你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

《C语言程序设计实训(B)》

2021-11-27 14:15:48

《C语言程序设计实训(B)》

课程实训指导书
(适用专业:信息管理与信息系统)

信息工程学院
二〇二一年九月

源码下载

链接:https://pan.baidu.com/s/1IKgUYqcRTG6avic5r7EB1A
提取码:1111

目 录
实训一 用循环结构程序设计解决问题 1

  1. 存款利率问题 1
  2. 企业根据利润提成发放奖金的问题 2
  3. 猴子吃桃问题: 3
  4. 歌星大奖赛评分问题 4
  5. 最大公约数和最小公倍数 5
  6. 利用“正多边形逼近”的方法求π的近似值 6
  7. 求车速和里程数 8
  8. 古堡算式 9
  9. 打印菱形图案 10
    10.百钱买百鸡问题 11
    实训二 利用数组进行程序设计解决问题 13
  10. 月份天数判断 13
  11. 公用电话传递数据问题 15
  12. 问最后剩下的是哪位? 16
  13. 阿姆斯特朗数 17
  14. 魔术师的猜牌术(1) 18
    实训三 使用函数和指针程序设计解决问题 20
    1.用函数计算ex的值 20
    2.编写子函数计算圆的周长和面积 21
    3.求一元二次方程的根 22
    4.求组合数的值 23
    5.编写一个函数fib1(),求Fibonacci数列的值 24
    6.求M行M列整数方阵两对角线上各元素之和 25
    7.输入某年某月某日,判断这一天是这一年的第几天? 27
    8.十个小孩分糖果 28
    9.在子函数中实现2个数的交换 29
    10.字符指针的使用 30
    11.通过函数和指针完成以下练习: 31
    实训四 将非函数形式程序改写成函数形式程序 33
  15. 选做题 33
  16. 抓交通肇事犯问题 33

实训一 用循环结构程序设计解决问题
一、实训目的
1、掌握三种循环结构的转化方法;
2、循环结构中解决循环条件问题的不同方法;
3、break和continue语句的使用特征。
二、实训条件
1、硬件环境:多媒体电脑一台
2、软件环境:Windows 7+ Microsoft Visual C++ 2010。
三、实训要求
1、能用循环结构设计较复杂程序;
2、利用程序设计解决实际问题;
3、能够针对问题找出最优的设计思路。
四、实训步骤
任务设计实例
1、存款利率问题
假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的五年中的年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少?
问题分析与算法设计
分析存钱和取钱的过程,可以采用倒推的方法。若第五年年底连本带息要取1000元,则要先求出第五年年初银行存款的钱数:
第五年初存款=1000/(1+12
0.0063);
依次类推可以求出第四年、第三年……的年初银行存款的钱数:
第四年年初存款=(第五年年初存款+1000)/(1+120.0063);
第三年年初存款=(第四年年初存款+1000)/(1+12
0.0063);
第二年年初存款=(第三年年初存款+1000)/(1+120.0063);
第一年年初存款=(第二年年初存款+1000)/(1+12
0.0063);
通过以上过程就可以很容易地求出第一年年初要存入多少钱。
*程序说明与注释:

*运行结果:
2、企业根据利润提成发放奖金的问题
利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润,求应发放奖金总数?
本程序较简单,设置不同的分支结构用于计算不同的利润,主要锻炼学生利用程序设计的思想解决实际的问题。

3、猴子吃桃问题:
猴子吃桃子!有天猴子在树上摘了很多桃子,吃了一半,觉得不过瘾,又多吃1个,以后每天都吃剩下的一半,再多吃一个,到第10天的时候,发现就剩下一个,问第一天摘了多少桃子。

4、歌星大奖赛评分问题
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平和最不公平…
*问题分析与算法设计:这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。

5、最大公约数和最小公倍数
求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)。手工方式求两个正整数的最大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。
思考题:求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)。
辗转相除法,又名欧几里德算法(Euclideanalgorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法,其可追溯至公元前300年前。设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q…r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q…r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个余数为0的除数即为(a,b)的最大公约数。
*问题分析与算法设计:手工方式求两个正整数的最大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。

6、利用“正多边形逼近”的方法求π的近似值
请利用“正多边形逼近”的方法求出π的近似值。利用“正多边形逼近”的方法求出π值在很早以前就存在,我们的先人祖冲之就是用这种方法在世界上第一个得到精确度达小数点后第6位的π值的。思考题:请用外切正多边形逼近的方法求π的近似值。
*问题分析与算法设计:
利用“正多边形逼近”的方法求出π值在很早以前就存在,我们的先人祖冲之就是用这种方法在世界上第一个得到精确度达小数点后第6位的π值的。
利用圆内接正六边形边长等于半径的特点将边数翻番,作出正十二边形,求出边长,重复这一过程,就可获得所需精度的π的近似值。
假设单位圆内接多边形的边长为2b,边数为i,则边数加倍后新的正多边形的边长为:
周长为: y=2 * i * x ,i:为加倍前的正多边形的边数

7、求车速和里程数
一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?
*问题分析与算法设计
根据题意,设所求对称数为i,其初值为95589,对其依次递增取值,将i值的每一位分解后与其对称位置上的数进行比较,若每个对称位置上的数皆相等,则可判定i即为所求的对称数。

8、古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:ABCDE * ? = EDCBA,他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。(这是比较容易理解的代码写法)

9、打印菱形图案
题目:打印出如下图案(菱形)

10、百钱买百鸡问题
中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?这类求解不定方程总理的实现,各层循环的控制变量直接与方程未知数有关
*问题分析与算法设计
设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在020之间;同理,y的取值范围在033之间,可得到下面的不定方程:
5x+3y+z/3=100
x+y+z=100
所以此问题可归结为求这个不定方程的整数解。
由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
实训二 利用数组进行程序设计解决问题
一、实训目的
1、了解同类型数据集合的数据的表达方式;
2、掌握数组元素和数组名作为函数参数传递的数据处理方式;
3、掌握二维数据的数据表达方式以及二维数据的存储结构。
二、实训条件
1、硬件环境:多媒体电脑一台;
2、软件环境:Windows 7+ Microsoft Visual C++ 2010。
三、实训要求
1、掌握数组的定义和使用;
2、熟悉常见字符数组处理函数;
四、实训步骤
具体的设计实例

  1. 月份天数判断
    月份天数判断,要求:编写函数,求解闰年和月份天数,例如:输入2014年2月,输出的2月天数为28天 闰年:能被4整除但不能被100整除,或者能被400整除。程序设计思路:利用数组实现:

  2. 公用电话传递数据问题
    某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。程序设计思路:

  3. 问最后剩下的是哪位?
    有n个人围成一圈,顺序编号。从第一个人开始报数(从1到3),凡报到3的人退出圈子,问最后留下的是原来的第几号人?

  4. 阿姆斯特朗数
    一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。如407=43+03+73就是一个阿姆斯特朗数。求1000以内的所有阿姆斯特朗数。用穷举法,依次取1000以内的各数i,将i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。
    如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。
    如407=43+03+73就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。
    *问题分析与算法设计
    可采用穷举法,依次取1000以内的各数(设为i),将i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。

  5. 魔术师的猜牌术(1)
    魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的?
    *问题分析与算法设计
    题目已经将魔术师出牌的过程描述清楚,我们可以利用倒推的方法,很容易地推出原来牌的顺序。
    人工倒推的方法是:在桌子上放13空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5…,直到放入全部3张牌。注意在计数时要跳过非空的盒子,只对空盒子计数。最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。
    这种人工的方法是行之有效的,计算机可以模拟求解。

实训三 使用函数和指针程序设计解决问题
一、实训目的
通过练习,掌握全局变量和局部变量的区别以及循环结构和嵌套循环的应用,掌握函数的定义、返回值以及函数的调用。
二、实训条件
1、硬件环境:多媒体电脑一台;
2、软件环境:Windows 7+ Microsoft Visual C++ 2010。
三、 实训要求
1、理解模块化程序设计与函数的关系;
2、掌握函数调用中传递参数的作用;
3、掌握变量的作用域和生存期。
四、实训步骤
任务设计实例
1.用函数计算ex的值
用函数计算ex=1+x+x2/2!+…+xn/n!前n+1项之和,计算直到|xn/n!|<1e-6。

2.编写子函数计算圆的周长和面积
输入圆的半径,编写子程序计算圆的周长和面积。在主函数main()中输入半径r,通过调用girth()和 area()两个函数来计算圆的周长和面积,在主函数中输出结果。

3.求一元二次方程的根
编写3个求一元二次方程根的函数,通过主函数输入3个参数,调用子函数求一元二次方程的根,并在子函数中输出结果。

4.求组合数的值
编写一个阶乘函数,通过主函数调用阶乘函数函数,求如下公式的值,m和n在主函数中通过键盘输入。

5.编写一个函数fib1(),求Fibonacci数列的值
编写一个函数fib1(),求Fibonacci数列的值,结果由函数返回。其中Fibonacci数列F(n)定义为: F(0)=1, F(1)=1 F(n)=F(n-1)+F(n-2)
在主函数main中输入当n为40时,输出Fibonacci数列的值。

6.求M行M列整数方阵两对角线上各元素之和
给定数组{{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5}, {3,4,5,6,7}},设计一个函数fun,其功能是:输出M行M列整数方阵,然后求两条对角线上各元素之和,返回此和数。

7.输入某年某月某日,判断这一天是这一年的第几天?

8.十个小孩分糖果
十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?
*问题分析与算法设计:题目描述的分糖过程是一个机械的重复过程,编程算法完全可以按照描述的过程进行模拟。

9.在子函数中实现2个数的交换
定义一个函数swap,该函数的功能为交换两个整数的值,在主函数中输出交换后数据。

10.字符指针的使用
利用字符指针实现字符串1“I Love China”与字符串2“So do I”的输出。然后利用字符指针将字符串2的内容复制到字符串1中,然后输出字符串1。

11.通过函数和指针完成以下练习:
有n个数,使其前面个数顺序向后移m个位置,最后m个数变成前面m个数。

实训四 将非函数形式程序改写成函数形式程序
一、实训目的
通过练习,全面掌握函数的定义、返回值,以及函数的调用以及将非函数形式程序改写成函数形式程序。
二、实训条件
1、硬件环境:多媒体电脑一台;
2、软件环境:Windows 7+ Microsoft Visual C++ 2010。
三、实训要求
1.理解模块化程序设计与函数的关系;
2.掌握函数调用中传递参数的作用。
四、实训步骤

  1. 选做题
    在上述实训一到实训二中选4——5个程序改写成函数调用形式,至少做一个数组方面的地址传递的函数调用。
  2. 抓交通肇事犯问题
    一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同; 丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
    设计程序段:
    *问题分析与算法设计
    按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。
    *程序说明与注释
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,c;
for(i=1;i<=9;i++) /*i:车号前二位的取值*/
for(j=0;j<=9;j++) /*j:车号后二位的取值*/
if(i!=j) /*判断二位数字是否相异*/
{
k=i*1000+i*100+j*10+j; /*计算出可能的整数*/
for(c=31;c*c<k;c++); /*判断该数是否为另一整数的平方*/
if(c*c==k) printf("Lorry–No. is %d.\n",k); /*若是,打印结果*/
}
}

*运行结果
Lorry _No.is 7744
效果如图

将此题改写成函数调用形式!