学生成绩管理 目 录 1 问题定
义 …………………………………………………………………………..1 2 系统设计 ……………………………………………………………………2 2(1 总体设计………………………………………………………………………………3 2(2 详细设计………………………………………………………………………………5
2.2.1 数据结构设计 ……… …………………………………………………6 2.2.2 主控流
程 …………………………………………………………………………7
2.2.3 函数功能描
述 …………………………………………………………………….7 3 系统实现 ………………………………………………………………………8 3.1 编码 ………………………………………………………………………9
3.1.1 程序预处
理 ……….……………………………………………………………10
3.1.2 主函数
main() ……….………………………………………………………..12
3.1.3 主菜单界面 ………….………………………………………………………. 13
3.1.4输入商品
信 …….………………………………………………………………….15
3.1.5查找商品信
息………….…………………………………………………………….16
3.1.6录入商品信
息 ……….……………………………………………………………..17
3.1.7显示商品信
息………….…………………………………………………………….18
3.1.8添加商品信
息………….………………………………………………………18 3.2 测试与调试 ………………………………………………………………………20
3.2.1 概述 ………….……………………………………………………………20 3.2.2 程序测
试 ………….……………………………………………………………21 4 系统维护 ………………………………………………………………………21 5 归纳总结 ………………………………………………………………………21 5.1 开发经验 ………………………………………………………………………22 5.2 实训中遇到的问题及解决方法 ………………………………………………22 5.3 设计中的不足之处……………………………………………………………………23 5.4 感想和心得体会 ……………………………………………………………………23 6 参考资料 ………………………………………………………………………23
前 言
课程设计环节是应用型本科院校非常重要的一个教学环节,是学完一门课后应用本课知识及以前的知识积累而进行的综合性、开放性的训练。通过课程设计,不仅能够使学生得到系统的技能训练,巩固和加强所学得专业理论知识,而且能够培
养学生工程意识、创新能力、团队精神等综合素质,培养学生的设计能力和解决实际问题的能力。
C语言由于其强大的功能,丰富的表达能力,高效的代码,良好的移植性和灵活性,自
1
C语言课程设计
1972年问世以来,经久不衰,即使现在出现了面向对象的程序设计方法和开发工具,但它仍然是人们学习程序设计的首选语言,用它训练和提高编程技术,以及开发应用程序等。
我们通过《C语言程序设计》这门课程的学习,已经能编写解决小问题的程序,对程序的开发也有了初步的认识,还掌握了C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以完成自我任务的成就感。但是,对于程序设计而言,学习C 的步伐不应该停留于此。我们最终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设计思想,用C 语言开发出解决复杂问题的大型综合程序。可是对于多数学生来说,学习了C语言后,除了应付各种考试之外,别无它用,对Turbo C语言丰富的函数知之甚少,加上DOS环境所限,因而对C语言兴趣不大,也感到C语言比较难以掌握。
本实训就是为了让学生在学完C语言后进一步了解C语言的知识,掌握C语言在软件开发方面的使用方法,希望通过此次实训,不仅能提高学生学习C语言的兴趣,更为今后学习其它专业知识及开发程序打下坚实的基础。
本指导书中有些内容借鉴了互联网上相关程序的设计思想,在此对相关者表示衷心的感谢。
由于时间、经验及水平的原因,不当、不足之处,请大家提出宝贵意见。 编者
桂林电子科技大学信息科技学院 商品管理系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。本程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用文件保存实现对商品管理管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。 1、问题定义
2
学生成绩管理
制作一个商品管理系统,功能包括商品录入、商品排序、商品查找、商品存储与读入、按条件输出商品单价等。
图1.1 商品管理系统功能需求
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计 2(1 总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
商品管理系统
输入商品显示商品查找商品信息 添加商品退出系统 信息 信息 信息 图2.1
按件输从从按打选按按输按 入 单入任文键序开择单序信 价0 意件盘号文查价 号 息 查,读输查找件 键 存询 方入 入 询 入式 文
3
图2.1 学生成绩管理系统功能模块图 C语言课程设计
本商品管理系统采用文件保存实现,如图2.1所示,它由如下五大功能模块组成:
, 输入商品信息模块。完成将信息输入文件的工作。信息以二进制形式存储的数据文件中
读入。商品信息由商品序号,商品生产商,商品单价构成。 , 显示商品模块。完成商品信息的输入后,可以选择打开商品信息存入的文件,并按照商
品号或者商品单价的排序形式输出商品信息。
, 查找商品信息模块。查找要找的商品信息,打开商品存入的文件并输入商品号显示要查
找的商品信息。
, 添加商品模块。将新添的商品信息存储入指定的文件。 , 退出系统模块。输入0按回车键退出商品管理系统。
2(2 详细设计 2.2.1数据结构设计 , 商品信息结构体 typedef struct {
char name[30]; /*商品名称*/ int num; /*商品号*/
char shang[10]; /*商品生产厂家*/ float price; /*商品单价*/ }record;
结构体struct student将用于存储商品信息,它将存储到指定的文件。 2.2.2 主控main()函数执行流程 开始
新建一个文件,以写入的方式写入文 件 以可读的方式打开指定的文件 调用菜单函数
进入while(1)主循环,运用switch语4 句
输入[0,4]中的一个数值, 选择相应操作 学生成绩管理
本成绩管理系统执行主流程如图2.2所示。它先创建文件,将商品信息输入文件,并按提示输入数字(0-4)打开文件,通过文件读写来实行商品的显示和添加等。
在选择功能时,有效的输入为本0至4之间的任意数值,其他输入都被视为错误按键。若输入为0(即变量fn=0),它会显示退出系统,并按任意键退出。
若选择1,则调用void DataInput(record *com, int *nptr)函数,执行输入商品信息操作;若选择2,则调用void DataDisPlay( ) 函数,执行商品显示操作;若选择3,则调用void DataFind( ) ;
函数,执行商品查找操作;若选择4,则调用void DataAdd( )函数,执行商品信息添加操作;若选择5,则调用void DataStatistic( )函数,执行退出系统操作。
2.2.3 函数功能描述
DataInput(record *st, int *q)
函数原型:void DataInput(record *st, int *q)
DataInput(record *st, int *q)函数用于输入商品信息,写入文件中 。。
DataStorage(record *st, int n)
函数原型:void DataStorage(record *st, int n)
DataStorage(record *st, int n)函数用于将商品信息存储入文件中。 DataFind( ) 5
C语言课程设计
函数原型:void DataFind( )
DataFind( )函数用于商品信息的查找。
DataDisPlay( )
函数原型:void DataDisPlay( )
DataDisPlay( )函数用于显示商品信息,按指定的顺序显示出来。 void DataAdd( )
函数原型:void void DataAdd( )
void DataAdd( )函数用于添加商品信息,写入并存储到指定的文件当中。 , 主函数main()
整个成绩管理系统控制部分,其详细说明可参考图二。
完成在上述系统设计后,即可着手进行系统实现的工作,开始程序代码的编写。 3、系统实现
3(1 编码
3.1.1 程序预处理
包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。 #include #include char name[30]; int num; char shangjia[10]; float price; }record; void DataInput(record *st, int *q); int DataRead(record *st,int *q) ; void DataStorage(record *st, int n); /*信息保存到文件*/ void DataFind( ); void DataDisPlay( ); void DataAdd( ); 6 学生成绩管理 3.1.2主函数main() main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。详细分析可参 考图2。 int main( ) { record shangpin[S]; int number=20; /*设商品数*/ char a; printf(\"\~~~~~~~欢迎进入我的商品管理系统~~~~~~~~\\"); 3.1.3主菜单界面 用户进入商品管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。 while(1) { printf(\"\\n\\1.录入商品\\n\"); /*显示主菜单*/ printf(\"\\2.显示商品\\n\"); printf(\"\\3.查找商品\\n\"); printf(\"\\4.添加商品\\n\"); printf(\"\\0.退出\"); printf(\"\\n\,,,,,,,,,,,,,,,,\\n\"); printf(\"\请输入你的一个选项(数字0-4): \"); fflush(stdin); scanf(\"%c\puts(\"\\n\"); switch(a) /*切换到不同功能*/ { case '1': DataInput(shangpin, &number ); break; /*录入信息*/ case '2': 7 C语言课程设计 DataDisPlay(shangpin,number); break; /*信息显示*/ case '3': DataFind(shangpin,number ); break; /*信息查找*/ case '4': DataAdd( ); break; /*增加*/ case '0': return 0; default:puts(\"\\没有这个项~返回主菜单~\"); break; } printf(\"\\n\\完毕!按任意键继续\"); getch( ); puts(\"\\n\"); } } 3.1.4输入商品信息 用户进入商品管理系统时,通过输入商品数量,商品名称,商品号,商品生产厂家,商品单 价来录入到文件中。 void DataInput(record *st, int *q) /*商品信息录入*/ { int i = 0; int n ; /*录入的总数*/ char YesOrNo; /*判断是否保存*/ char shangjiaming[30]; /*商名*/ int haoma; /*商品号*/ char shangjia[10]; /*单价*/ float danjia; printf(\"\\请输入商品个数:\"); 8 学生成绩管理 scanf(\"%d\ *q = n; /*q返回商品个数*/ printf(\"\\现在开始录入这%d个商品信息:\\n\\n\while(i printf(\"请输入商品的生产商:\scanf(\"%s\ printf(\"请输入商品的单价 :\scanf(\"%f\ if(danjia>=0&&danjia<=12345) /*有效的单价才录入*/ { strcpy(st[i].name,shangjiaming); st[i].num = haoma; strcpy(st[i].shangjia,shangjia); st[i].price = danjia; i =i+1; } else printf(\"输入的单价是一个无效的值!!!\\n\\n\"); } /*结束while*/ printf(\"要保存您刚才录入的数据吗(Y/N)?\"); /*选择保存*/ fflush(stdin); scanf(\"%c\ if(YesOrNo=='y'||YesOrNo=='Y') DataStorage(st,n); else if(YesOrNo=='n'||YesOrNo=='N') return; else printf(\"输入了不正确的选项\\n\"); return; 9 C语言课程设计 } /*结束函数*/ 3.1.5查找商品信息 以读出的形式打开文件,通过条件来查找文件中的商品信息,并且以按商品号或者按商品 单价的形式由低到高排列出来。 void DataFind( ) /*查找*/ { void OnNumber(record *st,int n ); /*按商品号排序*/ int key; /*key为要查找的关键值*/ int low = 0; /*下限*/ int high ; /*上限*/ int mid ; /*中间值*/ char ans; /*选项*/ record st[S]; int n; if(DataRead(st,&n)==1) /*从文件中读取信息*/ { OnNumber(st,n); /*先按商品号排序*/ high = n; do { printf(\"\\n\\n\\请输入你要查找的商品号:\"); scanf(\"%d\low = 0;high = n; while (low <=high) { mid = (high + low)/2; if (key == st[mid].num ) { printf(\"\\n\\你要找的是第%d个商品\\n\10 学生成绩管理 printf(\"\\结果如下:\\n\\n\"); printf(\"序号\\商品名\ 商品号\生产商\单价\\n\"); printf(\"%3d%17s%12d%12s%8.1f\\n\d].shangjia, st[mid].price); break; /*如果找到则退出循环*/ } if (key > st[mid].num ) low = mid + 1; else high = mid - 1; } if (low > high) printf(\"\\,没有找到这个价格!\\n\"); printf(\"\\n\\还要继续查询吗(Y/N),\"); ans = getch( ); } while (ans =='Y'||ans == 'y'); /*结束do....while*/ } } 3.1.6录入商品信息 新建一个文件,将输入的商品信息录入文件并保存,成功后,可执行将商品信息添加到该文件中,或者从文件中读取商品信息等功能。 void DataStorage(record *st, int n) /*录入保存文件*/ { int i; FILE *fp; char FileName[20]; printf(\"请输入您要保存的文件名:\"); scanf(\"%s\ printf(\"正在将商品信息保存到文件,请稍候„„\\n\"); if((fp=fopen(FileName,\"w\"))==NULL) 11 C语言课程设计 printf(\"没有该文件\\n\"); else for(i=0 ; i fclose(fp); } int DataRead(record *st,int *q) /*读取文件*/ { int i=0; char datafile[20]; FILE *fp; *q = 0; printf(\"请输入文件名:\"); scanf(\"%s\ if((fp = fopen(datafile,\"r\")) == NULL) /*打开文件*/ { printf(\"没有该文件,请重新输入~\\n\"); return 0; } else { printf(\"正在读取商品单价,请稍候„„\\n\"); while (!feof(fp)) { fscanf(fp,\"%s%d%s%f\rice); i++; } *q = i; printf(\"\\n\"); fclose(fp); 12 学生成绩管理 return 1; } } 3.1.7显示商品信息 文件创建成功并且存入了商品信息后,可以通过指定的操作打开文件并将文件的商品信息显 示出来。 void DataDisPlay() { void OnPrice(record *st,int n ); /*按单价*/ void OnNumber(record *st,int n ); /*按商品号*/ int N; int i; record st[300]; char YesNo; /*是否按顺序显示*/ char tp; if(DataRead(st,&N)==1) /*从文件读取数据*/ { printf(\"序号\\商品名\ 商品号\生产商\单价\\n\"); for(i=0;i printf(\"要按顺序显示吗,(Y/N)?\"); fflush(stdin); scanf(\"%c\if(YesNo=='y'||YesNo=='Y') { printf(\"\请输入排序方式:\\n\"); printf(\"\(1.按价格排序从低到高;2.按商品号排序从低到高.)\"); fflush(stdin); scanf(\"%c\13 C语言课程设计 if(tp=='1') OnPrice(st,N); else if(tp =='2') OnNumber(st,N); else printf(\"\输入了不正确项~\\n\"); } } } /*结束显示成绩*/ 按单价排序商品信息 查找商品信息时,按照商品单价的高低查看要查找的商品信息。 void OnPrice(record *st,int n ) /*按单价顺序*/ { int i,j; record temp; printf(\"\\按单价排序---\\n\\n\"); printf(\"商品总数为%d:\\n\for(j=0 ; j printf(\"\\n\\按成绩排序的结果如下(按分数从低到高):\\n\\n\"); printf(\"序号\\商品名\ 商品号\生产商\单价\\n\"); for(i=0 ; i st[i].price); 14 学生成绩管理 } 按商品序号查找商品信息 查找商品信息时,按照商品序号来查看要查找的商品信息。 void OnNumber(record *st,int n ) /*按序号顺序*/ { int i,j; record temp; printf(\"\\按商品号排序---\\n\\n\"); printf(\"商品总数为%d:\\n\for(j=0 ; j temp=st[i]; st[i]=st[i+1]; st[i+1]=temp; } printf(\"\\n\(按商品号从小到大):\\n\\n\"); printf(\"序号\\商品名\ 商品号\生产商\单价\\n\"); for(i=0 ; i st[i].price); } 3.1.8添加商品信息 15 C语言课程设计 打开建立的文件,将要添加的商品信息写入文件当中并且保存。DataAdd( ) /*增加*/ { int i=0,n,m; /*商品名称*/ char shangjiaming[30]; int haoma; /*生产商*/ char shangjia[10]; float danjia; char YesOrNo; record st[S]; printf(\"\\读取原有数据信息---\\n\"); if(DataRead(st,&n)==1) { printf(\"\\信息读取完毕!\\n\\n\"); printf(\"\\请输入要添加的商品总数:\"); scanf(\"%d\ printf(\"\\现在开始录入这%d个商品信息:\\n\\n\while(i printf(\"第%d个商品的商品名:\scanf(\"%s\ printf(\"第%d个商品的商品号:\scanf(\"%d\ printf(\"第%d个商品的生产商:\scanf(\"%s\ printf(\"第%d个商品的单价:\scanf(\"%f\ if(danjia>=0&&danjia<=12345) /*有效的单价才录入*/ { 16 学生成绩管理 strcpy(st[i+n].name,shangjiaming); st[i+n].num = haoma; strcpy(st[i+n].shangjia,shangjia); st[i+n].price = danjia; i =i+1; } else printf(\"输入的单价不正确,请重新输入!\\n\\n\"); } printf(\"要保存您刚才录入的数据吗(Y/N)?\"); fflush(stdin); scanf(\"%c\ if(YesOrNo=='y'||YesOrNo=='Y') DataStorage(st,n+m); else if(YesOrNo=='n'||YesOrNo=='N') return; else printf(\"输入了不正确项,返回上一级\\n\"); return; } } 3(2 测试与调试 3.2.1 概述 一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。 测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。甚至有时候一不小心连变量或者函数名写错的都不知道,等到程序编写好了发现错误就很多,改起来也比较麻烦,虽然是简单的错误,但是我们在编写程序的时候还是要仔细认真,避免这样或者那样的小错误。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。 17 C语言课程设计 能检查出尚未发现的、各种不同类型错误的测试才是成功的测试。测试程序需要测试用例,测试用例可用如下公式表示:测试用例,测试数据,预期结果。 好的测试用例应该是用尽可能少的测试数据发现尽可能多的错误,即发现错误的概率要大。要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。还应分别测试输入合法数据与非法数据时,程序的运行情况,。对于合法数据,还要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最后面、中间某一位置的情况。 测试可按模块测试、组装测试和确认测试的步骤进行。 (1)模块测试就是分别对各模块进行测试的过程。在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。 (2)组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。 (3)确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。 测试程序时,用监视窗口可以随时查看变量或表达式的值,有时还可以将部分程序代码 用注释符暂时括起来,缩短程序,以便压缩出错代码的范围。 3.2.2 程序测试 , 在主菜单中选择1 当在菜单中选择输入数字1时,按回车键可进入商品信息录入界面,将要录入文件的商品信息写入文件中。。其输入记录过程如图3.1所示,这里输入了3条商品信息。 , , , 图3.1 , 在主菜单中选择2 , 当输入2并按回车键时候可进入商品信息显示界面,显示之前录入的商品信息。并按照 18 学生成绩管理 商品序号或者商品单价的高低来排序,或者可以按N来取消按顺序显示。如图3.2所示。 , 图3.2 , 在主菜单中选择3 , 在菜单中输入3可进入商品信息查找界面,可以通过商品所在的文件名,商品的序号查 找商品信息操作界面如图3.3。 , , 19 C语言课程设计 , 在主菜单中选择4 , 当在菜单中输入4并按回车键时,进入商品添加商品信息界面。打开要添加到的文件, 并写入商品信息。操作如图3.4所示。 , 图3.4 , 在主菜单中选择0 , 在主菜单中输入0按回车键,会显示是否退出程序,按任意键退出。如图3.5 , 20 学生成绩管理 , 4、系统维护 经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。一般维护的工作有:更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。 5、归纳总结 5(1 开发经验 通过对本题目的开发,体会到要掌握以下几点内容。 , 大程序的设计风格。按“自顶向下,逐步细化,模块化”的方法进行程序设计。 , 编写主函数,并进行测试与调试。当被调函数又需要调用其他函数时,也要遵循逐 步细化的原则。C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要 的劳动。 , 定义函数时,应选好参数的个数和数据类型。 , 文件使用方法。文件使用完毕后应及时关闭。 5(2 实训中遇到的问题及解决方法 在这次的实训中,主要遇到的问题是编译需要用到一些我们没有学到的函数,通过上网查找或者向老师提问才可以理解,同时遇到了许多陌生的知识,需要自己主动去看书去查找资料,遇到的各种问题通过同学之间互相交流和老师的帮助才可以解决。 5(3 设计中尚存的不足之处 这个程序虽然可以运行成功,但是还有所不足。第一,我觉得程序还不够完善,有些地方甚至有点乱;第二,有些地方好像功能有点重复了;第三,该程序的功能太少了。 5(4 感想和心得体会 通过这次实训,我获益匪浅。我知道了C语言知识的广泛,我们所学的只是九牛一毛,因此在程序设计的过程中通常会遇到这样或者那样的问题,为了完成任务,我们会以认真的态度去面对,翻资料,上网,我们通过各种手段对C语言有了更深的了解,为我们将来更好的学习这门课程打下了基础,并培养了兴趣。 这次实训让我进一步理解了“编程是什么”,“如何去编程”,“编程的目的又是什么”,„„发现自己的知识竟是如此贫乏,顿时感到了压力的存在,从而也激发了我的学习热情。它会成为我今后不断进取、永不懈怠的动力。 在整个实训过程中,我能够坚持虚心的向老师以及同学请教问题,它使我明白了虚心好学的重要性,更让我懂得了如何跟老师同学去相处、去沟通。没有老师和同学们的无私帮助,我不可能圆满完成这次实训任务。感谢帮助过我的所有老师和同学们,要列出所有帮助过我的人的名字是不现实的,因为有些困难是通过因特网解决的,我甚至不知道他们的名字,在此,谨向他们一并表示感谢~ 6、参考资料 [1] [2] 唐新来 李春贵. C语言程序设计教程. 科学出版社,2009 [3] 田淑清. 二级教程——C语言程序设计. 高等教育出版社 2010 21 因篇幅问题不能全部显示,请点此查看更多更全内容