实验三 C语言函数应用编程
一、实验目的
能正确使用C语法规则定义,声明,调用函数
能正确编写递归函数
针对具体问题场景,合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性,可维护性
针对具体问题场景,能正确,合理使用全局变量和局部static变量,解决实际问题
二、实验准备
1,函数定义,声明,调用的语法规则
2,什么是形参,什么是实参,以及,参数的传递和返回过程
3,什么是递归函数,以及,递归函数的编写规范
4,全局变量,局部static变量的特性
三、实验内容
1. 实验任务1
代码:
1 #include<stdio.h> 2 3 char score_to_grade(int score); 4 5 int main() 6 { 7 int score; 8 char grade; 9 10 while (scanf ("%d",&score)!=EOF) 11 { 12 grade = score_to_grade(score); 13 printf("分数:%d,等级:%c\n\n",score,grade); 14 15 } 16 return 0; 17 } 18 19 char score_to_grade(int score) 20 { 21 char ans; 22 23 switch (score/10) 24 { 25 case 10: 26 case 9: ans = 'A';break; 27 case 8: ans = 'B';break; 28 case 7: ans = 'C';break; 29 case 6: ans = 'D';break; 30 default: ans = 'E'; 31 } 32 33 }
运行截图:
问题回答:
问题一:函数score_to_grade()用来评判成绩的等级,返回等级对应的字符;形参类型是整型,返回值类型是char字符型。
问题二:有问题。当一个成绩被评为一A时,由于并没有break终止循环,导致会继续下去,最后输出结果一直为E
2. 实验任务2
代码:
1 #include<stdio.h> 2 3 int sum_digits(int n); 4 5 int main() 6 { 7 int n; 8 int ans; 9 10 while (printf("Enter n: "),scanf("%d",&n)!=EOF) 11 { 12 ans = sum_digits(n); 13 printf("n = %d , ans = %d\n\n",n,ans); 14 15 16 } 17 return 0; 18 } 19 20 int sum_digits(int n) 21 { 22 int ans = 0; 23 while(n !=0) 24 { 25 26 ans += n% 10; 27 n/=10; 28 } 29 return ans; 30 }
运行截图:
问题回答:
问题一:这个函数的功能实现了返回一个整数的各个位上的数字的加和。如13,1+3=4,故可以实现返回4。
问题二:我测试输入发现是可以实现同行效果的。第一种方法不考虑输入数字的位数,都可以进行计算,如果输入10以内的数字也要来一遍。第二种方法使用了递归的方法,而且更加巧妙。当输入10以内数字,直接输出原数字就达到了位相加的结果。如果大于10,又调用自身把问题简化,一步步得到结果。
3. 实验任务3
代码:
1 #include<stdio.h> 2 3 int power ( int x, int y); 4 5 int main() 6 { 7 8 int x, n; 9 int ans ; 10 11 while (printf ( "Enter x and n: "),scanf ("%d%d",&x,&n)!=EOF) 12 { 13 ans= power (x, n ); 14 printf("n = %d,ans = %d\n\n",n ,ans); 15 16 } 17 return 0; 18 } 19 20 int power(int x, int n) 21 { 22 int t; 23 24 if(n==0) 25 return 1; 26 else if (n% 2) 27 return x*power(x,n-1); 28 else 29 { 30 t=power(x,n/2); 31 return t*t; 32 } 33 34 35 }
运行截图:
问题回答:
问题一:函数的功能是求出给定的整数x的y 次幂的结果。
问题二:函数是递归函数。递归模式:n 为1,函数返回1,n为大于0的偶数时,返回x * power(x, n-1),n为大于0的奇数时,返回power(x, n/2)
数学公式模型:
计算幂运算即计算:x^n
4. 实验任务4
代码:
1 #include<stdio.h> 2 3 int is_prime(int m); 4 5 int main() 6 { 7 printf("100以内的孪生素数: \n"); 8 9 int i=0; 10 11 for ( int m=1;m<100;m++) 12 { 13 if (is_prime(m)&&(is_prime(m+2))) 14 { 15 printf("%d %d\n",m,m+2); 16 i++; 17 } 18 } 19 20 21 printf("100以内的孪生素数共有%d个",i); 22 23 } 24 25 int is_prime(int n) 26 { 27 if (n<=1) return 0; 28 29 //int i=2; 30 for (int i=2;i*i<=n;i++) 31 { 32 if (n%i==0) return 0; 33 34 } 35 return 1;
运行截图:
5. 实验任务5
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void hanoi(unsigned int n,char from, char temp,char to,int *count); 5 void moveplate(unsigned int n, char from , char to); 6 7 int main( ) 8 { 9 unsigned int n; 10 while(scanf("%u",&n)!=EOF) 11 { 12 int count=0; 13 hanoi(n,'A','B','C',&count); 14 15 16 printf("一共移动了%d次.\n",count); 17 printf("\n"); 18 } 19 20 return 0; 21 } 22 23 24 void hanoi( unsigned int n,char from, char temp ,char to,int *count) 25 { 26 if(n==1) 27 { 28 moveplate(n,from,to); 29 (*count)++; 30 } 31 32 else 33 { 34 hanoi(n-1,from,to,temp,count); 35 moveplate(n,from,to);(*count)++; 36 hanoi(n-1,temp,from,to,count); 37 38 39 } 40 41 }
运行截图:
6. 实验任务6
代码:
迭代方法:
1 #include <stdio.h> 2 int func(int n, int m); 3 int factorial(int n); 4 int main() { 5 int n, m; 6 int ans; 7 while(scanf("%d%d", &n, &m) != EOF) { 8 ans = func(n, m); 9 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 10 } 11 12 return 0; 13 } 14 15 //迭代方式 16 int func(int n, int m) 17 { 18 19 return factorial(n)/(factorial(m)*factorial(n-m)); 20 } 21 int factorial(int n) 22 { 23 int result =1; 24 25 if(n==1||n==0) return 1; 26 27 28 for (int i=2;i<=n;i++) 29 { 30 result*=i; 31 } 32 return result; 33 }
递归方式:
1 #include <stdio.h> 2 int func(int n, int m); 3 4 int main() { 5 int n, m; 6 int ans; 7 while(scanf("%d%d", &n, &m) != EOF) { 8 ans = func(n, m); 9 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 10 } 11 12 return 0; 13 } 14 15 //递归方式 16 int func(int n, int m) 17 { if(n==m) 18 return 1; 19 if (n<m) 20 return 0; 21 if (n>=m) 22 { 23 24 if(n-m==1||(m==1)) 25 return n; 26 27 else if(m==0||n==m||(m==1&&n==1)) 28 return 1; 29 30 31 else 32 return func(n-1,m)+func(n-1,m-1); 33 } 34 35 return 0; 36 37 38 39 } 40 41
运行截图
7. 实验任务7
代码:
1 #include<stdio.h> 2 int main(){ 3 4 int n; 5 while(printf("Enter n: ")&&scanf("%d",&n)!=EOF){ 6 7 for(int i=1;i<=n;i++){ 8 for(int j=1;j<=i-1;j++){ 9 printf("\t"); 10 }for(int k=1;k<=(2*n-2*i+1);k++){ 11 printf(" O\t"); 12 }printf("\n"); 13 14 15 for(int j=1;j<=i-1;j++){ 16 printf("\t"); 17 }for(int k=1;k<=(2*n-2*i+1);k++){ 18 printf("<H>\t"); 19 }printf("\n"); 20 21 22 for(int j=1;j<=i-1;j++){ 23 printf("\t"); 24 }for(int k=1;k<=(2*n-2*i+1);k++){ 25 printf("I I\t"); 26 }printf("\n\n"); 27 }//printf("\n\n"); 28 } 29 30 31 32 return 0; 33 }
运行截图: