C语言程序设计源程序学生成绩管理.docx
- 文档编号:6818242
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:21
- 大小:21.51KB
C语言程序设计源程序学生成绩管理.docx
《C语言程序设计源程序学生成绩管理.docx》由会员分享,可在线阅读,更多相关《C语言程序设计源程序学生成绩管理.docx(21页珍藏版)》请在冰豆网上搜索。
C语言程序设计源程序学生成绩管理
/*11.3.2源程序*/
/***********xuesheng.c***********/
/******头文件(.h)***********/
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*其它说明*/
#include"string.h"/*字符串函数*/
#include"conio.h"/*屏幕操作函数*/
#include"mem.h"/*内存操作函数*/
#include"ctype.h"/*字符操作函数*/
#include"alloc.h"/*动态地址分配函数*/
#defineN3/*定义常数*/
typedefstructz1/*定义数据结构*/
{
charno[11];
charname[15];
intscore[N];
floatsum;
floataverage;
intorder;
structz1*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);/*插入记录*/
voidappend();/*追加记录*/
voidcopy();/*复制文件*/
STUDENT*sort(STUDENT*h);/*排序*/
STUDENT*index(STUDENT*h);/*索引*/
voidtotal(STUDENT*h);/*分类合计*/
intmenu_select();/*菜单函数*/
/******主函数开始*******/
main()
{
inti;
STUDENT*head;/*链表定义头指针*/
head=init();/*初始化链表*/
clrscr();/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{/*值不同,执行的函数不同,break不能省略*/
case0:
head=init();break;/*执行初始化*/
case1:
head=create();break;/*创建链表*/
case2:
head=delete(head);break;/*删除记录*/
case3:
print(head);break;/*显示全部记录*/
case4:
search(head);break;/*查找记录*/
case5:
save(head);break;/*保存文件*/
case6:
head=load();break;/*读文件*/
case7:
computer(head);break;/*计算总分和均分*/
case8:
head=insert(head);break;/*插入记录*/
case9:
copy();break;/*复制文件*/
case10:
head=sort(head);break;/*排序*/
case11:
append();break;/*追加记录*/
case12:
head=index(head);break;/*索引*/
case13:
total(head);break;/*分类合计*/
case14:
exit(0);/*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char*menu[]={"***************MENU***************",/*定义菜单字符串数组*/
"0.initlist",/*初始化*/
"1.Enterlist",/*输入记录*/
"2.Deletearecordfromlist",/*从表中删除记录*/
"3.printlist",/*显示单链表中所有记录*/
"4.Searchrecordonname",/*按照姓名查找记录*/
"5.Savethefile",/*将单链表中记录保存到文件中*/
"6.Loadthefile",/*从文件中读入记录*/
"7.computethescore",/*计算所有学生的总分和均分*/
"8.insertrecordtolist",/*插入记录到表中*/
"9.copythefiletonewfile",/*复制文件*/
"10.sorttomakenewfile",/*排序*/
"11.appendrecordtofile",/*追加记录到文件中*/
"12.indexonnomber",/*索引*/
"13.totalonnomber",/*分类合计*/
"14.Quit"};/*退出*/
chars[3];/*以字符形式保存选择号*/
intc,i;/*定义整形变量*/
gotoxy(1,25);/*移动光标*/
printf("pressanykeyentermenu......\n");/*压任一键进入主菜单*/
getch();/*输入任一键*/
clrscr();/*清屏幕*/
gotoxy(1,1);/*移动光标*/
textcolor(YELLOW);/*设置文本显示颜色为黄色*/
textbackground(BLUE);/*设置背景颜色为蓝色*/
gotoxy(10,2);/*移动光标*/
putch(0xc9);/*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xcd);/*输出上边框水平线*/
putch(0xbb);/*输出右上角边框┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);/*输出左垂直线*/
gotoxy(54,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(10,20);putch(0xc8);/*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xcd);/*输出下边框水平线*/
putch(0xbc);/*输出右下角边框┛*/
window(11,3,53,19);/*制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();/*清屏*/
for(i=0;i<16;i++)/*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
gotoxy(10,21);/*移动光标*/
do{
printf("\nEnteryouchoice(0~14):
");/*在菜单窗口外显示提示信息*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整形数*/
}while(c<0||c>14);/*选择项不在0~14之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT*init()
{
returnNULL;
}
/*创建链表*/
STUDENT*create()
{
inti;ints;
STUDENT*h=NULL,*info;/*STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/
if(!
info)/*如果指针info为空*/
{
printf("\noutofmemory");/*输出内存溢出*/
returnNULL;/*返回空指针*/
}
inputs("enterno:
",info->no,11);/*输入学号并校验*/
if(info->no[0]=='@')break;/*如果学号首字符为@则结束输入*/
inputs("entername:
",info->name,15);/*输入姓名,并进行校验*/
printf("pleaseinput%dscore\n",N);/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为0*/
for(i=0;i { do{ printf("score%d: ",i+1);/*提示输入第几门课程*/ scanf("%d",&info->score[i]);/*输入成绩*/ if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/ printf("baddata,repeatinput\n");/*出错提示信息*/ }while(info->score[i]>100||info->score[i]<0); s=s+info->score[i];/*累加各门课程成绩*/ } info->sum=s;/*将总分保存*/ info->average=(float)s/N;/*求出平均值*/ info->order=0;/*未排序前此值为0*/ info->next=h;/*将头结点做为新输入结点的后继结点*/ h=info;/*新输入结点为新的头结点*/ } return(h);/*返回头指针*/ } /*输入字符串,并进行长度验证*/ inputs(char*prompt,char*s,intcount) { charp[255]; do{ printf(prompt);/*显示提示信息*/ scanf("%s",p);/*输入字符串*/ if(strlen(p)>count)printf("\ntoolong! \n");/*进行长度校验,超过count值重输入*/ }while(strlen(p)>count); strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/ } /*输出链表中结点信息*/ voidprint(STUDENT*h) { inti=0;/*统计记录条数*/ STUDENT*p;/*移动指针*/ clrscr();/*清屏*/ p=h;/*初值为头指针*/ printf("\n\n\n****************************STUDENT********************************\n"); printf("|rec|nO|name|sc1|sc2|sc3|sum|ave|order|\n"); printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n"); while(p! =NULL) { i++; printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",i,p->no,p->name,p->score[0],p->score[1], p->score[2],p->sum,p->average,p->order); p=p->next; } printf("**********************************end*********************************\n"); } /*删除记录*/ STUDENT*delete(STUDENT*h) { STUDENT*p,*q;/*p为查找到要删除的结点指针,q为其前驱指针*/ chars[11];/*存放学号*/ clrscr();/*清屏*/ printf("pleasedeletedno\n");/*显示提示信息*/ scanf("%s",s);/*输入要删除记录的学号*/ q=p=h;/*给q和p赋初值头指针*/ while(strcmp(p->no,s)&&p! =NULL)/*当记录的学号不是要找的,或指针不为空时*/ { q=p;/*将p指针值赋给q作为p的前驱指针*/ p=p->next;/*将p指针指向下一条记录*/ } if(p==NULL)/*如果p为空,说明链表中没有该结点*/ printf("\nlistno%sstudent\n",s); else/*p不为空,显示找到的记录信息*/ { printf("*****************************havefound***************************\n"); printf("|no|name|sc1|sc2|sc3|sum|ave|order|\n"); printf("|----------|---------------|----|----|----|--------|-------|-----|\n"); printf("|%-10s|%-15s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no, p->name,p->score[0],p->score[1],p->score[2],p->sum, p->average,p->order); printf("********************************end*******************************\n"); getch();/*压任一键后,开始删除*/ if(p==h)/*如果p==h,说明被删结点是头结点*/ h=p->next;/*修改头指针指向下一条记录*/ else q->next=p->next;/*不是头指针,将p的后继结点作为q的后继结点*/ free(p);/*释放p所指结点空间*/ printf("\nhavedeletedNo%sstudent\n",s); printf("Don'tforgetsave\n");/*提示删除后不要忘记保存文件*/ } return(h);/*返回头指针*/ } /*查找记录*/ voidsearch(STUDENT*h) { STUDENT*p;/*移动指针*/ chars[15];/*存放姓名的字符数组*/ clrscr();/*清屏幕*/ printf("pleaseenternameforsearch\n"); scanf("%s",s);/*输入姓名*/ p=h;/*将头指针赋给p*/ while(strcmp(p->name,s)&&p! =NULL)/*当记录的姓名不是要找的,或指针不为空时*/ p=p->next;/*移动指针,指向下一结点*/ if(p==NULL)/*如果指针为空*/ printf("\nlistno%sstudent\n",s);/*显示没有该学生*/ else/*显示找到的记录信息*/ { printf("\n\n*****************************havefound***************************\n"); printf("|nO|name|sc1|sc2|sc3|sum|ave|order|\n"); printf("|----------|---------------|----|----|----|--------|-------|-----|\n"); printf("|%-10s|%-15s|%4d|%4d|%4d|%4.2f|%4.2f|%3d|\n",p->no, p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); printf("********************************end*******************************\n"); } } /*插入记录*/ STUDENT*insert(STUDENT*h) { STUDENT*p,*q,*info;/*p指向插入位置,q是其前驱,info指新插入记录*/ chars[11];/*保存插入点位置的学号*/ ints1,i; printf("pleaseenterlocationbeforetheno\n"); scanf("%s",s);/*输入插入点学号*/ printf("\npleasenewrecord\n");/*提示输入记录信息*/ info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/ if(! info) { printf("\noutofmemory");/*如没有申请到,内存溢出*/ returnNULL;/*返回空指针*/ } inputs("enterno: ",info->no,11);/*输入学号*/ inputs("entername: ",info->name,15);/*输入姓名*/ printf("pleaseinput%dscore\n",N);/*提示输入分数*/ s1=0;/*保存新记录的总分,初值为0*/ for(i=0;i { do{/*对数据进行验证,保证在0~100之间*/ printf("score%d: ",i+1); scanf("%d",&info->score[i]); if(info->score[i]>100||info->score[i]<0) printf("baddata,repeatinput\n"); }while(info->score[i]>100||info->score[i]<0); s1=s1+info->score[i];/*计算总分*/ } info->sum=s1;/*将总分存入新记录中*/ info->average=(float)s1/N;/*计算均分*/ info->order=0;/*名次赋值0*/ info->next=NULL;/*设后继指针为空*/ p=h;/*将指针赋值给p*/ q=h;/*将指针赋值给q*/ while(strcmp(p->no,s)&&p! =NULL)/*查找插入位置*/ { q=p;/*保存指针p,作为下一个p的前驱*/ p=p->next;/*将指针p后移*/ } if(p==NULL)/*如果p指针为空,说明没有指定结点*/ if(p==h)/*同时p等于h,说明链表为空*/ h=info;/*新记录则为头结点*/ else q->next=info;/*p为空,但p不等于h,将新结点插在表尾*/ else if(p==h)/*p不为空,则找到了指定结点*/ { info->next=p;/*如果p等于h,则新结点插入在第一个结点之前*/ h=info;/*新结点为新的头结点*/ } else { info->next=p;/*不是头结点,则是中间某个位置,新结点的后继为p*/ q->next=info;/*新结点作为q的后继结点*/ } printf("\n----haveinserted%sstudent----\n",info->name);printf("---Don'tforgetsave---\n");/*提示存盘*/ return(h);/*返回头指针*/ } /*保存数据到文件*/ voidsave(STUDENT*h) { FILE*fp;/*定义指向文件的指针*/ STUDENT*p;/*定义移动指针*/ charoutfile[10];/*保存输出文件名*/ printf("Enteroutfilename,forexamplec: \\f1\\te.txt: \n");/*提示文件名格式信息*/ scanf("%s",outfile); if((fp=fopen(outfile,"wb"))==NULL)/*为输出打开一个二进制文件,如没有则建立*/ { printf("cannotopenfile\n"); exit (1); } printf("\nSavingfile......\n");/*打开文件,提示正在保存*/ p=h;/*移动指针从头指针开始*/ while(p! =NULL)/*如p不为空*/ { fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/ p=p->next;/*指针后移*/ } fclose(fp);/*关闭文件*/ printf("-----savesuccess! ! -----\n");/*显示保存成功*/ } /*从文件读数据*/ STUDENT*load() { STUDENT*p,*q,*h=NULL;/*定义记录指针变量*/ FILE*fp;/*定义指向文件的指针*/ charinfile[10];/*保存文件名*/ printf("Enterinfilename,forexamplec: \\f1\\te.txt: \n");scanf("%s",infile);/*输入文件名*/ if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 源程序 学生 成绩 管理