#include<stdio.h>
#include<stdlib.h>
#define N 20
struct student
{
char name[20];//名字
char number[5];//学号
char sex[6];//性别
char age[5]; //年龄
char E_score[4];//英语
char C_score[4];//C语言
char J_score[4];//计算机应用
int zongfen;//总成绩
};
void menu();//菜单
void input(struct student *p);//输入文件
void all(struct student *p);//输出所有信息
int chaxun(struct student *p);//学号及姓名查找
int Compare(char *p,char *q);//字符串的比较
void baocun(struct student *p);//文件保存
void xiugai(struct student *p);//学号及姓名修改
void tianjia(struct student *p);//添加一个新的信息
void tianji(struct student *p);//添加保存文件
void main()
{
struct student stut[N];
int key; //控制菜单数
menu();
input(stut);
while(1)
{
scanf("%d",&key); //输入需要操作的数字
switch(key)
{
case 1: all(stut);break; //显示全部学生信息。
case 2: chaxun(stut);break; //根据学号及姓名查询学生信息。
case 3: xiugai(stut);break;//学号及姓名修改成绩
case 4: tianjia(stut);break;//添加一个新的信息
case 6:exit(1); //退出系统
}
}
return;
}
void menu() //菜单
{
printf("****************湖南工业职业技术学院****************\n");
printf("\t**************学生成绩管理系统**************\n");
printf("\t\t1.显示全部学生的信息。\n");
printf("\t\t2.根据学生学号或姓名查询学生信息。\n");
printf("\t\t3.根据学号或姓名修改信息。\n");
printf("\t\t4.添加一个新的学生信息。\n");
printf("\t\t5.删除学生的信息。\n");
printf("\t\t6.退出本系统。\n");
printf("\t\t请输入操作数<1-6>进行选择。\n");
printf("*****************************************************\n");
printf("\t\t\t设计小组成员:彭亮,张邵峰,曾平伟,杨威智,周妍。\n");
printf("\t\t\t\t\t\t设计小组班级:计软2班。\n");
printf("\t\t\t\t\t\t\t指导老师:谢丁峰老师。\n");
}
void input(struct student *p)
{
FILE *fp;
fp=fopen("xinxi.in","r");
if(fp==NULL)
{
printf("文件打开不成功!\n");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s",p->name); //fscanf是从文件中读取,fp一个指针,指向文件的指针
fscanf(fp,"%s",p->number);
fscanf(fp,"%s",p->age);
fscanf(fp,"%s",p->sex);
fscanf(fp,"%s",p->E_score);
fscanf(fp,"%s",p->C_score);
fscanf(fp,"%s",p->J_score);
p++;
}
fclose(fp);
}
void all(struct student *p) //输出全部学生信息
{
FILE *fp;
fp=fopen("xinxi.in","r"); //以只读的方式打开xinxi.in
if(fp==NULL) //判断文件打开是否成功
{
printf("文件打开不成功!\n");
exit(0); //结束程序运行
}
printf(" 名字: 学号: 年龄: 性别: 英语: C语言: 计应基础: \n");
while(!feof(fp)) //没有读到文件尾,则继续循环
putchar(fgetc(fp)); //将文件中读出的字符显示到屏幕上
fclose(fp); //关闭文件
}
//按学号和姓名查询信息
int chaxun(struct student *p) //此函数还存在某些小问题。 姓名查找存在BUG,有空修改
{
char number[5];
char name[5];
int key;
printf("按学号查询按1,按姓名查找请按2:");
scanf("%d",&key);
if(key==1)
{
printf("请输入需要查找学生学号:\n");
scanf("%s",number);
for(int i=0;i<N;i++)
{
if(Compare(p->number,number)) //调用Compare函数,比较输入的学号和文件中的学号是否一致
{
printf(" 名字: 学号: 年龄: 性别: 英语: C语言: 计应基础: \n");
printf("%s\t",p->name);
printf("%s\t",p->number);
printf("%s\t",p->age); //数组设小了就会显示不出来
printf("%s\t",p->sex);
printf("%s\t",p->E_score);
printf("%s\t",p->C_score);
printf("%s\t",p->J_score);
break;
}
p++;
}
}
else if (key==2)
{
printf("请输入需要查找学生姓名:\n");
scanf("%s",name);
for(int i=0;i<1;i++)
{
if(Compare(p->name,name)) //调用Compare函数,比较输入的学号和文件中的学号是否一致
{
printf(" 名字: 学号: 年龄: 性别: 英语: C语言: 计应基础: \n");
printf("%s\t",p->name);
printf("%s\t",p->number);
printf("%s\t",p->age);
printf("%s\t",p->sex);
printf("%s\t",p->E_score);
printf("%s\t",p->C_score);
printf("%s\t",p->J_score);
break;
p++;
}
else{
printf("你操作有错误!");
}
}
}
return 0;
}
int Compare(char *p,char *q) //字符串的比较
{
while(*p)
{
if(*p==*q) //比较两个字符串是否一样
{
p++;
q++;
}
else return 0;
}
return 1; //一样就是真
}
void xiugai(struct student *p)
{
char number[8];
char name[8];
struct student *q=p;
int key;
printf("按学号修改按1,按姓名修改按2。请选择:");
scanf("%d",&key);
if(key==1)
{
printf("请输入需要修改学生的学号:");
scanf("%s",number);
for(int i=0;i<N;i++)
{
if(Compare(p->number,number))
{
printf("请输入修改后学生姓名:");
scanf("%s",p->name);
printf("请输入修改后学生的年龄:");
scanf("%s",p->age);
printf("请输入修改后学生的性别:");
scanf("%s",p->sex);
printf("请输入修改后学生的英语成绩:");
scanf("%s",p->E_score);
printf("请输入修改后学生的C语言成绩:");
scanf("%s",p->C_score);
printf("请输入修改后学生的计应成绩:");
scanf("%s",p->J_score);
printf("%s\t",p->name);
printf("%s\t",p->number);
printf("%s\t",p->age);
printf("%s\t",p->sex);
printf("%s\t",p->E_score);
printf("%s\t",p->C_score);
printf("%s\t",p->J_score);
printf("\n");
break;
p++;
}
}
}
else if(key==2)
{
printf("请输入需要修改学生的姓名:");
scanf("%s",name);
for(int i=0;i<N;i++)
{
if(Compare(p->name,name))
{
printf("请输入修改后学生姓名:");
scanf("%s",p->name);
printf("请输入修改后学生的年龄:");
scanf("%s",p->age);
printf("请输入修改后学生的性别:");
scanf("%s",p->sex);
printf("请输入修改后学生的英语成绩:");
scanf("%s",p->E_score);
printf("请输入修改后学生的C语言成绩:");
scanf("%s",p->C_score);
printf("请输入修改后学生的计应成绩:");
scanf("%s",p->J_score);
printf("%s\t",p->name);
printf("%s\t",p->number);
printf("%s\t",p->age);
printf("%s\t",p->sex);
printf("%s\t",p->E_score);
printf("%s\t",p->C_score);
printf("%s\t",p->J_score);
printf("\n");
break;
p++;
}
}
}
baocun(q);
}
void baocun(struct student *p)
{
FILE *fp;
fp=fopen("xinxi.in","w");
if(fp==NULL)
{
printf("文件xinxi.in打开不成功\n");
exit(0);
}
for(int i=0;i<13;i++) //如果这里的字符串比实际信息大的话,剩余的空间后面全是乱码,该怎么解决呢?暂时的办法是把数循环控制在12之内
{
fprintf(fp,"%8s",p->name);
fprintf(fp,"%8s",p->number);
fprintf(fp,"%8s",p->age);
fprintf(fp,"%8s",p->sex);
fprintf(fp,"%8s",p->E_score);
fprintf(fp,"%8s",p->C_score);
fprintf(fp,"%8s\n",p->J_score);
p++;
}
fclose(fp);
}
void tianjia(struct student *p)
{
struct student *q=p;
FILE *fp;
fp=fopen("xinxi.in","a");
if(fp==NULL)
{
printf("文件xinxi.in打开不成功\n");
exit(0);
}
while(!feof(fp)) //如果有两个相同的信息该怎么办
{
printf("请输入新的姓名:"); //姓名和学号添加后信息相同该怎么解决
scanf("%s",p->name);
printf("请输入新的学号:");
scanf("%s",p->number);
printf("请输入年龄:");
scanf("%s",p->age);
printf("请输入性别:");
scanf("%s",p->sex);
printf("请输入英语成绩:");
scanf("%s",p->E_score);
printf("请输入C语言成绩:");
scanf("%s",p->C_score);
printf("请输入计应成绩:");
scanf("%s",p->J_score);
printf("%s\t",p->name);
printf("%s\t",p->number);
printf("%s\t",p->age);
printf("%s\t",p->E_score);
printf("%s\t",p->C_score);
printf("%s\t",p->J_score);
printf("\n");
break;
p++;
}
tianji(q);
}
void tianji(struct student *p)// 添加新的信息保存函数
{
FILE *fp;
fp=fopen("xinxi.in","a");
if(fp==NULL)
{
printf("文件xinxi.in打开不成功\n");
exit(0);
}
{
fprintf(fp,"%8s",p->name);
fprintf(fp,"%8s",p->number);
fprintf(fp,"%8s",p->age);
fprintf(fp,"%8s",p->sex);
fprintf(fp,"%8s",p->E_score);
fprintf(fp,"%8s",p->C_score);
fprintf(fp,"%8s\n",p->J_score);
}
p++;
fclose(fp);
}

随便乱输的话就死循环· 我哭!