课程设计的内容: 1、每一条记录包括一个学生的学号、姓名、3门课成绩、平均成绩。
2、输入功能:可以一次完成若干条记录的输入。
3、显示功能:完成全部学生记录的显示。
4、查找功能:完成按姓名查找学生记录,并显示。
5、排序功能:按学生平均成绩进行排序。
6、插入功能:按平均成绩高低插入一条学生记录。
7、将学生记录存在文件score中。
8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
课程设计的要求: 1、 用C语言实现系统;
2、 利用结构体数组实现学生成绩的数据结构设计;
3、 系统具有增加,查询,插入,排序等基本功能;
4、 系统的各个功能模块要求用函数的形式实现;
5、 完成设计任务并书写课程设计报告。
6、 将学生成绩信息存在文件中。
#include <dos.h> /*暂停函数*/
#include <stdio.h> /*I/O函数*/
#include <stdlib.h> /*其它说明*/
#include <string.h> /*字符串操作函数*/
#define M 1000
int N=0; /*记录已经存在的记录条数*/
int H=0;
struct student /*定义数据结构*/
{ char number[8];
char name[16];
float score[3];
float average;
}stud[M],temp;
/*以下是函数声明*/
void load(void); /*读入记录*/
void inorder(struct student stud[]); /*排列记录*/
void insert(struct student stud[]); /*插入记录*/
void save(struct student stud[]); /*保存记录*/
void print(struct student stud[]); /*显示记录*/
void search(struct student stud[]); /*查找记录*/
void enter(struct student stud[]); /*输入记录*/
void del(void); /*删除记录*/
void change(void); /*改变记录*/
void quit(void); /*退出系统*/
int flag(struct student stud[]); /*返回值为0或1*/
int menu(void); /*菜单*/
main() /*主函数*/
{ /*以下printf语句为打印欢迎界面语句*/
printf("\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t!!!!!\n");
printf(" w w eeeeeee l ccccccc ooooo mmmmmmmmm eeeeeee !!!!\n");
printf(" w w w e e l c o o m m m e e !!! \n");
printf(" w w w w e eeeee l c o o m m m eeeeeee !! \n");
printf(" w w w w e l c o o m m m e ! \n");
printf(" w w eeeeeee llllll ccccccc ooooo m m m eeeeeee \n");
printf("\t\t\t\t\t\t\t\t\t\b0");
sleep(1);
printf("\n\n\n\n\n\t\t\t\t\t\t\t\t ----- pan");
sleep(1);
load(); /*调用读入记录函数*/
for(;;) /*无限循环*/
{ switch(menu()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ case 1: enter(stud); break; /*输入记录*/
case 2: print(stud); break; /*显示要看的一页的记录*/
case 3: search(stud); break; /*查找记录*/
case 4: inorder(stud);break; /*排序*/
case 5: insert(stud); break; /*插入记录*/
case 6: save(stud); break; /*保存文件*/
case 7: change(); break; /*改变记录*/
case 8: del(); break; /*删除记录*/
case 9: quit(); /*如菜单返回值为9程序结束*/
}
}
}
/*输入数据函数*/
void enter(struct student stud[])
{ int n=0,i,j,k,c;
char b[4];
float sum;
printf("How many student's record do you want to enter? n= ?\b\b\b");
scanf("%d",&n); /*输入一次要输入记录数*/
for(i=0;i<n;)
{ sum=0; /*统记三科总分*/
printf("Input the %dth student's number ",N+1);
scanf("%s",stud[N].number); /*输入学号*/
/*以下if-else语句判断所输记录是否存在*/
if(flag(stud)) /*调用返回值为0或1函数,判断所输入的学号是否已经存在,存在就执行if语句*/
{
printf("The record has exist.\n");
printf("Input again.");
getch();
}
else
{ printf("Input the %dth student's name ",N+1);
scanf("%s",stud[N].name); /*输入姓名*/
for(j=0;j<3;j++)
{ do
{
printf("Input the %dth student's score(%d)",N+1,j+1); /*打印提示*/
scanf("%s",b); /*输入分数*/
最新回复
if(stud[N].score[j]<=0||stud[N].score[j]>100) /*判断分数是否在0-100之间*/
{
k=1; /*分数不在0-100之间时k值为1*/
printf("Error input !!!\n");
printf("Input again ...\n"); /*打印出错提示*/
}
else
k=0; /*分数在0-100之间时k值为0*/
}while(k); /*由k值决定是否要循环*/
sum+=stud[N].score[j]; /*统记三科总分*/
}
stud[N].average=sum/3.0; /*平均分*/
printf("\nEnter success !!!\n");
printf("\nPress any key to return.");
getch();
N++; /*记录数加1*/
i++;
H=1;
}
clrscr(); /*清屏*/
}
clrscr(); /*清屏*/
} /* 显示记录函数*/
void print(struct student stud[])
{ int i=0,k,max,maxb,n,flag='y';
char m[6];
/*以下if-else为判断文件中是否有记录*/
if(N==0)
{
printf("There are not record.\n");
printf("Press any key to return."); /*当N为0时(即没有记录)打印没有记录提示*/
getch();
}
else
while(flag!='n')
{ maxb=0;i=0;
/*以下分页输出记录*/
do
{ if(N%10!=0)
{ printf("\n\t\tThere are %d pages in all.",N/10+1);
printf("\n\t\tWhich page do you want to see? ");
}
else
{ printf("\n\t\tThere are %d pages in all.",N/11+1);
printf("\n\t\tWhich page do you want to see? ");
}
scanf("%s",m); /*输入要显示的页数*/
k=atoi(m); /*强制把m转换成整形*/
if(k)
{ k=10*(k-1); /*此时k变为第k页的第一条信息的序号*/
if(k>=N) /*判断页数是否存在*/
{ printf("\n\t\tThe page is not exist !!!");
printf("\n\t\tInput again .\n");
}
}
else
k=N+1;
}while(k>=N); /*如果页数不存在进入do-whie循环*/
/*以下if-else语句是判断第k页是否有10条语句*/
if((k+10)>N)
max=N; /*当第k页不够10条记录时*/
else
max=k+10; /*当第k页够10条记录时*/
clrscr();
/*以下for语句为取得第k页名字最大字符长度*/
for(i=k;i<max;i++)
{ n=strlen(stud.name);
if(n>maxb)
maxb=n;
}
i=k;
/*以下if-else是为了保证表美观*/
/*如果最大字符长度不大于8则按if
输出,则按名字方格长度为8输出*/
if(maxb<8)
{ while(i<max)
{ /*以下为输出记录*/
if(i%10==0)
{ printf("\n\t\t\t\t Page:%d",(k+10)/10);
printf("\n\t|---|--------|--------|--------|--------|--------|--------|");
printf("\n\t|NO:| number | name |score(1)|score(2)|score(3)|average |\n");
}
printf("\t|---|--------|--------|--------|--------|--------|--------|\n");
printf("\t| %-2d| %-6s|%-8s| %-5.1f | %-5.1f | %-5.1f | %-7.2f|\n",i+1,stud.number,
stud.name,stud.score[0],stud.score[1],stud.score[2],
stud.average);
i++;
}
printf("\t|---|--------|--------|--------|--------|--------|--------|\n");
}
/*如果最大字符长度大于8则按else
输出,见则按名字格长度为16输出*/
{ while(i<max)
{ /*以下为输出记录*/
if(i%10==0)
{ printf("\n\t\t\t\t Page:%d",(k+10)/10);
printf("\n\t\b\b|---|--------|----------------|--------|--------|--------|--------|");
printf("\n\t\b\b|NO:| number | name |score(1)|score(2)|score(3)|average |\n");
}
printf("\t\b\b|---|--------|----------------|--------|--------|--------|--------|\n");
printf("\t\b\b| %-2d| %-6s|%-16s| %-5.1f | %-5.1f | %-5.1f | %-7.2f|\n",i+1,stud.number,
stud.name,stud.score[0],stud.score[1],stud.score[2],
stud.average);
i++;
}
printf("\t\b\b|---|--------|----------------|--------|--------|--------|--------|\n");
}
printf("\t\t\t\b\bDo you want to go on? y or n?\b\b\b\b\b\b\b");
flag=getch(); /*获取一个字符判断是否要继续显示*/
clrscr(); /*清屏*/
}
} /*查找函数*/
void search(struct student stud[])
{ int i=0,n,j;
char number[8],flag='y';
clrscr(); /*清屏*/
while(flag!='n')
{ i=0;
printf("\n\t\t\t\t\b\b\b\bThe number--name list:\n");
printf("----------------------------------------");
printf("----------------------------------------");
/*以下while语言句为输出已有的记录的学号与名字*/
while(i<N)
{ /*以下保证输出的学号和名字总长度不长于14*/
if(strlen(stud.number)<4)
n=4;
else
n=strlen(stud.number);
if(n+strlen(stud.name)<15) /*总长度不长于14时执行if语句*/
{ if(n+strlen(stud.name)>6)
{ printf("%-4s-",stud.number);
printf("%s\t",stud.name);
i++;
}
else
{ printf("%-4s-",stud.number);
printf("%s\t\t",stud.name);
i++;
}
}
else /*总长度长于14时执行else语句*/
{ printf("%-4s-",stud.number);
if(strlen(stud.number)>4)
j=(12-strlen(stud.number));
else
j=12-4;
for(n=0;n<j;n++)
printf("%c",stud.name[n]); /*以上输出总长度为13*/
printf(".. "); /*长出部分用".."省略表示*/
i++;
}
}
printf("\n---------------------------------------");
printf("-----------------------------------------");
printf("\n\t\t\bInput the student's number you want to search:");
scanf("%s",number); /*输入要查找的记录的学号*/
i=0;
while(i<N)
{ if(strcmp(stud.number,number)==0) /*查找记录*/
{/*输出找到的记录*/
/*当名字长度小于8时执行if语句*/
if(strlen(stud.name)<8)
{ printf("\n");
printf("\t |---|--------|--------|--------|--------|--------|--------|\n");
printf("\t |NO:| number | name |score(1)|score(2)|score(3)|average |\n");
printf("\t |---|--------|--------|--------|--------|--------|--------|\n");
printf("\t | %-2d| %-6s|%-8s| %-5.1f | %-5.1f | %-5.1f | %-7.2f|\n",i+1,stud.number,
stud.name,stud.score[0],stud.score[1],
stud.score[2],stud.average);
printf("\t |---|--------|--------|--------|--------|--------|--------|\n");
}
/*当名字长度大于8时执行else语句*/
else
printf("\t |---|--------|----------------|--------|--------|--------|--------|\n");
printf("\t |NO:| number | name |score(1)|score(2)|score(3)|average |\n");
printf("\t |---|--------|----------------|--------|--------|--------|--------|\n");
printf("\t | %-2d| %-6s|%-16s| %-5.1f | %-5.1f | %-5.1f | %-7.2f|\n",i+1,stud.number,
stud.name,stud.score[0],stud.score[1],
stud.score[2],stud.average);
printf("\t |---|--------|----------------|--------|--------|--------|--------|\n");
}
flag=0;
i=N; /*找到并打印后i=N退出while循环*/
}
i++; /*找不到时i自加*/
}
if(flag) /*当找到记录时flag为0,否则为1*/
printf("\n\t\t\tYour input is error\n");
printf("\n\t\t\tDo you want to go on? y or n?\b\b\b\b\b\b\b");
flag=getch(); /*获取一个字符判断是否要继续查找*/
clrscr(); /*清屏*/ }
}
/*排序函数*/
void inorder(struct student stud[])
{ int i,j,k;
for(i=0;i<N-1;i++)
{ k=i;
/*以下for语句为选择法排序*/
for(j=i+1;j<N;j++)
if(stud[j].average>stud[k].average)
k=j;
if(k!=i)
{
temp=stud[k];
stud[k]=stud;
stud=temp;
H=1;
}
}
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" ");
printf("********* Has been inoder!! *********\n"); /*排序成功提示*/
printf(" ");
sleep(2); /*调用暂停函数 暂停2秒钟*/
clrscr(); /*清屏*/
}
/*插入记录函数*/
void insert(struct student stud[])
{ int i,j,k;
float sum;
char flag='y',b[4];
clrscr(); /*清屏*/
while(flag=='y')
{ sum=0;
k=0;
printf("Input the student's number you want to insert:");
scanf("%s",stud[N].number); /*输入要插入记录的学号*/
for(i=0;i<N;i++)
if(strcmp(stud.number,stud[N].number)==0) /*查找要插入记录是否存在*/
k=1;
if(k) /*判断要插入记录是否存在*/
{
printf("The record has exist.\n");
}
else
{ printf("Input the student's name you want to insert:");
scanf("%s",stud[N].name); /*输入要插入记录的名字*/
for(j=0;j<3;j++)
{ do
{ printf("Input the student's score(%d):",j+1);
scanf("%s",b); /*输入分数*/
stud[N].score[j]=atof(b);
if(stud[N].score[j]<=0||stud[N].score[j]>100) /*判断分数是否在0-100之间*/
{ k=1;
printf("Error input !!!\n");
printf("Input again ...\n");
}
else
k=0;
}while(k);
sum=sum+stud[N].score[j]; /*三科总分*/
}
stud[N].average=sum/3.0; /*平均分*/
/*以下for语句为插入*/
for(j=0;j<N;j++)
if(stud[j].average<stud[N].average)
{ i=N;
temp=stud[N];
for(;i>j;)
{ stud=stud[i-1];
}
stud[j]=temp;
j=N;
}
N++;
H=1; /*记录数加1*/
printf("\nInsert success !!!\n\n");
}
printf("If you want to go on press:y\n");
printf("Else press any key to menu:");
flag=getch(); /*获取一个字符判断是否要继续插入*/
clrscr(); /*清屏*/
}
} /*保存记录函数*/
void save(struct student stud[])
{ FILE *fp;
int i=0;
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" ");
printf("********** Saving file......**********\n"); /*保存提示*/
printf(" ");
sleep(1); /*调用暂停函数 暂停1秒钟*/
if((fp=fopen("score","wb"))==NULL) /*以wb形式打开文件score*/
{
printf("Can not open the file\n");
sleep(1);
return;
}
for(i=0;i<N;i++)
if(fwrite(&stud,sizeof(struct student),1,fp)!=1) /*把记录保存到score文件中*/
{
printf("File write error\n");
return;
}
fclose(fp); /*关闭文件*/
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" ");
printf("********** Saving success !!! **********\n"); /*保存成功提示*/
printf(" ");
H=0;
sleep(2); /*调用暂停函数 暂停1.5秒钟*/
clrscr(); /*清屏*/
}
/*改变记录函数*/
void change(void)
{ int i,a,k,n,h,j;
float sum;
char m[10],flag='y',b[8];
while(flag=='y')
{ sum=0;
i=0;
k=0;
printf("\n\t\t\t\t\b\b\b\bThe number--name list:\n");
printf("----------------------------------------");
printf("----------------------------------------");
/*以下while语句为输出文件中已有记录的学号与人名*/
while(i<N)
{ if(strlen(stud.number)<4)
n=4;
else
n=strlen(stud.number);
if(n+strlen(stud.name)<15)
{ if(n+strlen(stud.name)>6)
{ printf("%-4s-",stud.number);
printf("%s\t",stud.name);
i++;
}
else
{ printf("%-4s-",stud.number);
printf("%s\t\t",stud.name);
i++;
}
}
else
{ printf("%-4s-",stud.number);
if(strlen(stud.number)>4)
j=(12-strlen(stud.number));
else
j=12-4;
for(n=0;n<j;n++)
printf("%c",stud.name[n]);
printf(".. ");
i++;
}
}
printf("\n---------------------------------------");
printf("-----------------------------------------");
printf("\n\t\tInput the student's number you want to change.");
scanf("%s",m); /*输入要改变记录的人名*/
printf("\n");
for(i=0;strcmp(stud.number,m)!=0&&i<N;i++); /*查找要改变记录的人名*/
/*a为判断是否找到*/
if(i<N)
{
a=1;
h=i;
}
else
a=0;
/*以下if语句为找到要改变的 并输入新记录*/
if(a)
{ printf("Input new number:");
scanf("%s",b); /*输入学号*/
for(i=0;i<h||i>h&&i<N;i++)
if(strcmp(stud.number,b)==0)/*查找要改变记录是否存在*/
k=1;
if(k) /*判断要改变记录是否存在*/
printf("The record has exist.\n");
getch();
}
else
{ strcpy(stud[h].number,b); /*复制学号*/
printf("Input new name:");
scanf("%s",stud[h].name); /*输入姓名*/
for(k=0;k<3;k++)
{ do
{ printf("Input new score(%d)",k+1);
scanf("%s",b); /*输入分数*/
stud[h].score[k]=atof(b); /*将字符串强制转换成整形*/
/*以下语句判断输入是否在0-100之间*/
if(stud.score[k]<=0||stud[h].score[k]>100)
{
n=1;
printf("Error input !!!\n");
printf("Input again ...\n");
}
else
n=0;
}while(n);
sum=sum+stud[h].score[k]; /*统记三科总分*/
}
stud.average=sum/3.0; /*平均分*/
printf("\n\t\t\t **** Change success !!! ****\n\n"); /*改变成功提示*/
H=1;
}
}
else
printf("\n\t\t\t\tError input!!!!!\n\n");
printf("\t\t\t If you want to go on press:y");
printf("\n\t\t\t Else press any key to menu:");
flag=getch(); /*获取一个字符判断是否要继续改变*/
clrscr(); /*清屏*/
}
} /*删除记录函数*/
void del(void)
{ int i,a,j,k,n;
char m[10],flag='y';
while(flag=='y')
{ i=0;
printf("\t\t\t\t\b\b\b\bThe number--name list:\n");
printf("----------------------------------------");
printf("----------------------------------------");
/*以下while语句为输出文件中记录的学号与人名*/
while(i<N)
{ if(strlen(stud.number)<4)
n=4;
else
n=strlen(stud.number);
if(n+strlen(stud.name)<15)
{ if(n+strlen(stud.name)>6)
{ printf("%-4s-",stud.number);
printf("%s\t",stud.name);
i++;
}
else
{ printf("%-4s-",stud.number);
printf("%s\t\t",stud.name);
i++;
}
}
else
{ printf("%-4s-",stud.number);
if(strlen(stud.number)>4)
j=(12-strlen(stud.number));
else
j=12-4;
for(n=0;n<j;n++)
printf("%c",stud.name[n]);
printf(".. ");
i++;
}
}
printf("\n---------------------------------------");
printf("-----------------------------------------");
printf("\n\t\tInput the student's number you want to delete.");
scanf("%s",m); /*输入要删除的记录的学号*/
for(i=0;strcmp(stud.number,m)!=0&&i<N;i++); /*查找要删除的学号*/
/*以下if-else判断要删除的是否存在*/
if(i<N)
a=1;
else
a=0;
/*以下if语句为删除记录*/
if(a)
{ stud=stud[M-1];
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(stud[j].average>stud[k].average)
k=j;
temp=stud[k];
stud[k]=stud;
stud=temp;
}
N--; /*文件中记录数减1*/
printf("\n\t\t\t **** Delete success !!! ****\n\n");
H=1;
}
/*当要删除的不存在是执行下列else语句*/
else
printf("\n\t\t\t\tError input!!!!!\n");
printf("\n\t\t\t If you want to go on press:y");
printf("\n\t\t\t Else press any key to menu:");
flag=getch(); /*获取一个字符判断是否要继续删除*/
clrscr(); /*清屏*/
}
}
/*退出系统函数*/
void quit(void)
{ char a;
if(H)
{ printf("\n\n\n\n\n\n\n\n\n\t\t Do you want to save the datas have changed ?");
printf("\n\n\t\t\t\t y & n ? ");
printf("\n\t\t\t\t ");
a=getch();
printf("%c",a);
getch();
if(a=='y')
{ clrscr();
save(stud); /*调用保存记录函数*/
/*以下printf语句为打印再见语句*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\b\b\b\b**********");sleep(1);
printf(" See you\a"); sleep(1);
printf(" next time\a"); sleep(1);
printf(" !\a"); sleep(1);
printf(" **********");
sleep(1);
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t********** Bye Bye !!! **********");
sleep(2);
exit(0); /*退出系统*/
} else
{clrscr();
/*以下printf语句为打印再见语句*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\b\b\b\b**********");sleep(1);
printf(" See you\a"); sleep(1);
printf(" next time\a"); sleep(1);
printf(" !\a"); sleep(1);
printf(" **********");
sleep(1);
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t********** Bye Bye !!! **********");
sleep(2);
exit(0); /*退出系统*/
}
}
else
{/*以下printf语句为打印再见语句*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\b\b\b\b**********");sleep(1);
printf(" See you\a"); sleep(1);
printf(" next time\a"); sleep(1);
printf(" !\a"); sleep(1);
printf(" **********");
sleep(1);
clrscr(); /*清屏*/
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t********** Bye Bye !!! **********");
sleep(2);
exit(0); /*退出系统*/
}
}
/*读入记录函数*/
void load(void)
{ FILE *fp;
while((fp=fopen("score","rb"))==NULL) /*以rb形式打开score文件*/
return;
for(N=0;!feof(fp);N++)
{
if(1!=fread(&stud[N],sizeof(struct student),1,fp)) /*读入记录*/
break; /*读完后退出*/
}
fclose(fp); /*关闭文件*/
}
/*返回值为0或1函数*/
int flag(struct student stud[])
{ int i,flag=0;
/*以下判断学号是否相同*/
for(i=0;i<N;i++)
if(strcmp(stud.number,stud[N].number)==0)
flag=1; /*相同返回1,否则返回0*/
return(flag);
}
/*菜单函数*/
int menu(void)
{ int n;
char a[5];
clrscr(); /*清屏*/
/*以下是菜单图案*/
do
{
printf("\n");
printf("\t\t ________________________________________________\n");
printf("\t\t||\t\t The menu:\t\t\t||\n");
printf("\t\t||----------------------------------------------||\n");
printf("\t\t|| (1) Enter the studens' records ||\n");
printf("\t\t||----------------------------------------------||\n");
printf("\t\t|| (2) print the file ||\n");
printf("\t|| || (3) Search record on name || ||\n");
printf("\t|| ||----------------------------------------------|| ||\n");
printf("\t|| || (4) inorder the records by the average score || ||\n");
printf("\t||------||----------------------------------------------||------||\n");
printf("\t|| || (5) Insert a student's record || ||\n");
printf("\t|| ||----------------------------------------------|| ||\n");
printf("\t|| || (6) Save the file || ||\n");
printf("\t\t||----------------------------------------------||\n");
printf("\t\t|| (7) Change a record ||\n");
printf("\t\t||----------------------------------------------||\n");
printf("\t\t|| (8) delete a record ||\n");
printf("\t\t||----------------------------------------------||\n");
printf("\t\t|| (9) Quit ||\n");
printf("\t\t|------------------------------------------------|\n");
/*以下语句是输入菜单函数要返回的值*/
printf("\n\t\t\tChoose the item you want (1-9)
scanf("%s",a);
n=atoi(a);
if(n<1||n>9)
{
printf("\t\t\t Error input. Input again.");
sleep(1);
}
clrscr(); /*清屏*/
}while(n<1||n>9);
clrscr(); /*清屏*/
return(n);
}