实验任务四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可以用的地方用了却各种报错,还是要继续学习、好好练习。