《程序设计与问题求解I》实验指导书Word文档格式.docx
《《程序设计与问题求解I》实验指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《《程序设计与问题求解I》实验指导书Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
逗号隔开),输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?
问题4要使上面程序的键盘输入数据格式为1,2,34,而输出语句在屏幕上显示的结果为
'
1'
'
2'
34,则应修改程序中的哪条语句?
[提示:
利用转义字符输出字符单引号字符。
]
问题5要使上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为'
34,则程序应修改程序中的哪条语句?
第1种输入方式:
1,2,34↙(以逗号作为分隔符)
第2种输入方式:
1234↙(以空格作为分隔符)
第3种输入方式:
1234↙(以Tab键作为分隔符)
第4种输入方式:
1↙
2↙
34↙(以回车符作为分隔符)
提示:
使用scanf("
%c%*c%c%*c%d"
其中,scanf后的*表示本输入项在读入后不赋给相应的变量。
简单的说可以利用%*c跳过任意的字符而不读入
2.计算定期存款本利之和
设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。
要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入
提示1:
银行定期存款为复利,计算公式为:
提示2:
使用函数pow,具体见如下从帮助文档中的摘录
doublepow(
doublex,
doubley
);
Parameters
x:
Base.
y:
Exponent.
Example
//crt_pow.c
math.h>
intmain(void)
doublex=2.0,y=3.0,z;
z=pow(x,y);
printf("
%.1ftothepowerof%.1fis%.1f\n"
x,y,z);
Output
2.0tothepowerof3.0is8.0
三、实验结果与分析
将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。
实验二选择结构程序设计
1.正确使用关系表达式和逻辑表达式表示条件
2.掌握选择语句if和switch语句的使用方法
3.学会用选择语句构成的选择结构程序设计
二、实验内容
1.身高预测
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。
小孩成人后的身高与其父母的身高和自身的性别密切相关。
设faHeight为其父身高,moHeight为其母身高,身高预测公式为
男性成人时身高=(faHeight+moHeight)×
0.54cm
女性成人时身高=(faHeight×
0.923+moHeight)/2cm
此外,如果喜爱体育锻炼,那么可增加身高2%;
如果有良好的卫生饮食习惯,那么可增加身高1.5%。
编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好),利用给定公式和身高预测方法对身高进行预测。
编程要求:
有用户输入输出提示信息。
2.简单的计算器
用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:
操作数1运算符op操作数2
计算表达式的值,指定的算术运算符为加(+)、减(-)、乘(*)、除(/)。
程序能进行浮点数的算术运算,有用户输入输出提示信息。
因为除法中的除数不能为0,因此关键在于如何比较浮点变量data2和常数0是否相等。
作为整型变量跟0的比较,简单的==就可以解决。
而浮点型等实型变量需要用
if(fabs(data2)<
=1e-7)
进行判断(即判断其是否足够小)。
若使用函数fabs,需要包含头文件math.h
实验三循环结构程序设计
(1)
1.学习循环语句的使用方法
2.学习用循环语句编写程序
(1)请用三种结构实现从1到100之间的偶数累加,奇数相乘,并将偶数累加的结果输出,奇数相乘的结果输出。
(2)求
,n的值从键盘输入
(3)编写程序,打印99乘法表
实验四循环结构程序设计
(2)
2.学习用循环语句编写实际应用程序
猜数游戏
在这个实验中,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果按下列要求循序渐进地编程实现,会发现其实这个程序是很容易实现的。
那么,现在就开始吧,先编写第1个程序,然后试着在第1个程序的基础上编写第2个程序,……
程序1编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则计算机给出提示“Right!
”,否则提示“Wrong!
”,并告诉人所猜的数是大(Toohigh)还是小(Toolow),然后结束游戏。
要求每次运行程序时机器所“想”的数不能都一样。
程序2编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;
否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。
程序3编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;
否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。
程序4编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;
否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。
每次运行程序可以反复猜多个数,直到操作者想停止时才结束。
1.有用户输入输出提示
2.仅仅需要编写出程序4的代码并上机调试运行成功,前面的程序1至程序3是引导如何编写出程序4的代码。
在程序4中要用到二重循环,如果实在无法直接编写出程序4,可按上面的步骤循序渐进的进行代码的编写。
编程提示:
随机数序列的生成
在这个程序的编写中,需要产生随机数。
附录中是一个生成随机数的帮助文档,需要自己看懂。
简单提一下,生成一个从1到100的随机数的代码如下:
magic=rand()%100+1;
但要注意,在一段程序使用rand()函数前,需要有且仅仅有一条语句进行随机数初始值的设置。
比如使用srand(time(NULL));
这里是用系统时间进行随机数初始值的设置。
函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子。
作为一个随机数实际上是一个伪随机数,并不是实际意义上的随机,仅仅是通过一定的数学方法(不同的数学方法产生满足不同分布的随机数序列),从一个初始值生成的一个序列,因此这个初始值如果雷同的话,生成的随机数也是相同的。
因此在第一次使用rand函数前,需要使用srand函数。
rand
Requirements
Routine
Requiredheader
Compatibility
<
stdlib.h>
ANSI,Win98,WinMe,WinNT,Win2000,WinXP
Generatesapseudorandomnumber.
intrand(void);
ReturnValue
randreturnsapseudorandomnumber,asdescribedabove.Thereisnoerrorreturn.
Remarks
Therandfunctionreturnsapseudorandomintegerintherange0toRAND_MAX.Usethesrandfunctiontoseedthepseudorandom-numbergeneratorbeforecallingrand.
//crt_rand.c
/*Thisprogramseedstherandom-numbergenerator
*withthetime,thendisplays10randomintegers.
*/
time.h>
inti;
/*Seedtherandom-numbergeneratorwithcurrenttimesothat
*thenumberswillbedifferenteverytimewerun.
srand((unsigned)time(NULL));
/*Display10numbers.*/
for(i=0;
i<
10;
i++)
%6d\n"
rand());
SampleOutput
19430
28222
9710
12070
7513
9501
1767
26041
11872
4097
实验五控制结构综合程序设计
1.熟练掌握分支结构、循环结构的综合应用。
2.掌握结构化程序设计的思想及方法。
1.输入一行字符(以#结束),统计其中英文字母、空格、数字和其它字符的个数。
2.输入2个1—1000之间的正整数m和n,输出m—n之间的所有完数,完数就是因子和与它本身相等的数。
例如,factorsum(12)的返回值是16(1+2+3+4+6)。
输入输出示例
Inputm:
1
Inputn:
100
Output:
1,6,28
2.输入一行字符,统计其中单词的个数。
各单词之间用空格分隔,空格数可以是多个。
输入输出示例
Inputwords:
Thesumoftheoddnumbers
Count=6
实验六数组的使用
1.掌握数组的定义、赋值和输入输出方法
2.学习使用数组实现相关算法
1.编写程序,
输入一个正整数(
),再输入n个整数(存入数组a中),输出a中的最大值,最小值及平均值(保留两位小数)
注释:
这里要定义数组中的元素个数至少为10个,即inta[10];
2.餐饮服务质量调查打分
在商业和科学研究中,人们经常需要对数据进行分析并将结果以直方图的形式显示出来。
例如,一个公司的主管可能需要了解一年来公司的营业状况,比较一下各月份的销售收入状况。
如果仅给出一大堆数据,这显然太不直观了,如果能将这些数据以条形图(直方图)的形式表示,将会大大增加这些数据的直观性,也便于数据的分析与对比。
下面以顾客对餐饮服务打分为例,练习这方面的程序编写方法。
假设有40个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),试统计调查结果,并用*打印出如下形式的统计结果直方图。
GradeCountHistogram
15*****
210**********
37*******
...
–定义数组score存放打的分数
–定义数组count为计数器(count[0]不用)
–计算统计结果:
设置一个循环,依次检查数组元素值score[i],是1则将数组元素count[1]加1,是2则将数组元素count[2]加1,依此类推
for(i=0;
i<
STUDENTS;
i++)
{
count[score[i]]++;
}
–打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号’*’
输入40个数据太多,进行测试的时候,可以让计算机生成随机数代替手工输入数据。
3.检验并打印魔方矩阵
在下面的5×
5阶魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
实验七函数的使用
1.掌握函数的定义和调用方法
2.掌握通过参数在函数间传递数据的方法
1.编写简单程题
(1)输入两个数,输出其中较大的数。
要求定义和调用函数intmax(inta,intb);
找出并返回a,b中较大的数
,其中n的值由键盘输入。
要求:
定义和调用函数doublefact(inta);
求取a!
并返回结果。
注:
此题仅作为自定义函数练习使用,这个程序用函数实现效率会很低。
2.给小学生出加法考试题
编写一个程序,给学生出加法运算题,然后判断学生输入的答案对错与否,可以按下列要求以循序渐进的方式编程。
程序1通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!
”,否则显示“Notcorrect!
Tryagain!
”,程序结束。
程序2通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!
”,直到做对为止。
程序3通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!
”,否则提示重做,显示“Notcorrect!
”,最多给三次机会,如果三次仍未做对,则显示“Notcorrect!
Youhavetriedthreetimes!
Testover!
程序4连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!
”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题数。
1.较好的用户输入输出提示
2.使用子函数实现两个数相加的测试。
此函数的输入参数是两个加数,返回值是用户运算的正确与否(用1或者0表示)。
在此函数中首先读入用户输入的加法结果,并与正确结果进行比较。
intAddTest(inta,intb)
;
3.仅仅要求完成程序4的编写调试运行工作,程序1至程序3是对编写程序4的引导。
若可以直接编写出程序4,可以直接编写,如果不能一步编写成功,可以根据引导一步步编写。
选做附加题
通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型为随机产生的加、减、乘、整除中的任意一种,如果输入答案正确,则显示“Right!
”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错题数。
将源程序、运行结果和分析以及实验中遇到的问题和解决问题的方法,写在实验报告上。
实验八数组和函数综合编程练习
1.复习数组和函数的相关知识
2.掌握利用数组存储数据和进行编程的方法
3.进一步掌握函数的编写
1.学生成绩统计
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;
(3)统计各分数段的学生人数及所占的百分比。
将成绩分为六个分数段,60分以下为第0段,60~69为第1段,70~79为第2段,80~89为第3段,90~99为第4段,100分为第5段。
1.较好的用户输入输出提示信息
2.使用子函数来实现上述各个功能
3.最好不要使用全局变量
1.用num[i]存放第i+1个学生的学号,用score[i]存放第i+1个学生的成绩。
设置计数器count,当score[i]<
60分时,计数器count计数一次,并打印num[i]和score[i]。
2.先计算全班平均分aver,当第i个学生的成绩score[i]>
=aver时,打印num[i]和score[i]。
3.各分数段的学生人数保存在数组stu中,用stu[i]存放第i段的学生人数。
对于每个学生的成绩,先计算出该成绩所对应的分数段,然后将相应的分数段的人数加1,即stu[i]++。
供参考的函数原型如下:
/*函数功能:
从键盘输入一个班学生某门课的成绩及其学号
当输入成绩为负值时,输入结束
函数参数:
长整型数组num,存放学生学号
实型数组score,存放学生成绩
函数返回值:
学生总数
*/
intReadScore(longnum[],floatscore[]);
统计不及格人数并打印不及格学生名单
长整型数组num,存放学生学号
整型变量n,存放学生总数
不及格人数
intGetFail(longnum[],floatscore[],intn);
计算全班平均分
实型数组score,存放学生成绩
平均分
floatGetAver(floatscore[],intn);
统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单
成绩在全班平均分及平均分之上的学生人数
intGetAboveAver(longnum[],floatscore[],intn);
统计各分数段的学生人数及所占的百分比
无
voidGetDetail(floatscore[],intn);
2.成绩排名次
某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。
考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数
1.良好的用户输入输出提示信息
2.使用子函数实现各个功能
用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。
a)用函数编程实现计算每个学生的总分;
b)用函数编程实现按总分由高到低对学生成绩排序,注意:
排序时,一维数组sum元素的变化应连同二维数组score和一维数组num和aver一起变化;
c)用函数编程实现查找学号为k的学生在班级中的排名名次及相关成绩等信息,找不到时返回-1值