实验三 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 }

 

 

运行截图:

 

posted @ 2024-10-25 15:29  安东尼23  阅读(14)  评论(0编辑  收藏  举报