題目:
(1)有5個(gè)學(xué)生,每個(gè)學(xué)生有3門課程的成績,從鍵盤輸入以上數(shù)據(jù)(包括學(xué)號、姓名、3門課成績),計(jì)算出平均成績,將原有數(shù)據(jù)和計(jì)算出的平均分?jǐn)?shù)存放在磁盤文件stud中。
設(shè)5名學(xué)生的學(xué)號、姓名和3門課成績?nèi)缦拢?/p>
在向文件stud寫入數(shù)據(jù)后,應(yīng)檢查驗(yàn)證stud文件中的內(nèi)容是否正確。
編寫程序:
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Student{ //定義結(jié)構(gòu)體
char id[10]; //學(xué)號
char name[10]; //姓名
float score[3]; //3科成績
float ave; //平均分
}stu[N]; //定義結(jié)構(gòu)體數(shù)組
/*-----學(xué)生信息輸入函數(shù)------*/
void input(void){
int i,j;
for(i=0;i<N;i++){
printf("輸入第%d個(gè)學(xué)生信息:\n",i+1);
scanf("%s %s %f %f %f",&stu[i].id,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); //接收學(xué)生信息
stu[i].ave=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3; //計(jì)算每個(gè)學(xué)生平均分
}
}
/*-----學(xué)生信息寫入文件函數(shù)----*/
void wri(void){
FILE *fp; //定義文件指針
int i;
fp=fopen("stud","w"); //為了輸出數(shù)據(jù),打開一個(gè)文件,若么有該文件就新建一個(gè)
for(i=0;i<N;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){ //寫入數(shù)據(jù)信息
printf("\n寫入錯(cuò)誤!?。n");
exit(0);
}
fp=fopen("stud","r"); //打開剛才的文件
puts("----------------------------------------------");
puts("學(xué)號\t姓名\t成績1\t成績2\t成績3\t平均分"); //表頭樣式
puts("----------------------------------------------");
for(i=0;i<N;i++){
fread(&stu[i],sizeof(struct Student),1,fp); //每次讀取fp所指文件中的長度為sizeof所得字節(jié)數(shù)的數(shù)據(jù)項(xiàng)
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //輸出剛才寫入文件的信息
}
fclose(fp);
}
int main(){
input(); //調(diào)用學(xué)生信息輸入函數(shù)
wri(); //調(diào)用學(xué)生信息寫入文件函數(shù)
return 0;
}
?程序運(yùn)行結(jié)果:程序運(yùn)行生成了一個(gè)名為stud( ???????)的文件,并將輸入的
?信息寫入了這個(gè)文件。
(2)將上題stud文件中的學(xué)生數(shù)據(jù)按平均分進(jìn)行排序處理,將已排序的學(xué)生數(shù)據(jù)存入一個(gè)新文件stu_sort中。在向文件stu_sort寫入數(shù)據(jù)后,應(yīng)檢查驗(yàn)證stu_sort文件中的內(nèi)容是否正確。
?編寫程序:
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct Student{ //定義結(jié)構(gòu)體
char id[10]; //學(xué)號
char name[10]; //姓名
float score[3]; //3科成績
float ave; //平均分
}stu[N],temp; //定義結(jié)構(gòu)體數(shù)組,和一個(gè)結(jié)構(gòu)體變量
/*---對上次文件中的數(shù)據(jù)排序函數(shù)--*/
void stu_sort(){
FILE *fp; //定義文件指針
int i,j,count=0,max;
fp=fopen("stud","r"); //以度的方式打開剛才的文件
puts("原來的:");
puts("----------------------------------------------");
puts("學(xué)號\t姓名\t成績1\t成績2\t成績3\t平均分"); //表頭樣式
puts("----------------------------------------------");
for(i=0;i<N;i++){
fread(&stu[i],sizeof(struct Student),1,fp); //每次讀取fp所指文件中的長度為sizeof所得字節(jié)數(shù)的數(shù)據(jù)項(xiàng)
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //輸出所讀原來的內(nèi)容
}
//冒泡排序
for(j=0;j<N;j++)
for(i=0;i<N-j-1;i++)
if(stu[i].ave<stu[i+1].ave){
temp=stu[i+1];
stu[i+1]=stu[i];
stu[i]=temp;
}
fp=fopen("stu_sort","w"); //將排好序的結(jié)構(gòu)體數(shù)組寫入新的文件中
for(i=0;i<N;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){ //寫入數(shù)據(jù)信息
printf("\n寫入錯(cuò)誤?。?!\n");
exit(0);
}
fp=fopen("stu_sort","r"); //再次打開需要將信息排序的的文件
puts("\n現(xiàn)在的:");
puts("----------------------------------------------");
puts("學(xué)號\t姓名\t成績1\t成績2\t成績3\t平均分"); //表頭樣式
puts("----------------------------------------------");
for(i=0;i<N;i++){
fread(&stu[i],sizeof(struct Student),1,fp); //每次讀取fp所指文件中的長度為sizeof所得字節(jié)數(shù)的數(shù)據(jù)項(xiàng)
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //輸出排序好的數(shù)組
}
fclose(fp); //關(guān)閉文件
}
int main() {
stu_sort(); //調(diào)用文件內(nèi)容排序函數(shù)
return 0;
}
程序運(yùn)行結(jié)果:程序運(yùn)行生成了一個(gè)名為stu_sort( ??????????)的文件,并將輸入的信息寫入了這個(gè)文件。
? (3)將上題已排序的學(xué)生成績文件進(jìn)行插入處理。插入一個(gè)學(xué)生的3門課成績。程序先計(jì)算新插入學(xué)生的平均成績,然后將它按成績高低順序插入,插入后建立一個(gè)新文件。?在向新文件stu_new寫入數(shù)據(jù)后,應(yīng)檢查驗(yàn)證stu_new文件中的內(nèi)容是否正確
要插入的學(xué)生數(shù)據(jù)為:
?編寫程序:
#include<stdio.h>
#include<stdlib.h>
#define N 6 //原來的5人再加1人
struct Student{ //定義結(jié)構(gòu)體
char id[10]; //學(xué)號
char name[10]; //姓名
float score[3]; //3科成績
float ave; //平均分
}stu[N],temp; //定義結(jié)構(gòu)體數(shù)組,和一個(gè)結(jié)構(gòu)體變量
/*----插入排序隊(duì)列函數(shù)----*/
void stu_sort_new(struct Student stu0){
FILE *fp; //定義文件指針
int i,count;
fp=fopen("stu_sort","r"); //讀入剛才內(nèi)容排好序的文件
puts("原來的:");
puts("----------------------------------------------");
puts("學(xué)號\t姓名\t成績1\t成績2\t成績3\t平均分"); //表頭樣式
puts("----------------------------------------------");
for(i=0;i<N-1;i++){ //因?yàn)樵瓉碇挥形迦耍赃@次只讀入N-1=5人
fread(&stu[i],sizeof(struct Student),1,fp); //每次讀取fp所指文件中的長度為sizeof所得字節(jié)數(shù)的數(shù)據(jù)項(xiàng)
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //輸出所讀原來的內(nèi)容
}
//將原來文件中的個(gè)數(shù)據(jù)項(xiàng)的平均分和傳入的數(shù)據(jù)的平均分項(xiàng)對比,找出應(yīng)該插入位置
for(i=0;i<N-1;i++) //因?yàn)楝F(xiàn)在數(shù)組只有五個(gè)人的信息,所以不用檢查數(shù)組尾部了
if(stu0.ave>stu[i].ave){
count=i; //記錄插入位置
break;
}
for(i=N-1;i>=count;i--)
stu[i]=stu[i-1]; //將插入位置及其后的數(shù)據(jù)向后挪
stu[count]=stu0;
fp=fopen("stu_new","w"); //再次打開需要將信息排序的的文件
for(i=0;i<N;i++)
if(fwrite(&stu[i],sizeof(struct Student),1,fp)!=1){ //寫入數(shù)據(jù)信息
printf("\n寫入錯(cuò)誤?。?!\n");
exit(0);
}
fp=fopen("stu_new","r"); //再次打開需要將信息排序的的文件,檢查其中的內(nèi)容
puts("\n現(xiàn)在的:");
puts("----------------------------------------------");
puts("學(xué)號\t姓名\t成績1\t成績2\t成績3\t平均分"); //表頭樣式
puts("----------------------------------------------");
for(i=0;i<N;i++){
fread(&stu[i],sizeof(struct Student),1,fp); //每次讀取fp所指文件中的長度為sizeof所得字節(jié)數(shù)的數(shù)據(jù)項(xiàng)
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave); //輸出內(nèi)容重新排序好的文件內(nèi)容
}
fclose(fp); //關(guān)閉文件
}
int main(){
struct Student stu0; //定義需要結(jié)構(gòu)體變量
printf("輸入要插入的學(xué)生信息:\n");
scanf("%s %s %f %f %f",&stu0.id,&stu0.name,&stu0.score[0],&stu0.score[1],&stu0.score[2]);
stu0.ave=(stu0.score[0]+stu0.score[1]+stu0.score[2])/3; //計(jì)算平均分
stu_sort_new(stu0); //調(diào)用插入排序隊(duì)列函數(shù)
return 0;
}
程序運(yùn)行結(jié)果:程序運(yùn)行生成了一個(gè)名為stu_new(??)的文件,并將輸入的信息寫入了這個(gè)文件。文章來源:http://www.zghlxwxcb.cn/news/detail-441500.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-441500.html
到了這里,關(guān)于【C語言】#文件操作#有5個(gè)學(xué)生,每個(gè)學(xué)生有3門課程的成績,從鍵盤輸入以上數(shù)據(jù)(包括學(xué)號、姓名、3門課成績),計(jì)算出平均成績,將原有數(shù)據(jù)和計(jì)算出的平均分?jǐn)?shù)存放在磁盤文件stud中。的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!