实验4
1.递归函数
代码如下:
1 #include <stdio.h> 2 long long fun(int n); 3 int main() { 4 int n; 5 long long f; 6 while(scanf("%d",&n)!=EOF){ 7 f=fun(n); 8 printf("n=%d,f=%d\n", n,f); 9 } 10 return 0; 11 } 12 long long fun(int n){ 13 long long s; 14 if(n==0) 15 s=0; 16 else 17 s=2*fun(n-1)+1; 18 return s; 19 }
运行结果如下:

2.static变量
增加一行后代码1如下:
1 #include <stdio.h> 2 long long fac(int n); // 函数声明 3 int main() { 4 int i,n; 5 printf("Enter n: "); 6 scanf("%d", &n); 7 for(i=1; i<=n; ++i) 8 printf("%d! = %lld\n", i, fac(i)); 9 return 0; 10 } 11 // 函数定义 12 long long fac(int n) { 13 static long long p = 1; 14 printf("p=%lld\n",p); 15 p = p*n; 16 return p; 17 }
运行结果:
(图太长无法截全)

可以看出static局部变量p在每次函数执行后,仍会保存自身的值。
代码2如下:
1 #include<stdio.h> 2 int func(int, int); 3 int main() { 4 int k=4,m=1,p1,p2; 5 p1 = func(k,m) ; 6 p2 = func(k,m) ; 7 printf("%d,%d\n",p1,p2) ; 8 return 0; 9 } 10 int func(int a,int b) { 11 static int m=0,i=2; 12 i += m+1; 13 m = i+a+b; 14 return (m); 15 }
运行结果如下:

p1与p2不相等,足以证明执行一遍函数后i和m值不为0;
第一次执行函数后i=3,m=3+4+1=8;
第二次执行后i=3+8+1=12,m=12+4+1=17;
证明了i和m在第一次运行后保存了自身的值。
3.数组输出素数
代码如下:
1 #include <stdio.h> 2 #define N 1000 3 int fun(int n,int m,int bb[N]); 4 int main(){ 5 int m,n,i,bb[N],k; 6 while(scanf("%d %d",&n,&m)!=EOF) { 7 for (i = 0; i < (m - n); i++) { 8 bb[i] = 0; 9 } 10 k = fun(n, m, bb); 11 for (i = 0; i < k; i++) { 12 printf("%4d", bb[i]); 13 } 14 printf("\n"); 15 } 16 return 0; 17 } 18 int fun(int n,int m,int bb[N]){ 19 int i,j,k=0,flag; 20 for(j=n;j<=m;j++){ 21 flag=1; 22 if(j<2) 23 flag=0; 24 for (i = 2; i<j ; i++) { 25 if (j%i==0){ 26 flag=0; 27 break; 28 } 29 } 30 if (flag==1) 31 bb[k++]=j; 32 } 33 return k; 34 }
运行结果如下:

4.进制换算
代码如下:
1 #include <stdio.h> 2 #define N 50 3 void dec2n(int x,int n); 4 int main() { 5 int x; 6 printf("Enter a decimal number:"); 7 scanf("%d",&x); 8 dec2n(x,2); 9 dec2n(x,8); 10 dec2n(x,16); 11 return 0; 12 } 13 void dec2n(int x,int n){ 14 int num[N],i=0; 15 while (x>=1){ 16 num[i++]=x%n; 17 x/=n; //取余数依次存入数组 18 } 19 if(n==2||n==8){ 20 for (int j = i-1; j >=0; j--) { 21 printf("%d",num[j]); 22 } 23 printf("\n"); //二进制或八进制:直接逆序输出余数 24 } 25 if(n==16){ 26 for (int j = i-1; j >=0; j--) { 27 switch (num[j]) { 28 case 10: 29 printf("%c",'A'); 30 break; 31 case 11: 32 printf("%c",'B'); 33 break; 34 case 12: 35 printf("%c",'C'); 36 break; 37 case 13: 38 printf("%c",'D'); 39 break; 40 case 14: 41 printf("%c",'E'); 42 break; 43 case 15: 44 printf("%c",'F'); 45 break; 46 default: 47 printf("%d",num[j]);//十六进制:使用switch将10~15的余数替换为相应字母 48 } 49 } 50 printf("\n"); 51 } 52 }
运行结果如下:

个人认为十六进制的10~15的输出有更好的解法(利用ASCII码大概可简化),但利用switch函数可读性更强。
浙公网安备 33010602011771号