实验三 C语言函数应用编程

news/2025/3/19 23:07:29/文章来源:https://www.cnblogs.com/andongni51/p/18496167

一、实验目的

 能正确使用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: \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         }for(int k=1;k<=i-1;k++){
13             printf("\t");    
14         }printf("\n");
15         
16         
17         for(int j=1;j<=i-1;j++){
18             printf("\t");
19         }for(int k=1;k<=(2*n-2*i+1);k++){
20             printf("<H>\t");
21         }for(int k=1;k<=i-1;k++){
22             printf("\t");
23         }printf("\n");
24         
25         
26         for(int j=1;j<=i-1;j++){
27             printf("\t");
28         }for(int k=1;k<=(2*n-2*i+1);k++){
29             printf("I I\t");
30         }for(int k=1;k<=i-1;k++){
31             printf("\t");
32         }printf("\n");
33     }
34     }
35 
36     
37     
38     return 0;
39 }

 

 

运行截图:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/821716.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还不知道怎么做报表?一文教会你简单还免费的报表制作方法

在当今数据驱动的商业环境中,报表制作已经成为企业管理和决策中不可或缺的部分。然而,许多人面对复杂的报表制作流程可能感到无从下手。幸运的是,本文将教你如何一款完全免费的报表工具——山海鲸报表,无论你是初学者还是数据分析的老手,这篇文章都能帮你掌握快速上手、简…

HarmonyOS:给您的应用添加通知(2)

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18502243➤如果链接不是为敢技术的博…

家谱树题解

(ACM比赛时忘了拓扑怎么写时代尻古) 假设有一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法: 1.从 DAG 图中选择一个没有前驱(即入度为0)的顶点并输出。 2.从图中删除该顶点和所有以它为起点的有向边。 3.重复 1 和 2 直到当前的 DAG 图为空或当前图中不…

♿交换序列题解♿

以下将状态 \(K\),\(E\),\(Y\) 用数字0,1,2表示。考虑 \(dp\) 我们设 \(dp[a][b][c][d]\) 表示 \(K\) 用了 \(a\) 次,\(E\) 用了 \(b\) 次,\(Y\) 用了 \(c\) 次,总共交换了 \(d\) 次, 前缀和 $sum[i][j] $表示到第 \(j\) 位有几个字母 \(i\) 记录一个 \(loc[i][j]\)表示第…

鸿蒙NEXT应用上架与分发步骤详解

大家好,我是 V 哥。今天的文章来聊一聊HarmonyOS NEXT应用上架。当你开发、调试完HarmonyOS应用/元服务,就可以前往AppGallery Connect申请上架,华为审核通过后,用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会通过数字证书与Profile文件等签名信息来保…

云端软件对企业管理有什么好处

云端软件对企业管理有以下好处:一、提高信息共享与协作效率;二、降低IT成本与维护难度;三、增强数据安全与备份能力;四、实时监控与分析业务数据;五、提升企业管理灵活性与可扩展性。提高信息共享与协作效率源于云端软件打破了传统办公的地域和时间限制。一、提高信息共享…

HTML(网页)打包EXE软件的一机一码网络验证(生成卡密)使用说明和介绍

HTML(网页)打包EXE软件1.9.97版本中, 新增了网络验证功能, 它可以给打包生成的EXE文件添加网络验证功能, 即添加卡密, 打包后的EXE文件用户首次打开使用时, 会提示需要输入激活码(卡密), 输入正确后才可以正常使用. 本文主要介绍该功能如何使用HTML转EXE的网络验证使用步骤说明…

项目经理如何应对项目实施过程中的资源短缺

项目经理面对项目实施过程中的资源短缺,首先需要采取的措施包括:优化资源配置、寻找替代资源、项目需求调整、协商时间表、以及项目风险管理。其中,优化资源配置是核心方法,这涉及到合理分配现有资源,确保关键任务的优先级得到满足。 I. 优化资源配置 要优化资源配置,项目…

Apache Seata(incubating) 首个版本重磅发布!

2.1.0 是 Seata 进入 Apache 基金会的第一个 Release Version。此次发布将 io.seata 包名更改为 org.apache.seata。除了按原有的 Roadmap 技术演进外,2.1.0 进行了大量兼容性工作,实现了 API、数据和协议的兼容。用户无需修改原有的 API 和配置,即可实现到 Apache 版本的平…

越界检测视频分析网关区域入侵识别人员入侵算法的技术原理和视频监控应用

在传统的监控模式下,依赖人工持续监视视频画面存在明显的局限性,包括疲劳、注意力分散以及无法覆盖所有区域等问题,这使得实现24小时、全方位监控变得困难。而人工智能技术的应用,通过在关键位置部署摄像头,能够捕获连续的视频流。结合深度学习模型,这些视频流可以被实时…

InterlliJ IDEA中的properties文件中文乱码方法

有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

书生浦语全链路介绍

模型性能天梯图推理能力:综合推理能力领先社区开源模型 支持100万字上下文(短期记忆):相较于gpt4o是100倍的量级 自主规划和搜索完成复杂任务:通过信息搜索和整合,针对复杂问题撰写专业回答,效率提升60倍核心技术思想在于:数据迭代反馈,仍然是数据质量驱动的模型性能,…