📄 savethemark.txt
字号:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include <stdlib.h>
#include <string.h>
#define MAX 11
#define NUM 10000
#define FILENAME "record.dat"
typedef int COUNT;
typedef struct
{
char id[MAX];
char name[MAX*3];
char mark[MAX];
}STUT_INFO;
void scan_valid(char *p,int n)
{
for(;;)
{
scanf("%s",p);
if(*(p+1)||*p<49||*p>48+n)
printf("请输入一个1到%d之间的数字\n",n);
else break;
}
}
char enter[11];
int main()
{
STUT_INFO student,*pstu;
void print_welcome();
void scan_valid(char *,int);
void add(STUT_INFO *);
void find(STUT_INFO *);
void deletes(STUT_INFO *);
void modify(STUT_INFO *);
void print();
void printall(STUT_INFO *);
pstu=&student;
b:
print_welcome();
scan_valid(enter,7);
switch(enter[0])
{
case '1': add(pstu);break;
case '2': find(pstu);break;
case '3': deletes(pstu);break;
case '4': modify(pstu);break;
case '5': print();break;
case '6': printall(pstu);
break;
case '7':exit(0);
}
printf("1.返回主界面\n2.退出\n");
scan_valid(enter,2);
if(enter[0]=='1')goto b;
return 0;
}
void print_welcome()
{
printf("\n\n\n你想要........\n");
printf("1.添加新的学生成绩记录\n");
printf("2.查找指定学生\n");
printf("3.删除学生成绩记录\n");
printf("4.修改记录信息\n");
printf("5.输出各分数段学生记录\n");
printf("6.输出全部学生成绩\n");
printf("7.退出\n");
}
void add(STUT_INFO *p)
{
float fmark;
COUNT i,j,m;
FILE *pf;
if((pf=fopen(FILENAME,"a"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
a:
printf("请输入这个学生的姓名:\t");
scanf("%s",p->name);
printf("请输入这个学生的学号:\t");
scanf("%s",p->id);
b:
printf("请输入这个学生的成绩:\t");
scanf("%s",p->mark);
for(i=0,j=0;p->mark[i];i++)
{
if(p->mark[i]=='.'){j++;m=i;}
else if(p->mark[i]<'0'||p->mark[i]>'9')
{
printf("\n您输入了非数字\n");
printf("1.重新输入\n2.退出输入\n");
scan_valid(enter,2);
if(enter[0]=='1')goto b;
else exit(0);
}
}
if(j>1)
{
printf("输入小数点过多\n");
printf("1.重新输入\n2.退出输入\n");
scan_valid(enter,2);
if(enter[0]=='1')goto b;
else exit(0);
}
else fmark=atof(p->mark);
if(fmark>100)
{
printf("\n输入的分数过大(成绩应在一百以内)\n");
printf("1.重新输入\n2.退出输入\n");
scan_valid(enter,2);
if(enter[0]=='1')goto b;
else exit(0);
}
else
for(;j;)
{
if(p->mark[m+2])
{ printf("您输入的分数小数点后位数较多,是否重新输入?\n");
printf("1.重新输入\n2.就是这个分数,没错!\n");
scan_valid(enter,2);
if(enter[0]=='1')goto b;
else break;
}
else break;
}
printf("学号: %s 姓名: %s 成绩:%s\n",p->id,p->name,p->mark);
printf("1.确认储存\n2.输入有错要重新输入\n");
scan_valid(enter,2);
if(enter[0]=='2')goto a;
fwrite(p,sizeof(STUT_INFO),1,pf);
printf("输入成功!\n学号:%s\t姓名:%s\t成绩:%s",p->id,p->name,p->mark);
printf("\n\n1.继续输入\n2.退出\n");
scan_valid(enter,2);
if(enter[0]=='1')goto a;
fclose(pf);
}
void find(STUT_INFO *p)
{
char id[MAX],name[MAX*3];
int TorF=1;
FILE *pf;
if((pf=fopen(FILENAME,"r"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
a:
printf("1.通过学号查找学生\n2.通过姓名查找学生\n");
scan_valid(enter,2);
if(enter[0]=='1')
{
TorF=1;
printf("请输入要查找的学生的学号:");
scanf("%s",id);
rewind(pf);
for(;!feof(pf);)
{
fread(p,sizeof(STUT_INFO),1,pf);
if(!strcmp(id,p->id))
{
TorF=0;
printf("名字:%s 学号:%s 分数:%s",p->name,p->id,p->mark);
break;
}
}
if(TorF)
{
printf("没有这个学号\n");
printf("1.退出\n2.重新输入");
scan_valid(enter,2);
if(enter[0]=='2')goto a;
}
}
if(enter[0]=='2')
{
TorF=1;
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
rewind(pf);
for(;!feof(pf);)
{
fread(p,sizeof(STUT_INFO),1,pf);
if(!strcmp(name,p->name))
{
TorF=0;
printf("名字:%s 学号:%s 分数:%s",p->name,p->id,p->mark);
break;
}
}
if(TorF)
{
printf("没有这个学生\n");
printf("1.退出\n2.重新输入");
scan_valid(enter,2);
if(enter[0]=='2')goto a;
}
}
printf("\n1.继续查找\n2.退出\n");
scan_valid(enter,2);
if(enter[0]=='1')goto a;
fclose(pf);
}
void modify(STUT_INFO *p)
{
char idname[3*MAX];
FILE *pf;
int TorF=1;
a:
printf("请输入要修改学生的姓名或学号(程序将自动识别)\n");
scanf("%s",idname);
if((pf=fopen(FILENAME,"r+"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
rewind(pf);
for(;!feof(pf);)
{
fread(p,sizeof(STUT_INFO),1,pf);
if(!strcmp(idname,p->name)||!strcmp(idname,p->id))
{
TorF=0;
printf("这个学生的信息为\n学号:%s 姓名:%s 成绩:%s\n",p->id,p->name,p->mark);
break;
}
}
if(TorF)
{
printf("没有这个学生,请重新输入\n");
printf("1.退出\n2.重新输入");
scan_valid(enter,2);
if(enter[0]=='2')goto a;
else exit(0);
}
printf("\n你想要修改....\n1.学号\n2.姓名\n3.成绩\n4.不用修改\n");
for(;;)
{
scan_valid(enter,4);
switch(enter[0])
{
case '1':printf("新学号为:");scanf("%s",p->id);break;
case '2':printf("新姓名为:");scanf("%s",p->name);break;
case '3':printf("新成绩为");scanf("%s",p->mark);break;
default:printf("\n1.修改另外一个学生的信息\n2.退出\n3.储存并退出");
scan_valid(enter,3);
if(enter[0]=='1')goto a;
else if(enter[0]=='3')
{
fseek(pf,-sizeof(STUT_INFO),1);
fwrite(p,sizeof(STUT_INFO),1,pf);
printf("已成功储存");
fclose(pf);
exit(0);
}
else exit(0);
}
printf("现在这个学生的信息为\n学号:%s 姓名:%s 成绩:%s\n",p->id,p->name,p->mark);
printf("继续修改....\n1.学号\n2.姓名\n3.成绩\n4.不用修改");
}
}
void deletes(STUT_INFO *p)
{
FILE *pf;
char idname[3*MAX];
STUT_INFO stu[NUM];
int TorF;
COUNT n,m;
a:
if((pf=fopen(FILENAME,"r"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
printf("请输入要删除的学生的姓名或学号(程序将自动识别)\n");
scanf("%s",idname);
rewind(pf);
for(TorF=1;!feof(pf);)
{
fread(p,sizeof(STUT_INFO),1,pf);
if(!strcmp(idname,p->name)||!strcmp(idname,p->id))
{
TorF=0;
printf("这个学生的信息为\n学号:%s 姓名:%s 成绩:%s\n",p->id,p->name,p->mark);
break;
}
}
if(TorF)
{
printf("没有这个学生,请重新输入\n");
printf("1.退出\n2.重新输入\n");
scan_valid(enter,2);
if(enter[0]=='2')goto a;
else exit(0);
}
printf("\n确认要删除吗?....\n1.删除\n2.不用删除,退出\n3.返回");
scan_valid(enter,3);
switch(enter[0])
{
case '1':rewind(pf);
for(n=0;!feof(pf);n++)
{
if((fread(&stu[n],sizeof(STUT_INFO),1,pf))!=1)break;
if(!strcmp(idname,stu[n].id)||!strcmp(idname,stu[n].name)){n--;continue;}
}
pf=fopen(FILENAME,"w");
for(m=0;m<n;m++)
{
if((fwrite(&stu[m],sizeof(STUT_INFO),1,pf))!=1)break;
}
printf("删除成功!\n1.继续删除\n2.退出");
fclose(pf);
scan_valid(enter,2);
if(enter[0]=='1')goto a;
break;
case '2':exit(0);
case '3':goto a;
}
}
void print()
{
STUT_INFO stu[NUM];
STUT_INFO *pstu[5][NUM],*temp;
FILE *pf;
float fmark[5][NUM],ftemp;
COUNT n[5],m,x,y;
int mark,i,j;
if((pf=fopen(FILENAME,"r"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for(m=n[0]=n[1]=n[2]=n[3]=n[4]=0;!feof(pf);m++)
{
fread(&stu[m],sizeof(STUT_INFO),1,pf);
mark=atoi(stu[m].mark)/10;
if(mark==10)mark=9;
j=mark-5;
if(j<1)
{
pstu[0][n[0]]=&stu[m];
fmark[0][n[0]]=atof(stu[m].mark);
n[0]++;
}
else
{
pstu[j][n[j]]=&stu[m];
fmark[j][n[j]]=atof(stu[m].mark);
n[j]++;
}
}
a:
printf("\n1.输出60分以下学生\n");
printf("2.输出60~69分数学生\n");
printf("3.输出70~79分数学生\n");
printf("4.输出80~89分数学生\n");
printf("5.输出90分以上学生\n");
printf("6.退出\n");
scan_valid(enter,6);
if(enter[0]=='6')exit(0);
m=atoi(enter);
m=m-1;
mark=atoi(enter)-1;
printf("学号\t\t姓名\t\t成绩\n");
for(i=0;pstu[mark][i+1];i++)
printf("%-16s%-16s%-16s\n",pstu[mark][i]->id,pstu[mark][i]->name,pstu[mark][i]->mark);
printf("1.按分数排列\n2.返回\n3.退出\n");
scan_valid(enter,3);
if(enter[0]=='2')goto a;
else if(enter[0]=='1')
{
for(y=0;y<i-1;y++)
for(x=0;x<i-y-1;x++)
if(fmark[m][x]<fmark[m][x+1])
{
temp=pstu[m][x];
pstu[m][x]=pstu[m][x+1];
pstu[m][x+1]=temp;
ftemp=fmark[m][x];
fmark[m][x]=fmark[m][x+1];
fmark[m][x+1]=ftemp;
}
for(j=0;pstu[m][j+1];j++)
printf("%-16s%-16s%-16s\t\n",pstu[m][j]->id,pstu[m][j]->name,pstu[m][j]->mark);
}
else exit(0);
}
void printall(STUT_INFO *p)
{
FILE *pf;
pf=fopen(FILENAME,"r");
printf("学号\t\t姓名\t\t成绩\n");
for(;!feof(pf);)
{
if((fread(p,sizeof(STUT_INFO),1,pf))!=1)break;
printf("%-16s%-16s%-16s\n",p->id,p->name,p->mark);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -