C课程设计报告.docx
- 文档编号:25266232
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:20
- 大小:18.74KB
C课程设计报告.docx
《C课程设计报告.docx》由会员分享,可在线阅读,更多相关《C课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
C课程设计报告
大理大学数学与计算机学院
《C语言课程设计》设计报告
题目名称:
班级成绩管理系统
班级:
2014级计算机科学与技术
学号:
LX14115150
姓名:
申畅恒
评分:
一、功能介绍
1、本系统采用一个链表结构体,每个数据的结构应当包括:
学号、姓名、M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
1.成绩录入
2.成绩显示
3.成绩排序(平均分排序)
4.增删改
Ø插入
Ø删除
Ø修改成绩
5.成绩统计
Ø显示每门课程成绩最高的学生的基本信息
Ø显示每门课程的平均成绩
Ø显示超过某门课程平均成绩的学生人数
6.退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
二、总体设计
2.1功能模块设计
使用带头结点的结构体单链表
每个记录含有:
学号,姓名,成绩1,成绩2,成绩3三门课。
主函数以key的值进行调用其他函数实现对应的功能
v成绩录入:
create()函数进行录入学生信息学生人数可以任意(输入完一个记录按n结束)。
该函数调用Insert函数在表尾逐条添加记录到表尾
v成绩显示:
check()函数显示每条记录信息
v成绩排序:
sort()利用冒泡排序法进行以第一个成绩排序(小到大)
v增删改:
edit()里面有三个功能
✓插入表尾:
insert()函数
✓删除记录:
deletByName()以学生的姓名删除记录
✓修改一条记录:
modify()以学生的学号修改一个
学生的成绩记录
v成绩统计:
sta()函数包含三个功能
✓计算每门课的平均成绩:
average()函数
✓计算每门课得最高分的学生信息:
top()函数
✓计算超过每门课平均成绩的学生人数:
above()函数
v退出系统:
exit
(1)利用conio.h库里面的函数
主程序
退出系统
成绩统计
成绩修改
成绩显示
成绩排序
成绩录入
2.2算法或流程图设计
主函数
开始
vv
主菜单显示后进行按键选择功能
Menu_Sel
N
Switch判断可以的值进行调用函数功能
Key=1
Y
N
Key=2
N
Y
create
Key=3
N
Y
check
Key=4
N
Y
sort
Key=5
N
Y
Key=6
edit
Y
sta
exit
Getch()
功能执行完成后等待输入任一键继续
Key!
=0
如果key不等于零继续循环
Y
N
结束
Insert()函数
S*p,*q
判断q是否为空,为空直接开辟空间
!
q
N
不为空指针移到表尾
Y
p->next
q=(s*)malloc(LEN
N
Y
q=q->next
i=0
Y
q=(S*)malloc(..
i<3
申请空间
Y
i=0
scanf(“%d”,...
输入该记录的成绩
i<3
i++
N
Y
scanf(“%d”,..
q->next=null
return
i++
q->next=N...
Sort()(排序函数)
S*p,*q,*m,*n
!
s->next
printf(...
判断指针是否为表尾
不是进行比较
N
Y
初始化指针
p=s;q=s->next
外部循环条件
q->next
N
m=p->next
内部循环条件
temp1->next
N
Y
交换条件
temp1->nex
N
Y
Y
m=temp1;n=temp1
Y
temp1=pemp1-
内部循环结束
m!
=p->next||
N
Y
p=p->next
p->next=n;
Temp2=s->next
printf(........
三、功能模块的实现
3.1函数调用关系图
Main
Menu_select
Menu_select
create
sort
check
edit
statistic
exit
exit
above
average
top
delete
modify
insert
3.2功能实现代码
结构体定义:
typedefstructStudent{
charid[10];
charname[10];
intresult[3];
structStudent*next;
}S;
主函数
voidmain()
{
//structStudentstudent[50],*s;
intkey;
voidmenu();
Sstudent;
student.next=NULL;
do{
menu();
P("Pleaseenteryourcommand:
");
scanf("%d",&key);
switch(key){
case1:
create(&student);break;
case2:
checking(&student);break;
case3:
sort(&student);break;
case4:
edit(&student);break;
case5:
sta(&student);break;
case6:
exit
(1);
//default:
P("Errorinput\n");break;
}
P("pressanykeytocontinue!
");
getch();
system("cls");
}while(key!
=0);
}
主菜单显示
voidmenu(){
P("\t\t\tstudentmanagementsystem\n");
P("\t**********************************************************\n");
P("\t*\t1.InsertResult\t2.ResultChecking\t*\n");
P("\t*\t3.SortedResult\t4.ResultEditing\t*\n");
P("\t*\t5.ResultStatistic\t6.Exit\t\t\t*\n");
P("\t**********************************************************\n");
}
新建记录
voidcreate(S*s){
charflag;
do{
insert(s);
P("Doyouwanttocontinue?
(y/n)");
flag=getch();
P("\n");
}while(flag!
='n'&&flag!
='N');
}
查看所有记录
voidchecking(S*s){
S*p;
P("checking\n");
p=s->next;
P("ID\t\tName\t\tScore1\t\tScore2\t\tScore3\n");
while(p!
=NULL){
P("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",p->id,p->name,p->result[0],p->result[1]
p->result[2]);
p=p->next;
}
}
排序功能
voidsort(S*s){//按第一个成绩排序
S*p,*q,*m,*n;
S*temp1,*temp2;
if(s->next==NULL)
printf("NOLINKLIST!
!
!
");
else
{
p=s;q=s->next;
while(q->next!
=NULL)
{
m=p->next;
n=q->next;
temp1=m;
while(temp1->next!
=NULL)
{
if(temp1->next->result[0]
temp1->next->result[0]
{
m=temp1;n=temp1->next;
}
temp1=temp1->next;
}
if(m!
=p->next||(m==p->next&&m->result[0]>n->result[0]))
{
p->next=n;
p=n;
m->next=q;
m=q;
q=q->next;
n=n->next;
p->next=q;
m->next=n;
}
else
{
p=p->next;
q=q->next;
}}
temp2=s->next;
}
P("------Resultsorted-------");
}
增删改
voidedit(S*s){
intn;
P("1.Insert\n2.Delete\n3.Edit\n4.Mainmenu\n");
P("Pleaseselectthemethod:
");
scanf("%d",&n);
switch(n){
case1:
insert(s);break;
case2:
deleteByName(s);break;
case3:
modify(s);break;
case4:
return;
}
}
插入
voidinsert(S*s)
{
S*p,*q;
inti;
p=s->next;
if(!
p){
q=(S*)malloc(LEN);
P("pleaseinputtheinformationinform(ID,Name,Result1,Result2,Result3):
\n");
scanf("%s%s",&q->id,&q->name);
for(i=0;i<3;i++)
{
scanf("%d",&q->result[i]);
}
q->next=NULL;
s->next=q;
}
else{
while(p->next){
p=p->next;
}
q=(S*)malloc(LEN);
P("pleaseinputtheinformationinform(ID,Name,Result1,Result2,Result3):
\n");
scanf("%s%s",&q->id,&q->name);
for(i=0;i<3;i++)
{
scanf("%d",&q->result[i]);
}
q->next=NULL;
p->next=q;
}
}
删除
voiddeleteByName(S*s){//以学生名删除记录
S*p,*q;
charch[10];
intn=0;
P("Deleting....\nInputthestudentname:
");
scanf("%s",&ch);
p=s->next;
q=p->next;
if(strcmp(p->name,ch)==0){
s->next=s->next->next;
}
else{
while(q){
if(strcmp(ch,q->name)==0){
n=1;
break;
}
p=p->next;
q=q->next;
}
if(n==0)
{P("没有此学生名记录");
return;
}
else{
p->next=q->next;
free(q);
}
}
}
修改成绩记录
voidmodify(S*s){
S*p;
charch[10];
intn=0;
P("Modifyingrecord....\nInputthestudentID:
");
scanf("%s",&ch);
p=s->next;
while(p){
if(strcmp(ch,p->id)==0){
n=1;
P("pleaseinputtheresult1,2,3:
\n");
scanf("%d%d%d",&p->result[0],&p->result[1],&p->result[2]);
break;
}
p=p->next;
}
if(n==0)P("没有此学生名记录");
}
统计功能
voidsta(S*s){
intk;
P("******************************************\n");
P("Pleaseenteryourcommand:
");
P("\n1,Topresultinthecourse\n2,Resultaverage\n3,Studentwithresultaboveaverage\n4,Exit\n");
while
(1)
{
P("enteryourcommand:
");
scanf("%d",&k);
switch(k){
case1:
top(s);break;
case2:
average(s);break;
case3:
above(s);break;
case4:
return;
}
}
}
每门课平均成绩
voidaverage(S*s){
floataver;
S*p;
intn,sum;
inti;
for(i=0;i<3;i++){
n=sum=0;
p=s->next;
while(p){
sum+=p->result[i];
p=p->next;
n++;
}
if(n==0){
P("thereisn'tanyrecord\n");
return;
}
aver=(float)sum/n;
P("Result%daverageis:
%.2f\n",i+1,aver);
}
}
每门课最高分的学生信息
voidtop(S*s){
S*p,*q;
inti;
intmax1;
for(i=0;i<3;i++){
max1=0;
p=q=s->next;
while(p){
if(max1
p=p->next;
}
while(q){
if(max1==q->result[i])break;
q=q->next;
}
P("thetopresult%dis:
%d\n",i,max1);
P("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",q->id,q->name,q->result[0],q->result[1],
q->result[2]);
}
}
每门课大于平均分的学生人数
voidabove(S*s){
floataver;
S*p;
intn,sum,x;
inti;
for(x=0;x<3;x++){
i=0;
n=sum=0;
p=s->next;
while(p){
sum+=p->result[x];
p=p->next;
n++;
}
if(n==0){
P("thereisn'tanyrecord\n");
return;
}
aver=(float)sum/n;
P("Result%daverageis:
%.2f\n",x+1,aver);
p=s->next;
while(p){
if(p->result[x]>aver)i++;
p=p->next;
}
P("thestudentthatgotgreaterthanaveragescoreamountis:
%d\n",i);
}
}
4、总结
1 ,开发经验
通过对本题目的开发,体会到要掌握以下几点内容。
Ø大程序的设计风格。
按“自顶向下,逐步细化,模块化”的方法进行程序设计。
Ø编写主函数,并进行测试与调试。
当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。
C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。
Ø定义函数时,应选好参数的个数和数据类型。
2 ,实训中遇到的问题及解决方法
在这次的实训中,主要遇到的问题是编译环境的不同对程序也不同。
本来我们的程序是不支持在VC++
里面编译的,因此一直都处在编译失败,该函数未定义的错误中。
后来经过老
师的指导,终于找到了根源,就是把“clrscr()”改为“system("cls")”
就可以了。
3 ,设计中尚存的不足之处
关于这次的程序,也有挺多不足的地方。
首先,我觉得程序还不够完善,每次输入的数据都不能下次使用,没有使用到IO保存读取;其次,有些地方好像功能有点重复了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)