南华大学C语言实验报告.docx
《南华大学C语言实验报告.docx》由会员分享,可在线阅读,更多相关《南华大学C语言实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
![南华大学C语言实验报告.docx](https://file1.bdocx.com/fileroot1/2023-7/26/7e22d3c5-686b-412d-94cb-9d0fa969e0ab/7e22d3c5-686b-412d-94cb-9d0fa969e0ab1.gif)
南华大学C语言实验报告
南华大学
计算机科学与技术学院
实验报告
(2015~2016学年度第1学期)
课程名称
高级程序设计I
实验名称
C语言实验报告
姓名
刘让洲
学号
20140440734
专业
计算机类
班级
14级计类07班
地点
教师
罗江琴
实验一:
计算定期存款本利之和
1.实验题目及要求
设银行定期存款的年利率rate为2.25%,并已知存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。
要求定期存款的年利率rate、存款期n和存款本金capital均由键盘输入。
2.实验内容
1)流程图:
1.正确从键盘读入数据。
2.把读入的数据带入公式计算即可。
2)源程序
#include
#include
#include
voidmain()
{
intn;
floatdeposit,rate,capital;
printf("请输入存款金额capital:
");
scanf("%f",&capital);
fflush(stdin);
printf("请输入存款年限n:
");
scanf("%d",&n);
fflush(stdin);
printf("请输入年存款利率rate:
");
scanf("%f",&rate);
deposit=capital*pow((rate+1),n);
printf("%d年以后您的余额为:
%.2f",n,deposit);
}
4.实验运行结果及分析
5.实验总结:
注意格式控制符的匹配,定义的是float型,scanf中一定要是%f,我就因为这个错误,错了好几次;还有,scanf是取地址,&这个符号一定要注意加上,不然也会出错,我也好几次忘记这个&符号,找错找了好久。
实验二-1:
身高预测
1.实验题目及要求
编程从键盘输入你的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对你的身高进行预测。
2.实验内容
1)流程图
1.首先根据提示,要求输入父母的身高。
2.选择性别:
根据读入的是M还是F进行选择。
2.1如果是M,则身高Height=(faHeight+moHeight)*0.54
2.2如果是F,则身高Height=(faHeight*0.923+moHeight)/2
3.提示是否喜欢体育锻炼
3.1如果喜爱体育锻炼,则身高Height增加2%;
4.提示是否有良好的卫生习惯
4.1如果有,则身高Height增加1.5%;
5.输出预测身高
2)源程序
#include
#include
voidmain()
{
charsex,sports,diet;
floatfaHeight,moHeight,Hight;
printf("请输入你的性别MorF:
(M/男F/女)\n");
scanf("%c",&sex);
fflush(stdin);
printf("请输入你父亲的身高(cm):
\n");
scanf("%f",&faHeight);
fflush(stdin);
printf("请输入你母亲的身高(cm):
\n");
scanf("%f",&moHeight);
fflush(stdin);
switch(sex)
{
case'M':
Hight=(faHeight+moHeight)*0.54;
break;
case'F':
Hight=(faHeight*0.923+moHeight)/2;
break;
}
printf("你喜欢体育锻炼吗?
(Y/N):
\n");
scanf("%c",&sports);
if(sports=='Y')
Hight*=(1+0.02);
fflush(stdin);
printf("你有良好的卫生饮食习惯吗?
(Y/N):
\n");
scanf("%c",&diet);
if(diet=='Y')
Hight*=(1+0.015);
printf("你的身高预测为:
%.0fcm",Hight);
}
4.实验运行结果及分析:
5.实验总结
本实验主要根据用户的输入进行判断,利用switch或者if语句进行相应的选择。
需要注意的是,身高定义为float型,因为要进行浮点运算。
但最后结果不输出小数。
同时,每次输入数据之前,记得请输缓冲区,避免出现错误;
实验二-2:
简单计算器
1.实验题目及要求
编程设计一个简单的计算器程序,要求根据用户从键盘输入如下形式的表达式:
操作数1运算符op操作数2
然后,计算并输出表达式的值
指定的运算符为
加(+)
减(-)
乘(*)
除(/)
2.实验内容
1)流程图
1.提示输入;
2.根据输入的运算符,利用switch语句对输入的运算符进行判断,然后进行相应的计算。
2.1进行除法时,除数不能为0;当输入的除数为0时,提示除数不能为0;
3.输出打印结果,
4.利用do-while循环,多次计算。
直到用户输入N时结束。
2)源程序
#include
#include
voidmain()
{
intdata,data1,data2,length;
charop,reply;;
do{
printf("请输入需要计算的式子(如:
1+2):
\n");
scanf("%d%c%d",&data1,&op,&data2);
switch(op)
{
case'+':
data=data1+data2;
break;
case'-':
data=data1-data2;
break;
case'*':
data=data1*data2;
break;
case'/':
if(0==data2)
printf("除数不能为0.");
else
data=data1/data2;
break;
}
if(data2==0)
;
else
printf("%d%c%d=%d\n",data1,op,data2,data);
printf("需要继续计算吗?
(YorN)\n");
fflush(stdin);
scanf("%c",&reply);
}while(reply=='Y');
printf("计算结束!
");
}
4.实验运行结果及分析:
5.实验总结
本实验综合应用lswitch语句和do-while循环语句进行多次计算操作;需要注意设置do-while循环结束的标志,否则会进入死循环。
实验三:
猜数游戏
1.实验题目及要求
编程先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,且结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。
每次运行程序可以反复猜多个数,直到操作者想停止时才结束。
2.实验内容
1)流程图
1.首先利用随机函数产生一个1-100之间的随机数,初始化计数器。
2.提示用户输入一个数。
3.把用户输入的数与产生的随机数进行比较,并提示用户是大了还是小了;
4.用户根据提示,再猜一个数。
5.反复执行3和4,直到用户猜对或者超过十次,结束当前循环;
6.提示用户是否需要再来一次;
2)源程序
#include
#include
#include
#include
voidmain()
{
intmagic,guess,counter;
charreply;
//产生随机数种子
srand((unsigned)time(NULL));
//首先由系统产生一个1—100之间的数字,并初始化计数器
do{
magic=rand()%100+1;
counter=0;
do{
printf("pleaseguessamagicnumber:
\n");
scanf("%d",&guess);
counter++;
if(guess>magic)
printf("Wrong!
Toohight!
\n");
elseif(guessprintf("Wrong!
Toolow!
\n");
else
printf("Rihgt!
Youaresoclever!
\n");
}while(guess!
=magic&&counter<10);
printf("counter=%d\n",counter);
fflush(stdin);//清除缓冲区
printf("DoYouWantToContinue?
(Y/Nory/n)\n");
reply=getchar();
printf("\n");
}while(reply=='Y'||reply=='y');
printf("TheGameIsOver!
");
}
4.实验运行结果及分析:
5.实验总结
需要设置双重循环,内层循环用于统计猜的次数及是否猜对,外层循环用于是否需要再来一次;需要注意刘勇fflush(stdin)清除缓冲区,否则可能会因读入空格而结束程序;
实验四:
小学生加法考试题
1.实验题目及要求
连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!
”,否则显示“Notcorrect!
”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题目数量。
2.实验内容
1)流程图
1.首先通过随机函数产生两个1-10之间的整数。
2.循环调用函数,提示输出产生的两个相加,并要求输入两个数相加的结果。
3.对输入的结果进行判断。
3.1如果输入的答案正确,提示答对了,同时,score加10;
3.2如果输入的答案错误,提示答错了,并显示正确答案,错误计数器加1,score不累加。
4.直到调用函数10次,退出循环,并输出分数及错误计数器的值。
5.提示用户是否需要再来一次。
5.1如果输入Y,则再次进入循环,执行上面2-4步骤。
5.2如果输入N,则结束所有循环。
2)源程序
#include
staticintscore=0;
staticintcount=0;
voidmain()
{
inti=1;
charreply;
do{
intscore=0;
intcount=0;
do{
inta,b;
srand(time(NULL));
a=rand()%10+1;
b=rand()%10+1;
AddTest(a,b);
i++;
}while(i<=10);
printf("\n");
printf("你的得分为:
%d分!
",score);
printf("你错了%d道题目!
\n",count);
printf("Doyouwanttotryagain!
(YorN):
\n");
fflush(stdin);
scanf("%c",&reply);
}while(reply=='Y');
printf("\n");
printf("已经退出!
");
}
voidAddTest(inta,intb)
{
intanswer;
printf("计算:
%d+%d=\n",a,b);
scanf("%d",&answer);
if(answer==a+b)
{
printf("恭喜你,答对了!
\n");
score+=10;
printf("\n");
}
else{
printf("很遗憾,答错了!
\n");
printf("正确答案是:
%d\n",a+b);
printf("\n");
count++;
}
4.实验运行结果及分析
5.实验总结
通过这个例子,对循环以及选择结构有了更好地认识。
这次实验需要注意,怎么对每次的分数以及错误次数累加。
我采用的是静态全局变量,并且,当用户需要再来一次是,把count和score再次置0;
实验五-1:
检验并打印魔方矩阵
1.实验题目及要求
在下面的5×5魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后,检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。
2.实验内容
1)流程图
1.定义二维数组,存储输入的数据。
2.累加二维数组的每行每列以及对角线上的元素的和。
3.判断每行每列以及对角线上的元素和是否相等。
4.输出数组以及判断结果。
2)源程序
#include
#defineN6
voidmain()
{
inta[N][N];
inti,j,sum1=0,sum2=0,flag;
//读入矩阵。
for(i=1;ia[i][0]=0;//数组第一行元素初始化为0,用来累加每一列的和;
for(j=1;ja[0][j]=0;//数组第一列初始化为0,用来累加每一行的和;
scanf("%d",&a[i][j]);
}
}
//用多出来的一行和一列来累加每行和每列之和;
//sum1和sum2累加两条对角线之和;
for(i=1;isum1+=a[i][i];//不要放进里面去了。
因为放在里面,调试好久。
sum2+=a[i][6-i];
for(j=1;ja[i][0]+=a[i][j];
a[0][j]+=a[i][j];
}
}
//输出矩阵
for(i=1;ifor(j=1;jprintf("%-4d",a[i][j]);
if(j=5)
printf("\n");
}
//判断矩阵是否为魔方矩阵,并设置标志。
for(i=1;i<6;i++){
if((a[0][i]!
=a[i][0])||(a[0][i]!
=sum1)||(a[i][0]!
=sum2))
flag=0;
else
flag=1;
}
//根据标志来判断是否为魔方矩阵。
if(flag==1)
printf("该矩阵是魔方矩阵\n");
else
printf("该矩阵不是魔方矩阵\n");
printf("每行和每列以及两条对角线的之和都为:
%d",sum1);
}
4.实验运行结果及分析
5.实验总结
本次实验主要对二维数组进行操作。
要思考怎么读入二维数组,怎么检验每一行每一列以及对角线上的元素相加是否相等。
刚开始,我对这样的题感到手足无措,可是后来耐着性子,慢慢琢磨,发现其实也并不是难,只要掌握规律,弄清楚思路,一步一步来,经过不断的调试和改进,我终于做出来。
好吧,让我们来理一下思路。
题目要求得的是,对输入的5*5的矩阵进行判断,我们可以定义一个6*6的矩阵,矩阵的第一行以及第一列都初始化为0(不初始化,我这里老是出现乱码,应该来说,定义好数组,不进行赋值时,会自动初始化为0,可能是我机器的问题,反正初始化为0,以保万全吧),多出来的一行和一列用来累加没一行和每一列的和,当然,同时,我也定义了两个整形变量来记住两条对角线上和。
最后,对每行每列的和以及对角线的和进行判断,这里,我们设置了一个标志,最后的输出是对标志进行判断是否是魔方矩阵。
实验五-2:
餐饮服务质量调查打分
1.实验题目及要求
有40个学生被邀请给自助餐厅的食品和服务质量打分(1~10等级),统计调查结果,并用*打印如下形式的统计结果直方图
GradeCountHistogram
15*****
210**********
37*******
2.实验内容
1)流程图
1.定义两个数组,一个数组a[]用来存储学生所打的分数。
另一个数组count[]用来累加每个等级的个数。
2.利用循环,对数组中的每个元素判断,是几就在count[a[i]]中累加1.
3.再次利用循环,打印count[1]-count[10]的值,并根据期的值打印相应个数的*号。
2)源程序
#include
#defineN40
voidmain()
{
inti,j,k,count[11];
inta[N]={1,1,1,1,1,2,7,2,5,5,5,4,4,8,8,8,9,2,
9,10,5,7,4,3,7,8,9,10,10,9,7,8,9,5,6,7,9,3,10,8};
for(k=1;k<11;k++)
count[k]=0;
for(i=0;icount[a[i]]++;
printf("统计结果如下:
\n");
printf("GradeCountHistogram\n");
for(i=0;i<10;i++){
printf("%-8d%d",i+1,count[i+1]);
for(j=0;jprintf("*");
printf("\n");
}
}
4.实验运行结果及分析
5.实验总结
本实验对数组进行了综合的应用,而且还要带点技巧,不然会很麻烦呢。
除了数组,对前面的循环结构也进行了复习。
通过本次实验,对数组有了更深的理解,除了前面那种需要找规律的,这种需要技巧性的数组也很好玩。
需要好好掌握。
实验六:
学生成绩统计
1.实验题目及要求
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单;
(3)统计各分数段的学生人数及所占的百分比;
2.实验内容
1)流程图
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.将成绩分为六个分数段,60分以下为第0段,60~69为第1段,70~79为第2段,80~89为第3段,90~99为第4段,100分为第5段,因此,成绩与分数段的对应关系为:
4.各分数段的学生人数保存在变量count1-count5中,对于每个学生的成绩,先计算出该成绩所对应的分数段,然后将相应的变量的人数加1,即count++。
2)源程序
#include
#defineN10
voidmain()
{
intnum[N]={2014001,2014002,2014003,2014004,
2014005,2014006,2014007,2014008,2014009,2014010};
intscore[N],i=0;
floatsum=0,aver,count=0,count1=0,count2=0,
count3=0,count4=0,count5=0,count6=0;
for(i=0;iprintf("请输入学号为:
%d的成绩:
\n",num[i]);
scanf("%d",&score[i]);
sum+=score[i];
if(score[i]<60)count++;
elseif(score[i]<70)count1++;
elseif(score[i]<80)count2++;
elseif(score[i]<90)count3++;
elseif(score[i]<100)count4++;
elsecount5++;
}
printf("\n");
printf("不及格人数名单如下:
\n");
for(i=0;iif(score[i]<60)
{
printf("学号:
%d成绩:
%d\n",num[i],score[i]);
}
}
printf("总计%.0f人\n",count);
aver=sum/N;
printf("\n平均分为:
%.2f\n",aver);
printf("\n成绩在平均分以上的学生有:
\n");
for(i=0;iif(score[i]>aver)
{
printf("学号:
%d成绩:
%d\n",num[i],score[i]);
count6++;
}
}
printf("总计%.0f人\n",count6);
printf("\n");
printf("不及格人数为:
%.0f所占百分比为:
%.0f%%\n",count,count/N*100);
printf("69-69分人数为:
%.0f所占百分比为:
%.0f%%\n",count1,count1/N*100);
printf("70-79分人数为:
%.0f所占百分比为:
%.0f%%\n",count2,count2/N*100);
printf("80-89分人数为:
%.0f所占百分比为:
%.0f%%\n",count3,count3/N*100);
printf("90-99分人数为:
%.0f所占百分比为:
%.0f%%\n",count4,count4/N*100);
printf("100人数为:
%.0f所占百分比为: