实验任务四20.11.26

  • EX1

ans:不能。因为 solve 函数返回值类型为 void,不能返回数值。将 void solve 声明及定义改为 double solve 再返回值即可。

  • EX2
//ex2_1
// 利用局部static变量计算阶乘

#include <stdio.h>
#include <stdlib.h>

long long fac(int n);  // 函数声明 

int main() 
{
    int i, n;

    printf("Enter n: ");
    scanf("%d", &n);

    for (i = 1; i <= n; ++i)
        printf("%d! = %lld\n", i, fac(i));
    
    system("pause");
    
    return 0;
}

// 函数定义 
long long fac(int n) {
    static long long p = 1;

    printf("p = %lld\n", p);
    p = p*n;

    return p;
}

//ex2_2
// 练习:局部static变量特性 

#include <stdlib.h>
#include <stdio.h>
int func(int, int);

int main() {
    int k = 4, m = 1, p1, p2;

    p1 = func(k, m);
    p2 = func(k, m);
    printf("%d,%d\n", p1, p2);
    
    system("pause");
    return 0;
}

int func(int a, int b) {
    static int m = 0, i = 2;

    i += m + 1;
    m = i + a + b;

    return (m);
}

运行前猜想:p1=8,p2=17  与结果一致

局部static变量用法总结:

①编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。而静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。(此条在实验中并未体现,为收集来的资料所知);

②普通局部变量存储于进程栈空间,使用完毕会立即释放。而静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。(在实验中,计算p2值时,带入的m与i并不是0和2而是计算完p1后的m和i,所以P2结果与p1不同)

  • EX3
//ex3
//寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。

#include <stdio.h>

#define N 1000
int fun(int n,int m,int bb[N])
{
    int i,j,k=0,flag;
    
    for(j=n;j<=m;j++) //筛选素数
    {
        flag = 1;
        for(i=2;i<j;i++)
            if(j%i == 0) 
            {  
                 flag=0;
                 break;
            }
        if(flag == 1) 
           bb[k++]=j;
    }
    return k;
}

int main()
{
    int n=0,m=0,i,k,bb[N];
    
    printf("输入n和m(n<m):");

    scanf("%d",&n);
    scanf("%d",&m);
    
    for(i=0;i<m-n;i++)
        bb[i]=0;
        
    k=fun(n,m,bb); 
    
    for(i=0;i<k;i++)
        printf("%4d",bb[i]);
        
    return 0;
}

  • EX4
//ex4

#include <stdio.h>
long long fun(int n);   // 函数声明 

int main() {
    int n;
    long long f;
    
    while(scanf_s("%d", &n) != EOF) {
        f = fun(n);  // 函数调用 
        printf("n = %d, f = %lld\n", n, f);
    }
    
    return 0;
}

// 函数定义
long long fun(int n)
{
    long long result;
    
    if (n == 0)
        result = 0;
    else
        result = 2 * fun(n - 1) + 1;

    return result;
}

  • EX5
//ex5

#include <stdio.h>

void draw(int n, char symbol);  // 函数声明 

#include <stdio.h> 
int main() {
    int n, symbol;

    while (scanf("%d %c", &n, &symbol) != EOF) {
        draw(n, symbol);  // 函数调用 

        printf("\n");
    }

    return 0;
}


// 函数定义
void draw(int n, char symbol)
{
    int line, i;
    char blank = ' ';

    for (line = 1; line <= n; line++)
    {

        for (i = 1; i <= n - line; i++)
            putchar(blank);

        for (i = 1; i <= 2 * line - 1; i++)
            printf("%c", symbol);

        printf("\n");

    }
}

 

实验总结:对for运用更熟练了,有时觉得do()while可以用的地方用了却各种报错,还是要继续学习、好好练习。

posted @ 2020-11-29 15:32  热心市民小杨  阅读(100)  评论(2编辑  收藏  举报