实验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 这里是使用了数组进行了解决,主要目的是使数据分类更加有序,利于直接观察;不过,与此同时,也极大增加了代码行数。假如不使用数组,应该是会减少很多行代码的。