计算机科学学学院计算机系C语言程序设计报告.docx
《计算机科学学学院计算机系C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《计算机科学学学院计算机系C语言程序设计报告.docx(51页珍藏版)》请在冰点文库上搜索。
计算机科学学学院计算机系C语言程序设计报告
计算机科学学学院计算机系C语言程序设计报告
成绩管理系统
学生姓名:
学号:
班级:
指导老师:
报告日期:
1.题目与要求
1)问题提出
本人计划编写一个学生信息管理系统,主要用来管理学生基本信息及成绩信息。
2)本系统涉及的知识点
结构体,链表,dowhile,while,for循环,函数,switch,指针。
3)功能要求
(1)建立学生信息,每个学生的信息包括:
学号,姓名,语文成绩,数学成绩,英语成绩。
(2)直接输出学生信息。
(3)求每个学生的平均分,求单科的平均分。
(4)查询:
分别按学号查询,按姓名查询,按名次查询,成绩排名正数倒数若干名内来查询,语文不及格查询,数学不及格查询,英语不及格查询,以及平均分不及格查询。
(5)修改学生信息:
根据学号修改学生姓名,语文成绩,数学成绩,英语成绩。
(6)排序:
根据平均分从大到小排序,从小到大排序,单科成绩从大到小,从小到大排序。
(7)创建新的学生信息到原来的链表。
(8)根据学号删除链表中的学生信息。
(9)退出系统,并进行确认。
2.功能设计
1)算法设计
将题目分成若干摸块或部分,各模块或部分的算法设计思想
(1)利用switch语句设计如图1-1所示的主菜单
主菜单
请选择下一步你想要的操作(1-6)
1--直接输出
2--求平均分
3--查询学生信息
4--修改学生信息与成绩
5--排序
6--新创建学生信息
7--删除学生信息
8--退出系统
图1-1
(2)选择1后,调用直接输出函数,将刚刚记录的成绩显示出来
。
(3)选择2后,调用求平均分函数,进入函数后利用switch语句实现一个如图1-2所示的子菜单。
该菜单中除返回主菜单外每个选项调用一个函数。
子菜单
1--求单个学生平均分
2--求单科平均分
3--返回主菜单
图1-2
(4)选择3后,调用查询学生信息函数,进入函数利用switch语句实现一个如图1-3所示的子菜单。
该菜单中除7外每个选项调用一个函数,其中4,5公有一个函数,只是传递的参数不同。
子菜单
1--按学号查询
2--按姓名查询
3--按名次查询
4--查询正数前多少名的学生信息
5--查询倒数前多少名的学生信息
6--查询不及格学生信息
7--返回上一层
图1-3
(5)选择4后,调用学生信息修改函数,输入学号判断正确后利用switch语句实现如图1-4所示的子菜单。
除返回主菜单外每条语句对应一个函数。
其中第1,2,3条公有一个函数,只是传递的参数不同。
子菜单
0--修改语文成绩
1--修改数学成绩
2--修改英语成绩
3--修改学生姓名
4--返回主菜单
图1-4
(6)选择5后,调用排序功能,进入函数后,利用switch语句实现如图1-5所示的子菜单。
除返回主菜单,1,2公有一个排序函数,只是传递的参数不同,3,4公有另一个排序函数,同样传递的参数不同,5对应返回主菜单的语句。
子菜单
1--平均分从大到小排序
2--平均分从小到大排序
3--单科成绩从高到低排序
4--单科成绩从低到高排序
5--返回主菜单
图1-5
进入3,4选项后,用printf输出可供选择的语句实现如下图1-6,1-7所示的第二级子菜单,
获得的参数传递到调用函数。
0--语文从高到低
1--数学从高到低
2--英语从高到低
图1-6
0--语文从低到高
1--数学从低到高
2--英语从低到高
图1-7
(7)选择6后,调用新创建学生信息函数。
(8)选择7后,调用删除学生信息函数。
(9)选择8后,调用退出系统确认函数,退出系统。
(10)根据所选菜单编写相应代码:
(a)输入函数input:
建立链表,利用循环的方式将相关信息存入单链表,当学号输入为0时,输入停止,并将学生人数统计赋值给n,并返回链表的首地址。
(b)直接输出函数output:
利用形参将链表首地址传递给output,利用循环的方式,输入的成绩输出。
(c)求单个学生的平均分(总分处以科目数)ave1:
将平均分计算出来,并存入链表中的结构体成员average,并将其输出。
(d)求单科目的平均分ave2:
计算单科的平均分,并将其输出。
(e)按学号查询学生信息函数chaxun1:
输入学生学号,利用strcmp库函数找出该学生,并将信息输出。
(f)按姓名查询学生信息函数chaxun2:
输入学生姓名,利用strcmp库函数出该学生,并将其输出,由于学生姓名不唯一,故可能会输出相同姓名的不同学生信息。
(g)按名次查询学生信息函数chaxun3:
输入学生平均分的排名,调用从大到小排序的函数后,将对应名次的学生信息输出。
(h)输出正数和倒数前后多少名的函数公用一个qianhou:
输入的参数不同使函数进行不同的排序,并将结果输出。
(I)查询不及格学生信息,分为语文不及格,数学不及格,英语比较高以及平均分不及格。
,由于三科分数用数组保持,故单科可公用一个函数danke:
通过选择将参数传递给该函数,利用循环的方式使其进行单科目不及格学生的信息;查询平均分不及格函数pingjun:
同样利用循环的方式将平均分不及格的学生找出,并输出。
斯中查找方式基本相同。
(j)修该学生信息分为对姓名,以及单科成绩的修改,先输入学号进行判断无误好,选择不同的修改,同样由于单科成绩用数组记录保存,故又可公用一个函数
Correctdanke:
将选择作为参数传递给该函数,使其进行不同的修改。
对姓名的修改方式同单科成绩,利用strcpy库函数进行修改。
(k)排序函数:
对单科进行排序函数paixu1:
将参数传递给该函数,使其进行不同科目及顺序不同的排序,并调用output输出结果。
平均分排序方法同此。
(l)增加新学生信息的函数creatnew,其方法同最初的inputha函数。
(m)删除学生信息的函数del:
利用循环根据学号找到该学生,将该学生对应结构体的前后两个结构体连接,以此从链表中删除该学生信息。
(n)退出函数,询问是否真的退出系统,否则再次返回主菜单。
2)画模块图
成绩管理系统的模块如图
3)画部分模块的流程图
图1-12correct()函数
注释:
修改信息方法大致一样,故只画一图。
图1-13paixu()函数
注释:
排序方法大致一样,故只画一图。
3.程序代码设计
(1)函数原形:
voidwelcome();
功能:
用printf语句显示欢迎界面。
并按ENTER键确认进入。
(2)函数原形:
voidintroducation();
功能:
利用system(“cls”)函数将前面的内容清屏,用printf语句显示对本函数的简介。
按ENTER键继续。
(3)函数原形:
structstudent*input();
功能:
malloc函数建立链表,利用flushall函数清除缓冲,利用dowhile语句,if语句,scanf函数完成对学生信息的输入,记录学生人数,利用strcmp函数判断学号是否为0。
同时返回链表的首地址head。
变量及类型:
intj,sum;//整型,j控制循环变量,sum记录该学生的总分。
chars[2]="0";//字符串,与p->xueaho比较,判断输入是否完毕。
structstudent*p,*head,*w=NULL;//指向链表单元的地址
head=(structstudent*)malloc(sizeof(structstudent));//链表的首地址
说明:
当输入学号为0时,回车后输入结束.在输入一个学生的信息后,计算出平均分并保存
(4)函数原形:
voidave(structstudent*head)
功能:
利用switch语句进行功能选择,同时调用相应的ave1()和ave2()函数。
变量及类型:
inta;//switch中用来判断选择的功能函数
(5)函数原形:
voidave1(structstudent*head);
功能:
利用for语句,printf语句将保存在链表中的个人平均分输出。
变量及类型:
inti;//控制循环变量
structstudent*head//接受主函数传过来的链表首地址。
structstudent*p;//指向一个结构体的首地址。
(6)函数原形:
voidave2(structstudent*head);
功能:
利用for语句记录单科的总分,计算出单科平均分,printf语句将单科平均分输出。
变量及类型:
inti,j,sum;//整型变量,i,j为控制变量,sum记录单科总分
structstudent*head;//接收链表的首地址
structstudent*p//指向链表中一个结构体的首地址
(7)函数原形:
voidchaxun(structstudent*head);
功能:
利用switch语句进行功能选择,并调用相应的查询函数。
调用了chaxun1(),chaxun2;chaxun3;qianhou();bujige();函数。
变量及类型:
inta;//判断选择的功能
structstudent*p//指向链表中一个结构体的首地址
structstudent*head;//接收链表的首地址
(8)函数原形:
voidchaxun1(structstudent*head);
功能:
利用scanf()函数输入要查询的学生学号,利用strcmp函数,while循环找出该学生的结构体地址。
利用printf,for循环将信息输出。
如果找不到相应的学号则显示错误,重新输入。
变量及类型:
intj,flag=0;//整型变量,j为控制循环变量。
flag用来标志是否找到相应的学号。
chara[6];//保存输入的学号
structstudent*head;//接收链表的首地址
structstudent*p//指向链表中一个结构体的首地址
(9)函数原形:
voidchaxun2(structstudent*head);
功能:
利用scanf()函数输入要查询的学生姓名,利用strcmp函数,while循环找出该学生的结构体地址。
利用printf,for循环将信息输出。
如果找不到相应的姓名则显示错误,重新输入。
变量及类型:
intj,flag=0;//整型变量,j为控制循环变量。
flag用来标志是否找到相应的学号。
structstudent*p;//指向链表中一个结构体的首地址
structstudent*head;//接收链表的首地址
chara[20];//保存输入的姓名
(10)函数原形:
voidchaxun3(structstudent*head);
功能:
输入学生名次,调用排序函数,利用for语句找到该名次的学生的结构地址,再利用printf打印出来。
变量及类型:
inta,b;//整型变量,a记录名次,b为控制循环变量。
structstudent*p;指向链表中一个结构体的首地址
structstudent*head;//接收链表的首地址
(11)函数原形:
voidqianhou(structstudent*head,intk)
功能:
输出平均分排名前后多少名的学生信息.调用排序函数,排序后,用for循环将
其输出。
变量及类型:
intc,j,i;//c记录输入的人数,j,i为循环控制变量。
structstudent*p;//链表中一个结构体的首地址
structstudent*head,intk//接收链表的首地址,k判断是要输出前几名,还是后几名。
(12)函数原形:
voidcorrect(structstudent*head)
功能:
先输入要修改的学生学号,利用for循环,strcmp函数学号输入是否为正确,错误重新输入,正确利用switch语句语句显示子菜单功能,显示你要修改的是那种信息。
并将参数传递该调用的函数。
调用了correctdanke();correctname();函数;
变量及类型:
inti,d,flag=0;、//i为循环控制变量,d为判断调用哪个函数,并将其作为参数传递给调用函数。
flag判断是否输入的学号存在。
charnumber[6];//保存输入的学号
structstudent*p;//指向链表中一个结构体的首地址
structstudent*head//接收链表的首地址
(13)函数原形:
voidcorrectdanke(structstudent*p,intd)
功能:
判断将要修改的是哪门成绩,利用scanf函数输入新的成绩,修改后再计算平均分,将其保存在p->average里面。
变量及类型:
intsum=0,j;//sum保存修改后的总分,用来计算平均分,j为循环控制变量
structstudent*p,//指向链表中一个结构体的首地址,在这里表示要修改信息的学生的结构体的地址。
intd;//对应成绩在记录成绩的数组中的位置,从而判断修改哪门成绩
说明:
修改三科成绩,大致方法一样;故公用一个函数,通过传递过来的参数来判断是修改哪门成绩。
(14)函数原形:
voidcorrectname(structstudent*p)
功能:
利用scanf重新对姓名进行赋值(字符串),并将其用strcpy函数复制到p->name。
变量及类型:
charb[20];
structstudent*p指向链表中一个结构体的首地址,在这里表示要修改信息的学生的结构体的地址。
(15)函数原形:
voidanyaoqiu(structstudent*head);
功能:
利用switch语句显示子菜单,判断要按哪种方式进行排序,调用paixu1()和paixu2函数,调用按单科成绩排序时将参数传递给paixu1()函数。
变量及类型:
inti,x;//i是判断以那种方式排序(语文,数学,英语,平均分);x判断是从小到大还是从大到小。
(16)函数原形:
voidpaixu1(structstudent*head,inti)
功能:
按平均分排序。
利用for语句,if语句,找到每一轮比较中平均分最大或最小的结构体首地址。
一轮比较后将找到的地址对应的结构体信息与第一个结构体的学生信息交换。
同时通过for语句使平均分最大或最小的学生信息在下一轮中不参与比较。
最后调用output函数输出排序的结果。
变量及类型:
intk,j;//整型,控制循环变量
structstudent*p=NULL,*t=NULL,*p1;//指向链表中一个结构体的首地址,
structstudentk1;//此处用来做中间变量
structstudent*head,inti/接收链表的首地址;i判断是从小到大还是从大到小。
(17)函数原形:
voidpaixu2(structstudent*head,inti,intx)
功能:
按单科成绩进行排序。
先根据传递过来的参数判断是按哪一门成绩进行排序,利用for语句,if语句,找到每一轮比较中平均分最大或最小的结构体首地址。
一轮比较后将找到的地址对应的结构体信息与第一个结构体的学生信息交换。
同时通过for语句使单科成绩最大或最小的学生信息在下一轮中不参与比较。
最后调用output函数输出排序的结果。
变量及类型:
intk,j;//整型,控制循环变量
structstudent*p=NULL,*t=NULL,*p1;//指向链表中一个结构体的首地址,
structstudentk1;//此处用来做中间变量
structstudent*head//接收链表的首地址
inti,intx//x是判断以那种方式排序(语文,数学,英语,平均分);i判断是从小到大还是从大到小。
(18)函数原形:
voidoutput(structstudent*head);
功能:
利用while语句,if语句将处理后或未处理的学生整体成绩输出。
变量及类型:
intj;整型,控制循环变量
structstudent*p;//指向链表中一个结构体的首地址,
structstudent*head//接收链表的首地址
(19)函数原形:
voidbujige(structstudent*head);
功能:
利用switch语句显示子菜单,调用了pingjun()函数,danke()函数。
变量及类型:
inta;整型,用来选择相应的不及格查询函数。
(20)函数原形:
voidpingjun(structstudent*head)
功能:
利用for循环,if语句找到平均分不足60的学生,利用printf输出。
变量及类型:
intN=0;//整型变量,记录不及格的学生人数
structstudent*p;//指向链表中一个结构体的首地址,
(21)函数原形:
voiddanke(structstudent*head,inta)
功能;先根据传递过来的参数判断查询哪一门不及格,利用for循环,if语句找到单科成绩不足60的学生,利用printf输出。
变量及类型:
intN=0;//整型变量,记录不及格的学生人数
structstudent*p;//指向链表中一个结构体的首地址,
说明:
修查询三科不及格成绩,大致方法一样;故公用一个函数,通过传递过来的参数来判断是查找哪门成绩不及格。
(22)函数原形voidcreatnew(structstudent*head);
功能:
增加新学生信息,功能同input输入。
变量及类型:
intsum,j;//整型变量,sum记录总分,j做循环控制变量
chars[2]="0";//字符串,与p->xueaho比较,判断输入是否完毕。
structstudent*p,*w;//指向链表中一个结构体的首地址,
(23)函数原形voiddel(structstudent*head);
功能:
删除学生信息,输入学号,利用for语句,strcmp函数找出对应学生,将该结构体前后的两个结构体相连,则删除成功。
变量及类型:
intflag=0;//整型,标识是否输入的学号是否存在。
charnumber[20];//记录输入的学号
structstudent*p,*w;//指向链表中一个结构体的首地址,
(24)函数原形:
intExit();
功能:
询问是否确认退出,返回一个值,确定则打印出退出界面,否者继续返回主菜单。
变量及类型:
intx;//整型变量,作为返回值来判断是否确认退出。
4.c语言设计总结
(1)程序调试情况:
在完成一个函数设计后,就进行编译,出现了意想不到的结果,有时是错误太多,并且是没见过的,有时是执行过程中突然停止,不过通过查找资料和课本和与同学进行研究,最终还是调试成功。
不断地调试,不断地修改和变动,使EXE执行文件能正常运行。
(2)收获:
编程是一项极需要仔细和耐心的工作,很多情况下由于耐心不够,于是在调试过程中忽略了一些问题。
在编写排序函数时,由于把一个字符误写,导致程序运行结果不对。
在建立链表时,由于知识记忆和运用不熟悉,导致有时候在编写过程中过分的依赖课本,同时也造成一些错误。
可见,可见想做一个好的程序员,态度很重要,需要你坚持不懈的思考和研究和学习,同时也不能忽略课本知识的重要性。
5.结束语
特别感谢万帅同学对某些错误的指正。
6.参考文献
白燕.尹业安C语言程序设计。
国防科技大学出版社。
7.附录:
程序清单
#include
#include
#include
voidpaixu2(structstudent*head,inti,intx);
structstudent
{
charxingming[20];
charxuehao[6];
intscore[3];
floataverage;
structstudent*next;
};
voidwelcome();
voidintroducation();
structstudent*input();
voidave(structstudent*head);
voidave1(structstudent*head);
voidave2(structstudent*head);
voidchaxun(structstudent*head);
voidchaxun1(structstudent*head);
voidchaxun2(structstudent*head);
voidchaxun3(structstudent*head);
voidqianhou(structstudent*head,intk);
voidcorrect(structstudent*head);
voidcorrectdanke(structstudent*p,intd);
voidcorrectname(structstudent*p);
voidanyaoqiu(structstudent*head);
voidpaixu1(structstudent*head,inti);
voidoutput(structstudent*head);
voidbujige(structstudent*head);
voiddanke(structstudent*head,inta);
voidpingjun(structstudent*head);
voidcreatnew(structstudent*head);
voiddel(structstudent*head);
intExit();
intn=0;
voidmain()
{
chari,a;
structstudent*head=NULL;
welcome();
printf("\t\t\t确认进入请按Enter键→");
scanf("%c",&i);
if(i=='\n')
system("cls");
introducation();
printf(