1 课程设计目的与要求
1.1课程设计目的
本课程设计是在学习C语言基本理论之后的实践教学环节。该实践教学是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。学生通过课程设计在下述各方面得到锻炼:
1.能根据实际问题的具体情况,结合C语言的基本理论和基本技巧,正确分析问题,并能设计出解决问题的有效算法与程序。
2.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法和程序的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改,进一步提高程序设计水平。
1.2课程设计要求
通过一个学期的学习,我认为要学好C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。特别是作为本科生,更要注重实践这一环节,只有这样我们才能成为合格的计算机人材。通过这次课程设计,进一步巩固所学的语句,如语句嵌套等;加深对循环,分支等结构的运用。具体如下:
(1)数据组织方面尽量使用到:数组、链表、结构体、文件; (2)程序结构方面做到函数调用,尽量采用指针运算; (3)代码编写规范,形成良好的编程习惯;
(4)程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。
(5)课设完成须进行答辩,提交课设报告电子稿、装订的打印稿。课设报告内容包括以下几个方面:
程序的总体设计和算法分析。 程序流程图、函数说明
0
源程序代码清单 测试数据和测试过程记录 遇到的问题及解决方法分析 课程设计小结
1.3课程设计的评价
通过此次课程设计,我的知识面得到了扩展,发现课本上的东西是远远不够的,需要上网找资料寻找补充,而且小组合作的形式可以互相交流知识,弥补自己的不足。通过课程设计,加深对结构化程序设计思想的理解,能进行一个系统功能需求分析,并设计合理的模块化结构。提高程序开发能力。
1
2 问题描述
设计一个学生信息管理系统,其中包括:
学生基本信息:如学号、姓名、性别、年龄、地址、电话等。 功能包括:
1. 系统菜单形式显示 2.学生信息录入功能—输出 3.学生信息浏览功能—输出 4.查询、排序功能—算法 按学号查询 按姓名查询 5.学生信息的删除与修改 2
3总体设计
3.1 功能分析
3.1.1菜单模块
通过while语句 给出信息提示; 清屏;
绘制菜单(包含输入,浏览,查询,修改,删除,排序,保存,退出);
提示菜单选择并读入到变量;
根据读入变量的值调用不同的模块函数;
3.1.2信息录入模块
打开文件 While() { 清屏;
按照提示输入各种信息; While
显示各种信息;
通过选择1.确认并继续 2.重新填写 3.放弃并返回 4.确认并返回 选择四种功能; } }
3.1.3信息浏览模块
打开文件 While() { 清屏;
用for语句依次按照顺序输出学生信息 通过选择可以翻页 1.上一页 2.下一页 0.退出
3
}
3.1.4信息查询
While()
{ 通过菜单式的选择 是学号查询 还是姓名 printf(\"******学生信息管理系统******\");
printf(\"\\n----------检 索----------\"); printf(\"\\n您想要:\");
printf(\"\\n 1.按学号检索\"); printf(\"\\n 2.按姓名检索\"); printf(\"\\n 3.返回主菜单\");
printf(\"\\n****************************\\n\"); }
如果选择学号进入学号模块 通过输入学号 If( 学号存在继续) {输出学生信息
}
Else 输出无此学生 如果选择姓名进入姓名模块
If(根据比较姓名判断学生是否存在) {输出学生信息
}
Else 输出无此学生
3.1.5删除模块
while( 继续删除 )
4
{
提示并读入待删除的学生的学生号; 显示要删除的信息 } 删除成功
3.1.6信息修改模块
输入要修改学生信息的学号: If (判断是否有此学生)
{ 菜单形式显示要修改的项目
printf(\"\\n1.姓名 2.年龄 3.性别 4.出生年月 5.地址 6.电话 7.E-mail \\n\"); } Swich()
{ 选择要修改的项目进行修改 }
3.1.7打开文件模块
printf(\"\\n8.数学 9.英语 \\n\");
void fileopen() {
FILE *fp; int n;
if((fp=fopen(\"data\fp=fopen(\"data\for(n=0;n<100;n++)
fread(&stu[n],sizeof(struct student),1,fp); fread(&stunum,4,1,fp); fclose(fp);
5
}
3.1.8保存文件模块
void filesave() {
int n; FILE *fp;
fp=fopen(\"data\for(n=0;n<100;n++)
fwrite(&stu[n],sizeof(struct student),1,fp); fwrite(&stunum,4,1,fp); fclose(fp);
printf(\"保存成功!press Enter to continue..\"); }
3.1.9退出模块
getch();
case '8':ma=0;break; 用的是跳出while语句 回到安全模块
3.1.10排序模块
通过 冒泡排序法
for(m=0;m if(stu[m].sum stu[99]=stu[m]; stu[m]=stu[x]; stu[x]=stu[99]; stu[99].id=stu[x].id ; stu[x].id =stu[m].id; stu[m].id =stu[99].id ; } printf(\"排序后的顺序为:\\n\"); 然后显示排序好后的学生信息; 3.2系统主要函数 多功能计算器采用结构化程序设计思想,程序中除主函数外,共设计了23个函数,函数原型 及功能说明如表3.2.1所示。 表3.2.1 函数原型及功能说明 序号 函数原型 功能说明 1 void calculate1() 调用整数运算的相关函数 2 void zhengshu() 整数的运算的头文件 3 void calculate2() 调用实数运算的相关函数 4 void shishu() 实数的运算的头文件 5 void calculate3() 调用分数运算的相关函数 6 void fenshu() 分数的运算的头文件 7 typedef struct fushu 抽象数据类型定义 8 float real 数据对象 9 float image 定义构造复数的函数 10 fushu ComplexNumberInput(float 构造复数二元组 a,float b) 11 fushu ComplexNumberAdd(fushu 复数的求和运算 c1,fushu c2) 12 fushu ComplexNumberSub(fushu 复数的求差运算 7 13 14 15 16 17 18 19 20 21 22 23 c1,fushu c2) fushu ComplexNumberMul(fushu 复数的求积运算 c1,fushu c2) fushu ComplexNumberDiv(fushu 复数的求商运算 c1,fushu c2) void ComplexNumberOutput(fushu c) 输出复数的运算结果 void fushi() 复数的运算的头文件 typedef struct Linknode 定义链表节点的数据类型为Node struct Linknode *next 定义链表节点的数据类型为Node Node * createlink() 创建链表并读入多项式的指数和系数 void Sum(Node *pa, Node *pb) 两个一元多项式相加 void mus(Node *pa, Node *pb) 两个一元多项式相减 void print(Node * p) 输出程序中所有的项 void yiyuanduoxiangshi() 一元多项式的运算的头文件 8 4 详细设计 主模块 学生基本信息管理系统 菜单选择 信息录入 信息浏览 信息查询 信息排序 信息删除 信息修改 信息添加 对新加的学生进行信息录入 退出系统 输入学生的相关信息 显示学生的相关信息 按姓名查询 按学号查询 更新保存的学生信 9 开始 菜单信息输浏览 查询 信息浏览 按学号 按姓名 删除 修改 信息删除 添加 信息修改 排序 信息添信息输入 保存文件 结束 4.1 程序总体结构图 10 主函数 结束 4.2 主函数流程图 开始 显示主页菜单 功能选择 录入学生信息 浏览学生信息 查询学生信息修改学生信息 删除学生信息按照总成绩排序 保存学生信息退出信息管理 各部分模块 11 4.3 信息的录入流程图 4.4 学生信息浏览流程图 12 开始 N 打开文件 Y N 文件中有无信息 Y 输出所有信息 返回主菜单 结束 4.5 按姓名或学号查询流程图 4.6信息的删除流程图 13 5 功能测试 5.1系统主界面 5.1系统主界面 5.2录入学生信息功能 5.2.1录入学生信息界面 14 5.2.2录入学生信息界面 5.2信息浏览功能 5.2信息浏览界面 15 5.3信息修改功能 5.3.1信息修改界面 5.4信息检索功能 5.4.1信息检索界面 16 5.4.2按学号检索界面 5.4.4按姓名检索界面 17 6 程序设计调试情况分析 1.问题:c程序运行不出来,几个头文件中出现了相同的函数; 解决方法:改变头文件中相同名字的函数名。 2.问题:调用检索函数一闪而过。 解决方法:添加getchar()语句使程序暂停。 3.问题:无法有效的控制输出函数循环终止。 解决方法:添加全局变量“stunum”,使用该全局变量来记录学生总数,从而控制输出循环的次数 4.问题:查询函数数据量过多时同时输出,先输出的内容无法查看,或需用户自行查看。 解决方法:添加getchar()语句使程序暂停,当用户按Enter时继续。 5.问题:调试时,有的时候编译后没什么问题,就是在点击连接link时出现了错误; 解决方法: 将源程序保存,然后关掉Microsoft Visual C++ 6.0,重新启动Microsoft Visual C++ 6.0。 18 7 课程设计小结 通过此次课程设计,我基本上对制作一个相对来说比较完整的程序有了一定的认识和了解。这一周多来的制作,不但对C语言的知识有了一定的巩固,还增加了我们的动手能力。 学生信息管理系统,涉及到结构体,链表,文件和循环的知识,所以尤其对这几个方面有所加深和巩固。其中又包括结构体的赋值,写到文件中。从文件中赋值给结构体。 等等。 还能够通过编译时出现的出错提示信息,进行初步的纠错。 完成一个程序的一般步骤为设计,录入,编译,如果出错,则修改,然后 再编译,编译成功后,看看结果是否正确,如果结果不正确,则再重复以上步骤。 小组成员分工 组长:王彬冰 负责信息浏览、信息删除模块和总流程图 组员:汤璞君 负责信息排序模块 组员:刘帅 负责信息录入模块 参考文献 [1]《C程序设计教程与实验》吉顺如 清华大学出版社 [2]《C程序习题集与课程设计》吉顺如 计春雷 电子工业出版社 [3]《C程序设计思想与方法》 尹宝林 机械工业出版社 19 [4] http://wenku.baidu.com/view/83580befaeaad1f346933f89.html #include 系统源程序 20 附录#include struct student // 结构体 { void check() //查询函数 { void jsid(); void jsname(); int a; char ch; while (a) { system(\"cls\"); printf(\"******学生信息管理系统******\"); printf(\"\\n----------检 索----------\"); printf(\"\\n您想要:\"); printf(\"\\n 1.按学号检索\"); printf(\"\\n 2.按姓名检索\"); printf(\"\\n 3.返回主菜单\"); ch=getchar(); 21 int id; char name[30]; int age; char sex[6]; char birthday[12]; char add[80]; char tel[15]; char email[25]; int math; int sum; int english; }stu[100] ; printf(\"\\n****************************\\n\"); } switch(ch) { case '1':jsid();break; case '2':jsname();break; case '3':a=0;break; } } void fileopen() //打开文件 { } void filesave() //保存文件 { } 22 FILE *fp; int n; if((fp=fopen(\"data\fp=fopen(\"data\for(n=0;n<100;n++) fread(&stu[n],sizeof(struct student),1,fp); fread(&stunum,4,1,fp); fclose(fp); int n; FILE *fp; fp=fopen(\"data\for(n=0;n<100;n++) fwrite(&stu[n],sizeof(struct student),1,fp); fwrite(&stunum,4,1,fp); fclose(fp); getch(); printf(\"保存成功!press Enter to continue..\"); void editname(int n) //按照名字修改 { } void editage(int n) //修改年龄函数 printf(\"\\n新姓名:\"); scanf(\"%s\ { printf(\"\\n新年龄:\"); scanf(\"%d\ } void editsex(int n) { printf(\"\\n新性别:\"); scanf(\"%s\ } void editbir(int n) { printf(\"\\n新出生年月\"); scanf(\"%s\ } void editadd(int n) { printf(\"\\n新地址:\"); scanf(\"%s\ } void edittel(int n) { printf(\"\\n新电话:\"); scanf(\"%s\ // 修改性别函数 //修改生日 //修改地址 //修改电话 23 } void editemail(int n) { } void editmath(int n) //修改数学成绩 { } void editenglish(int n) // 修改经与成绩 { } void last(int n) { } void edit() //修改函数 { char ch ; 24 printf(\"\\n新E-mail:\"); //修改邮箱 scanf(\"%s\ printf(\"\\n新数学:\"); scanf(\"%d\ stu[n].sum=stu[n].math+stu[n].english; printf(\"\\n新英语:\"); scanf(\"%d\ stu[n].sum=stu[n].math+stu[n].english; if(n==stunum) system(\"cls\"); printf(\"******学生信息管理系统******\"); printf(\"\\n----------检 索----------\"); printf(\"\\n已检索到末尾。\"); printf(\"\\nPress any key to continue..\"); printf(\"\\n****************************\\n\"); int a=1,b; int n; while(a) { system(\"cls\"); printf(\"\\n请输入你想修改的人的学号:\\n\"); scanf(\"%d\ if(n<=stunum) 7.E-mail \\n\"); n=n--; printf(\"学号 姓 名 年龄 性别 出生年月\\n\"); printf(\"%4d \printf(\"%12s \printf(\"%4d \printf(\"%4s \printf(\"%8s \\n\ printf(\"\\n\\n\\n学号 电 话 E-mail 地址\\n\"); printf(\"%4d \printf(\"%15s \printf(\"%15s \printf(\"%s\\n\ printf(\"\\n\\n\\n 数学 英语 总分\\n\"); printf(\"%4d\ printf(\"%15d\ printf(\"%15d\\n\ printf(\"\\n请输入你想修改的内容:\"); printf(\"\\n1.姓名 2.年龄 3.性别 4.出生年月 5.地址 6.电话 printf(\"\\n8.数学 9.英语 \\n\"); printf(\"\\n****************************\\n\"); getchar(); ch=getchar(); switch(ch) { 25 { case '1':editname(n);break; case '2':editage(n);break; case '3':editsex(n);break; case '4':editbir(n);break; case '5':editadd(n);break; case '6':edittel(n);break; case '7':editemail(n);break; case '8':editmath(n);break; case '9':editenglish(n);break; } void delect() //删除函数 { int n, a; system(\"cls\"); printf(\"\\n请输入想要删除人的学号:\\n\"); scanf(\"%d\ n=n--; 26 } } } b=1; } while (b) { printf(\"\\n确认吗?(y/n)\"); ch=getchar(); switch(ch) { case 'Y':b=0;a=0;break; case 'y':b=0;a=0;break; case 'N':b=0;break; case 'n':b=0;break; } } } for(a=n;a<=stunum;a++) { strcpy(stu[a].name,stu[a+1].name); strcpy(stu[a].sex,stu[a+1].sex); strcpy(stu[a].birthday,stu[a+1].birthday); strcpy(stu[a].add,stu[a+1].add); strcpy(stu[a].tel,stu[a+1].tel); strcpy(stu[a].email,stu[a+1].email); stu[a].english=stu[a+1].english; stu[a].sum=stu[a+1].sum; stu[a].age=stu[a+1].age; stu[a].math=stu[a+1].math; stunum--; printf(\"删除成功!press Enter to continue..\"); void jsid() //按照学号查询 { int n,i=0; system(\"cls\"); printf(\"******学生信息管理系统******\"); printf(\"\\n----------检 索----------\"); printf(\"\\n请输入想要检索的学号:\"); scanf(\"%d\if(n<=stunum) { n=n--; printf(\"学号 姓 名 年龄 性别 出生年月\\n\"); printf(\"%4d \printf(\"%12s \printf(\"%4d \ 27 printf(\"%4s \printf(\"%8s \\n\ printf(\"\\n\\n\\n学号 电 话 E-mail 地址\\n\"); printf(\"%4d \ printf(\"%15s \ printf(\"%15s \ printf(\"%s\\n\ printf(\"\\n\\n\\n 数学 英语 printf(\"%4d\ printf(\"%15d\ printf(\"%15d\\n\ i++; if(i==0) { printf(\"\\nError:无此学生。\"); printf(\"\\n****************************\\n\"); } getch(); } else { system(\"cls\"); last(n); } getch(); } 28 总分\\n\"); void jsname() //按照姓名查询 { int n,i=0; char m[30]; system(\"cls\"); printf(\"******学生信息管理系统******\"); printf(\"\\n----------检 索----------\"); printf(\"\\n请输入想要检索的姓名:\"); scanf(\"%s\for(n=0;n if(strcmp(m,stu[n].name)==0) { system(\"cls\"); printf(\"学号 姓 名 年龄 性别 出生年月\\n\"); printf(\"%4d \printf(\"%8s \printf(\"%4d \printf(\"%4s \printf(\"%8s \\n\ printf(\"\\n\\n\\n学号 电 话 E-mail 地址\\n\"); printf(\"%4d \printf(\"%15s \printf(\"%15s \printf(\"%s\\n\ printf(\"\\n\\n\\n 数学 英语 总分\\n\"); printf(\"%15d\ printf(\"%15d\\n\i++; getch(); } printf(\"%4d\ } if(i==0) printf(\"\\nError:无此学生。\"); else { last(n); } void write() //录入函数 { int a,n=1,m; char ch; while (n) { a=stunum; system(\"cls\"); printf(\"学号:\"); stu[a].id=(a+1); printf(\"%d\printf(\"\\n名字:\"); scanf(\"%s\printf(\"\\n年龄:\"); scanf(\"%d\printf(\"\\n性别:\"); scanf(\"%s\printf(\"\\n出生年月日:\"); scanf(\"%s\printf(\"\\n地址:\"); scanf(\"%s\printf(\"\\n电话:\"); 30 scanf(\"%s\ printf(\"\\nE-mail:\"); scanf(\"%s\ printf(\"\\n数学:\"); scanf(\"%d\ printf(\"\\n英语:\"); scanf(\"%d\ stu[a].sum=stu[a].math+stu[a].english; printf(\"%d\ m=1; while (m) m=0时跳出 { system(\"cls\"); printf(\"学号:\"); printf(\"%d\ printf(\"\\n名字:\"); printf(\"%s\ printf(\"\\n年龄:\"); printf(\"%d\ printf(\"\\n性别:\"); printf(\"%s\ printf(\"\\n出生年月日:\"); printf(\"%s\ printf(\"\\n地址:\"); printf(\"%s\ printf(\"\\n电话:\"); printf(\"%s\ printf(\"\\nE-mail\"); printf(\"%s\ printf(\"\\n数学\"); printf(\"%d\ printf(\"\\n英语\"); printf(\"%d\ 31 //做一个循环,直到 } } } printf(\"\\n总分\"); printf(\"%d\ printf(\"\\n请选择:1.确认并继续 2.重新填写 3.放弃并返回 4.ch=getchar(); switch(ch) { case '1':m=0;stunum++;break; case '2':stunum,m=0;break; case '3':m=0,n=0;break; //选择此项时, 确认并返回\"); m=0,循环终止 case '4':m=0,n=0;a=stunum++;break; } void view() //浏览函数 { printf(\"%4d \printf(\"%8s \printf(\"%4d \printf(\"%7s \ 32 int count=1,i,n=1,pagenum=1,page=stunum/5+1; char ch; while (n) { system(\"cls\"); //设定 变量控制翻页 printf(\"学号 姓 名 年龄 性别 出生年月\\n\"); for(i=count-1;i printf(\"%12s \\n\ printf(\"\\n\\n\\n学号 电 话 E-mail 地址\\n\"); for(i=count-1;i printf(\"\\n\\n\\n 数学 英语 总分\\n\"); for(i=count-1;i 33 } } { printf(\"%15d\ printf(\"%15d\\n\ printf(\"\\n1.上一页 2.下一页 0.退出 ch=getchar(); switch(ch) { case '1':pagenum--; } if(pagenum==0) count=(page-1)*5+1,pagenum=page; else count=(pagenum-1)*5+1;break; if(pagenum>page) count=1,pagenum=1; else count=(pagenum-1)*5+1;break; printf(\"%4d\ 共学生%d人,第%d页,共%d页\\n\ case '2':pagenum++; case '0':n=0;break; int y=stunum; int count=1,i,n=1,pagenum=1,page=stunum/5+1; char ch; for(m=0;m stu[m]=stu[x]; stu[x]=stu[99]; stu[99].id=stu[x].id ; stu[x].id =stu[m].id; stu[m].id =stu[99].id; } printf(\"排序后的顺序为:\\n\"); while (n) { system(\"cls\"); printf(\"学号 姓 名 年龄 性别 for(i=count-1;i printf(\"%4d \ printf(\"%8s \ printf(\"%4d \ printf(\"%7s \ printf(\"%12s \\n\ } printf(\"\\n\\n\\n学号 电 话 for(i=count-1;i printf(\"%15s \ 34 \\n\"); E-mail 地址\\n\"); 出生年月 } printf(\"%s\\n\ printf(\"\\n\\n\\n 数学 英语 总分\\n\"); for(i=count-1;i char ch; char x[20]; char y[20]=\"zhangyong\"; //主函数 } } printf(\"\\n1.上一页 2.下一页 0.退出 ch=getchar(); switch(ch) { case '1':pagenum--; } if(pagenum==0) count=(page-1)*5+1,pagenum=page; else count=(pagenum-1)*5+1;break; if(pagenum>page) count=1,pagenum=1; else count=(pagenum-1)*5+1;break; { printf(\"%15d\ printf(\"%15d\\n\ printf(\"%4d\ 共学生%d人,第%d页,共%d页\\n\ case '2':pagenum++; case '0':n=0;break; int ma; fileopen(); while(n) { 35 system(\"cls\"); printf(\"\\n\"); { system(\"cls\"); printf(\"******学生信息管理系统******\"); printf(\"\\n----------V 1.0.0 ----------\"); printf(\"\\n您想要:\"); printf(\"\\n 1.录入学生信息\"); printf(\"\\n 2.浏览学生信息\"); printf(\"\\n 3.查询学生信息\"); printf(\"\\n 4.修改学生信息\"); printf(\"\\n 5.删除学生信息\"); printf(\"\\n 6.按照总成绩排序\"); printf(\"\\n 7.保存学生信息\"); } } } } printf(\"\\n 8.退出信息管理\"); printf(\"\\n****************************\\n\"); switch(ch) { case '1':write();break; case '2':view();break; case '3':check();break; case '4':edit();break; case '8':ma=0;break; case '7':filesave();break; //switch语句选择功能 ch=getchar(); case '5':delect();break; case '6':turn();break; 36 因篇幅问题不能全部显示,请点此查看更多更全内容