C语言课程设计输出水仙花数.docx
《C语言课程设计输出水仙花数.docx》由会员分享,可在线阅读,更多相关《C语言课程设计输出水仙花数.docx(32页珍藏版)》请在冰豆网上搜索。
![C语言课程设计输出水仙花数.docx](https://file1.bdocx.com/fileroot1/2023-2/1/52fef987-09b9-4060-a8cf-d4e13f90f00e/52fef987-09b9-4060-a8cf-d4e13f90f00e1.gif)
C语言课程设计输出水仙花数
C语言程序设计课程设计
评语:
考勤(10)
纪律(10)
过程(40)
设计报告(30)
答辩(10)
总成绩(100)
1引言
1.1设计目的
通过该课程设计来深化对《C程序设计》的学习,深入了解结构循环体,数组,指针以及动态分布内存等技术,熟练掌握对C程序的调试,培养自身的编程习惯,初步掌握程序设计的算法,熟练Word的用法。
进一步培养学生结构化程序设计的思想。
1.2设计要求
⑴问题分析及解决方案框架确定:
充分地分析和理解问题本身,弄清要求做什么。
在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系。
⑵详细设计和编码:
确定算法的主要流程,在此基础上进行代码设计。
⑶上机前程序静态检查:
上机前对程序进行静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
⑷上机调试程序:
在运行环境中执行编写好的程序代码,以便进一步检查程序设计中出现的错误。
1.3设计方法
⑴拟出设计思路
⑵表示出每个函数或过程的作用画出流程图
⑶写出源程序
⑷运行程序
2基础题
2.1题目要求
打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。
例如,153是一水仙花数,因为:
153=13+53+33。
2.2设计思路
本题利用一个for循环语句,求出100到1000以内的三位数,再用if语句找出符合各个位数的立方和等于该数本身的书,即输出水仙花数。
2.3画出流程
2.4编写源程序
#include//主函数
intmain()//定义主函数
{//主函数体开始
intg,s,b,i;//定义g,s,b,i为整型变量
for(i=100;i<1000;i++)//控制循环次数,共循环999次
{b=i/100;//表示百位数字
s=i/10-b*10;//表示十位数字
g=i-b*100-s*10;//表示个位数字
if(i==b*b*b+s*s*s+g*g*g)//判断各个数位数字的立方和为该数本身
printf("水仙花数是:
%-6d",i);//执行循环体,输出水仙花数
}
printf("\n");//换行
return0;//返回函数值为0
}//主函数结束画出流程图
2.5运行结果
执行以上程序,所得的结果如图2.2所示。
图2.2基础题的运行结果
3改错
3.1改错题目
下列给定的程序中,函数fun的功能是:
为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构!
源程序
#include
#include
voidfun(inta,int*b,int*c)
{inti,j,d,y;
for(i=3;i<=a/2;i=i+2)
{
y=0;
for(j=2;j<=sqrt((double)i);j++)
if(i%j==0)y=0;
if(y==1)
{
d=i-a;
for(j=2;j<=sqrt((double)d);j++)
if(d%j==0)y=0;
if(y==1)
{*b=i;*c=d;}
}
}
}
voidmain()
{inta,b,c;
do
{printf("\nInputa:
");
scanf("%d",&a);}
while(a%2);
fun(a,&b,&c);
printf("\n\n%d=%d+%d\n",a,b,c);
}
3.2错误分析
⑴在第九行中y=0逻辑判断为假,操作停止,应改为y=0逻辑判断为真,操作继续执行。
⑵另一个素数因是d=a-i.如果是d=i-a则取得是他的相反数,在执行次过程中计算机输出取它的反码。
改正后的源程序
#include//编译预处理指令
#include//程序中要调用求平方sqrt
voidfun(inta,int*b,int*c)//对fun函数的声明
{inti,j,d,y;//定义整型变量
for(i=3;i<=a/2;i=i+2)//从i=3用递增的方式找到一
个奇数,且这个数小于a/2
{//循环体开始
y=1;//y为逻辑判断值,y=1为真,
执行下列语句
for(j=2;j<=sqrt((double)i);j++)//判别i是否为素数
if(i%j==0)y=0;//如果i不为素数,y=0逻辑
判断为假
if(y==1)//逻辑判断值y==1则i为素
数
{//嵌套内循环
d=a-i;//找偶数的另一个数
for(j=2;j<=sqrt((double)d);j++)//判断另一数d是否为素数
if(d%j==0)y=0;//如果d不为素数,逻辑判
断值y=0为假
if(y==1)//如果d为素数,y==1
{*b=i;*c=d;}//将两目标素数i,d的值分
别赋给指针*b,*c
}
}
}
voidmain()//定义主函数
{inta,b,c;//定义整型变量
do
{printf("\nInputa:
");//向用户提示,输入一个
a值
scanf("%d",&a);//输入a值
}
while(a%2);
fun(a,&b,&c)
printf("\n\n%d=%d+%d\n",a,b,c);//输出a=b+c
}
3.3运行结果
执行以上程序,所得结果如图3.1所示
图3.1改错题的运行结果
3.4流程图
main函数流程图3.2,fun函数流程图3.3
4综合题
4.1题目
飞机订票管理系统
4.2问题描述
假设某航空公司只有M架N个座位的飞机,每架飞机每天飞行一趟。
通过该系统来实现机票的订购问题。
4.3功能要求
一.本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:
起飞地、目的地航班号、座次号码、座次订出与否标记、订座者的姓名和订座者的身份证号码。
⑴本系统显示这样的菜单
①输入航班信息
②输出航班信息
③查找航班信息
a.显示空座的数量
b.显示空座的信息
c.显示已订座的信息
d.起飞时间
④订票预约
⑤删除定票预约
⑥退出系统
⑵本系统成功执行菜单的每个信息,选项4)和5)将要求额外的输入,并且它们都允许用户收回其输入。
⑶查找航班信息既可按线路查,也可按目的地查。
⑷在两次运行之间,数据被保存于一个文件里,当本程序重新开始的时候,它首先从该文件读入数据.
二.算法提示
⑴数据结构:
结构体类型数组;
⑵数据库结构:
下表构成该系统的基本数据库。
航班号
起飞时间
目的地
座次号
座次订出与
否的标记
订票者名
订票者身份证号码
int
char
char
int
char
char
char
4.4设计思路
订票函数(voidbook())
⑴定义局部变量i
⑵调用voidsearch()函数并把输入变量值赋给i
⑶判断i的值并输出相关提示信息
4.5流程图
图4.1book()函数的流程图
图4.2search()函数流程图
4.6源程序
⑴book()函数
voidbook()
{
inti;
system("cls");
printf("欢迎进入售票窗口!
\n");
i=search();
if(i!
=-1)
{
if(ti[i].num>=ti[i].max)
{
printf("\n该趟航班票已售完!
");
}
else
{
ti[i].num++;
printf("\n订票成功!
\n");
}
}
else
printf("该航班不存在!
\n");
getchar();
getchar();//按任意健
menu();
}
⑵search()函数
intsearch()//查找模块
{
inti,k;
structplanes;
k=-1;
system("cls");
printf("\n\n请输入要订票的起飞地点:
");
scanf("%s",s.BePlace);//输入要到达的地方
printf("\n\n请输入要订票的降落地点:
");
scanf("%s",s.EnPlace);
printf("\n\n请输入要订票的起飞时间:
")
scanf("%s",s.data);//输入出发的时间
puts("\n-------------------------------------------------------------------------------");
printf("\n\t航班代号飞行路线起飞地点降落地点起飞时间票价最大乘客已售票数\n");
for(i=0;i{
if(strcmp(s.BePlace,ti[i].BePlace)==0&&strcmp(s.EnPlace,ti[i].EnPlace)==0&&strcmp(s.data,ti[i].data)==0)
{
k=i;//找到要修改的记录
printf_one(k);
break;//调用显示一个记录的函数
}
}
if(k==-1)
{
printf("\n\nNOexist!
");
return-1;
}
else
returnk;
}
4.7运行结果
执行上述子函数程序的运行结果如图4.1所示
图4.1订票系统运行结果
4.8总结
通过本次课程设计让我加深了对《C程序设计》的学习,认真的设计画出流程图,编写源程序,进行调试,不断改错,最后得出正确的运行结果。
通过这一系列的操作让我更好的初步掌握了计算机编程的能力。
以及对C程序的设计思路,提高自己动手和动脑的能力。
同时也让自己更细心,认真注意自己所编译的每个字符.。
其次,也让我更好的掌握了用Word画流程图,以及许多我之前所不知道的
关于Word的一些用法及用途。
这次课程设计锻炼了我的上机能力,也加强了我的实践能力。
一次次的失败,一次次的修改与重新再来。
列如页眉页脚的修改,在这过程中每一次对段落的修改,页脚的页码都会出错,让我很纠结。
经过我努力以及同学的帮助终于将错误排除,这次努力也加强了我毅力,让我更好的学习。
在用Word的过程中对于一些行距的要求经常出错,主要是在标题与正文的行距搞错还有英文经常新罗马与宋体搞错。
以及字体宋体与黑体经常出错。
等等这些方面,让我知道这其中有很多细节需要我仔细注意。
这其中最让我费劲的是用Word画流程图,这其中主要是线头的对齐,这让我佷纠结,最后我将每条线段的长度都调成一样,有的甚至精确到小数点3位。
还好经过自己的努力,最后还是成功了。
在计算机前一爬就是三,四个小时,说实话真的很累,尤其对我来说,来自农村,对计算机本来就不熟悉,对于Word也就是高中上过的几堂课的认识,对其只知道最简单几种操作。
现在让我熟练运用Word是很大的挑战,但经过我的努力我相信我会成功。
总而言之,衷心的感谢老师的指导以及同学帮助,让我在这次课程设计中学到了很多,让我取得了很大的进步。
5附录
5.1飞机订票系统总源程序
#include
#include
#include
#defineN1000
typedefstructplane
{
charID[10];//航班代号
charBePlace[10];//飞机起飞地点
charEnPlace[10];//飞机降落终点
chardata[15];//飞机起飞时间
charline[10];//飞机飞行路线
intmax;//飞机最大乘客人数
intprice;//飞机票价
intnum;//飞机已售票数
}
PLANE;
PLANEti[N];
intn;//当前的航班数目
voidmenu();
voidmenu1();
voidinput(inti)
{
printf("请输入航班代号:
\n");
scanf("%s",ti[i].ID);
printf("请输入航班飞行路线:
\n");
scanf("%s",ti[i].line);
printf("请输入起飞地点:
\n");
scanf("%s",ti[i].BePlace);
printf("请输入降落地点:
\n");
scanf("%s",ti[i].EnPlace);
printf("请输入起飞时间:
\n");
scanf("%s",ti[i].data);
printf("请输入航班的最大载客人数:
\n");
scanf("%d",&ti[i].max);
printf("请输入航班的票价:
\n");
scanf("%d",&ti[i].price);
ti[i].num=0;
}
voidenter()
{
inti;
system("cls");
printf("请输入航班的数目(0-%d)?
:
",N);
scanf("%d",&n);//要输入的记录个数
printf("\n请输入数据\n\n");
for(i=0;i{
printf("\n请输入第%d航班记录.\n",i+1);
input(i);//调用输入函数
}
getchar();
menu();
}
voidprintf_one(inti)//记录的函数
{
printf("%11s%8s%6s%8s%6s%6d%6d%6d",ti[i].ID,ti[i].line,ti[i].BePlace,ti[i].EnPlace,ti[i].data,ti[i].price,ti[i].max,ti[i].num);
}
voidsearch_way()
{
inti,m=0;
structplanes;
system("cls");
printf("\n\n请输入飞行路线:
");
scanf("%s",s.line);//输入路线
puts("\n--------------------------------------------------------------------------------");
printf("\n\t航班代号飞行路线起飞地点降落地点起飞时间票价最大乘客已售票数\n");
for(i=0;i{
if(strcmp(s.line,ti[i].line)==0)
{
m++;
if((m!
=0)&&(m%10==0))//目的是分屏显示
{
printf("\n\nPressanykeytocontiune...");
getchar();
puts("\n\n");
}
printf_one(i);
printf("\n")//调用显示一个记录的函数
}
}
puts("\n--------------------------------------------------------------------------------");
getchar();//按任意健
getchar();
menu1();
}
voidsearch_end()
{
inti,m=0;
structplanes;
system("cls");
printf("\n\n请输入目的地:
");
scanf("%s",s.EnPlace);//输入要到达的地方
puts("\n-------------------------------------------------------------------------------");
printf("\n\t航班代号飞行路线起飞地点降落地点起飞时间票价最大乘客已售票数\n");
for(i=0;i{
if(strcmp(ti[i].EnPlace,s.EnPlace)==0)
{
m++;
if((m!
=0)&&(m%10==0))//目的是分屏显示{
printf("\n\nPressanykeytocontiune...");
getchar();
puts("\n\n");
}
printf_one(i);//调用显示一个记录的函数
printf("\n");
}
}puts("\n-----------------------------------------------------------------------------");
getchar();//按任意健
getchar();
menu1();
}
voidmenu1()
{
intn,w1;
do
{
system("cls");//清屏
puts("\n\t\t\t\t*航班查询*\n\n");
puts("\t\t*********************MENU*********************\n\n");puts("\t\t\t\t1.按照路线查找航班");
puts("\t\t\t\t2.按照目的地查找航班");
puts("\t\t\t\t3.返回主菜单");puts("\n\n\t\t**********************************************\n");printf("Choiceyournumber(1-3):
[]\b\b");
scanf("%d",&n);
if(n<1||n>3)//对选择的数字作判断
{
w1=1;
printf("yourchoiceisnotbetween1and3,Pleaseinputagain:
");
getchar();
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)//选择功能
{
case1:
search_way();break;
case2:
search_end();break;
case3:
menu();break;
}
}
intsearch()//查找模块
{
inti,k;
structplanes;
k=-1;
system("cls");
printf("\n\n请输入要订票的起飞地点:
");
scanf("%s",s.BePlace);//输入要到达的地方
printf("\n\n请输入要订票的降落地点:
");
scanf("%s",s.EnPlace);
printf("\n\n请输入要订票的起飞时间:
");
scanf("%s",s.data);//输入出发的时间
puts("\n-------------------------------------------------------------------------------");
printf("\n\t航班代号飞行路线起飞地点降落地点起飞时间票价最大乘客已售票数\n");
for(i=0;i{
if(strcmp(s.BePlace,ti[i].BePlace)==0&&strcmp(s.EnPlace,ti[i].EnPlace)==0&&strcmp(s.data,ti[i].data)==0)
{
k=i;//找到要修改的记录
printf_one(k);
break;//调用显示一个记录的函数
}
if(k==-1)
{
printf("\n\nNOexist!
");
return-1;
}
else
returnk;
}
voidbook()
{
inti;
system("cls");
printf("欢迎进入售票窗口!
\n");
i=search();
if(i!
=-1)
{
if(ti[i].num>=ti[i].max)
{
printf("\n该趟航班票已售完!
");
}
else
{
ti[i].num++;
printf("\n订票成功!
\n");
}
}
else
printf("该航班不存在!
\n");
getchar();
getchar();//按任意健
menu();
}
voidback()
{
inti,k=-1;
structplanes;
system("cls");
printf("欢迎进入退票窗口!
\n");
printf("\n\n输入航班代号:
");
scanf("%s",s.ID);//输入要到达的地方
puts("\n-------------------------------------------------------------------------------");
printf("\n\t航班代号飞行路线起飞地点降落地点起飞时间票价最大乘客已售票数\n");
for(i=0;i{