要求设计的管理系统能够实现以下功能:
1.每一条记录包括一个学生的学号、姓名、3个成绩(平时成绩、作业成绩、考试成绩)
2.成绩录入功能:(成绩信息用文件保存,可以一次完成若干条记录)
3.成绩信息显示浏览功能,完成全部学生记录的显示。
4.查询功能:完成按姓名查找学生记录,并显示
5.成绩信息的删除:按学号进行删除某学生的成绩
6.排序功能:按学生总成绩进行排序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int AddStu(); //添加学生信息
void Stu_delete(); //删除某个学生的信息
void Stu_alldisplay(); //显示所有人的学生信息
void Stu_find(); //按名字查找
int Stu_findcode(char number[10]); //按照学号查找
void Stu_sort(); //排序
void Stu_display(int num); //显示某个学生的信息
void read_studentdata();
void edit_studentdata1(); //将刚输入的数据存入文件中
void edit_studentdata2(); //将排序后的数据存入文件中
int Stu_findname(char name[]); //通过名字返回数组下标
void mei();
char *xingm;
struct student
{
char name[10];
char number[10];
char usual[10];
char homework[10];
char exam[10];
double all;
};
int X;
int num = 0;
struct student Stu[1000];
int main()
{
read_studentdata();
mei();
while(1)
{
printf(" ✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡学生成绩管理系统✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡\n");
printf(" ✡ 1. 加入学生信息 2. 删除学生信息 ✡\n");
printf(" ✡ 3. 显示浏览学生信息 4. 按姓名查找学生记录并显示 ✡\n");
printf(" ✡ 5. 按总成绩进行排序 6. 退 出 ✡\n");
printf(" ✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡欢迎使用✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡✡\n");
printf("\n 请选择(1-6): \n\n");
scanf("%d",&X);
getchar();
switch(X)
{
case 1:
AddStu();
edit_studentdata1();//数据写入文件
mei();
break;
case 2:
Stu_delete();
edit_studentdata1();//数据写入文件
mei();
break;
case 3:
Stu_alldisplay();
mei();
break;
case 4:
Stu_find();
mei();
break;
case 5:
Stu_sort();
edit_studentdata2();//数据写入文件
mei();
break;
case 6:
exit(0);
break;
}
}
return 0;
}
//添加学生
int AddStu()
{
while(1)
{
printf("Please input the name:");
scanf("%s",Stu[num].name);
printf("Please input the No.(学号) :");
scanf("%s",Stu[num].number);
printf("Please input the usual gride :");
scanf("%s",Stu[num].usual);
printf("Please input the homework's gride:");
scanf("%s",Stu[num].homework);
printf("Please input the exam gride:");
scanf("%s",Stu[num].exam);
double grade1 = atoi(Stu[num].usual);
double grade2 = atoi(Stu[num].homework);
double grade3 = atoi(Stu[num].exam);
Stu[num].all = grade1 + grade2 + grade3;//计算总成绩
num++;//学生数目的计数器,也会进入文件
printf("请问您是否要添加学生信息?(y for yes or n for no ?)");
getchar();
if(getchar() == 'n')
{
break;//直到在此处输入n,添加学生的循环才会停止
}
}
return num;
}
//删除某个学生
void Stu_delete()
{
int i;
while(1)
{
char numbers[20];
int index;
printf("请输入要删除的学生的学号:\n");
scanf("%s",numbers);
getchar();
index = Stu_findcode(numbers);//查找该学生是否存在
if (index==-1){printf("学生不存在!\n");}
else
{
printf("你要删除的学生信息是:\n");
printf("------学号-----姓名-----平时成绩------作业成绩------考试成绩------总成绩\n");
Stu_display(index);
printf("是否真的要删除?(y for yes and n for no/n)");
if (getchar()== 'y')
{
printf("学号为 %s 的学生已被删除!\n",numbers);
for (i=index;i<num-1;i++)
{
Stu[i]= Stu[i+1];
}
num--;
}
else
printf("未能删除成功,请重新进行删除!\n");
getchar();
}
printf("是否继续删除学生?(y for yes and n for no/n)");
if (getchar()=='n'){break;}
}
}
int Stu_findcode(char number[10])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(Stu[i].number,number)==0)
{
printf("想要删除的人的下标是%d\n",i);
return i;
}
}
return -1;
}
int Stu_findname(char name[]) //通过名字返回数组下标
{
int i;
for (i=0;i<num;i++)
{
if (strcmp((Stu[i].name),name)==0)
{
printf("这时的数组下标是:%d\n",i);
return i;
}
}
return -1;
}
//按姓名查找某个学生
void Stu_find()
{
while(1)
{
char name[20];
int index;
printf("请输入要查询的学生的姓名:");
scanf("%s",name);
getchar();
index = Stu_findname(name);
printf("此时的index等于%d\n",index);
if (index==-1)
{
printf("学生不存在!\n");
}
else{
printf("你要查询的学生信息为:\n");
printf("------学号-----姓名-----平时成绩------作业成绩------考试成绩------总成绩\n");
Stu_display(index);
}
printf("是否继续?(y/n)");
//getchar();
if (getchar()=='n')
{
break;
}
}
}
/*将学生信息从文件读出*/
void read_studentdata()
{
FILE *fp1;
int i;
if ((fp1=fopen("studata1.txt","rb"))==NULL)//文件指针是否为空
{
printf("尚未存储学生文件!\n");
printf("\n\n");
return;
}
if (fread(&num,sizeof(int),1,fp1)!=1)//fread判断是否读入成功
{
num = -1;
}
else
{
printf("现有%d个学生信息,请预览:\n",num);
printf(" ---------------------------------------------------\n");
printf(" | 目前已有的学生信息如下 : |\n");
printf(" ---------------------------------------------------\n\n\n");
printf("-----学号-----姓名-----平时成绩-----作业成绩-----考试成绩-----总成绩------\n");
for(i=0;i<num;i++)
{
fread(&Stu[i],sizeof(struct student),1,fp1);
printf(" %-8s %-8s %-8s %-8s %-8s %.2lf\n",Stu[i].number,Stu[i].name,Stu[i].usual,Stu[i].homework,Stu[i].exam,Stu[i].all);
}
fclose(fp1);
}
}
/*1.一般调用形式
fread(stu,size,count,fp);
fwrite(stu,size,count,fp);
2.说明
(1)stu首地址:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。*/
//将学生信息写入文件
void edit_studentdata1()
{
FILE *fp1;
int i;
if ((fp1=fopen("studata1.txt","wb"))==NULL)//wb
{
printf("文件未打开!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp1)!=1)
{
printf("读入失败,请检查输入\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&Stu[i],sizeof(struct student),1,fp1)!=1)
{
printf("Error!\n");
}
}
fclose(fp1);
}
/*char *fgets(char *buf, int bufsize, FILE *stream);
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件结构体指针,将要读取的文件流。
返回值
成功,则返回第一个参数buf;
在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。
*/
void edit_studentdata2()
{
FILE *fp2;
int i;
if ((fp2=fopen("studata2.txt","wb"))==NULL)//wb
{
printf("no\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp2)!=1)
{
printf("Error!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&Stu[i],sizeof(struct student),1,fp2)!=1)
{
printf("Error!\n");
}
}
fclose(fp2);
}
void Stu_alldisplay()
{
printf("------学号-----姓名-----平时成绩------作业成绩------考试成绩------总成绩\n");
for(int i = 0 ;i < num ;i++)
Stu_display(i);
}
//显示某个姓名的学生的各项信息
void Stu_display(int i)
{
printf(" %-8s %-8s %-8s %-8s %-8s %.2lf\n",Stu[i].number,Stu[i].name,Stu[i].usual,Stu[i].homework,Stu[i].exam,Stu[i].all);
}
void Stu_sort()
{
int i,j;
struct student XXX;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (Stu[j-1].all<Stu[j].all)
{
XXX = Stu[j-1];
Stu[j-1] = Stu[j];
Stu[j] = XXX;
}
}
}
printf("排序后的结果显示为:\n\n");
printf("------学号-----姓名-----平时成绩------作业成绩------考试成绩------总成绩\n");
for(int q = 0 ; q < num ; q++)
{
Stu_display(q);
}
}
void mei()
{
printf("---------------------->>>");
printf("\n\n\n\n\n\n\n从键盘上输入任意键,进入学生成绩管理系统\n");
getchar();
printf("\n\n");
}