实验3 函数
实验任务一
// 利用局部static变量的特性,计算阶乘 #include <stdio.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)); return 0; } //函数定义 long long fac(int n) { static long long p = 1; p = p*n; return p; }
插入代码printf("p = %lld\n",p);后,
// 利用局部static变量的特性,计算阶乘 #include <stdio.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)); return 0; } //函数定义 long long fac(int n) { static long long p = 1; printf("p = %lld\n",p); p = p*n; return p; }
1-2
// 练习:局部static变量特性 #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); return 0; } //函数定义 int func(int a,int b) { static int m = 0,i = 2; i += m + 1; m = i + a + b; return (m); }
1、实验运行结果与理论分析得到的结果一致;
2、总结局部static变量的特性:静态局部变量的数据储存在静态存储区,再次进入此函数时将保存上一次的结果。
实验任务二
2-1迭代
#include <stdio.h> void printSymbol(int n,char symbol); //函数声明 int main() { int n; char symbol; while(scanf("%d %c",&n,&symbol) != EOF) { printSymbol(n,symbol); //函数调用 printf("\n"); } return 0; } void printSymbol(int n,char symbol) { int i; for(i=0;i<n;i++) { printf("%c",symbol); } }
2-2 递归
#include <stdio.h> void printSymbol(int n,char symbol); //函数声明 int main() { int n; char symbol; while(scanf("%d %c",&n,&symbol) != EOF) { printSymbol(n,symbol); //函数调用 printf("\n"); } return 0; } void printSymbol(int n,char symbol) { if(n==1) { printf("%c",symbol); } else { printSymbol(n-1,symbol); printf("%c",symbol); } }
针对这个具体编程问题,对比两种实现方式,我认为迭代的实现方式更好,因为此问题的要求较为简单,使用迭代的方法只需for循环即可完成,更加方便易懂。
实验任务三
#include <stdio.h> long long fun(int n); //函数声明 int main() { int n; long long f; while(scanf("%d",&n) != EOF) { f = fun(n); //函数调用 printf("n = %d,f = %lld\n",n,f); } return 0; } long long fun(int n) { long long i; if(n==0) { i = 0; return i; } else { i =1 + 2*fun(n-1); } return i; }
实验任务四
#include <stdio.h> #include <math.h> int isPrime(int n); int main() { int a,n,i=0; for(n=101;n<=200;n++) { if(isPrime(n)==0) { printf("%8d",n); i++; } } printf("\n"); printf("101~200之间一共有%d个非素数",i); return 0; } int isPrime(int n) { int p; for(p=2;p<=n;p++) { if(n%p==0) break; } if(p<n) //有非自身的因数 { return 0; } else { return 1; } }
实验任务五
#include <stdio.h> long fun(long s); int main() { long s,t; printf("Enter a number: "); while(scanf("%ld",&s) != EOF) { t = fun(s); printf("new number is:%ld\n\n",t); printf("Enter a number: "); } return 0; } long fun(long s) { long m=0,a=0,b=1; while(s>0) { m = s%10; if(m%2!=0) { a = a + m*b; b = b*10; } s = s/10; } return a; }
实验任务六
#include <stdio.h> double fun(int n); //声明 double myabs(int a); int main() { int n; double s; printf("Enter n(1~10): "); while(scanf("%d",&n) != EOF) { s = fun(n); printf("n = %d,s = %f\n\n",n,s); printf("Enter n(1~10): "); } return 0; } double fun(int n) { int t; double sum=0; for(t=1;t<=n;t++) { if(t%2 != 0) { sum = sum + 1/myabs(t); } else if(t%2==0) { sum = sum - 1/myabs(t); } } return sum; } double myabs(int a) { if(a==1) return 1; else return a*myabs(a-1); }
实验总结
1、收获的具体知识点:利用实验学习了局部static变量的特性;了解了迭代与递归这两种方法的不同处;使用递归法时应先找到第n项与第n-1项的关系,并以此为根据设计算法;
2、本次实验的体会:动手敲代码之前一定要先理解题目的要求,理清逻辑、想清用什么算法之后再动手书写,若写完后再重新修改算法逻辑会很麻烦;
3、尚存的问题:实验任务六试了很多别的算法都不行,但也找不出错误之处;(如:若将每项的正负判断放进第二个自定义的函数,得出的运行结果不正确;以及 若不在第一个调用的函数中用“1/myabs(t)”来表示每一项,而是在第二个调用的函数中用"1/(a*myabs(a-1))"来确定每一项的值,运行结果也不正确。