?? 2.cpp
字號(hào):
#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() //學(xué)生數(shù)據(jù)輸入時(shí)的保存函數(shù)
{
int sum;
printf("輸入數(shù)據(jù),對(duì)文件進(jìn)行初始化!\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() //查找函數(shù)
{
fp=fopen("stud","r");//1.將w改為了r,這里只是讀文件
int flag;
char chs[11];
printf("請(qǐng)輸入你要查找的學(xué)生的學(xué)號(hào)或者姓名: ");
scanf("%s",&chs);//2.將c改為了s,這里讀的是字符串而不是字符
for(i=0,flag=1;flag&&i<SIZE;i++)
{
if(strcmp(stu[i].num,chs)==0)
{
printf("你需要的學(xué)生數(shù)據(jù)已找到:\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;//如果找到了,就要停止查找,不然會(huì)增加查找的時(shí)間
}
else if(strcmp(stu[i].name,chs) == 0)//要加else,否則會(huì)出錯(cuò)的
{
printf("你需要的學(xué)生數(shù)據(jù)已找到:\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;//如果找到了,就要停止查找,不然會(huì)增加查找的時(shí)間
}
}
if(flag==1)
printf("沒(méi)有找到你所需要的數(shù)據(jù)!");
fclose(fp);
}
void paixu() //排序函數(shù)
{
fp=fopen("stud","r");//只讀文件
char chr;
printf("\n請(qǐng)選擇你要的排序方式,'x'以學(xué)號(hào)方式排序,'$'以平均分排序。\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)//如果前一個(gè)學(xué)生號(hào)比后一個(gè)學(xué)生號(hào)大,進(jìn)行交換
{
temp=stu[i];//temp一開(kāi)始就被定義為數(shù)組了,所以可以這樣進(jìn)行交換
stu[i]=stu[j];
stu[j]=temp;
}
}
else if(chr=='$')//else不能少,否則會(huì)出錯(cuò)
{
for(i=0;i<SIZE;i++)
for(j=i+1;j<SIZE;j++)
if(stu[i].ave<stu[j].ave)//如果是int或float,可以直接進(jìn)行比較大小
{
temp=stu[i];//temp一開(kāi)始就被定義為數(shù)組了,所以可以這樣進(jìn)行交換
stu[i]=stu[j];
stu[j]=temp;
}
}
printf("現(xiàn)在的排序如下:\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);//加“-”表示與左邊對(duì)齊,這樣便于看
}
fclose(fp);
}
void delet() //刪除操作
{
char chl[8];
int flag;
fp=fopen("stud","r");
printf("\n原始數(shù)據(jù):\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("輸入你要?jiǎng)h除的學(xué)生名字:");
scanf("%s",chl);//輸入字符串時(shí)不用加&
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];//將后面一個(gè)學(xué)生的數(shù)據(jù)覆蓋掉前一個(gè)學(xué)生的數(shù)據(jù)
flag=0;
}
}
if(flag==1) //當(dāng)輸入的學(xué)生不存在時(shí)的錯(cuò)誤提示
printf("此學(xué)生不存在,無(wú)法進(jìn)行刪除操作!");
fclose(fp);
printf("刪除后的數(shù)據(jù):\n");//顯示刪除后的學(xué)生數(shù)據(jù)
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()//插入函數(shù)
{
fp=fopen("stud","r");
int sum=0;//用于平均分計(jì)算
printf("\n輸入插入的學(xué)生的數(shù)據(jù):\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("原始數(shù)據(jù):\n");//寫(xiě)出原始數(shù)據(jù)
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);//將插入的學(xué)生的數(shù)據(jù)寫(xiě)入文件
fclose(fp);//關(guān)閉文件,同時(shí)保存插入學(xué)生的數(shù)據(jù)
for(i=0;i<IN;i++)//進(jìn)行排序操作
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("插入后的學(xué)生數(shù)據(jù)是:\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()//修改函數(shù)
{
char ch2[8],c;
char num[10],name[8];
int score;
int flag,n;
fp=fopen("stud","r");
printf("\n原始數(shù)據(jù):\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("請(qǐng)輸入你要修改的學(xué)生姓名:");
scanf("%s",ch2);
for(i=0,flag=1;flag&&i<SIZE;i++)
{if(strcmp(stu[i].name,ch2)==0)
{printf("1. 修改學(xué)號(hào)\n2. 修改姓名\n3. 修改成績(jī)\n");
c=getch();
switch(c)
{
case '1':
{printf("請(qǐng)輸入你所修改后的學(xué)生的學(xué)號(hào):");
scanf("%s",num);
strcpy(stu[i].num,num);
break;
}
case '2':
{printf("請(qǐng)輸入所修改后的學(xué)生姓名:");
scanf("%s",name);
strcpy(stu[i].name,name);//將后一個(gè)數(shù)據(jù)復(fù)制給前一個(gè)數(shù)據(jù)
break;
}
case '3':
{printf("請(qǐng)輸入你所要修改的是第幾門(mén)功課的成績(jī):1. 第一門(mén) 2. 第二門(mén) 3. 第三門(mén)\n");
n=getch();
switch(n)
{case '1'://修改第i個(gè)學(xué)生的第一門(mén)功課的成績(jī)
{
printf("請(qǐng)輸入你要修改的第一門(mén)功課的成績(jī):");
scanf("%d",&score);
stu[i].score[0]=score;
break;
}
case '2'://修改第i個(gè)學(xué)生的第二門(mén)功課的成績(jī)
{printf("請(qǐng)輸入你要修改的第二門(mén)功課的成績(jī):");
scanf("%d",&score);
stu[i].score[1]=score;
break;
}
case '3'://修改第i個(gè)學(xué)生的第三門(mén)功課的成績(jī)
{printf("請(qǐng)輸入你要修改的第三門(mén)功課的成績(jī):");
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;//將修改后的數(shù)據(jù)再求依次平均分
}
}
flag=0;
}
}
if(flag==1) //當(dāng)輸入的學(xué)生不存在時(shí)的錯(cuò)誤提示
printf("此學(xué)生不存在,無(wú)法進(jìn)行刪除操作!");
fclose(fp);
printf("修改后的學(xué)生數(shù)據(jù)是:\n");//顯示修改后的學(xué)生的數(shù)據(jù)
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()//主函數(shù)
{
char ch1,ch2;
save();//先進(jìn)行輸入工作
printf("\n要進(jìn)行其他操作,根據(jù)屏幕提示:\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("未進(jìn)行任何操作!");
}
printf("\n想要繼續(xù)操作請(qǐng)按“y”\n");//讓程序能夠重復(fù)執(zhí)行
ch2=getch();
if(ch2=='y') goto L;//注意要“==”,而不是“=”
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -