C语言学生成绩管理系统课程设计报告书.docx
- 文档编号:16351564
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:42
- 大小:117.31KB
C语言学生成绩管理系统课程设计报告书.docx
《C语言学生成绩管理系统课程设计报告书.docx》由会员分享,可在线阅读,更多相关《C语言学生成绩管理系统课程设计报告书.docx(42页珍藏版)》请在冰点文库上搜索。
C语言学生成绩管理系统课程设计报告书
C语言学生成绩管理系统课程设计
第一章需求分析
1.1引言
利用C语言编程和程序调试的基本技能进行学生信息管理系统的设计。
1.2任务概述
某班学生基本信息管理,包括以下功能:
1、从键盘输入包括学号、姓名、性别、出生年月日、籍贯、所在院系、专业等,并将其保存在磁盘文件里。
2、具有进行单项查询或多项查询的功能(即按照给定的关键字姓名等找出满足条件的纪录)。
3、具有插入、修改和删除信息的功能,具有输出文件数据信息的功能。
1.3数据描述
typedefstructdate
{
intyear;
intmonth;
intday;
}DATE;
structstudent
{
charNO[20];
charname[20];
intage;
charsex[3];
DATEbirthday;
charorigo[100];//籍贯
charcollege[20];//学院
charmajor[20];//专业
charphone[20];
structstudent*next;
};
1.4功能需求
输入功能:
一次可以完成自定义学生人数的学生信息记录的输入。
删除功能:
对指定学生的信息进行删除。
修改功能:
对指定学生的信息进行修改。
查询功能:
选择某种方式并输入该信息查询符合条件的学生信息。
排序功能:
以学号为依据对学生信息进行排序。
显示功能:
将以上功能操作后的学生信息显示出来。
储存功能:
将输入信息进行保存。
退出主菜单。
1.5性能需求
最多只允许1人使用,查询结果显示速度<1s,具有开放性及可扩充性。
1.6运行需求
在保证整体代码完整的情况下,需在CodeBlocks环境下进行编译、运行。
1.7任务计划
(1)输入的内容及形式
输入学生的学号、姓名、年龄、性别、出生年月、籍贯、学院、专业、电话,其中年龄和出生年月为数字,其余为汉字。
(2)输出的内容及形式
输出学生的学号、姓名、年龄、性别、出生年月、籍贯、学院、专业、电话,其中年龄和出生年月为数字,其余为汉字。
(3)程序的功能
输入功能:
一次可以完成自定义学生人数的学生信息记录的输入。
删除功能:
对指定学生的信息进行删除。
修改功能:
对指定学生的信息进行修改。
查询功能:
选择某种方式并输入该信息查询符合条件的学生信息。
排序功能:
以学号为依据对学生信息进行排序。
显示功能:
将以上功能操作后的学生信息显示出来。
储存功能:
将输入信息进行保存。
第二章概要设计
2.1总体设计
总体结构我们采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。
也可根据自己对题目的理解增加新的功能模块。
系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。
总体模块设计图如图2.1。
建立新文件
从已有的文件中读取
按姓名查找
按学号查找
按专业查找
按学号排序
学生信息管理系统
菜单
系统初始化
录入新信息
浏览信息
查找信息
修改或删除信息
排序
保存及退出
图2.1
2.2数据类型设计(或数据结构设计)
typedefstructdate
{
intyear;
intmonth;
intday;
}DATE;
structstudent
{
charNO[20];
charname[20];
intage;
charsex[3];
DATEbirthday;
charorigo[100];//籍贯
charcollege[20];//学院
charmajor[20];//专业
charphone[20];
structstudent*next;
};
2.3接口设计
函数名
函数格式
函数功能
show_menu
void
显示菜单
menu
void
执行菜单
creat_stu
void
建立链表
insert_stu
void
学生信息录入
print_stu
void
学生信息浏览
search_NO
void
按学号查找
search_name
void
按姓名查找
search_major
void
按专业查找
arrage_stu
void
按学号排序
del_stu
void
删除学生信息
revise_stu
void
修改学生信息
save
void
保存学生信息
2.4运行界面设计
主菜单模块
采用switch()函数从键盘选择相应菜单的对应功能。
switch(c)
{
getchar();
case1:
insert_stu();break;
case2:
print_stu();break;
case3:
search_NO();break;
case4:
search_name();break;
case5:
search_major();break;
case6:
del_stu();break;
case7:
revise_stu();break;
case8:
arrage_stu();break;
case0:
exit(0);
}
第三章详细设计
3.1输入模块设计
采用scanf()函数输入新联系人信息插入至结构数组中。
PF("\t\t学号:
\t");
scanf("%s",p1->NO);
PF("\t\t姓名:
\t");
scanf("%s",p1->name);
PF("\t\t年龄:
\t");
scanf("%d",&p1->age);
PF("\t\t性别:
\t");
scanf("%s",p1->sex);
PF("\t\t出生年月:
\t");
scanf("%d%d%d",&p1->birthday.year,
&p1->birthday.month,
&p1->birthday.day);
PF("\t\t籍贯:
\t");
scanf("%s",p1->origo);
PF("\t\t学院:
\t");
scanf("%s",p1->college);
PF("\t\t专业:
\t");
scanf("%s",p1->major);
PF("\t\t电话:
\t");
scanf("%s",p1->phone);
3.2输出模块设计
voidprint_stu()//学生信息浏览
{
STU*p=NULL;
if(head==NULL)//判断链表是否为空
{
PF("文档中无记录!
\n");
return;
}
for(p=head->next;p!
=NULL;p=p->next)//读出信息
{
PF("●●●●●●●●●●●●●●●●●学生信息浏览●●●
●●●●●●●●●●●●\n");
PF("\t\t学号:
\t%2s\n",p->NO);
PF("\t\t姓名:
\t%2s\n",p->name);
PF("\t\t年龄:
\t%2d\n",p->age);
PF("\t\t性别:
\t%2s\n",p->sex);
PF("\t\t出生年月:
\t%d%d%d\n",p->birthday.year,
p->birthday.month,
p->birthday.day);
PF("\t\t籍贯:
\t%2s\n",p->origo);
PF("\t\t学院:
\t%2s\n",p->college);
PF("\t\t专业:
\t%2s\n",p->major);
PF("\t\t电话:
\t%2s\n",p->phone);
PF("\n");
}
}
3.3查找模块设计
(1)按姓名查找
voidsearch_name()
{
STU*p=NULL;
charname[20];
if(head==NULL)
{
PF("文档中无记录!
\n");
return;
}
PF("输入学生姓名");
scanf("%s",name);
for(p=head->next;p!
=NULL;p=p->next)//验证信息是否正确
{
if(!
strcmp(p->name,name))
{
PF("●●●●●●●●●●●●●●●●●您查找的学生是
●●●●●●●●●●●●●●●●\n");
PF("\t\t学号:
\t%2s\n",p->NO);
PF("\t\t姓名:
\t%2s\n",p->name);
PF("\t\t年龄:
\t%2d\n",p->age);
PF("\t\t性别:
\t%2s\n",p->sex);
PF("\t\t出生年月:
\t%d%d%d\n",p->birthday.year,
p->birthday.month,
p->birthday.day);
PF("\t\t籍贯:
\t%2s\n",p->origo);
PF("\t\t学院:
\t%2s\n",p->college);
PF("\t\t专业:
\t%2s\n",p->major);
PF("\t\t电话:
\t%2s\n",p->phone);
PF("\n");
i=1;
}
}
if(!
i)
{
PF("无该生信息,请查证");
}
}
(2)按学号查询
voidsearch_NO()
{
STU*p=NULL;
charNO[20];
if(head==NULL)
{
PF("文档中无记录!
\n");
return;
}
PF("输入学生学号:
");
scanf("%1s",NO);
for(p=head->next;p!
=NULL;p=p->next)
{
if(!
strcmp(p->NO,NO))
{
PF("●●●●●●●●●●●●●●●●●您查找的学生是
●●●●●●●●●●●●●●●●\n");
PF("\t\t学号:
\t%2s\n",p->NO);
PF("\t\t姓名:
\t%2s\n",p->name);
PF("\t\t年龄:
\t%2d\n",p->age);
PF("\t\t性别:
\t%2s\n",p->sex);
PF("\t\t出生年月:
\t%2d%d%d\n",p->birthday.year,
p->birthday.month,
p->birthday.day);
PF("\t\t籍贯:
\t%2s\n",p->origo);
PF("\t\t学院:
\t%2s\n",p->college);
PF("\t\t专业:
\t%2s\n",p->major);
PF("\t\t电话:
\t%2s\n",p->phone);
PF("\n");
i=1;
}
}
if(!
i)
{
PF("无该生信息,请查证");
}
}
(3)按专业查询
voidsearch_major()
{
STU*p=NULL;
charmajor[20];
if(head==NULL)
{
PF("文档中无记录!
\n");
return;
}
PF("输入学生专业");
scanf("%s",major);
for(p=head->next;p!
=NULL;p=p->next)
{
if(!
strcmp(p->major,major))
{
PF("●●●●●●●●●●●●●●●●●您查找的学生是
●●●●●●●●●●●●●●●\n");
PF("\t\t学号:
\t%2s\n",p->NO);
PF("\t\t姓名:
\t%2s\n",p->name);
PF("\t\t年龄:
\t%2d\n",p->age);
PF("\t\t性别:
\t%2s\n",p->sex);
PF("\t\t出生年月:
\t%2d%2d%2d\n",p->birthday.year,
p->birthday.month,
p->birthday.day);
PF("\t\t籍贯:
\t%2s\n",p->origo);
PF("\t\t学院:
\t%2s\n",p->college);
PF("\t\t专业:
\t%2s\n",p->major);
PF("\t\t电话:
\t%2s\n",p->phone);
PF("\n");
i=1;
}
}
if(!
i)
{
PF("无该生信息,请查证");
}
}
3.4排序模块设计
按照学生的学号排序
voidarrage_stu()
{
STU*p1,*p2;
intin=0,j;
if(head->next==NULL)
{
printf("你还没有记录,无法排序\n");
return;
}
printf("n=%d",n);
p1=head->next;
for(in=0;in { for(j=0,p1=head->next;j<=n-in-3;p1=p1->next,j++) { if(j==0)//第一次比较第一个和第二个节点的信息 { if(strcmp(p1->NO,p1->next->NO)) //比较p1和p1下一个节点 { p2=p1->next; p1->next=p1->next->next; p2->next=p1; head->next=p2; p1=head->next;//重新给CUR赋值 } } if(strcmp(p1->next->NO,p1->next->next->NO)) //比较p1下一个和下下个节点 { p2=p1->next; p1->next=p1->next->next; p2->next=p1->next->next; p1->next->next=p2; } } if(strcmp(head->next->NO,head->next->next->NO)) //只有两个节点信息时直接比较他们两个 { p1=head->next; head->next=p1->next; p1->next=p1->next->next; head->next->next=p1; if(n==2) //只有两个节点信息时把第二个节点的next赋值为空 { head->next->next->next=NULL; } } } } 3.5保存及读取模块设计 voidsave() { printf("●●●●●●●●●●●●●●●您查找的学生是●●●●●●● ●●●●●●●\n"); STU*p=NULL; FILE*fp; char*filename="fname.txt"; if((fp=fopen("fname.txt","w"))==NULL) { printf("\n打不开文件! \n"); return; } if(head->next==NULL) { printf("\n信息为空! \n"); return; } else p=head->next; while(p! =NULL) { fprintf(fp,"%s%s%d%s%d%d%d%s%s%s%s\n",p->NO,p->name,p->age, p->sex,p->birthday.year, p->birthday.month, p->birthday.day, p->origo,p->college, p->major,p->phone); //存入文件 p=p->next; } printf("保存完毕! \n"); fclose(fp); } 第四章测试分析 4.1测试程序执行情况 菜单 输入信息 学生信息浏览 按学号查找 按姓名查找 按专业查找 修改信息 4.2出现的问题和解决的方法 最初设计的修改信息模块是将全部信息重新输入,太过麻烦,之后我借鉴了书上的内容,加入了switch使其可以选择修改的内容。 第五章课程设计总结 本系统按照任务要求内容设计,并且可进行多个方向的查询,修改信息模块简洁、有条理,但是整体信息并不完整,例如奖惩信息。 因为自己不了解奖惩的方式,所以就把这一项省略了。 这次是用codeblocks设计和调试程序的,没有在其他的编译器上运行过。 经过这次的课程设计,我将自己没有熟练掌握的知识再次进行了复习与练习,并将许多零碎的知识连接在了一起。 通过不断的练习,我对C语言有了一个新的认识。 虽然在这个过程中,遇到过很多的问题,但是在不断地查阅资料和改进程序的过程中,我开始能够更加熟练的运用结构体、指针等内容。 附录: 程序代码 #include #include #include #definePFprintf #defineLENsizeof(structstudent) //定义结构体 typedefstructdate { intyear; intmonth; intday; }DATE; structstudent { charNO[20]; charname[20]; intage; charsex[3]; DATEbirthday; charorigo[100];//籍贯 charcollege[20];//学院 charmajor[20];//专业 charphone[20]; structstudent*next; }; typedefstructstudentSTU; STU*head=NULL;//全局指针 intn,i=0;//全局变量 //自定义函数 voidshow_menu();//显示菜单 voidmenu();//执行菜单 voidcreat_stu();//建立链表 voidinsert_stu();//学生信息录入 voidprint_stu();//学生信息浏览 voidsearch_NO();//以学号方式查询信息 voidsearch_name();//以姓名方式查询信息 voidsearch_major();//以专业方式查询信息 voidarrage_stu();//排序 voiddel_stu();//删除学生信息 voidrevise_stu();//修改学生信息 voidsave();//保存信息 intmain() { creat_stu(); menu(); return0; } //创建链表 voidcreat_stu() { FILE*fp; longsize; STU*p1,*p2; head=(STU*)malloc(sizeof(STU)); head->next=NULL; if((fp=fopen("fname.txt","r"))==NULL) { printf("这是新表\n"); return; } fseek(fp,0L,2); size=ftell(fp); if(! size) { printf("这是空表\n"); return; } rewind(fp); p2=head->next; while(! feof(fp)) { p1=(STU*)malloc(sizeof(STU)); fscanf(fp,"%s%s%d%s%d%d%d%s%s%s%s\n",p1->NO,p1->name,&p1->age, p1->sex,&p1->birthday.year, &p1->birthday.month, &p1->birthday.day, p1->origo,p1->college, p1->major,p1->phone); p1->next=NULL;//创建节点完 if(head->next==NULL) { head->next=p1; } else p2->next=p1; p2=p1; n++; } p2->next=NULL; fclose(fp); } //执行菜单 voidmenu() { intc; show_menu(); while (1) { scanf("%d",&c); switch(c) { getchar(); case1: insert_stu();break; case2: print_stu();break; case3: search_NO();break; case4: search_name();break; case5: search_major();break; case6: del_stu();break; case7: revise_stu();break; case8: arrage_stu();break; case0: exit(0); } show_menu(); } } //显示菜单 voidshow_menu() { PF("\n"); PF("●●●●●●●●●●●●●●●●●●●●菜单●●●●●●●● ●●●●●●●●●●\n"); PF("\t\t1.输入学生信息\n"); PF("\t\t2.浏览学生信息\n"); PF("\t\t3.以学号方式查询信息\n"); PF("\t\t4.以姓名方式查询信息\n"); PF("\t\t5.以专业方式查询信息\n"); PF("\t\t6.删除学生信息\n"); PF("\t\t7.修改学生信息\n"); PF("\t\t8.排序\n"); PF("\t\t0.退出\n"); PF("●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●\n"); PF("\n请选择\n"); } //学生信息录入 voidinsert_stu()//学生信息录入 { n=0; STU*p1=NULL,*p2=NULL; p1=(STU*)malloc(sizeof(STU)); PF("●●●●●●
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学生 成绩管理系统 课程设计 报告书
![提示](https://static.bingdoc.com/images/bang_tan.gif)