实验3 函数

四、实验结论:

1.实验任务1:

task1.c

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 #include<windows.h>
 5 #define N 80
 6 
 7 void printText(int Line, int col, char text[]);
 8 void printSpaces(int n);
 9 void printBlankLines(int n);
10 
11 int main()                      /*在屏幕上随机位置打印 10 个“hi, May~”*/
12 {
13     int line, col, i;
14     char text[N]="hi, May~";
15     
16     srand(time(0));
17     
18     for(i=0;i<=10;i++)
19     {
20         line = rand()%25;
21         col = rand()%80;
22         printText(line, col, text);
23         Sleep(1000);
24     }
25     
26     return 0;
27 }
28 
29 void printSpaces(int n)
30 {
31     int i;
32     
33     for(i=1; i<=n; i++)
34     {
35         printf(" ");
36     }
37 }
38 
39 void printBlankLines(int n)
40 {
41     int i;
42     
43     for(i=1; i<=n; i++)
44     {
45         printf("\n");
46     }
47 }
48 
49 void printText(int line, int col, char text[])
50 {
51     printBlankLines(line-1);
52     printSpaces(col-1);
53     printf("%s",text);
54 }

 

 

实现的功能:在屏幕上随机位置打印 10 个“hi, May~”。

 

 

2.实验任务2:

task2_1.c

 1 #include<stdio.h>
 2 long long fac(int n);
 3 
 4 int main()
 5 {
 6     int i,n;
 7     
 8     printf("Enter n:");
 9     scanf("%d",&n);
10     
11     for(i=1;i<=n;i++)
12         printf("%d!=%lld\n",i,fac(i));
13         
14     return 0;
15  } 
16  
17 long long fac(int n)
18 {
19     static long long p=1;             /*static可使被定义变量储存在全局数据中,即使函数返回,也不会改变其值*/
20     /*printf("p=%lld\n",p);*/
21     p=p*n;
22     
23     return p;
24 }

 

 

task2_2.c

 1 #include<stdio.h>
 2 int func(int,int);
 3 
 4 int main()
 5 {
 6     int k=4,m=1,p1,p2;
 7     
 8     p1=func(k,m);
 9     p2=func(k,m);
10     printf("%d,%d\n",p1,p2);
11     
12     return 0;
13  } 
14 
15 int func(int a,int b)
16 {
17     static int m=0,i=2;
18     
19     i+=m+1;
20     m=i+a+b;
21     
22     return m;
23 }

 

结果是一致的。

 

static变量特性是:

1)其储存于全局数据中,类似于全局变量,但不完全相同。

2)其只可在其被声明的函数中被调用,而无法像全局变量一样,可以任意调用。

 

 

3.实验任务3:

task3.c

 1 #include<stdio.h>
 2 long long fun(int n);
 3 
 4 int main()
 5 {
 6     int n;
 7     long long f;
 8     
 9     while(scanf("%d",&n)!=EOF)
10     {
11         f=fun(n);
12         printf("n=%d, f=%lld\n",n,f);
13     }
14     
15     return 0;
16 }
17 
18 long long fun(int n)
19 {
20     long long f;
21     int i;
22     
23     if(n==1)
24         f=1;
25     else
26         f=2*fun(n-1)+1;
27     
28     return f;
29 }

 

 

4.实验任务4:

task4.c

 1 #include<stdio.h>
 2 void hanoi(unsigned int n,char from, char temp, char to);
 3 void moveplate(unsigned int n,char from, char to); 
 4 int i;
 5 
 6 int main()
 7 {
 8     unsigned int n;
 9     while(scanf("%u",&n)!=EOF)
10     {
11         i=0;
12         hanoi(n,'A','B','C');
13         printf("\n一共移动了%d次\n\n",i);
14     }
15     return 0;
16 }
17 
18 void hanoi(unsigned int n,char from, char temp, char to)
19 {
20     if(n==1)
21         moveplate(n,from,to);
22     else
23     {
24         hanoi(n-1,from,to,temp);
25         moveplate(n,from,to);
26         hanoi(n-1,temp,from,to);
27     }
28 }
29 
30 void moveplate(unsigned int n,char from, char to)
31 {
32     printf("第%u个盘子:%c-->%c\n",n,from,to);
33     i++;
34 }

 

 

5.实验任务5:

task5.c

 

 1 #include<stdio.h>
 2 #include<math.h>
 3 #define Num 20
 4 int is_prime(int n);
 5 int databace(int prime[],int Even_num[]);
 6 void output(int prime[],int Even_num[]);
 7 
 8 int main()
 9 {
10     int prime[Num],Even_num[Num];
11     databace(prime,Even_num);
12     output(prime,Even_num);
13     
14     return 0;
15 }
16 
17 int is_prime(int n)
18 {
19     int flag=1,i;
20     double N;
21     N=sqrt(n);
22     
23     for(i=2;i<=N;i++)
24     {
25         if(n%i==0&&n!=2)
26         {
27             flag=0;
28             break;
29         }
30     }
31     if(n==1)
32         flag=0;
33     return flag;
34 }
35 
36 int databace(int prime[],int Even_num[])
37 {
38     int i,j=0,k=0;
39     
40     for(i=1;i<=Num;i++)
41     {
42         if(is_prime(i)==1)
43         {
44             prime[j]=i;
45             j++;
46         }
47         if(i%2==0)
48         {
49             Even_num[k]=i;
50             k++;
51         }
52     }
53     prime[j]='\0';
54     Even_num[k]='\0';
55 }
56 
57 void output(int prime[],int Even_num[])
58 {
59     int i,j,k,flag;
60     int times=0;
61     
62     for(i=0;Even_num[i]!='\0';i++)
63     {
64         flag=0;
65         
66         for(j=0;prime[j]!='\0'&&flag==0;j++)
67         {
68             for(k=0;prime[k]!='\0'&&flag==0;k++)
69             {
70                 if(Even_num[i]==prime[j]+prime[k])
71                 {
72                     printf("%d = %d + %d \n",Even_num[i],prime[j],prime[k]);
73                     flag=1;
74                     times++;
75                 }
76             }
77         }
78     }
79     if(times!=i-1)
80         printf("Error!!!");
81 }

 

 

 

6.实验任务6:

task6.c

 

 1 #include<stdio.h>
 2 long fun(long s);
 3 
 4 int main()
 5 {
 6     long s,t;
 7     
 8     printf("Enter a number:");
 9     while(scanf("%ld",&s)!=EOF)
10     {
11         t=fun(s);
12         printf("new number is:%ld\n\n",t);
13         printf("Enter a number:");
14     }
15     return 0;
16 }
17 
18 long fun(long s)
19 {
20     int i,j,k=0;
21     long l,t;
22     l=s;
23     for(i=0;l!=0;i++)
24         l/=10;
25     long start[i],end[i];
26     for(j=0;s!=0;j++)
27     {
28         start[j]=s%10;
29         if(start[j]%2!=0)
30             end[k++]=start[j];
31         s/=10;
32     }
33     end[k]='\0';
34     for(k=k-1;k>=0;k--)
35     {
36         t*=10;
37         t=end[k]+t;
38     }
39     return t;
40 }

 

 

 

五、实验总结:

1. 关于 Hanoi 塔问题,应该认识到的是,其 n-1 个塔通过 C 移动到 B 可以被视为 n-1 个塔作为一个整体被移动到了 B ,然后把第 n 个塔移动到 C ,最后 n-1 个塔再被作为一个整体被移动到 C 。而这个过程又可以被逐层分解,即,n-1 个塔通过 C 移动到 B 这个任务改为将 n-2 个塔通过 B 移动到 C ,再把第 n-1 个塔移动到 B ,最后将 n-2 个塔移动到 B不断对这个问题分解,直到只对 1 个塔进行操作。这也是为什么这个问题可以通过函数的嵌套而完成。

2. 关于 static 变量,其可以作为子函数数据库中需要始终记录的数据的声明形式,使其可以不会因为子函数的调用结束而变量清除。而且不法被其他函数改变数据,有别于全局变量。

3. 关于 task5.c task6.c 这里是使用了数组进行了解决,主要目的是使数据分类更加有序,利于直接观察;不过,与此同时,也极大增加了代码行数。假如不使用数组,应该是会减少很多行代码的。

posted @ 2022-04-25 11:05  Nixmout  阅读(21)  评论(1编辑  收藏  举报