《C语言程序设计》课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《C语言程序设计》课程设计报告
(2013— 2014学年第 3 学期)
题目:C语言课程设计
专业:软件工程
班级:软件工程技术2班
姓名学号:1307142225
林燕萍
指导教师:吴芸
成绩:
计算机科学与技术系
2014 年6月23日
目录
一、课程设计的目的与要求 (1)
二、方案实现与调试 (3)
2.1 掷骰子游戏 (5)
2.2 射击游戏 (7)
2.3 计算存款本息之和 (8)
2.4肇事逃逸 (10)
2.5 礼炮 (12)
2.6 汽车加油 (14)
2.7 大优惠 (16)
2.8 金币 (19)
三、课程设计分析与总结 (23)
附录程序清单 (25)
一、
二、课程设计的目的与要求(含设计指标)
C语言是一种编程灵活,特色鲜明的程序设计语言。
C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。
这是学习语言的最终目的。
结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C语言程序设计任务书》,以在实训过程中给学生提供帮助。
达到如下目的:
1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能;
2.让学生扎实掌握C程序设计语言的相关知识;
3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。
编写程序要求遵循如下基本要求:
①模块化程序设计
②锯齿型书写格式
③必须上机调试通过
二、方案实现与调试
2.1掷骰子游戏
•2.1.1 题目内容的描述
1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。
2) 将每人每次的分值累加计分
3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。
4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。
最后显示双方分数并判定优胜者。
•2.1.2输入数据类型、格式和内容限制和输出数据的说明
数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方
•2.1.3主要模块的算法描述
本算法的思路过程:首先要随机产生随机数,然后进行算法输出数值,执行条件判断输入结果,最后比较结果,判断胜利的一方。
程序流程图
图1 掷骰子游戏
2.1.4调试过程及实验结果
编辑过程中遇到的困难有:编程思路正确,但是无法正确编写出程序和编程过程缺乏。
图2 掷骰子游戏
2.2射击游戏
•2.2.1题目内容的描述
在程序运行时屏幕上方第一行随机出现一个符号,要求游戏者输入一个1-80之间的整数,当用户输入一个整数后,一个*立即从屏幕底端的该整数列向上移动,若移动到屏幕的顶端能撞上符号,则游戏者获胜;若没有撞上,则要求再输入一个整数,共允许输入5次,如果一直没有撞上,则认为游戏者输。
提示:
1)输入符号可以采用printf("%c",'\1')
2)显示*号向上移动:输出一些空行;输出*号;以循环的方式增加延时
(for(i=0;i<100000;i++););clrscr()清屏重新绘制*号。
•2.2.2输入数据类型、格式和内容限制和输出数据的说明
System(“cls”);清楚屏幕,
•2.2.3主要模块的算法描述
本算法的思路过程:首先清楚屏幕,然后循环每行输出* ,依次循环,判断是否击中目标,最后 5次输入结束,或者击中目标结束。
程序流程图
图3 射击游戏
•2.2.4调试过程及实验结果
该程序在调试过程中出现的问题是:该题中大体循环是以次数,还是循环的结果作为判断,弄不清楚
图4 射击游戏
2.3计算存款本息之和:
*2.3.1题目内容描述
以“存款利率”为关键字上网搜索目前我国整存整取不同期限我国的银行存款利率,只计算一年(3%)、三年(4.25%)和五年(4.75%)三种期限。
问题:
1) 要求输入存钱的本金和期限,求到期能从银行得到的利息与本金合计。
2)假设存款期限为三十年本金为10万,比较一年、三年和五年滚存三十年后
的本息金额。
261036.844 332020.963 359146.175
*2.3.2输入数据类型、格式和内容限制和输出数据的说明 1)数据类型:长整型; 2)内容限制:键入本金与年限; 3)输出数据:本息和PI
•2.3.3主要模块的算法描述
本算法的语言描述:输入限定之内的年份与存款金额,选择对应的年利率计算本息和 程序流程图
图5 计算存款本息之和
•2.3.4调试过程及实验结果
图6 计算存款本息之和
图7 计算存款本息之和
2.4肇事逃逸
•2.4.1题目内容的描述
某部闽DT的出租车交通肇事逃逸,现场无人看清后面的四位数字,但三位目击群众提供信息如下:
1) 车牌号后两位相同;
2) 车牌号前两位相同;
3) 车牌号是一个整数的平方。
请编程查出肇事逃逸车辆的车牌号。
•2.4.2输入数据类型、格式和内容限制和输出数据的说明
1)数据类型:整型;2)内容限制:前两位相同,后两位相同,整数的平方; 3)输出数据:四位整数
•2.4.3主要模块的算法描述
本算法的思路描述:前两位,后两位相同,则前两位用i表示,后两位用均表示,用k 是100以内的两位整数,l表示这个四位数,用循环语句依次判断结果适合公
式:k*k=l=1000*i+100*i+10*j+j,即为肇事车牌号!
程序流程图
图8肇事逃逸
•2.4.4调试过程及实验结果
实验中所遇到的困难是:书写代码时,定义四位车牌号为l,由于字母i与数字1比较像,结果导致混淆。
图9 肇事逃逸
2.5礼炮:
•2.5.1题目内容的描述
鸣放礼炮起源于英国。
据说400多年前英国海军用的是火炮。
当战舰进入友好国家的港口之前,或在公海上与友好国家的舰船相遇时,为了表示没有敌意,便把船上大炮内的炮弹统统放掉,对方的海岸炮舰船也同样做以表示回报。
这种做法以后就逐渐成为互致敬意的一种礼仪。
由于当时最大的战舰装有大炮21门,所以鸣炮21响就成了一种最高礼节。
有四艘战舰ABCD开始鸣放礼炮各21响,已知A战舰每隔5秒放一次,B战舰每隔6秒放一次, C战舰每隔7秒放一次, D战舰每隔8秒放一次.假设各炮手对时间掌握非常准确,请问观众共可以听到几次礼炮声?
•2.5.2输入数据类型、格式和内容限制和输出数据的说明
•2.5.3主要模块的算法描述
本算法的思路过程:根据条件“A战舰每隔5秒放一次,B 战舰每隔6秒放一次, C战舰每隔7秒放一次, D战舰每隔8秒放一次”确定可能性!依次判断,累计听到的次数,得出结果!
程序流程图
图10 礼炮
•2.5.4调试过程及实验结果
程序在调试过程中出现的问题是:编码时要注意“||”,“&&”
图11 礼炮
2.6汽车加油
*2.6.1题目内容的描述
一辆汽车加满油后可行驶n公里。
旅途中有若干个加油站。
设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。
输入:第一行有2 个正整数N和K(1 <= N <= 100,1 <= K< = 100),表示汽车加满油后可行驶N公里,且旅途中有K个加油站。
接下来的1 行中,有K+1 个整数,表示第K个加油站与第K-1 个加油站之间的距离。
第0 个加油站表示出发地,汽车已加满油。
第K+1 个整数表示第K个加油站与目的地的距离。
输出:将编程计算出的最少加油次数输出。
如果无法到达目的地,则输出 No Solution。
(注意:No和Solution之间有一个空格)。
例如:输入:8 8
3 2 3 6 5
4 2 7 2
输出:5
•2.6.2输入数据类型、格式和内容限制和输出数据的说明
1)数据类型:数组类型;
2)内容限制:键入数据:
3)用到的主要语句:循环条件判断;
4)输出数据:加油次数(整型)
•2.6.3主要模块的算法描述
本算法的语言描述是:按题目要求输入数据;首先判断可行驶的路程是否足够汽车到达加油站;如果不能到达,则需要加油,在此处记录一次并循环;得出累计加油次数之和算得出结果。
程序流程图
图12 礼炮
•*2.6.4调试过程及实验结果
实验中所遇到的困难是:循环条件判断错误。
图13 礼炮
2.7大优惠
•2.7.1题目内容的描述
中国移动推出最新的手机资费优惠方案,按照这个方案Tom的手机每天消费1元,每消费K元就可以获赠1元,一开始Tom有M元,问最多可以用多少天?
输入的测试数据为一行,实例包括2个整数M, K(2 <= K <= M <= 1000)。
输出一个整数,表示M元可以用的天数。
10 10 11
50 20 52
•2.7.2输入数据类型、格式和内容限制和输出数据的说明整型,算法的应用,内容数字的限定;
•2.7.3主要模块的算法描述
程序流程图
图14
–简要的语言描述
思考数据间的关系;
分析K与天数的关系;
按M值递减的方式运算;
•2.7.4调试过程及实验结果
实验中所遇到的困难是:
没有注意到题目中给定的限制范围。
注意大小写
图15
2.8金币
•2.8.1题目内容的描述
国王用金币奖励他忠诚的侍从。
第一天侍从工作结束后,国王奖励了他一个金币;接着的两天侍从工作中(第二天,第三天)的每一天,国王奖励了他两个金币;接着的三天侍从工作中(第四天,第五天,第六天)的每一天,国王奖励了他三个金币;接着的四天侍从工作中(第七天,第八天,第九天,第十天)的每一天,国王奖励了他四个金币。
这种奖励的模式将是固定不变的,即在N天侍从工作中的每一天,国王将奖励他N个金币;接着的N+1天的侍从工作中的每一天,国王将奖励他N+1个金币。
要求在给定的天数时,你的程序能够统计国王总共奖励了侍从多少金币。
•2.8.2输入数据类型、格式和内容限制和输出数据的说明
整型,算法的应用,内容数字的限定;
•2.8.3主要模块的算法描述
–以程序流程图的方式给出。
图16
–简要的语言描述
思考数据间的关系;
分析天数与获得金币的关系(类金字塔);
进行总求和;
•2.8.4调试过程及实验结果
实验中所遇到的困难是:循环条件的出口判断不明确;求和处理不简约;
三、课程设计分析与总结
由于上学期在语言的学习方面还有很多不足之处,因此,这次课程设计显得特别吃力,很多不足都暴露了出来。
不过最终还是基本完成了此次课程设计的内容。
在各个实验中解决问题的基本流程是:分析问题→分析解决问题的基本流程→选择合适的算法语句→书写程序→调试修改→按要求书写实验报告。
在这些过程中,我认为分析问题的解决流程最为重要,分析好解决流程之后,就可以清楚的知道自己这一步要干什么,下一步要干什么,思路就显得十分清楚,按照这个流程解决问题是我感觉做得好的一面。
不过也有很多不足,例如:好久没碰C语言了,for, while之类的循环语句的基本功能都模糊了,在选择运用时还要在课本、网络上熟悉这些内容,还有一点就是自己对函数、模块化的思想掌握不够,按照实验要求需运用模块化的方式来解决问题,自己却很少使用这种思想,这就是实验中的不足之处。
总而言通过这次5天的课程设计我进一步了解C程序设计语言的编程功能,握C程序设计语言的相关知识,体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。
众多不足之处我会课余时间进一步加固,力争将这门基础课真正的学好、用好,摆正思想,为以后的专业课的学习大好基础!
最后感谢谢老师的一而再再而三的严格要求及耐心指导,感谢感谢同学们的帮助,谢
谢你们!
附录程序清单
2.1掷骰子游戏:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int i,j,k,b,n,m,add1=0,add2=0;
srand( (unsigned)time( NULL ) ); //生成随机数发生器
for(i=1; i<11; i++)
{
for(b=1;b<60000000;b++);
printf("第一个人第%d次投出的数\n",i);
j=rand()%6+1;
printf("%d\n",j);
k=rand()%6+1;
printf("%d\n",k);
if(k==j==6) add1=add1+8;
if(k==j==5||k==j==4||k==j==3||k==j==2||k==j==1) add1=add1+7;
else
if(k>j)
add1=add1+j;
else
add1=add1+k;
printf("第二个人第%d次投出的数\n",i);
m=rand()%6+1;
printf("%d\n",m); //rand()产生随机数 - 12 -
n=rand()%6+1;
printf("%d\n",n);
if(n==6||m==6) add2=add2+8;
if(n==m==5||n==m==4||n==m==3||n==m==2||n==m==1) add2=add2+7;
else
if(n>m)
add2=add2+m;
else
add2=add2+n;
if(i==6)
if(add1==2*add2||add2==2*add1)
i=10;
}
printf("第一个人分值累加计分%d\n",add1);
printf("第二个人分值累加计数%d\n",add2);
if(add1>add2)
printf("第一个人胜利");
if(add2>add1)
printf("第二个人胜利");
2.2射击游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int i,j,n,t,m;
long int k;
printf("*****************Welcome*****************");
printf("\nGame Begin:\n");
srand((unsigned)time(NULL));
n=rand()%80+1;
for(i=0;i<n;i++)
printf(" ");
printf("%c\n",'\1');
for(m=0;m<5;m++)
{
scanf("%d",&t);
for(j=10;j>0;j--)
{
system("cls");
for(i=0;i<80;i++)
{
if(i==n) printf("%c",'\1');
else printf(" ");
}
for(i=1;i<j;i++)
printf("\n");
for(k=0;k<80;k++)
{
if(k==t) printf("*");
else printf(" ");
}
for(k=0;k<100000;k++);
}
if(t==n)
{
printf("Your Winner\n");
break;
}
if(m==4)
printf("You Lose\n");
}
}
2.3计算存款本息之和
#include <stdio.h>
void main()
{
float m,n,PI;//定义m存款本金,n存款年限,
printf("Please input the principal:");
scanf("%f",&m);
printf("Please input the years:");
scanf("%f",&n);
if(n==1)
{
PI=m*(1+0.03*1);
}
else if(n==3)
{
PI=m*(1+0.425*3);
}
else if(n==5)
{
PI=m*(1+0.475*5);
}
printf("You save:%f\n",PI);
}
2.3.2
#include<stdio.h>
#include<stdlib.h>
main()
{
float i,save,total,profit,term;
while(1)
{
printf("total=");
scanf("%f",&total);
if(total==0)
{
break;
}
printf("Please input the principal:"); scanf("%f",&save);
printf("Please input the years:"); scanf("%f",&term);
if(term==5)
{
for(i=1;i<=30;i=i+term)
{
save=0.0475*save*term+save;
}
printf("You save:%f\n",save);
}
else if(term==3)
{
for(i=1;i<=30;i=i+term)
{
save=0.0425*save*term+save;
}
printf("You save:%f\n",save);
}
else
{
for(i=1;i<=30;i=i+term)
{
save=0.03*save*term+save;
}
printf("You save:%f\n",save);
}
}
}
2.4肇事逃逸
#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j,k,c;
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
c=1000*i+100*i+10*j+j;
for(k=1;k<=(c/2);k++)
{
if((k*k)==c)
printf("肇事逃逸车辆的车牌号为:%d\n",c);
}
}
}
}
2.5礼炮
#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j=1;
for(i=1;i<=168;i++)
{
if(i<=100)
{
if((i%5==0)||(i%6==0)||(i%7==0)||(i%8==0)) j=j+1;
}
else if(i<=120 && i>100)
{
if((i%6==0)||(i%7==0)||(i%8==0)) j=j+1;
}
else if(i<=140 && i>120)
{
if((i%7==0)||(i%8==0)) j=j+1;
}
else
{
if(i%8==0) j=j+1;
}
}
printf("%d\n",j);
}
2.6汽车加油
#include<stdio.h>
void main()
{
int K,N,i,j,i[999],x=0,y=0; //i表示第几个加油站;j为第K个加油站与第K-1个
加油站直接的距离;x表示总距离;*/
printf("输入N K:");
scanf("%d%d",&N,&K);
for(i=0;i<=K;i++)
{
scanf("%d",&j);
l[i]=j;
}
for(i=0;i<=K;i++)
{
if(N<l[i])
{
printf("No Solution.\n");
break;
}
else
x=x+l[i];
if(N<x)
{
y++;
x=l[i];
}
if(i==K)
printf("输出最少加油次数:%d\n",y);
}
}
2.7大优惠
#include<stdio.h>
main()
{
int M,K,i=0;
printf("Please input M and K\n(2<=K<=M<=1000)\n");
scanf("%d%d",&M,&K);
if(2<=K<=M<=1000)
{
while(M>0)
{
i++;
M=M-1;
if(i%K==0) M=M+1;
}
printf("可用天数%d\n",i);
}
else
{
printf("Input is error");
}
}
2.8金币
#include<stdio.h>
#include<stdlib.h>
main()
{
int i,j,money=0,sum=0,days;
printf("please input days=");
scanf("%d",&days);
for(i=1;i<=days;i++)
{
for(j=1;j<=i;j++)
{
money=money+i;
sum=sum+1;
if(sum==days)
{
printf("%d\n",money);
break;
}
}
}
}
2.1。