开发工具:
文件大小: 5mb
下载次数: 0
上传时间: 2019-09-13
详细说明:
从零开始学C语言(八)pdf,从零开始学C语言(八)第18章学生成绩管理系统设计293
18.2.1 score* statistics( score*head成绩统计
该函数主要实现了对学生成绩统计的几种方式:统计个人总分和平均分、统计单科平均分、
统计总分最高分和最低分,如图18-12~图18-15所示。
head=sNULL
否
是
switch-case语句匹配
当pll=NULL
输出pl结点总分与平均分
输出提示信息
匚进入相应的模块执行
输出错误提示
l=pl->next
返回执行操作后的链表首地址head
返回执行操作后的链表首地址head
图18-12成绩函数执行NS图
图1813统计个人总分和平均分
head==NULL
head==NULL
否
是
否
是
当p1=NUL
当pl!=NULL
输出单科平均分
输出提示信息
输出总分最高分和最低分
输出提示信息
pl=pI->next:
pl=pl→>next
返回执行操作后的链表首地址 head
返回执行操作后的链表首地址head
图18-14统计单科平均分
图18-15统计总分最高分和最低分
18.2.12 int menu(intk)菜单
该函数主要提供一个系统显示的界面,对系统模块进行介绍,便于用户进行操作。系统界
面如图1816所示
182.13用到的头文件和全局变量
排 include< malloc.h>
include
排inc1ude
#include
#define LEN sizeof(struct scorenode)
#define DEBUG
int n, k:
/*n,k为全局变量,本程序中的函数均可以使用它,分别用于记数
和标记*
图18-16系统界面
(18.3)程序代码
上一节对学生成绩管理系统的数据结构的模块功能的分析,并列出了实现各个模块功能的
函数以及它们的程序执行NS图,下面是实现各个函数的程序代码以及程序运行后的结果。
183.1主函数 maino代码
主函数 maino的功能是通过调用 creato, search(, deleo, addOprinto, statistics, save,
sortdatao等函数,实现学生成绩查询系统功能
首先,函数体中调用 menu函数,提供一个系统显示的界面,对系统模块进行介绍,便于用
户进行操作。然后使用 switch-case语句根据用户的不同选择来进入相应的模块,执行不同的操作。
menu函数代码如下:
294
雪从零开始学c语冒
int menu (int k)
Int
i
printf(" t\t\t\t学生成绩管理系统\n");
/*打印出系统标题*
printf("\n”)
for(i=0;i<80;i++)
printf("*"
printf("1编辑学生的成绩\ttt2显示学生的成绩\tt\t3查询学生的成绩\n")
printf(·4添加学生的成绩vttt5删除学生的成绩tt6学生成绩排序n}/
printf("7保存学生的资料\ttt8统计学生的成绩ttt9读取学生的成绩\n");
for(i=0;i<80:++
printf("*"
print£("欢迎进入学生成绩管理系统,请选择您所要的操作(选择(0)退出):");
scanf("暑d”,&k】;
/*选择操作*
getchar()t
return (k)i
main函数代码如下:
void main()
int k:
score *head=0, *stu=0
while (1)
k=menu(k)
switch(k)
/*用 switch语句实现功能选择*
[case 1: head=creatlink(), break
/*调用创建链表函数*
case 2: print (head)i breaki
/*调用显示学生资料函数*
case 3: head=search (head): break
/*调用成绩查询函数*
case 4: head=add(head, stu),:
调用追加学生资料函数*
case 5: head=dele (head)i breaki
/*调用删除学生资料函数*/
case 6: sortdata (head): break:
/★调用排序函数*
case 7: save (head): break;
/*调用保存函数*
case 8: statistics (head), breaki
/*调用统计函数*/
case 9: head=loadfile(head); break;
/*从文件调入记录函数*
case0;exit(0);/*退出系统,返回主界面*
default: printf("输入错误,请重试!n”);
程序运行时,出现学生成绩管理系统的主界面,如图
18-17所示。
18.32创建链表函数 creatlinko
函数 creatin0的功能是创建链表,此函数带回一个指
向链表头的指针。函数体中使用了goto语句,方便程序执
行过程中的跳转。
函数 creatlinko代码如下:
图18-17系统界面
score *creatlink(
score*head
score *p1,*p2,*p3,*max;
int 1,i
float fen:
char t[1017
第18章学生成绩管理系统设计295
p1=p2=p3=(score *)malloc(LEN); head=p3:
/*开辟一个新单元*
printf("请输入学生资料,输0退出!n");
repeat1: print f("请输入学生学号(学号应大于0):");
/*输入学号,学号应大于0*f
scanf("sd",&pl->number
while(pl->number<0)
getchar()i
print f("输入错误,请重新输入学生学号:甲);
scanf("号d",&p1-> number;}/*输入学号为字符或小于0时,程序报错,提示重新输入学号★/
if(pl->number==0)
goto end;
/*当输入的学号为0时,转到末尾,结束创建链表*
else
p3-head;
if(n>0)
(for(i=0i inumber!=p3->number
p3=p3->next;
else
printf("学号重复,请重输!n");
goto repeal;
/*当输入的学号已经存在时,程序报错,返回前面重新输入*
】
printf("请输入学生姓名:");
scanf("s",&pl->name);
输入学生姓名*
printf("请输入语文成绩(0-100):")/*输入语文成绩,成绩应在0~100*
scant(“暑fm,p1-> chinese);
while(pl->chinesec0l Ipl->chinese>100)
getchar():
print f("输入错误,请重新输入语文成绩");/*输入错误,重新输入语文成绩直到正确为止*
scanf("%",&pl->chinese);
print f("请输入数学成绩(0-100):");
*输入数学成绩,成绩应在0~100*
scanf("f",&pl->mathmatic)i
while(pl->mathmatic<0l Ipl->mathmatic>100)
getchar()i
print f("输入错误,请重新输入数学成绩");
/*输入错误,重新输入数学成绩直到正确为止*f
scanf("%f", &p1->mathmatic)i1
printf("请输入英语成绩(0-100):”);
/*输入英语成绩,成绩应在0~100*f
scant("暑”,p1->eng1ish);
while(p1->english<01lp1->english>100)
get char ();
printf("输入错误,请重新输入英语成绩");
scanf("f",&pl->english);1
/*输入错误,重新输入英语成绩直到正确为止
head=NULL
while(pl->number!=0)
n=n+1
if(n==1)
head=p1
else
p2->next=pl:
2=p1
pl=(score *)malloc(LEN);
296
m从零开始学C语曹
-------------m----
printf("请输入学生资料,输0退出!\n”);
repeat2: print f("请输入学生学号(学号应大于0):)
scanf("id",&pl->number ):
/*输入学号,学号应大于0*
while(pl->number<0
getchar();
printf("输入错误,请重新输入学生学号:“);
scanf(";a",6p1- number);}/*输入学号为字符或小于0时,程序报错,提示重新输入学号*
if(pl->number==0)
goto end;
/*当输入的学号为0时,转到末尾,结束创建链表*
else
p=headp
if(n>0)
(for (i=0; inumber !=p3->number
p3=p3->nexti
se
printf("学号重复,请重输!\n”);
goto repeat;
/*当输入的学号已经存在时,程序报错,返回前面重新输入*
printf("请输入学生姓名:");
scanf("&s",&pl->name);
/*输入学生姓名*
printf("请输入语文成绩(0~100):");
scanf("f",&pl->chinese)
/*输入语文成绩,成绩应在0~100*
while(pl->chinese<0| lp1-schineses100)
getchar()
printf("输入错误,请重新输入语文成绩");
scanf("f",&pl->chinese):)
/*输入错误,重新输入语文成绩直到正确为止*
printf("请输入数学成绩(0~100):”);
scanf(%f",&pl->mathmatic)i
/*输入数学成绩,成绩应在0~100*/
while(pl->mathmatic<0l lpl->mathmatics100)
getchar(
printf(·输入错误,请重新输入数学成绩")
scanf ("f",&pl->mathmatic)i)
/*输入错误,重新输入数学成绩直到正确为止*
printf("请输入英语成绩(0~100):");
scanf("gf",&pl->english);
/*输入英语成绩,成绩应在0~100*
while(pl->english<0llpl->english>100)
[getchar(
printf("输入错误,请重新输入英语成绩");
scanf("gf", &p1->english)i)
/*输入错误,重新输入英语成绩直到正确为止*/
end: pithead;
p3=p1
for(=1;inexti
if(max-number>p1->number)
f
k=max->number;
第18章学生成绩管理系统设计297
max->number=p1->number;
pl->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*
strcpy (t, max->name)
strcpy (max->name, pl->name )i
strcpy(pl->name, t)
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->chinese
max->chinese=pl->chinese;
p1->chinese=fen;
/*交换前后结点中的语文成绩,使之与学号相匹配*
Een=max->mathmatic
max->mathmatic=p1->mathmatic;
pl->mathmatic=fen;
/*交换前后结点中的数学成绩,使之与学号相匹配*
fen=max->english:
max->english=pl->english:
p1->english=fen;
/*交换前后结点中的英语成绩,使之与学号相匹配*/
max=head plshead i
/*重新使max,p指向链表头*/
p2->next=NULLi
/*链表结尾*
printf("输入的学生数为:号a个!n”,n);
return(head)
在输入学生的姓名和各科成绩时,采用使用逐一提示的输入方法,用回车确定。考虑到学
生的学号不可能为0,所以当输入的学号数为0时,把表尾结点的指针变量置NULL,输入结束。
在输入结束时,该函数对已经输入的学生按照学号进行排序存放。因此, creatin0所创建的链
表是一个有序的链表。
18.33显示学生信息函数 print(
函数 printO的功能是显示学生成绩,即将所建立的学生成绩链表打印出来。如果链表不为空,
逐个打印出学生的学号、姓名和各科成绩。
printo函数代码如下:
void print (score *head)
score Pi
if(head==NULL)
printf("n没有任何学生资料!n");}
else
printf("岩d\n",n);
printf("一-----------------------
-1n");
printf("|学号t|姓名t|话文\t|数学t英语tn");
printf("---------------------n");
/*打印表格域*
p=head;
do
[printf("18a\ti8st18.1ft18.1ftI8.1ft L\n".p->number, p->name, p->chinese, p->mathmati
c, p->english)i
printf(n
----------n");
/*打印表格域*/
p=p->next; )while (p!=NULL);
/*打印完成了*/
18.34向链表中添加学生数据函数addO
函数add的功能是向已经建立的链表中追加学生资料,并且将所有学生资料按学号排序。
函数adO代码如下:
298从零开始学c语會
score *add(score *head, score *stu)
score *po, *pl,*p2,*p3, *maxi
int 1. j
float fen;
char t[10]:
p3=stug(score *)malloc(LEN)
*开辟一个新单元*/
printf l"a输入要增加的学生的资料!")大于0)")
repeat4: printf("请输入学生学号(学号
scanf("id",&stu->number
/*输入学号,学号应大于0*
while(stu->number<0)
getchar (
printf("输入错误,请重新输入学生学号:");
scanf(sd",&stu->number)i I
/*输入错误,重新输入学号
if(stu->number==0)
goto end2:
/*当输入的学号为0时,转到末尾,结束追加*
else
p3=head;
if(n0)
【for(i=0;inumber !=p3->number
p3=p3->next i
else
printf("学号重复,请重输!Vn”)
goto repeat 4;
/*当输入的学号已经存在,程序报错,返回前面重新输入*
}
printf("输入学生姓名:“);
scanf("常s”,stu->name);
/*输入学生姓名★/
printf("请输入语文成绩(0-100):");
scanf("f",&stu->chinese);
/*输入语文成绩,成绩应在0~100*
while(stu->chinesechinese>100)
getchar ()i
printf("输入错误,请重新输入语文成绩");
scanf("f, &stu->chinese):)
*输入错误,重新输入语文成绩直到正确为止*
printf("请输入数学成绩(0-100):");
scanf("bf",&stu->mathmatic)i
输入数学成绩,成绩应在0~100*/
while(stu->mathmaticmathmatic>100)
I getchar();
printf("输入错误,请重新输入数学成绩");
scant(“暑f“,&st-> mathmatic);
/*输入错误,重新输入数学成绩直到正确为止*
printf("请输入英语成绩(0~100):")
scanf("of",&stu->english)i
/*输入英语成绩,成绩应在0~100*/
while(stu->english<0l I stu->english>100)
getchar();
printf("输入错误,请重新输入英语成绩”);
scanf("sf", &stu->english)i
/*输入错误,重新输入英语成绩直到正确为止
pl=head;
po=stui
if(head==NULL)
I head=p0: p0->next=NULL;
/*当原来链表为空时,从首结点开始存放资料+f
else
/*链表不为空*
if(pl->next==NULL)
/*找到原来链表的末尾*
pl->next=p0:
第18章学生成绩管理系统设计299
m加m=m+
p0->next=NULL;
/*将它与新开单元相连接*/
else
while(pl->next!=NULL
/*还没找到末尾,继续找*/
p2=pl:pl=pl->next i
pl->next=po;
pO->next=NULL;
n=n+1
pl=head;
p0=stui
for (i=l:inext i
if(max->number>pl->number)
k=max->number;
max->number=pl->number;
pl->number=k:
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*
strcpy(t, max->name)i
strcpy(max->name, p1l->name )i
strcpy (pl->name, t);
*交换前后结点中的姓名,使之与学号相匹配*
fen=max->chinese
max->chinese=p1->chinese
pl->chinese=fen;
/*交换前后结点中的语文成绩,使之与学号相匹配*
fen=max->mathmatic
max->mathmatic=pl->mathmatic;
p1->mathmatic=fen
/太交换前后结点中的数学成绩,使之与学号相匹配*
fensmax->english
max->english=p1->english:
pl->english=fen;
/*交换前后结点中的英语成绩,使之与学号相匹配*
}
max=head; pl=head i
/*重新使max,p指向链表头*/
1 end2:
printf("现在的学生数为:d个!n”,n);
return(head)
18.35查询学生成绩函数 search
函数 search的功能是从链表中查询输入学号的学生信息
由于在向链表中输入数据、添加数据的时候,已经对链表按学号从大到小排好序了,因此
在进行查找时,只需要从链表的表头开始进行查询。如果没有查询到结果,则给出反馈信息,
如果查找到,则打印出结果。
函数 search代码如下
score *search(score *head)
int number i
score *pl, *p2;
printf("输入要查询的学生的学号:);
300m从零开始学c语會
=+++-+-========
scanf ("Bd",&number);
while(number!=0)
if(head==NULL)
printf("n没有任何学生资料!n");
return(head):]
printf("-------m----
---------------------\n");
printf("|学号t姓名t|语文tl数学\t|英语\tn”);
printf("-
-------1n");/*打印表格域*
pithead;
while(number!=p1->number&&cpl->next !=NULL)
D2=p1
pl=p1->next i
}
if(number==pl->number)
printf(”|d\t|8\t|,1ft|.1f18,1ft|n",p1->number,p1->name,p1->chinese,p1->mathma
tic, pl->english)
printf("-
-----\n”)
/*打印表格域*
else
printf("号d不存在此学生!n", number);
printf("输入要查询的学生的学号,");
scanf("gd",&number
print f("已经退出了!\n")
return(head)
18.3.6删除数据函数dele
函数dele的功能是删除输入学号的学生信息。
score *dele(score *head)
score *pl, *p2
int number;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("Bd",&number )i
getchar()i
while(number!=0
/*输入学号为0时退出*/
if(head==NULL)
printf("n没有任何学生资料!n");
return(head)i
pl=head;
while( number!=p1-> number&&p1->next!=NUL)/*p1指向的不是要找的首结点,并且后面还有结点*
2=p1;pl=pl->next i
/*p1后移一个结点*
if(number==pl->number)
/*找到了*/
if(p1==head)
head=pl->next:
/*若p1指向的是首结点,把第二个结点地址赋
予head*
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.