📄 2.cpp
字号:
#include<stdio.h>
#include<string.h>
#include <conio.h>
#include<stdlib.h>
#define DIS 4
#define SIZE 5
#define IN 6
int i,j;
FILE *fp;
struct student
{
char num[10];
char name[8];
int score[3];
double ave;
}stu[IN],temp;
void save() //学生数据输入时的保存函数
{
int sum;
printf("输入数据,对文件进行初始化!\n");
for(i=0;i<SIZE;i++)
{
printf("\nInput date of student %d:\n",i+1);
printf("NO.: ");
scanf("%s",stu[i].num);
printf("name: ");
scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++)
{
printf("score %d: ",j+1);
scanf("%d",&stu[i].score[j]);
sum+=stu[i].score[j];
}
stu[i].ave=sum/3.0;
}
fp=fopen("stud","w");
for(i=0;i<SIZE;i++)
if (fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
printf("\nFile write error!\n");
fclose(fp);
printf("\nThe date of students is flowing:\n");
printf("NO. name score[1] score[2] score[3] ave\n");
fp=fopen("stud","r");
for(i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
}
void search() //查找函数
{
fp=fopen("stud","r");//1.将w改为了r,这里只是读文件
int flag;
char chs[11];
printf("请输入你要查找的学生的学号或者姓名: ");
scanf("%s",&chs);//2.将c改为了s,这里读的是字符串而不是字符
for(i=0,flag=1;flag&&i<SIZE;i++)
{
if(strcmp(stu[i].num,chs)==0)
{
printf("你需要的学生数据已找到:\n");//增加了\n,为了美观
printf("NO. name score[1] score[2] score[3] ave\n");
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
flag=0;
break;//如果找到了,就要停止查找,不然会增加查找的时间
}
else if(strcmp(stu[i].name,chs) == 0)//要加else,否则会出错的
{
printf("你需要的学生数据已找到:\n");
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
flag=0;
break;//如果找到了,就要停止查找,不然会增加查找的时间
}
}
if(flag==1)
printf("没有找到你所需要的数据!");
fclose(fp);
}
void paixu() //排序函数
{
fp=fopen("stud","r");//只读文件
char chr;
printf("\n请选择你要的排序方式,'x'以学号方式排序,'$'以平均分排序。\n");
chr=getch();//不用chr=getchar();???
if(chr=='x')//不能用chr='x'
{
for(i=0;i<SIZE;i++)
for(j=i+1;j<SIZE;j++)
if(strcmp(stu[i].num,stu[j].num)>0)//如果前一个学生号比后一个学生号大,进行交换
{
temp=stu[i];//temp一开始就被定义为数组了,所以可以这样进行交换
stu[i]=stu[j];
stu[j]=temp;
}
}
else if(chr=='$')//else不能少,否则会出错
{
for(i=0;i<SIZE;i++)
for(j=i+1;j<SIZE;j++)
if(stu[i].ave<stu[j].ave)//如果是int或float,可以直接进行比较大小
{
temp=stu[i];//temp一开始就被定义为数组了,所以可以这样进行交换
stu[i]=stu[j];
stu[j]=temp;
}
}
printf("现在的排序如下:\n");
for(i=0;i<SIZE;i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);//加“-”表示与左边对齐,这样便于看
}
fclose(fp);
}
void delet() //删除操作
{
char chl[8];
int flag;
fp=fopen("stud","r");
printf("\n原始数据:\n");
for(i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
printf("输入你要删除的学生名字:");
scanf("%s",chl);//输入字符串时不用加&
for(i=0,flag=1;flag&&i<SIZE;i++)
{
if(strcmp(stu[i].name,chl)==0)
{
for(j=i;j<DIS;j++)
stu[j]=stu[j+1];//将后面一个学生的数据覆盖掉前一个学生的数据
flag=0;
}
}
if(flag==1) //当输入的学生不存在时的错误提示
printf("此学生不存在,无法进行删除操作!");
fclose(fp);
printf("删除后的数据:\n");//显示删除后的学生数据
fp=fopen("stud","r");
for(i=0;i<DIS;i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
}
void insert()//插入函数
{
fp=fopen("stud","r");
int sum=0;//用于平均分计算
printf("\n输入插入的学生的数据:\n ");
printf("NO.: ");
scanf("%s",stu[SIZE].num);
printf("name: ");
scanf("%s",stu[SIZE].name);
for(j=0;j<3;j++)
{
printf("score %d: ",j+1);
scanf("%d",&stu[SIZE].score[j]);
sum+=stu[SIZE].score[j];
}
stu[SIZE].ave=sum/3.0;
printf("原始数据:\n");//写出原始数据
for(i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fwrite(&stu[SIZE],sizeof(struct student),1,fp);//将插入的学生的数据写入文件
fclose(fp);//关闭文件,同时保存插入学生的数据
for(i=0;i<IN;i++)//进行排序操作
for(j=i+1;j<IN;j++)
if(stu[i].ave<stu[j].ave)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
printf("插入后的学生数据是:\n");
fp=fopen("stud","r");
for(i=0;i<IN;i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
}
void alter()//修改函数
{
char ch2[8],c;
char num[10],name[8];
int score;
int flag,n;
fp=fopen("stud","r");
printf("\n原始数据:\n");
for(i=0;i<SIZE;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
printf("请输入你要修改的学生姓名:");
scanf("%s",ch2);
for(i=0,flag=1;flag&&i<SIZE;i++)
{if(strcmp(stu[i].name,ch2)==0)
{printf("1. 修改学号\n2. 修改姓名\n3. 修改成绩\n");
c=getch();
switch(c)
{
case '1':
{printf("请输入你所修改后的学生的学号:");
scanf("%s",num);
strcpy(stu[i].num,num);
break;
}
case '2':
{printf("请输入所修改后的学生姓名:");
scanf("%s",name);
strcpy(stu[i].name,name);//将后一个数据复制给前一个数据
break;
}
case '3':
{printf("请输入你所要修改的是第几门功课的成绩:1. 第一门 2. 第二门 3. 第三门\n");
n=getch();
switch(n)
{case '1'://修改第i个学生的第一门功课的成绩
{
printf("请输入你要修改的第一门功课的成绩:");
scanf("%d",&score);
stu[i].score[0]=score;
break;
}
case '2'://修改第i个学生的第二门功课的成绩
{printf("请输入你要修改的第二门功课的成绩:");
scanf("%d",&score);
stu[i].score[1]=score;
break;
}
case '3'://修改第i个学生的第三门功课的成绩
{printf("请输入你要修改的第三门功课的成绩:");
scanf("%d",&score);
stu[i].score[2]=score;
break;
}
default:
printf("你的输入有误!\n");
}
stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;//将修改后的数据再求依次平均分
}
}
flag=0;
}
}
if(flag==1) //当输入的学生不存在时的错误提示
printf("此学生不存在,无法进行删除操作!");
fclose(fp);
printf("修改后的学生数据是:\n");//显示修改后的学生的数据
fp=fopen("stud","r");
for(i=0;i<SIZE;i++)
{
fwrite(&stu[i],sizeof(struct student),1,fp);
printf("%-8s%-8s%-12d%-14d%-12d%-12.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
}
fclose(fp);
}
void main()//主函数
{
char ch1,ch2;
save();//先进行输入工作
printf("\n要进行其他操作,根据屏幕提示:\n");
L: printf(" 1. 查找\n");
printf(" 2. 排序\n");
printf(" 3. 删除\n");
printf(" 4. 插入\n");
printf(" 5. 修改\n");
printf(" 6. 退出\n");
ch1=getch();
switch(ch1)
{
case '1':
search();
break;
case '2':
paixu();
break;
case '3':
delet();
break;
case '4':
insert();
break;
case '5':
alter();
break;
case '6':
exit(0);
default:
printf("未进行任何操作!");
}
printf("\n想要继续操作请按“y”\n");//让程序能够重复执行
ch2=getch();
if(ch2=='y') goto L;//注意要“==”,而不是“=”
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -