实验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函数可读性更强。

 

posted @ 2021-04-28 22:36  namelessbird  阅读(51)  评论(2编辑  收藏  举报