我写这个所有的对文件数据的操作都是通过二进制实现的fread和fwrite,我感觉这个用起来特别的方便,但是他存储到文件中的数据有点乱感觉,但是不会影响到自己使用。
数据的存储
才用一个简单的结构体来对学生的数据进行存储
struct student{
char num[20],name[50],sex[50],sx[50],yy[50],cyy[50];
ll zf;
};
主函数
主要用来决定显示的界面是什么样的
int main()
{
// char aaa[100]="202111000318";
// printf("%d",zh1(aaa));
int i=1,option;
while(i!=0)
{
system("color 1e");//设置背景颜色颜色
printf("*************************************************\n");
printf(" 欢迎使用学生信息管理系统\n");
printf(" 1、增加数据 \n");
printf(" 2、显示数据 \n");
printf(" 3、查找数据 \n");
printf(" 4、删除数据 \n");
printf(" 5、修改数据 \n");
printf(" 6、学号排序 \n");
printf(" 7、数学成绩排序 \n");
printf(" 8、English排序 \n");
printf(" 9、c语言成绩排序 \n");
printf(" 10、总成绩排序 \n");
printf(" 0、退出系统 \n");
printf("*************************************************\n");
scanf("%d",&option);
// printf("%d",option);
while(option<0||option>10)
{
printf("选择不合法,请重新输入:");
scanf("%d",&option);
}
switch(option)
{
case 1:
add();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 2:
print();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 3:
search();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 4:
cut();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 5:
modify();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 6:
xsort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 7:
ssort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 8:
esort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 9:
csort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 10:
zsort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 0:
i=0;
break;
}
}
printf("您已经退出学生信息管理系统,欢迎再次使用\n");
return 0;
scanf("%d",&n);
store();//存储
add();
return 0;
}
一些比较关键的自定义函数
因为除了总分之外所有的数据都是直接定义的char类型因此需要一些吧字符串转换成数字的函数
ll zh(char s[])
{
ll n=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
n=n*10+s[i]-'0';
}
return n;
}
ll zh1(char s[])
{
ll n=0;
int len=strlen(s);
for(int i=len-4;i<len;i++)
{
n=n*10+s[i]-'0';
}
return n;
}
我通过c自带的qsort完成排序功能所以需要一些函数
int cmp1(const void *a,const void *b)
{
ll n=zh1((*(struct student*)a).num);
ll m=zh1((*(struct student*)b).num);
return n-m;
}
int cmp2(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).sx);
ll m=zh((*(struct student*)b).sx);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp3(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).yy);
ll m=zh((*(struct student*)b).yy);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp4(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).cyy);
ll m=zh((*(struct student*)b).cyy);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp5(const void *a,const void *b)
{
ll n=(*(struct student*)a).zf;
ll m=(*(struct student*)b).zf;
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
我们c语言老师说计算机有输入是垃圾输出是垃圾的特性,所以写了一些函数来吧使用者输入的垃圾不合法的数据来排除掉
其中学号是12位的,成绩都是0-100分的
bool check(char s[])//判断成绩是否合法
{
int len=strlen(s);
if(len>3)return false;
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
int n=0;
for(int i=0;i<len;i++)
{
n=n*10+s[i]-'0';
}
if(n<0||n>100)return false;
return true;
}
bool check1(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
return true;
}
bool check2(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
// printf("%d check\n",s[i]);
// printf("%d,if\n",s[i]<48||s[i]>57);
if(s[i]<48||s[i]>54)
return false;
}
return true;
}
bool check3(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
return true;
}
增加数据
void add()//添加学生信息
{
system("cls");//清屏
struct student s[500];
FILE *fp;
printf("*************************************************\n");
printf("请输入一个正整数n代表要添加的数据个数输入0代表停止添加:\n");
printf("*************************************************\n");
int n;
char z[100];
scanf("%s",z);
while(!check1(z))
{
printf("您输入的数字不合法请重新输入:");
scanf("%s",z);
}
n=zh(z);
if(n==0)return ;
for(int i=0;i<n;i++)
{
char ss[100];
printf("添加的第%d位同学的学号(12位数字):",i+1);
scanf("%s",ss);
int len=strlen(ss);
while(len!=12)
{
printf("添加的第%d为同学的学号(12位数字):",i+1);
scanf("%s",ss);
len=strlen(ss);
}
strcpy(s[i].num,ss);
printf("添加的第%d位同学的姓名:",i+1);
scanf("%s",s[i].name);
printf("添加的第%d位同学的性别(男或女):",i+1);
scanf("%s",s[i].sex);
while(strcmp(s[i].sex,"男")!=0&&strcmp(s[i].sex,"女")!=0)
{
printf("添加的第%d位同学的性别(男或女):",i+1);
scanf("%s",s[i].sex);
}
printf("添加的第%d位同学的数学成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的数学成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].sx,ss);
printf("添加的第%d位同学的英语成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的英语成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].yy,ss);
printf("添加的第%d位同学的c语言成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的c语言成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].cyy,ss);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
open(xxx,ab);//这里的xxx是写完生成的文件名称
for(int i=0;i<n;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
显示数据
用来吧所有已经存储的数据全部显示出来就是一个遍历的过程
void print()//打印全部学生信息
{
system("cls");//清屏
struct student s[500];
FILE *fp;
open(xxx,rb);//xxx是文件名
int n=0;
for(int i=0;!feof(fp);i++)
{
// cout<<i<<' '<<n<<' '<<"i,n"<<endl;
++n;
fread(&s[i],sizeof(struct student),1,fp);
// char ch[500];
// fgets(ch,100,fp);
}
printf("*************************************************\n");
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<n-1;i++)
{
printf("第%3.3d的同学信息为:",i+1);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
// char ch[10];fgets(ch,10,fp);
// printf("%s",ch);
}
printf("*************************************************\n");
fclose(fp);
}
删除数据
void cut()//删除某学生信息
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
int a;
printf("请输入一个正整数代表要删除学生的个数0代表结束:");
char z[100];
scanf("%s",z);
while(!check3(z))
{
printf("请输入一个合法的数字:");
scanf("%s",z);
}
a=zh(z);
for(int x=1;x<=a;x++)
{
printf("请输入第%d个要删除学生的姓名:",x);
char ss[100];
scanf("%s",ss);
int f=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
if(strcmp(s[i].name,ss)==0)f=1;
}
fclose(fp);
rewind(fp);
if(f)
{
FILE *fp;
open(xxx,wb);
for(int i=0;i<cnt-2;i++)
{
if(strcmp(s[i].name,ss)==0)
continue;
// printf("%s %s %s %s %s %s\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy);
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
else printf("未能找到姓名为%s的学生信息\n",ss);
}
}
修改数据
void modify()//修改部分信息
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
printf("*************************************************\n");
printf("1、修改学号 \n");
printf("2、修改姓名 \n");
printf("3、修改性别 \n");
printf("4、修改数学成绩 \n");
printf("5、修改英语成绩 \n");
printf("5、修改c语言成绩 \n");
printf("*************************************************\n");
// printf("1代表修改学号,2代表修改姓名,3代表修改性别,4代表修改数学成绩,5代表修改英语成绩,6代表修改c语言成绩,输入0代表停止修改");
printf("请输入一个0-6的数字:");
int n,cnt=0;
char z[100];
scanf("%s",z);
while(!check2(z))
{
printf("您刚刚输入的数字不合法请重新选择\n");
printf("*************************************************\n");
printf("1、修改学号 \n");
printf("2、修改姓名 \n");
printf("3、修改性别 \n");
printf("4、修改数学成绩 \n");
printf("5、修改英语成绩 \n");
printf("5、修改c语言成绩 \n");
printf("*************************************************\n");
printf("请输入一个0-6的数字:");
scanf("%s",z);
}
n=zh(z);
if(n!=0)
{
open(xxx,rb);
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
char ss[100];
int f=0;
if(n==1)//修改学号
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的学号(12位)");
char l[20];
scanf("%s",l);
int len=strlen(l);
while(len!=12)
{
printf("请输入一个合法的学号: ");
scanf("%s",l);
len=strlen(l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].num,l);
}
}
if(!f)
printf("未找到姓名为%s的学生的信息\n",ss);
}
else if(n==2)//修改姓名
{
printf("请输入要修改学生的学号(12位):");
scanf("%s",ss);
int len=strlen(ss);
while(len!=12)
{
printf("请输入一个合法学号:");
scanf("%s",ss);
len=strlen(ss);
}
printf("请输入修改后的姓名");
char l[20];
scanf("%s",l);
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].num)==0)
{
f=1;
strcpy(s[i].name,l);
}
}
if(!f)
printf("未找的学号为%s的学生的信息\n",ss);
}
else if(n==3)//修改性别
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的性别");
char l[20];
scanf("%s",l);
while(strcmp(l,"男")!=0&&strcmp(l,"女")!=0)
{
printf("请输入一个合法性别:");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].sex,l);
}
}
printf("未找到姓名为%s的学生的信息\n",ss);
}
else if(n==4)//修改数学成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的数学成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].sx,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
else if(n==5)//修改英语成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的英语成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].yy,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
else if(n==6)//修改c语言成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的c语言成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].cyy,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
open(xxx,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
}
按照学号排序
void xsort()//学号排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp1);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
// printf("学号为%s的同学的信息为:学号 姓名 性别 数学 英语 c语言\n",ss);
printf("按学号升序排列第%2.2d位同学的信息为:",i+1);
printf("%s %-10s %s %-2s %-2s %-2s %lld \n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(学号排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件学号排序\n");
}
按照数学成绩排序
void ssort()//数学成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp2);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按数学成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld \n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(数学成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件数学成绩排序\n");
}
按照英语成绩排序
void esort()//英语成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp3);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按英语成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(英语成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件England排序\n");
}
c语言成绩排序
void csort()//c语言成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(2103,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp4);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按c语言成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(c语言成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件c语言成绩排序\n");
}
总成绩排序
void zsort()//总成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(2103,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp5);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按总成绩降序第%2.2d位同学的信息为:",i);
printf(" %s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(总成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件总成绩排序\n");
}
源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ll long long
#define open(f,au) if((fp=fopen(#f,#au))==NULL)\
perror("file can't open"),exit(0)
int cnt=0;
struct student{
char num[20],name[50],sex[50],sx[50],yy[50],cyy[50];
ll zf;
};
ll zh(char s[])
{
ll n=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
n=n*10+s[i]-'0';
}
return n;
}
ll zh1(char s[])
{
ll n=0;
int len=strlen(s);
for(int i=len-4;i<len;i++)
{
n=n*10+s[i]-'0';
}
return n;
}
int cmp1(const void *a,const void *b)
{
ll n=zh1((*(struct student*)a).num);
ll m=zh1((*(struct student*)b).num);
return n-m;
}
int cmp2(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).sx);
ll m=zh((*(struct student*)b).sx);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp3(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).yy);
ll m=zh((*(struct student*)b).yy);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp4(const void *a,const void *b)
{
ll n=zh((*(struct student*)a).cyy);
ll m=zh((*(struct student*)b).cyy);
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
int cmp5(const void *a,const void *b)
{
ll n=(*(struct student*)a).zf;
ll m=(*(struct student*)b).zf;
return m-n;
// return zh(*(struct student*)a).num<zh(*(struct student*)b).num;
}
bool check(char s[])//判断成绩是否合法
{
int len=strlen(s);
if(len>3)return false;
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
int n=0;
for(int i=0;i<len;i++)
{
n=n*10+s[i]-'0';
}
if(n<0||n>100)return false;
return true;
}
bool check1(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
return true;
}
bool check2(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
// printf("%d check\n",s[i]);
// printf("%d,if\n",s[i]<48||s[i]>57);
if(s[i]<48||s[i]>54)
return false;
}
return true;
}
bool check3(char s[])//判断是否为数字
{
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]<48||s[i]>57)
return false;
}
return true;
}
void store()//存储函数
{
struct student s[500];
FILE *fp;
open(xxx,wb);
int n;
printf("请输入一个正整数n:");
scanf("%d",&n);
while(n<=0)
{
printf("请输入一个正整数n:");
scanf("%d",&n);
}
for(int i=0;i<n;i++)
{
// printf("i=%d\n",i);
scanf("%s %s %s %s %s %s",&s[i].num,&s[i].name,&s[i].sex,&s[i].sx,&s[i].yy,&s[i].cyy);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
for(int i=0;i<n;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
// fputs("\n",fp);
}
fclose(fp);
}
void add()//添加学生信息
{
system("cls");//清屏
struct student s[500];
FILE *fp;
// open(xxx,ab);
printf("*************************************************\n");
printf("请输入一个正整数n代表要添加的数据个数输入0代表停止添加:\n");
printf("*************************************************\n");
int n;
char z[100];
scanf("%s",z);
// printf("%d 111\n",check1(z));
while(!check1(z))
{
// printf("*************************************************\n");
printf("您输入的数字不合法请重新输入:");
// printf("*************************************************\n");
scanf("%s",z);
}
n=zh(z);
if(n==0)return ;
for(int i=0;i<n;i++)
{
char ss[100];
printf("添加的第%d位同学的学号(12位数字):",i+1);
scanf("%s",ss);
int len=strlen(ss);
while(len!=12)
{
printf("添加的第%d为同学的学号(12位数字):",i+1);
scanf("%s",ss);
len=strlen(ss);
}
strcpy(s[i].num,ss);
printf("添加的第%d位同学的姓名:",i+1);
scanf("%s",s[i].name);
printf("添加的第%d位同学的性别(男或女):",i+1);
scanf("%s",s[i].sex);
while(strcmp(s[i].sex,"男")!=0&&strcmp(s[i].sex,"女")!=0)
{
printf("添加的第%d位同学的性别(男或女):",i+1);
scanf("%s",s[i].sex);
}
printf("添加的第%d位同学的数学成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的数学成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].sx,ss);
printf("添加的第%d位同学的英语成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的英语成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].yy,ss);
printf("添加的第%d位同学的c语言成绩(0-100):",i+1);
scanf("%s",ss);
while(!check(ss))
{
printf("您输入的c语言成绩不合法请重新输入:");
scanf("%s",ss);
}
strcpy(s[i].cyy,ss);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
open(xxx,ab);
for(int i=0;i<n;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
void print()//打印全部学生信息
{
system("cls");//清屏
struct student s[500];
FILE *fp;
open(xxx,rb);
int n=0;
for(int i=0;!feof(fp);i++)
{
// cout<<i<<' '<<n<<' '<<"i,n"<<endl;
++n;
fread(&s[i],sizeof(struct student),1,fp);
// char ch[500];
// fgets(ch,100,fp);
}
printf("*************************************************\n");
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<n-1;i++)
{
printf("第%3.3d的同学信息为:",i+1);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
// char ch[10];fgets(ch,10,fp);
// printf("%s",ch);
}
printf("*************************************************\n");
fclose(fp);
}
void search()//查找学生信息
{
system("cls");//清屏
student s[500];
FILE *fp;
int n;
printf("*************************************************\n");
printf("1、按学号查找 \n");
printf("2、按姓名查找 \n");
printf("0、查找结束 \n");
// printf("1代表按学号查找,2代表按姓名查找,6代表查找结束\n");
printf("*************************************************\n");
printf("请输入一个正整数n:");
char z[100];
scanf("%s",z);
// printf("n=%d\n",n);
while(!check1(z))
{
printf("您刚刚输入的数字不合法请输入一个正整数n:");
scanf("%s",z);
//cout<<123<<endl;
}
n=zh(z);
if(n==0)return ;
open(xxx,rb);
if(n!=0)
{
int cnt=0;
char ss[100];
if(n==1)//学号查找
{
printf("请输入一个12位的学号:");
scanf("%s",ss);
int len=strlen(ss);
while(len!=12)
{
printf("请输入一个12位的学号:");
scanf("%s",ss);
len=strlen(ss);
}
}
if(n==2)//姓名查找
{
printf("请输入一个姓名:");
scanf("%s",&ss);
}
// if(n==3)
// {
// printf("请输入0-100的数学成绩:");
// scanf("%s",ss);
// int len=strlen(ss);
// while(ss<"0"||ss>)
// }
for(int i=0;!feof(fp);i++)//遍历读入数据
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
int f=0;
// cout<<123<<endl;
for(int i=0;i<cnt-1;i++)//遍历查找数据
{
if(n==1)
{
if(strcmp(s[i].num,ss)==0)
{
f=1;
printf("学号为%s的同学的信息为:学号 姓名 性别 数学 英语 c语言\n",ss);
// printf(" 学号 姓名 性别 数学 英语 c语言\n");
printf(" %s %-10s %s %-2s %-2s %-2s\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy);
// printf("%s %-10s %s %-2s %-2s %-2s \n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy);
}
}
if(n==2)
{
if(strcmp(s[i].name,ss)==0)
{
printf("姓名为%s的同学的信息为:学号 姓名 性别 数学 英语 c语言 总分\n",ss);
// printf(" 学号 姓名 性别 数学 英语 c语言\n");
printf(" %s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
f=1;
}
}
}
if(!f)
{
printf("未能查询到这个学生信息\n");
}
}
fclose(fp) ;
}
void modify()//修改部分信息
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
printf("*************************************************\n");
printf("1、修改学号 \n");
printf("2、修改姓名 \n");
printf("3、修改性别 \n");
printf("4、修改数学成绩 \n");
printf("5、修改英语成绩 \n");
printf("5、修改c语言成绩 \n");
printf("*************************************************\n");
// printf("1代表修改学号,2代表修改姓名,3代表修改性别,4代表修改数学成绩,5代表修改英语成绩,6代表修改c语言成绩,输入0代表停止修改");
printf("请输入一个0-6的数字:");
int n,cnt=0;
char z[100];
scanf("%s",z);
while(!check2(z))
{
printf("您刚刚输入的数字不合法请重新选择\n");
printf("*************************************************\n");
printf("1、修改学号 \n");
printf("2、修改姓名 \n");
printf("3、修改性别 \n");
printf("4、修改数学成绩 \n");
printf("5、修改英语成绩 \n");
printf("5、修改c语言成绩 \n");
printf("*************************************************\n");
printf("请输入一个0-6的数字:");
scanf("%s",z);
}
n=zh(z);
if(n!=0)
{
open(xxx,rb);
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
char ss[100];
int f=0;
if(n==1)//修改学号
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的学号(12位)");
char l[20];
scanf("%s",l);
int len=strlen(l);
while(len!=12)
{
printf("请输入一个合法的学号: ");
scanf("%s",l);
len=strlen(l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].num,l);
}
}
if(!f)
printf("未找到姓名为%s的学生的信息\n",ss);
}
else if(n==2)//修改姓名
{
printf("请输入要修改学生的学号(12位):");
scanf("%s",ss);
int len=strlen(ss);
while(len!=12)
{
printf("请输入一个合法学号:");
scanf("%s",ss);
len=strlen(ss);
}
printf("请输入修改后的姓名");
char l[20];
scanf("%s",l);
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].num)==0)
{
f=1;
strcpy(s[i].name,l);
}
}
if(!f)
printf("未找的学号为%s的学生的信息\n",ss);
}
else if(n==3)//修改性别
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的性别");
char l[20];
scanf("%s",l);
while(strcmp(l,"男")!=0&&strcmp(l,"女")!=0)
{
printf("请输入一个合法性别:");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].sex,l);
}
}
printf("未找到姓名为%s的学生的信息\n",ss);
}
else if(n==4)//修改数学成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的数学成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].sx,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
else if(n==5)//修改英语成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的英语成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].yy,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
else if(n==6)//修改c语言成绩
{
printf("请输入要修改学生的姓名:");
scanf("%s",ss);
printf("请输入修改后的c语言成绩(0-100)");
char l[20];
scanf("%s",l);
while(!check(l))
{
printf("请输入一个合法的成绩: ");
scanf("%s",l);
}
int f=0;
for(int i=0;i<cnt-1;i++)
{
if(strcmp(ss,s[i].name)==0)
{
f=1;
strcpy(s[i].cyy,l);
s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
}
if(!f)
printf("未能找到姓名为%s学生的信息\n",ss);
// s[i].zf=zh(s[i].sx)+zh(s[i].yy)+zh(s[i].cyy);
}
open(xxx,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
}
void cut()//删除某学生信息
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
int a;
printf("请输入一个正整数代表要删除学生的个数0代表结束:");
char z[100];
scanf("%s",z);
while(!check3(z))
{
printf("请输入一个合法的数字:");
scanf("%s",z);
}
a=zh(z);
for(int x=1;x<=a;x++)
{
printf("请输入第%d个要删除学生的姓名:",x);
char ss[100];
scanf("%s",ss);
int f=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
if(strcmp(s[i].name,ss)==0)f=1;
}
fclose(fp);
rewind(fp);
if(f)
{
FILE *fp;
open(xxx,wb);
for(int i=0;i<cnt-2;i++)
{
if(strcmp(s[i].name,ss)==0)
continue;
// printf("%s %s %s %s %s %s\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy);
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
}
else printf("未能找到姓名为%s的学生信息\n",ss);
}
}
void xsort()//学号排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp1);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
// printf("学号为%s的同学的信息为:学号 姓名 性别 数学 英语 c语言\n",ss);
printf("按学号升序排列第%2.2d位同学的信息为:",i+1);
printf("%s %-10s %s %-2s %-2s %-2s %lld \n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(学号排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件学号排序\n");
}
void ssort()//数学成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp2);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按数学成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld \n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(数学成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件数学成绩排序\n");
}
void esort()//英语成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp3);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按英语成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(英语成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件England排序\n");
}
void csort()//c语言成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp4);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按c语言成绩降序第%2.2d位同学的信息为:",i);
printf("%s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(c语言成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件c语言成绩排序\n");
}
void zsort()//总成绩排序
{
system("cls");//清屏
struct student s[1000];
FILE *fp;
open(xxx,rb);
int cnt=0;
for(int i=0;!feof(fp);i++)
{
++cnt;
fread(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
rewind(fp);
qsort(s,cnt-1,sizeof(struct student),cmp5);
printf(" 学号 姓名 性别 数学 英语 c语言 总分\n");
for(int i=0;i<cnt-1;i++)
{
printf("按总成绩降序第%2.2d位同学的信息为:",i);
printf(" %s %-10s %s %-2s %-2s %-2s %lld\n",s[i].num,s[i].name,s[i].sex,s[i].sx,s[i].yy,s[i].cyy,s[i].zf);
}
open(总成绩排序,wb);
for(int i=0;i<cnt-1;i++)
{
fwrite(&s[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("已生成新的文件总成绩排序\n");
}
int main()
{
// char aaa[100]="202111000318";
// printf("%d",zh1(aaa));
int i=1,option;
while(i!=0)
{
system("color 1e");//设置背景颜色颜色
printf("*************************************************\n");
printf(" 欢迎使用学生信息管理系统\n");
printf(" 1、增加数据 \n");
printf(" 2、显示数据 \n");
printf(" 3、查找数据 \n");
printf(" 4、删除数据 \n");
printf(" 5、修改数据 \n");
printf(" 6、学号排序 \n");
printf(" 7、数学成绩排序 \n");
printf(" 8、English排序 \n");
printf(" 9、c语言成绩排序 \n");
printf(" 10、总成绩排序 \n");
printf(" 0、退出系统 \n");
printf("*************************************************\n");
scanf("%d",&option);
// printf("%d",option);
while(option<0||option>10)
{
printf("选择不合法,请重新输入:");
scanf("%d",&option);
}
switch(option)
{
case 1:
add();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 2:
print();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 3:
search();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 4:
cut();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 5:
modify();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 6:
xsort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 7:
ssort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 8:
esort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 9:
csort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 10:
zsort();
printf("继续操作请输入 1,退出系统请输入 0\n");
scanf("%d",&i);
system("cls");//清屏
break;
case 0:
i=0;
break;
}
}
printf("您已经退出学生信息管理系统,欢迎再次使用\n");
return 0;
scanf("%d",&n);
store();//存储
add();
return 0;
}
总结
这是我写的第一次c语言大作业,写的挺水的,没用啥动态链表啥的直接用普通的数组写了,为了偷懒直接用qsort进行排序。
写了大概刚好一个星期吧,也算是又一次感觉到了学编程的快乐感。