资源描述
(一)、课程设计题目
《学生成绩管理系统》设计与实现
(二)、课程设计目
1、 进一步掌握和运用C语言进行程设计能力;
2、 进一步理解和运用构造化程设计思想和办法;
3、 初步掌握开发一种小型实用系统基本办法;
4、 学会调试一种较长程序基本办法;
5、 学会运用流程图或N-S图表达算法;
6、 掌握书写程设计开发文档能力(书写课程设计报告);
(三)、设计内容
1、每一条记录涉及一种学生学号、姓名、3门课成绩、平均成绩。
2、输入功能:可以一次完毕若干条记录输入。
3、显示功能:完毕所有学生记录显示。
4、查找功能:完毕按姓名查找学生记录,并显示。
5、排序功能:按学生平均成绩进行排序。
6、插入功能:按平均成绩高低插入一条学生记录。
7、将学生记录存在文献score中。
8、应提供一种界面来调用各个功能,调用界面和各个功能操作界面应尽量清晰美观!
(四)、设计规定
1、 用C语言实现系统;
2、 运用构造体数组实现学生成绩数据构造设计;
3、 系统具备增长,查询,插入,排序等基本功能;
4、 系统各个功能模块规定用函数形式实现;
5、 完毕设计任务并书写课程设计报告。
6、 将学生成绩信息存在文献中。
(五)、提交材料
1、课程设计报告
1)课程设计题目、内容、规定。
2)总体设计(包括几大功能模块)。
3)详细设计(各功能模块详细实现算法——流程图)
4)数据构造设计描述,各模块(函数)功能简介,参数阐明等。
5)调试分析(包括各模块测试用例,及测试成果。)
6)总结(课程设计完毕了哪些功能,尚有哪些地方需要改进,及通过一周课程设计有何收获,调试程序体会等)
二:本程序共有八个功能与数据构造阐明:
1.学生记录输入(一次性输入,输入个数由顾客决定,最大可容纳80记录,最大数可以在源程序中改) 。
2.追加学生记录。(追加后不能超过最在值80)。
3.修改记录。
4.删除记录。
5.浏览所有记录。
6.查找记录(按姓名查找)。
7.插入记录。
8.对记录进行排序(按平均成绩排序)。
9.退出。
10.数据构造是这样:学号只能由数字字符构成,最大可以11个字符;姓名由字符构成,最大可以20个字符;三门科目分数都是整型;平均成绩是实型。
11.程序中定义了学生容量为50个。容量可以在源程序宏定义中改,本程序宏定义#define N 50
#include<string.h>
#include<stdio.h>
/*控制学生记录容量*/
#define N 50
struct student
{char num[11];
char name[20];
int score[3];
float ave;
}stu[N];
/*全新保存函数*/
save(int n) /*保存函数,保存n个记录*/
{FILE *fp;
int i;
if((fp=fopen("score.txt","wb"))==NULL) /*以输出打开方式,在此前记录被覆盖*/
{printf("\nCannot open file\n");
return NULL;
}
for(i=0;i<n;i++)
if(stu[i].ave!=0) /*stu[i].ave=0表此记录已删除*/
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
/*加载记录或可以计算记录个数函数*/
load() /*加载记录或可以计算记录个数函数*/
{FILE *fp;
int i;
if((fp=fopen("score.txt","rb"))==NULL) /*以输出打开方式,在此前记录被覆盖*/
{printf("\nCannot open file\n");
return NULL;
}
for(i=0;!feof(fp);i++)
fread(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
return(i-1); /*返回记录个数*/
}
/*一种任务结束时选取浏览还是返回函数*/
void printf_back() /*一种任务结束时选取浏览还是返回*/
{int k,w;
printf("\n\n\tSuccessful. ^_^\n\n");
printf("What do you want to do?\n\n\t1).Browse all now\t2).Back: [ ]\b\b");
scanf("%d",&w);
if(w==1) browse();
else menu();
}
/*显示数据构造项目函数*/
void printf_face() /*显示数据构造项目*/
{printf("\n\tNO. name score1 score2 score3 average\n");
}
average(int i) /*对第i个记录分数求平均值*/
{int j,sum;
for(sum=0,j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].ave=sum/3.0;
}
/*学号输入函数*/
no_input(int i,int n) /*i表达第i个学生信息,n表达比较到第n个学生*/
{int j,k,w1;
do
{w1=0;
printf("NO.:");
scanf("%s",stu[i].num);
for(j=0;stu[i].num[j]!='\0';j++) /*学号输入函数,作了严格规定*/
if(stu[i].num[j]<'0'||stu[i].num[j]>'9') /*判断学号与否为数字*/
{puts("Input error!Only be made up of (0-9).Please reinput!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k<n;k++) /*比较到第n个学生*/
/*排除第i个学生记录即你要修改*/
if(k!=i&&strcmp(stu[k].num,stu[i].num)==0) /*判断学号与否有雷同*/
{puts("This record is exist. please reinput!\n");
w1=1;break;
}
}
while(w1==1);
}
/*对分数输入*/
score_input(int i)
{int j;
for(j=0;j<3;j++)
{printf("score %d:",j+1);
scanf("%d",&stu[i].score[j]);
}
}
/*输入一种记录函数*/
input(int i) /*输入一种记录函数*/
{
no_input(i,i); /*调用学号输入函数*/
printf("name:");
scanf("%s",stu[i].name);
score_input(i); /*调用分数输入函数*/
average(i); /*调用求平均值函数*/
}
/*显示一种记录函数*/
printf_one(int i) /*显示一种记录函数*/
{int j;
printf("%11s %-17s",stu[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%9d",stu[i].score[j]);
printf("%9.2f\n",stu[i].ave);
}
void puts___() /*显出---函数*/
{puts("\n--------------------------------------------------------------------");
}
/*修改记录函数*/
modify_data(int i,int n) /*修改数据函数,修改第i个记录*/
{int c,w1;
do /*输入选取作个判断*/
{puts("\nmodify by =>\n\n 1).NO. 2.name 3).score1 4).score2\n 5).score3 6).all score 7).all data 8).cancel and back");
printf("Which you needed?:[ ]\b\b");
scanf("%d",&c);
if(c>8||c<1)
{puts("\nChoice error!Please again!"); /*判断选取与否错误,若是则重新选取性*/
getchar(); /*当输入是字符时可以防止死循环*/
}
}
while(c>8||c<1);
do
{switch(c) /*选取要修改项目*/
{case 1:no_input(i,n);break; /*调用学号输入函数*/
case 2:printf("name:");scanf("%s",stu[i].name);break;
case 3:printf("score1:");scanf("%d",&stu[i].score[0]);break;
case 4:printf("score2:");scanf("%d",&stu[i].score[1]);break;
case 5:printf("score3:");scanf("%d",&stu[i].score[2]);break;
case 6:score_input(i);break;/*调用分数输入函数*/
case 7:input(i);break; /*调用输入整条学生记录*/
case 8:menu(); /*直接返回主介面*/
}
if(c>2&&c<7)
average(i); /*调用求平均值函数*/
puts("\nNow:\n");
printf_face(); /*调用显示数据构造项目函数*/
printf_one(i); /*修改后记录让顾客确认*/
printf("\nAre you sure?\n\n\t1).Sure 2).No and remodify 3).Back without save in this time [ ]\b\b"); /*与否拟定*/
scanf("%d",&w1); /*选取2则表达这次修改错误要重新修改*/
}
while(w1==2);
return(w1); /*返回控制值*/
}
/****************输入模块****************/
enter() /*输入模块*/
{int i,n;
printf("How many students(0-%d)?:",N);
scanf("%d",&n); /*要输入记录个数*/
printf("\nEnter data now\n\n");
for(i=0;i<n;i++)
{printf("\nInput %dth student record.\n",i+1);
input(i); /*调用输入函数*/
}
if(i!=0) save(n); /*调用保存函数*/
printf_back(); /*一种任务结束时让顾客选取是浏览还是返回*/}
/****************追加模块****************/
add() /*追加模块*/
{int i,n,m,k;
FILE *fp;
n=load();
printf("How many students are you want to add(0-%d)?:",N-n);
scanf("%d",&m); /*输入要追加记录个数*/
k=m+n;
for(i=n;i<k;i++)
{printf("\nInput %dth student record.\n",i-n+1);
input(i); /*调用输入函数*/
}
if((fp=fopen("score.txt","ab"))==NULL) /*以ab方式打开文献,追加保存*/
{printf("cannot open file\n");
return;
}
for(i=n;i<k;i++) /*输入出到文献*/
if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
printf_back(); /*一种任务结束时选取浏览还是返回*/
}
/****************修改模块****************/
modify() /*修改模块*/
{struct student s;
FILE *fp;
int i,n,k,w0=1,w1,w2=0;
n=load();
do
{clrscr();
k=-1;
/*给顾客看所有记录以便确认要修改记录*/
puts___(); /*显示-----*/
printf_face(); /*调用显示数据构造项目函数*/
for(i=0;i<n;i++)
{if((i!=0)&&(i%10==0)) /*目是分屏显示*/
{printf("\n\nRemember NO.which needed modify. pass any key to contiune . . .");
getch();
puts("\n\n");
}
printf_one(i); /*调用显示一种记录函数*/
}
puts___();
do
{printf("\n\nEnter NO. that you want to modify! NO.:");
scanf("%s",s.num); /*输入要修改数据学号*/
for(i=0;i<n;i++) /*查找要修改数据*/
if(strcmp(s.num,stu[i].num)==0)
{k=i; /*找到要修改记录*/
s=stu[i]; /*把stu[i](即当次修改学生记录)备份给s,以便顾客反悔时恢复名誉*/
}
if(k==-1) printf("\n\nNO exist!please again");
}
while(k==-1); /*当K=-1表达没有找到*/
printf_face(); /*调用显示数据构造项目函数*/
printf_one(k); /*调用显示一种记录函数*/
w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表达顾客已确认修改*/
if(w1==1) /*W1等于1时则表达顾客拟定这次修改*/
{printf("\nSuccessful ^_^.\n\nAre you modify another?\n\n\t1).Yes 2).Back with save\t[ ]\b\b");
scanf("%d",&w0);
w2=1; /*来控制保存,使w2=1是标记已有过修改*/
}
else
{w0=0;
if(w2==1)
stu[k]=s;
} /*走到这里是由于顾客没有确认这次修改(在调用修改函数w1=modify_data(k,n);时没有确认). 使W0=0,为了让终结循环,
stu[k]=s,则把备份s恢复给stu[k](即当次修改),这样好处是保证在此之前修改过成功保存,而本次(顾客没有确认)不修改*/
if(w0!=1&&w2==1) /*W0不等于1则表达正常返回,w2=1表达在此之前有过修改,这时就保存顾客已确认修改并返回*/
save(n); /*w2不等于1表达在本次之前没有修改过(即:第一次),而又反悔这次修改,则不保存返回*/
}
while(w0==1);
menu();
}
/****************删除模块****************/
del() /*删除模块*/
{struct student s;
FILE *fp;
int i,j,n,k,c,w0=1;
n=load();
do
{clrscr();
k=-1;
/*给顾客看所有记录以便确认要删除记录*/
puts___();
printf_face(); /*调用显示数据构造项目函数*/
for(i=0;i<n;i++)
if(stu[i].ave!=0)
{if((i!=0)&&(i%10==0)) /*目是分屏显示,每10个一屏*/
{printf("\n\nRemember NO. which needed del. pass any key to contiune . . .");
getch();
puts("\n\n");
}
printf_one(i); /*调用显示一种记录函数*/
}
puts___();
do
{printf("\n\nEnter NO. that you want to Delete! NO.:");
scanf("%s",s.num); /*输入要修改数据学号*/
for(i=0;i<n;i++) /*查找要修改数据*/
if(strcmp(s.num,stu[i].num)==0)
{k=i; /*找到要修改记录下标赋给K*/
s=stu[i];
}
if(k==-1) printf("\n\nNO exist!please again");/*K=-1,表达没有找到相似之*/
}
while(k==-1);
puts("\n");
printf_face(); /*调用显示数据构造项目函数*/
printf_one(k); /*调用显示一种记录函数*/
printf("\nAre you sure?\n\t1).sure 2).no and del another 3).back without save all [ ]\b\b");
scanf("%d",&c);
if(c==1)
{stu[k].ave=0; /*stu[k].ave=0用来标记这个记录是要删除.保存时则不保存stu[k].ave=0数据*/
printf("\n\nSuccessful ^_^.\n\nAre you again?\n\t1).again 2).back to menu\t[ ]\b\b"); /*问与否继续*/
scanf("%d",&w0);
}
if(c==3) w0=0; /*w0=0不删除直接返回*/
if(w0!=1&&c!=3) /*只有当确认删除后返回才保存,不删除直接返回则不保存,且不保存在此之前删除过记录*/
save(n);
}
while(w0==1);
menu(); /*返回主介面*/
}
/****************浏览(所有)模块****************/
browse() /*浏览(所有)模块*/
{int i,j,n;
n=load(); /*加载记录*/
clrscr();
puts___();
printf_face(); /*调用显示数据构造项目函数*/
for(i=0;i<n;i++)
{if((i!=0)&&(i%10==0)) /*目是分屏显示*/
{printf("\n\nPass any key to contiune . . .");
getch();
puts("\n\n");
}
printf_one(i); /*调用显示一种记录函数*/
}
puts___();
printf("\tThere are %d record.\n",n);
printf("\nPass any key to back . . .");
getch(); /*按任意健*/
menu();
}
/****************查找模块****************/
search() /*查找模块*/
{int i,n,k,w1=1,w2,w3,w4;
struct student s;
n=load();
do
{do
{k=-1;
printf("\n\nEnter name that you want to search! name:");
scanf("%s",s.name); /*输入要修改数据学号*/
printf_face(); /*调用显示数据构造项目函数*/
for(i=0;i<n;i++) /*查找要修改数据*/
if(strcmp(s.name,stu[i].name)==0)
{k=i; /*找到要修改记录*/
printf_one(k);break; /*调用显示一种记录函数*/
}
if(k==-1)
{printf("\n\nNO exist!please");
printf("\n\nAre you again?\n\t1).again 2).NO and back [ ]\b\b");
scanf("%d",&w1);
}
}
while(k==-1&&w1==1); /*如果w1不等于1则直接返回*/
w4=0;w3=0;
if(k!=-1) /*k不等于-1表达找到,如果找到则选取操作*/
{printf("\n\nWhat do you want to do?\n\t1).Search another 2).Modify 3).Delete 4).Back menu [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{case 2:w3=modify_data(k,n);break;/*调用修改数据函数*/
case 3:{printf("\nAre you sure?\n\t1).Sure 2).No and back [ ]\b\b");
scanf("%d",&w4);
if(w4==1)
stu[k].ave=0; /*表达删除*/
break;
}
}
if(w3==1||w4==1)
{save(n);
printf("\n\nSuccessful. ^_^.");
printf("\n\nWhat do you want to do?\n\t1).Search another 2).Back [ ]\b\b");
scanf("%d",&w2);
}
}
}
while(w2==1);
menu();
}
/****************插入模块****************/
insert() /*插入模块*/
{int i,j,n,c;
struct student s;
n=load();
puts("\nInput one data.\n");
do
{input(n); /*输入到第n个记录,即插入到最后*/
printf_face();
printf_one(n);
printf("\n\nAre you sure?\n\n\t1).Sure\t2).cancel snd again\t3).Back withuot save [ ]\b\b");
scanf("%d",&c);
if(c==1)
{for(j=0;j<n;j++) /*用起泡法排序*/
for(i=n;i>j;i--)
if(stu[i].ave>stu[i-1].ave)
{s=stu[i-1];stu[i-1]=stu[i];stu[i]=s;}
save(n+1);
printf_back();
}
else if(c!=2) menu();
}
while(c==2);
}
/****************排序模块(按平均成绩)****************/
order() /*排序模块(按平均成绩)*/
{int i,j,k,n;
struct student s;
n=load();
for(i=0;i<n-1;i++) /*选取法排序*/
{k=i;
for(j=i+1;j<n;j++)
if(stu[j].ave>stu[k].ave) k=j;
s=stu[i];stu[i]=stu[k];stu[k]=s;
}
save(n);
puts("\n\n");
printf_back();
}
/****************主界面****************/
menu() /*主界面*/
{int n,w1;
do
{clrscr(); /*清屏*/
puts("\n\t\t\t Copy right by CHEN LIN BIN!");
puts("\t\t\t\t 24/06/!\n\n");
puts("\t\t*********************MENU*********************\n\n");
puts("\t\t\t\t1.Enter new data");
puts("\t\t\t\t2.Addition data");
puts("\t\t\t\t3.Modify data");
puts("\t\t\t\t4.Delete data");
puts("\t\t\t\t5.Browse all");
puts("\t\t\t\t6.Search by name");
puts("\t\t\t\t7.Insert data");
puts("\t\t\t\t8.Order by average");
puts("\t\t\t\t9.Exit");
puts("\n\n\t\t**********************************************\n");
printf("Choice your number(1-9):[ ]\b\b");
scanf("%d",&n);
if(n<1||n>9) /*对选取数字作判断*/
{w1=1;getchar();}
else w1=0;
}
while(w1==1);
/*选取功能*/
switch(n)
{case 1:enter();break; /*输入模块*/
case 2:add();break; /*追加模块*/
case 3:modify();break; /*修改模块*/
case 4:del();break; /*删除模块*/
case 5:browse();break; /*浏览模块*/
case 6:search();break; /*查找模块*/
case 7:insert();break; /*插入模块*/
case 8:order();break; /*排序模块*/
case 9:exit(0); /*退出*/
}
}
/*****************主函数****************/
main()
{menu();
}
点击此处下载报告
展开阅读全文