学生成绩管理.docx

上传人:b****6 文档编号:8859285 上传时间:2023-02-02 格式:DOCX 页数:43 大小:181.47KB
下载 相关 举报
学生成绩管理.docx_第1页
第1页 / 共43页
学生成绩管理.docx_第2页
第2页 / 共43页
学生成绩管理.docx_第3页
第3页 / 共43页
学生成绩管理.docx_第4页
第4页 / 共43页
学生成绩管理.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

学生成绩管理.docx

《学生成绩管理.docx》由会员分享,可在线阅读,更多相关《学生成绩管理.docx(43页珍藏版)》请在冰豆网上搜索。

学生成绩管理.docx

学生成绩管理

 

《数据结构课程设计》

课程设计报告

《学生成绩管理》

 

学院:

信息科学技术学院

班级:

信息工程2009级1班

学号:

200941843109

姓名:

黄诗铭

指导教师:

何儒云

完成日期:

2010年12月

 

目录

 

设计任务………………………………………………3

程序的总体设计………………………………………3

程序的实现…………………………………………16

测试………………………………………………18

心得体会………………………………………………21

附件……………………………………………………21

 

1.设计任务

本课程设计要求有如下功能:

实现功能:

输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出。

2.程序的总体设计

typedefstructz1{

charno[11];//结构体里是学号的字符串

charname[15];//名字的字符串

intscore[N];//分数有3门

floatsum;

floataverage;

intorder;

structz1*next;//每一组数据是以结构体的形式连接的

}STUDENT;

//部分函数声明

STUDENT*init();//初始化函数

STUDENT*create();/*创建链表*/

STUDENT*delette(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();/*菜单函数*/

intmain()

{

//inti;

STUDENT*head;/*链表定义头指针*/

head=init();/*初始化链表*/

//clrscr();/*清屏*/

for(;;)/*无限循环*/

{

switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/

{/*值不同,执行的函数不同,break不能省略*/

case0:

head=init();break;/*执行初始化*/

case1:

head=create();break;/*创建链表*/

case2:

head=delette(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:

append();break;/*追加记录*/

case11:

head=index(head);break;/*索引*/

case12:

total(head);break;/*分类合计*/

case13:

head=sort(head);break;//排序

case14:

exit(0);/*如菜单返回值为14程序结束*/

}

}

return0;

}

/*输入字符串,并进行长度验证*/

voidinputs(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中*/

}

//接下来做一个界面友好的函数,在显示的时候展现

intmenu_select()

{

intn;

printf("╔═════════════════════════════╗\n");

printf("║☆学生成绩管理系统☆║\n");

printf("║═════════════════════════════║\n");

printf("║║\n");

printf("║

(1)学生数据的录入║\n");

printf("║

(2)学生数据的删除║\n");

printf("║(3)显示学生信息║\n");

printf("║(4)查找学生信息║\n");

printf("║(5)学生信息的保存║\n");

printf("║(6)学生信息的读入║\n");

printf("║(7)学生信息的统计║\n");

printf("║(8)学生信息的插入║\n");

printf("║(9)复制学生信息║\n");

printf("║(10)追加学生信息║\n");

printf("║(11)索引║\n");

printf("║(12)分类合计║\n");

printf("║(13)排序║\n");

printf("║(14)退出程序║\n");

printf("║║\n");

printf("║═════════════════════════════║\n");

printf("║注:

请输入相应括号里的阿拉伯数字来执行相关操作!

║\n");

printf("║要保存数据请先建立好指定文件:

║\n");

printf("╟----------------------------------------------------------╢\n");

printf("║===================谢谢您的使用===========================║\n");

printf("╚═════════════════════════════╝\n");

printf("→请选择相应的数字进行操作:

\n");

scanf("%d",&n);

returnn;

}

STUDENT*init()

{

returnNULL;

}//结构体函数的初始化

/*创建链表*/

STUDENT*create()

{

inti,k,j,g;ints;

STUDENT*h=NULL,*info;/*STUDENT指向结构体的指针*/

intl;

scanf("%d",&l);//输入循环的次数

for(g=0;g

{

info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/

if(!

info)/*如果指针info为空*/

{

printf("\noutofmemory");/*输出内存溢出*/

returnNULL;/*返回空指针*/

}

inputs("enterno:

",info->no,11);

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);/*返回头指针*/

}

/*输出链表中结点信息*/

voidprint(STUDENT*h)

{

inti=0;/*统计记录条数*/

STUDENT*p;/*移动指针*/

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*delette(STUDENT*h)

{

STUDENT*p,*q;/*p为查找到要删除的结点指针,q为其前驱指针*/

chars[11];/*存放学号*/

printf("pleasedelettedno\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[30];/*存放姓名*/

printf("pleaseenternameforsearch\n");

scanf("%s",s);

p=h;/*将头指针赋给p*/

while(strcmp(p->name,s)&&p!

=NULL)

{

p=p->next;/*移动指针,指向下一结点*/

}

if(p==NULL)/*如果指针为空*/

printf("\nlistnothisstudent\n");/*显示没有该学生*/

else{

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");

}

}

/*插入记录*/

STUDENT*insert(STUDENT*h)

{

STUDENT*p,*q,*info;/*p指向插入位置,q是其前驱,info指新插入记录*/

chars[11];/*保存插入点位置的学号*/

ints1,i,j,k;

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");

break;}

}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)==0)/*查找插入位置*/

{

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);

fp=fopen(outfile,"wt");

if((fp=fopen(outfile,"wt"))==NULL)/*为输出打开一个十进制文件,如没有则建立*/

{

printf("cannotopenfile\n");

return;

}

printf("\nSavingfile......\n");/*打开文件,提示正在保存*/

p=h;/*移动指针从头指针开始*/

while(p!

=NULL)/*如p不为空*/

{

//fp=fopen(outfile,"w");

fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/

p=p->next;/*指针后移*/

}

fclose(fp);/*关闭文件*/

printf("-----savesuccess!

!

-----\n");/*显示保存成功*/

}

/*从文件读数据*/

STUDENT*load()

{

STUDENT*p,*q,*h=NULL;/*定义记录指针变量*/

FILE*fp;/*定义指向文件的指针*/

charinfile[100];/*保存文件名*/

printf("Enterinfilename,forexamplec:

\\f1\\te.txt:

\n");scanf("%s",infile);/*输入文件名*/

if((fp=fopen(infile,"r"))==NULL)/*打开一个十进制文件,为读方式*/

{

printf("cannotopenfile\n");/*如不能打开,则结束程序*/

return(h);

}

printf("\n-----Loadingfile!

-----\n");

p=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/

if(!

p)

{

printf("outofmemory!

\n");/*如没有申请到,则内存溢出*/

returnh;/*返回空头指针*/

}

h=p;/*申请到空间,将其作为头指针*/

while(!

feof(fp))/*循环读数据直到文件尾结束*/

{

if(fread(p,sizeof(STUDENT),1,fp)!

=1)

break;/*如果没读到数据,跳出循环*/

p->next=(STUDENT*)malloc(sizeof(STUDE

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1