学生成绩管理系统
的有关信息介绍如下:问题补充说明:一.主菜单(1)成绩输入(2)成绩查询(3)成绩统计(4)退出 二.(1)成绩录入:输入学生的学号,姓名,三门课成绩 (2)成绩查询:(1)按学号查询学生记录(2)查询不及格学生记录 (3)成绩统计:(1)计算学生平均成绩(2)根据学生平均分高低对学生的数据进行排序输出(3)对单科成绩排序输出学生姓名与该科成绩 (4)退出系统 是C语言的编码~
C语言课程设计报告-------学生成绩简单管理程序
一、系统菜单的主要功能
或来维重(1)输入若干条记录
(2)显示来自所有记录
(3)按学号排序
(4)插入一条记录
(5)按姓名查找,删除一送支条记录
(6)查找并显示一条记录
(7)输出统计信息(新增)
(8)从正文中添加数据到结构体数组中
(9)将所有针员着数据写入文件中
(0)退出程序
二、题目分析
该题主要考察学生对结构体,指针,文件的操作,以及C语言算法字杨的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。360问答如何调程序也非常重要,通过这个程序娘们画可以学习到以前调试短程序使社约杆额肉计要象没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学既至应治察效仍秋海民过的技巧,下面就各个太子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较觉地指化抓婷由班政积命重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函异维席空土数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返黑括本入回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比刚列读视又且光术较。
功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的操作,提前准备好数据。
三、程序正文部分
#include<stdio.素切依势面及宽善宣唱h>/*引用库函数*/
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedefstruct/*定义结构体数组*/
{
charnum[10];/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
}Student;
Studentstu[80];/*结构体数组变量*/
intmenu_select()/*菜单函数*/
{
charc;
do{
system("cls");/*运行前清屏*/
printf("\让守今学t\t****Students垂防城'GradeManagementSystem****\n");/*菜单选择*/
printf("\t\t|1.InputRecords|\n");
printf("\t\t|2.Dis李playAllRecords|\n");
printf("\t\t|3.Sort|\n");
printf("\t\t|4.InsertaRecord|\n");
printf("\t\降依损皮流犯衣加围操八t|5.DeleteaRecord|\n");
printf("\t\t|6.Query|\n");
printf("\t\t|7较间.Statistic|\n");
printf("\t\t|8.AddRecordsfromaTextFile|\n");
printf("\t\t|9.WritetoaTextfile|\n");
printf("\t\t|0.Quit|\n");
printf("\t\t*****************************************\n");
printf("\t\t\tGiveyourChoice(0-9):");
c=getchar();/*读入选择*/
}while(c<'0'||c>'9');
return(c-'0');/*返回选择*/
}
intInput(Studentstud[],intn)/*输入若干条记录*/
{inti=0;charsign,x[10];/*x[10]为清除多余的数据所用*/while(sign!='n'&&sign!='N')/*判断*/{printf("\t\t\tstudent'snum:");/*交互输入*/scanf("\t\t\t%s",stud[n+i].num);printf("\t\t\tstudent'sname:");scanf("\t\t\t%s",stud[n+i].name);printf("\t\t\tstudent'sscore:");scanf("\t\t\t%d",&stud[n+i].score);gets(x);/*清除多余的输入*/printf("\t\t\tanymorerecords?(Y/N)");scanf("\t\t\t%c",&sign);/*输入判断*/i++;}
return(n+i);
}
voidDisplay(Studentstud[],intn)/*显示所有记录*/
{
inti;
printf("\t\t\t-----------------------------------\n");/*格式头*/
printf("\t\t\tnumbernamescore\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++)/*循环输入*/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0)/*每十个暂停*/
{printf("\t\t\t-----------------------------------\n");/*格式*/printf("\t\t\t");system("pause");printf("\t\t\t-----------------------------------\n");}
}
printf("\t\t\t");
system("pause");
}
voidSort_by_num(Studentstud[],intn)/*按学号排序*/
{inti,j,*p,*q,s;
chart[10];
for(i=0;i<n-1;i++)/*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)>0)
{strcpy(t,stud[j+1].num);strcpy(stud[j+1].num,stud[j].num);strcpy(stud[j].num,t);strcpy(t,stud[j+1].name);strcpy(stud[j+1].name,stud[j].name);strcpy(stud[j].name,t);p=&stud[j+1].score;q=&stud[j].score;s=*p;*p=*q;*q=s;}
}
intInsert_a_record(Studentstud[],intn)/*插入一条记录*/
{charx[10];/*清除多余输入所用*/printf("\t\t\tstudent'snum:");/*交互式输入*/scanf("\t\t\t%s",stud[n].num);printf("\t\t\tstudent'sname:");scanf("\t\t\t%s",stud[n].name);printf("\t\t\tstudent'sscore:");scanf("\t\t\t%d",&stud[n].score);gets(x);n++;Sort_by_num(stud,n);/*调用排序函数*/printf("\t\t\tInsertSuccessed!\n");/*返回成功信息*/return(n);}
intDelete_a_record(Studentstud[],intn)/*按姓名查找,删除一条记录*/
{chars[20];
inti=0,j;
printf("\t\t\ttellmehis(her)name:");/*交互式问寻*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n)i++;/*查找判断*/
if(i==n)
{printf("\t\t\tnotfind!\n");/*返回失败信息*/
return(n);
}
for(j=i;j<n-1;j++)/*删除操作*/
{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\tDeleteSuccessed!\n");/*返回成功信息*/
return(n-1);
}
voidQuery_a_record(Studentstud[],intn)/*查找并显示一个记录*/
{chars[20];
inti=0;
printf("\t\t\tinputhis(her)name:");/*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n)i++;/*查找判断*/
if(i==n)
{printf("\t\t\tnotfind!\n");/*输入失败信息*/
return;
}
printf("\t\t\this(her)number:%s\n",stud[i].num);/*输出该学生信息*/
printf("\t\t\this(her)score:%d\n",stud[i].score);
}
voidStatistic(Studentstud[],intn)/*新增功能,输出统计信息*/
{inti,j=0,k=0,sum=0;
floataver;/*成绩平均值*/
for(i=0;i<n;i++)/*循环输入判断*/
{
sum+=stud[i].score;
if(stud[j].score>stud[i].score)j=i;
if(stud[k].score<stud[i].score)k=i;
}
aver=1.0*sum/n;
printf("\t\t\tthereare%drecords.\n",n);/*总共记录数*/
printf("\t\t\tthehignestscore:\n");/*最高分*/
printf("\t\t\tnumber:%sname:%sscore:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\tthelowestscore:\n");/*最低分*/
printf("\t\t\tnumber:%sname:%sscore:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\ttheaveragescoreis%5.2f\n",aver);/*平均分*/
}
intAddfromText(Studentstud[],intn)/*从文件中读入数据*/
{inti=0,num;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("\t\t\tInputthefilename:");
scanf("\t\t\t%s",filename);/*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL)/*打开文件*/
{printf("\t\t\tcann'topenthefile\n");/*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",#);/*读入总记录量*/
while(i<num)/*循环读入数据*/
{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score);
i++;
}
n+=num;
fclose(fp);/*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
voidWritetoText(Studentstud[],intn)/*将所有记录写入文件*/
{
inti=0;
FILE*fp;/*定义文件指针*/
charfilename[20];/*定义文件名*/
printf("\t\t\tWriteRecordstoaTextFile\n");/*输入文件名*/
printf("\t\t\tInputthefilename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)/*打开文件*/
{
printf("\t\t\tcann'topenthefile\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n);/*循环写入数据*/
while(i<n)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;
}
fclose(fp);/*关闭文件*/
printf("Successed!\n");/*返回成功信息*/
}
voidmain()/*主函数*/
{
intn=0;
for(;;)
{
switch(menu_select())/*选择判断*/
{
case1:
printf("\t\t\tInputRecords\n");/*输入若干条记录*/
n=Input(stu,n);
break;
case2:
printf("\t\t\tDisplayAllRecords\n");/*显示所有记录*/
Display(stu,n);
break;
case3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n);/*按学号排序*/
printf("\t\t\tSortSuceessed!\n");
printf("\t\t\t");
system("pause");
break;
case4:
printf("\t\t\tInsertaRecord\n");
n=Insert_a_record(stu,n);/*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case5:
printf("\t\t\tDeleteaRecord\n");
n=Delete_a_record(stu,n);/*按姓名查找,删除一条记录*/
printf("\t\t\t");
system("pause");
break;
case6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n);/*查找并显示一个记录*/
printf("\t\t\t");
system("pause");
break;
case7:
printf("\t\t\tStatistic\n");
Statistic(stu,n);/*新增功能,输出统计信息*/
printf("\t\t\t");
system("pause");
break;
case8:
printf("\t\t\tAddRecordsfromaTextFile\n");
n=AddfromText(stu,n);/*新增功能,输出统计信息*/
break;
case9:
printf("\t\t\tWritetoaTextfile\n");
WritetoText(stu,n);/*循环写入数据*/
printf("\t\t\t");
system("pause");
break;
case0:
printf("\t\t\tHaveaGoodLuck,Bye-bye!\n");/*结束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
四、函数调用关系图
注:“→”代表调用
Input函数
打印链表记录
Display函数
输入若干条记录
menu_select()函数
选择菜单
Sort_by_num函数
显示所有记录
Delete_a_record函数
按姓名查找,删除一条记录
Query_a_record查找并显示一条记录
Statistic函数
输出统计信息(新增)
AddfromText函数
从正文中添加数据到结构体数组中
Main函数
Insert_a_record插入一条记录
WritetoText函数将所有数据写入文件中
退出程序
Reverse(head)函数
按学号排序
五、设计测试流程
1、进入界面
2、输入选项1,回车;
按提示输入数据:
3、回到主菜单;
输入选项7,回车;
输入文件名:data.txt,回车;
出现成功提示,则读入文件操作成功。
4、回到主菜单,输入2,回车
每10个暂停显示数据
5、回到主菜单,输入3,回车
出现排序成功信息。
6、回到主菜单,输入4,回车
按提示插入一组数据
7、回到主菜单,输入5,回车
按提示输入姓名,删除数据
出现删除成功的信息
8、回到主菜单,输入6,回车
输入姓名进行查询
9、回到主菜单,输入7,回车
出现统计信息
10、回到主菜单,输入9,回车
输入result.txt,回车
出现成功写入文件的信息
11、回到主菜单,输入0,回车退出系统