吉林大学c语言编程实验学生成绩管理系统Word文件下载.docx
《吉林大学c语言编程实验学生成绩管理系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《吉林大学c语言编程实验学生成绩管理系统Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
search()查找结点
按照姓名查找结点,从头结点开始顺序查找,成功显示记录信息,失败,显示没找到。
姓名是字符串,比较功能利用字符串比较函数strcmp()实现。
save()保存记录到文件
将学生信息保存到指定文件中。
按照文件读写要求,先定义一个指向文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定位置;
如果只给文件名,则文件保存在TurboC默认的路径下,
load()从文件中读取记录
按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的大开放式。
如果文件打不开,则退出函数,否则选择一种度文件方式,从文件头开始,将记录读入内存,直到文件尾。
computer()计算各门课程的总分和课程平均分
头指针开始,每读一条记录,分别累加各科成绩,并统计记录条数,当所有数据处理完毕,求出平均分,最后输出结果为所有学生各门课程的总分和平均分。
insert()插入结点
插入结点需要输入插入位置和新结点信息。
输入某个结点的学号,新结点将插入在这个指定结点之前。
申请空间得到指针info,输入新结点信息,存放到新申请的空间info中。
设链表的头指针为h,p为指定结点的指针,q为p的前驱指针,从头结点开始循环移动指针p查找指定的结点,查找和插入时分一下几种情况处理:
1指针为空,如果p等于头h,说明链表为空,则新结点为头结点,修改指针h=info,否则,说明没有指定结点。
则新结点在表尾部,此时q所指的结点时最后一个结点,所以修改指针q->
next=info。
2指针p不为空,如果p=h,说明新结点插入在当前结点之前,为新的头结点,修改指针info=next=p,h=info。
否则,说明新结点的位置在p和q之间,修改指针为info->
next=p,q->
next=info
sort()分类统计
从头指针开始,分别对学生的各门功课成绩进行判别,并按照科目输出处于各个分数段的学生学号,姓名,成绩。
五.实验结果
菜单界面,如图一所示;
记录输入,如图
删除记录,如图所示,
显示记录,如图所示;
查询记录,如图所示;
计算各门功课的总分即平均分,如图所示;
六.体会
通过一周的计算机能力训练,在老师的耐心指导及自己的努力下,使自己对c语言有了新的认识,并初步领会了编程的思想。
,使对c语言的了解也开始有知识向应用过度。
虽然现在能力还挺有限,但自己还是感觉学了很多东西。
在程序编写过程中,首先应该从整体入手,掌握大体的框架,然后再具体到模块,并建立程序流程图。
再进入各模块的开发。
最后,把各模块联系起来并进行程序的调试。
通过具体的实践,我深刻的感觉到了自己知识的不足。
所以在编写程序时要学习很多新的知识,这时相关的网站及图书馆就成了最好的助手。
不能错过!
最后,感谢老师耐心,细致,热情的辅导及鼓励。
七.附录I——程序清单
/*ScoreManagementSystemofStudent*/
/*Welcometomysystem*/
#include"
stdio.h"
stdlib.h"
string.h"
conio.h"
mem.h"
ctype.h"
alloc.h"
{charno[9];
charname[15];
intscore[N];
charsex[2];
intage;
floatsum;
floataverage;
intorder;
structs1*next;
}STUDENT;
/*以下是函数原型*/
STUDENT*init();
STUDENT*create();
STUDENT*delete(STUDENT*h);
voidprint(STUDENT*h);
voidsearch(STUDENT*h);
voidsave(STUDENT*h);
STUDENT*load();
voidcomputer(STUDENT*h);
STUDENT*insert(STUDENT*h);
void*all_sum_ave(STUDENT*h);
voidgrade();
voidcopy();
STUDENT*sort(STUDENT*h);
intmenu_select();
intsubmenu();
voidgrade00(STUDENT*h);
voidgrade60(STUDENT*h);
voidgrade70(STUDENT*h);
voidgrade80(STUDENT*h);
voidgrade90(STUDENT*h);
/******主函数*******/
main()
{
inti;
STUDENT*head;
head=init();
clrscr();
/*清屏*/
for(;
;
)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{/*值不同,执行的函数不同,break不能省略*/
case0:
head=init();
break;
/*执行初始化*/
case1:
head=create();
/*创建链表*/
case2:
head=delete(head);
/*删除记录*/
case3:
print(head);
/*显示全部记录*/
case4:
search(head);
/*查找记录*/
case5:
save(head);
/*保存文件*/
case6:
head=load();
break;
/*读文件*/
case7:
computer(head);
/*计算总分和均分*/
case8:
head=insert(head);
/*插入记录*/
case9:
head=sort(head);
/*排序*/
case10:
grade();
case11:
exit(0);
/*如菜单返回值为11程序结束*/
}}}
/******主菜单函数******/
menu_select()
char*menu[]={"
******************MENU************************"
/*定义菜单字符串数组*/
"
0.Initlist"
/*初始化*/
1.Enterlist"
/*输入记录*/
2.Deletearecordfromlist"
/*从表中删除记录*/
3.printlist"
/*显示单链表中所有记录*/
4.Searchrecordonname"
/*按照姓名查找记录*/
5.Savethefile"
/*将单链表中记录保存到文件中*/
6.Loadthefile"
/*从文件中读入记录*/
7.SumandAverage"
/*计算所有学生的总分和均分*/
8.Insertrecordtolist"
/*插入记录到表中*/
9.Sorttomakenewfile"
/*排序*/
10.Classificationthescore"
/**/
11.Quit"
****************20051118*********************"
};
chars[3];
/*以字符形式保存选择号*/
intc,i;
/*定义整形变量*/
gotoxy(1,1);
/*移动光标*/
printf("
pressanykeytocontinue...\n"
);
/*压任一键进入主菜单*/
getch();
/*输入任一键*/
/*清屏幕*/
textcolor(WHITE);
/*设置文本显示颜色为白色*/
textbackground(BLUE);
/*设置背景颜色为蓝色*/
gotoxy(10,2);
putch(0xc9);
/*输出左上角边框┏*/
for(i=1;
i<
64;
i++)
putch(0xcd);
/*输出上边框水平线*/
putch(0xbb);
/*输出右上角边框┓*/
for(i=3;
20;
gotoxy(10,i);
putch(0xba);
/*输出左垂直线*/
gotoxy(74,i);
}/*输出右垂直线*/
gotoxy(10,20);
putch(0xc8);
/*输出左下角边框┗*/
/*输出下边框水平线*/
putch(0xbc);
/*输出右下角边框┛*/
window(11,3,73,19);
/*制作显示菜单的窗口,大小根据菜单条数设计*/
for(i=0;
14;
i++)/*输出主菜单数组*/
gotoxy(10,i+1);
cprintf("
%s"
menu[i]);
}
textbackground(13);
/*设置背景颜色为黑色*/
window(1,1,80,25);
/*恢复原窗口大小*/
gotoxy(10,21);
do{
\n\tEnteryourchoice(0~11)tocontinue..."
/*在菜单窗口外显示提示信息*/
scanf("
s);
/*输入选择项*/
c=atoi(s);
/*将输入的字符串转化为整形数*/
}while(c<
0||c>
12);
/*选择项不在0~12之间重输*/
returnc;
/*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化*/
STUDENT*init()
{returnNULL;
/*创建链表*/
STUDENT*create()
{inti;
ints;
STUDENT*h=NULL,*info;
/*STUDENT指向结构体的指针*/
)
info=(STUDENT*)malloc(sizeof(STUDENT));
/*申请空间*/
if(!
info)/*如果指针info为空*/
\noutofmemory"
/*输出内存溢出*/
returnNULL;
/*返回空指针*/
inputs("
EntertheNo.as20051118.[Type#toEndEnter]:
"
info->
no,9);
/*输入学号并校验*/
if(info->
no[0]=='
#'
)break;
/*如果学号首字符为#则结束输入*/
Entername:
name,15);
/*输入姓名,并进行校验*/
EnterthesexM(ale)orF(emale):
sex,2);
Entertheageofthestudent:
%d"
&
info->
age);
age>
30||info->
age<
0)
\x07AGEERROR!
!
TYPEAGAIN!
\n"
}while(info->
0||info->
30);
pleaseinputstudentsscores:
/*提示开始输入成绩*/
s=0;
/*计算每个学生的总分,初值为0*/
N;
i++)/*N门课程循环N次*/
switch(i)
{case0:
printf("
pleaseinputENGLISHscores:
pleaseinputMATHscores:
pleaseinputClanguagescores:
pleaseinputmazhescores:
score[i]);
/*输入成绩*/
score[i]>
100||info->
score[i]<
0)/*确保成绩在0~100之间*/
DATAERROR!
/*出错提示信息*/
0);
s=s+info->
score[i];
/*累加各门课程成绩*/
info->
sum=s;
/*将总分保存*/
average=(float)s/N;
/*求出平均值*/
order=0;
/*未排序前此值为0*/
next=h;
/*将头结点做为新输入结点的后继结点*/
h=info;
/*新输入结点为新的头结点*/
return(h);
/*返回头指针*/
/*输入字符串,并进行长度验证*/
inputs(char*prompt,char*s,intcount)
charp[255];
printf(prompt);
/*显示提示信息*/
p);
/*输入字符串*/
if(strlen(p)>
count)printf("
\ntoolong!
\n"
/*进行长度校验,超过count值重输入*/
}while(strlen(p)>
count);
strcpy(s,p);
/*将输入的字符串拷贝到字符串s中*/
/*输出链表中结点信息*/
voidprint(STUDENT*h)
inti=0;
/*统计记录条数*/
STUDENT*p;
/*移动指针*/
p=h;
/*初值为头指针*/
\n\n\n**********************************STUDENT***************************************\n"
|rec|No|name|sex|age|eg|MATH|CLANG|MA|sum|ave|order|\n"
|---|--------|------------|---|---|----|----|------|----|------|-----|-----|\n"
while(p!
=NULL)
i++;
|%-3d|%-8s|%-12s|%1s|%3d|%4d|%4d|%6d|%4d|%4.2f|%5.2f|%3d|\n"
i,p->
no,p->
name,p->
sex,p->
age,p->
score[0],p->
score[1],
p->
score[2],p->
score[3],p->
sum,p->
average,p->
order);
p=p->
next;
************************************end*****************************************\n"
/*****删除记录*****/
STUDENT*delete(STUDENT*h)
{STUDENT*p,*q;
/*p为查找到要删除的结点指针,q为其前驱指针*/
chars[9];
/*存放学号*/
system("
cls"
pleasedeletedno\n"
/*输入要删除记录的学号*/
q=p=h;
/*给q和p赋初值头指针*/
while(strcmp(p->
no,s)&
&
p!
=NULL)/*当记录的学号不是要找的,或指针不为空时*/
q=p;
/*将p指针值赋给q作为p的前驱指针*/
/*将p指针指向下一条记录*/
if(p==NULL)/*如果p为空,说明链表中没有该结点*/
\nlistno%sstudent\n"
else/*p不为空,显示找到的记录信息*/
{printf("
\n\n\n***********************************STUDENT**************************************\n"
|No|name|sex|age|sc1|sc2|sc3|sc4|sum|ave|order|\n"
|----------|---------------|---|---|---|---|---|---|--------|-------|-----|\n"
|%-10s|%-15s|%1s|%3d|%3d|%3d|%3d|%3d|%4.2f|%4.2f|%3d|\n"
p->
/*压任一键后,开始删除*/
if(p==h)/*如果p==h,说明被删结点是头结点*/
h=p->
/*修改头指针指向下一条记录*/
else
q->
next=p->
/*不是头指针,将p的后继结点作为q的后继结点*/
free(p);
/*释放p所指结点空间*/
\nhavedeletedNo%sstudent\n"
Don'
tforgetsave\n"
/*提示删除后不要忘记保存文件*/
/*查找记录*/
voidsearch(STUDENT*h)
/*移动指针*/
chars[15];
/*存放姓名的字符数组*/
Pleaseenternameforsearching\n"
/*输入姓名*/
/*将头指针赋给p*/
name,s)&
=NULL)/*当记录的姓名不是要找的,且指针不为空时*/
/*移动指针,指向下一结点*/
if(p==NULL)/*如果指针为空*/
\n