实验四
一:实验结论:
1:设n取值范围在0~32之间。设计一个函数模块fun(),用来实现:
提供n的数值,返回该函数计算式 的结果。
要求:使用递归算法实现 不允许使用标准库函数pow()。
(1)源代码:
#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 s; if(n==1) s=1; else s=2*fun(n-1)+1; return s; }
(2)运行结果截图:
2:理解函数模块fac()定义中, 局部static变量起到的作用。
(1)源代码:
a:
// 利用局部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; }
b:
// 利用局部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=%11d\n",p); p = p*n; return p; }
(2)运行结果截图:
a:
b:
(3)使用关键字static修饰的局部变量的特性:
a:加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
b:static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
c:static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。
3:寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
(1)源代码:
//寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。 // 例如,输入6和21,则输出为:7 11 13 17 19。 #include <stdio.h> #include <stdlib.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]; 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; }
(2)运行结果截图:
4:一个函数dec2n(),实现把一个十进制数据x转换成n进制。(n取2,8,16)。
(1)源代码:
#include <stdio.h> void dec2n(int x, int n); // 函数声明 int main() { int x; printf("输入一个十进制整数: "); scanf("%d", &x); dec2n(x, 2); // 函数调用: 把x转换成二进制输出 dec2n(x, 8); // 函数调用: 把x转换成八进制输出 dec2n(x, 16); // 函数调用: 把x转换成十六进制输出 return 0; } // 函数定义 // 功能: 把十进制数x转换成n进制,打印输出 // 补足函数实现 void dec2n(int x, int n) { int i = 0, a[32],b[32],c[32]; char t; //转化为二进制 if(n==2){ while (x > 0) { a[i] = x % 2; i = i + 1; x = x / 2; } for (i--; i >= 0; i--) printf("%d", a[i]); printf("\n"); } //转化为八进制 else if(n==8){ while (x > 0) { b[i] = x % 8; i = i + 1; x = x / 8; } for (i--; i >= 0; i--) printf("%d", b[i]); printf("\n"); } //转化为十六进制 else if (n==16){ while (x > 0) { c[i] = x % 16; i = i + 1; x = x / 16; } for (i--; i >= 0; i--){ if(c[i]>=10){ t = 'A'+c[i]-10; printf("%c",t); } else printf("%d", c[i]); } printf("\n"); } }
(2)运行结果截图:
二:实验总结:
1:收获:(1)通过实验更为清晰的认识到了;
(2)对函数的嵌套,调用及数组的运用有了更直观的了解;
(3)掌握了进制转化的算法,操作及c语言编写。
2:尚存的问题:(1)对任务一的选做题的把握还不到位;
(2)对数组的认识有待提高;
(3)对细节的掌握还存在不足;
(4)希望能在之后的学习中掌握。