C语言课程设计报告
指导老师:
1
C语言课程设计报告
一、 C语言课程设计的目的
C语言的教学是学生根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。具体来说: 1. 进一步掌握和利用C语言进行程设计的能力; 2、 进一步理解和运用结构化程设计的思想和方法; 3、 初步掌握开发一个小型实用系统的基本方法; 4、 学会调试一个较长程序的基本方法; 5、 学会利用流程图或N-S图表示算法;
6、 掌握书写程设计开发文档的能力(书写课程设计报告);
二、课程设计报告正文
(1)课程设计题目的原文;
假定民航机场共有n个航班:航班号、起始站、终点站、飞机号、飞机时间、乘员定额、余票量。试设计一民航订票系统,使之能提供下列服务: 航班信息录入功能(文件保存) 完成航班信息浏览功能; 查询航线(至少一种查询方式)。
(2)题目的分析(需求分析);
任务:通过此系统可以实现如下功能:
录入: 可以录入航班情况(数据可以存储在一个数据文件中) 浏览:航班信息浏览功能需要提供显示操作;
查询:可提供按照航班号、起点站、终点站、飞行时间、查询,可以查询某个航
线的情况(如,输入航班号,起飞抵达城市,确定航班是否满仓);另外要提供键盘式选择菜单以实现功能选择。
要求:根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能。
可以建立航班结构体,结构体成员包括航班号、起点站、终点站、飞行时间、预售票总数、已售票数。
(3)整体设计与模块划分;
2
根据需求分析,该程序可分为以下四大模块:
飞机订票系统 输入模块 显示模块 查询模块 退出模块
(4)代码设计;
包括——各功能模块的流程图;重要模块中关键部分的代码分析;关键函数的算法设计和分析;等等;
(一)主函数
(1)分析:主函数的功能比较简单,形式比较简洁,主要功能为:在系统
中没有程序所要的文件时,为程序建立一个所需的文件;调用菜单函数。程序中的各模块都要用到同一个文件,如果该文件不存在,则该程序就无法正常运行,增加第一个功能就是保证文件的可用切可打开!本来只要在主函数里调用各功能模块就行了,但是为了让程序能够方便的回到主函数里,所以就建立了一个菜单函数。
菜单函数的功能是替主函数调用个功能模块函数,因而设计的基本思路很简单,即:用一个输入来接受用户的选择,加以个循环来让输入错误的用户继续输入,直到输入正确为止;用一个switch语句来选择用户所要用到的函数。
(2)程序: void menu() {
int n,w; do {
puts(\"\\***********************MENU***************************\\n\\n\"); puts(\"\\\\ 1.enter new data\"); puts(\"\\\\ 2.Browse all\"); puts(\"\\\\ 3.Search\"); puts(\"\\\\ 4.exit\");
3
puts(\"\\n\\n\\ ***************************************************\\n\"); }
while(w==1); switch(n) { } }
/**********************主函数*********************/ main() { menu(); }
case 1:enter();break; case 2:Browse();break; case 3:Search();break; case 4:exit(0);
printf(\"Choice your number(1-4): [ ]\\b\\b\"); scanf(\"%d\if(n<1||n>4) { }
else w=0;
w=1; getchar();
(二)公共函数
(1)分析:各功能模块中的分程序中的交错的较多,因而,本程序的公共函有5个,这使得各功能模块函数显得简洁,这是程序的一个特点。此处的公共函数的功能较为简单,但他很实用。 (2)程序:
1、把航班信息输入到文件中的函数。 void input(i) {
4
struct flight t;
printf(\"\\nflight_no startstation endstation flytime plan_ticket sell_ticket\\n\");
scanf(\"%d%s%s%s%d%d\e,&t.plan_ticket,&t.sell_ticket);
fp=fopen(\"flydata.txt\
if(!fp){printf(\"can not open this file\\n\");exit(0);} else fwrite(&t,sizeof(struct flight),1,fp); fclose(fp); }
2、输出一个 航班信息函数 void printf_oneflight(int i) {
printf(\"\\n%5d%20s%20s%10s%4d%4d\\n\n,fly[i].endstation,fly[i].flytime,fly[i].plan_ticket,fly[i].sell_ticket); }
3、输出文件内容结构函数 void printf_face() {
printf(\"\\n\NO. startstation endstation flytime sell_ticket\\n\"); }
4、载入函数实现文件内容载入程序,并返回飞机航班数值。 int load() {
FILE *fp; int i;
5
plan_ticket
if((fp=fopen(\"flydata.txt\ { }
for(i=0;!feof(fp);i++)
fread(&fly[i],sizeof(struct flight),1,fp); printf(\"\\nCan not open file\\n\"); exit(0);
fclose(fp); return(i-1); }
5、返回退出函数实现程序退出、返回。 void printf_back() { int w;
printf(\"\\n\\n\Successful.^_^\\n\\n\");
printf(\"What do you want to do?\\n\\n\1).Browse all now\2).back:[]\\b\\b\"); scanf(\"%d\ if(w==1) Browse(); else menu(); }
(三)航班基本信息输入模块
航班信息录入函数:
(1)分析:航班的基本信息,对它们输入后,要存进原文件,采用fwrite函数就可以实现。但是,用该函数存进文件的数据都是以二进制的形式存在的,不是通常所采用的形式,可以改用fprintf函数来实现该功能。不过本程序采用的是fwrite函数。再用户输入完成后,程序会询问是否继续输入,这个功能更具人性化,可以省去返回到主函数在进入这个函数的麻烦!
【流程图]输入信息
6
开始 文件打开否 输入信息 将信息输出到磁盘 输出错误信息 是否继续 调用printf_back()函数 结束
(2)程序: void enter() {
int i,n;
printf(\"How many flights do you want input? :[ ]\\b\\b\"); scanf(\"%d\
printf(\"\\n Enter data now\\n\\n\"); for(i=0;i printf_back(); } 航班信息浏览函数: [流程图]显示信息 7 开始 文件打开 输出错误信息 查找航班信息 是否查找到 删除操作 输入信息 是否继续 结束 显示航班信息: void Browse() { int i,n; n=load(); printf_face(); for(i=0;i if(i%10==0) { printf(\"\\nPress any key to contiune ...\"); getchar(); puts(\"\\n\\n\"); } puts(\"\\n\\n\"); printf_oneflight(i); printf(\"\There are %d record.\\n\ printf(\"\\nPress any key to back ...\\n\"); getchar(); menu(); } 查询模块: 分析:基本信息的查询按查询可供选择的方式比较丰富,可按航班号查询。在查询小模块中采用了直接查找的方法。本模块可以通过多种查询方式进行完善。这是本程序没有做的地方。 [流程图] 开始 文件打开 输出错误信息 查询方式 航班号 此处可以完善其它查询方式 是否继续 结束 程序: void Search() { int m,i,flight_no,flag=0; printf(\"Please input flight_no:\\n\"); scanf(\"%d\ m=load(); for(i=0;i 9 } { flag=1; printf(\"\\nThe flight message is:\\n\"); printf_oneflight(i); } } if(flag==1) printf(\"Found!\"); else printf(\"Not Found!\"); printf_back(); (5)运行与测试报告: 在第一步编程过程中很顺利的编写好了各模块,最后整合成了一个完整的程序,但在调试过程中遇到了许多问题。如一些由于粗心导致分号,括号,字母输错的例子很多。但都很快改正。还有函数调用错误fp=fopen(\"flydata.txt\我在写时丢了fopen结果一直错误,并且发现不了,后来请老师才解决问题。还有写程序中我经常忘记头文件包含命令,以及函数声明,导致调试中出现警告。这让我体会到只有耐心的一行一行的改错误才能把程序调试好。 运行中遇到问题:例如,对数据的写文件操作中,我把存在fly[N]中的数据以fwrite(&fly[N,sizeof(struct flight),1,fp)写入文件,结果发现文件中总是不能出现数据。以至程序不能运行后面部分。后来才发现取得地址错了应改成fwrite(&t,sizeof(struct flight),1,fp)。在机票显示阶段就是这问题让程序出现错误。不能正确读出输入的飞机航班信息。 10 11 三、总结 程序整体上运行与题目要求很吻合,算法大多比较通用,各个函数模块的正确性、完备性、对输入的容错能力以及算法的进一步改进在设计中都有表述,这道题使我熟悉了文件的输入输出操作,真切的感受到了fprintf和fwrite函数的区别! 回顾起此次课程设计,至今我仍感慨颇多,从理论到实践,在整整半个月的日子里,我学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。在设计的过程遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识。 四、程序代码: #include 12 #define N 50 struct flight /*结构体存放航班信息的结构*/ { int flight_no; char startstation[20]; char endstation[20]; char flytime[10]; int plan_ticket; int sell_ticket; }fly[N];/*定义结构体变量*/ FILE* fp; void Browse(); void printf_oneflight(int i); void menu(); void input(i) /* 把航班信息输入到文件*/ { struct flight t; printf(\"\\nflight_no startstation endstation flytime plan_ticket sell_ticket\\n\"); scanf(\"%d%s%s%s%d%d\.plan_ticket,&t.sell_ticket); fp=fopen(\"flydata.txt\ if(!fp){printf(\"can not open this file\\n\");exit(0);} else fwrite(&t,sizeof(struct flight),1,fp); fclose(fp); } void printf_oneflight(int i) /*输出一个 航班信息*/ { printf(\"\\n%5d%20s%20s%10s%4d%4d\\n\y[i].endstation,fly[i].flytime,fly[i].plan_ticket,fly[i].sell_ticket); } void printf_face() /*输出文件内容结构*/ { printf(\"\\n\NO. startstation endstation flytime plan_ticket sell_ticket\\n\"); } 13 int load()/*载入函数实现文件内容载入程序,并返回飞机航班数值*/ { FILE *fp; int i; if((fp=fopen(\"flydata.txt\ { printf(\"\\nCan not open file\\n\"); exit(0); } for(i=0;!feof(fp);i++) fread(&fly[i],sizeof(struct flight),1,fp); fclose(fp); return(i-1); } void printf_back() /*返回退出函数实现程序退出、返回*/ { int w; printf(\"\\n\\n\Successful.^_^\\n\\n\"); printf(\"What do you want to do?\\n\\n\1).Browse all now\2).back:[]\\b\\b\"); scanf(\"%d\ if(w==1) Browse(); else menu(); } void enter()/*航班信息录入*/ { int i,n; printf(\"How many flights do you want input? :[ ]\\b\\b\"); scanf(\"%d\ printf(\"\\n Enter data now\\n\\n\"); for(i=0;i printf_back(); } void Browse() 14 { int i,n; n=load(); printf_face(); for(i=0;i printf(\"\\nPress any key to contiune ...\"); getchar(); puts(\"\\n\\n\"); } puts(\"\\n\\n\"); printf_oneflight(i); } printf(\"\There are %d record.\\n\ printf(\"\\nPress any key to back ...\\n\"); getchar(); /*没有返回植*/ menu(); } void Search()/*查询*/ { int m,i,flight_no,flag=0; printf(\"Please input flight_no:\\n\"); scanf(\"%d\ m=load(); for(i=0;i flag=1; printf(\"\\nThe flight message is:\\n\"); printf_oneflight(i); } } if(flag==1) printf(\"Found!\"); else printf(\"Not Found!\"); printf_back(); } 15 void menu() { int n,w; do { puts(\"\\***********************MENU***************************\\n\\n\"); puts(\"\\\\ 1.enter new data\"); puts(\"\\\\ 2.Browse all\"); puts(\"\\\\ 3.Search\"); puts(\"\\\\ 4.exit\"); puts(\"\\n\\n\\ *******************************************************\\n\"); printf(\"Choice your number(1-4): [ ]\\b\\b\"); scanf(\"%d\ if(n<1||n>4) { w=1; getchar(); } else w=0; } while(w==1); switch(n) { case 1:enter();break; case 2:Browse();break; case 3:Search();break; case 4:exit(0); } } /*********************************主函数***********************************/ main() { menu();/*菜单函数的功能是替主函数调用个功能模块函数*/ } 16 因篇幅问题不能全部显示,请点此查看更多更全内容