实验任务一、二
已自主验证。
实验任务三
stdout成功:(话说时间有点长)
二进制文件生成成功:
可见,dat文件内容正确可读。
实验任务四
子任务一
stdout成功:
打开二进制文件:
令人费解的不直观。
子任务二
程序源代码:
1 // 从文本数据文件file4.dat中读入数据,将结果输出到屏幕上 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 #define N 10 6 7 typedef struct student { 8 int num; 9 char name[20]; 10 int score; 11 }STU; 12 13 int main(){ 14 FILE *fin,*fout; 15 STU st[N]; 16 int i; 17 18 fin=fopen("file4.dat","rb"); 19 if(!fin){ 20 printf("Failed to open the file "); 21 exit(0); 22 } 23 24 fread(st,sizeof(STU),N,fin); 25 26 fclose(fin); 27 28 for(i=0; i<N; i++) 29 fprintf(stdout,"%-6d%-10s%3d ", st[i].num, st[i].name, st[i].score); 30 31 fclose(fout); 32 33 return 0; 34 }
运行结果:
实验任务五
程序源代码:
1 #include <stdio.h> 2 #include <string.h> 3 const int N = 10; 4 5 // 定义结构体类型struct student,并定义其别名为STU 6 typedef struct student { 7 long int id; 8 char name[20]; 9 float objective; /*客观题得分*/ 10 float subjective; /*操作题得分*/ 11 float sum; 12 char level[10]; 13 }STU; 14 15 // 函数声明 16 void input(STU s[], int n); 17 void output(STU s[], int n); 18 void process(STU s[], int n); 19 20 int main() { 21 STU stu[N]; 22 23 printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60) ", N); 24 input(stu, N); 25 26 printf(" 对考生信息进行处理: 计算总分,确定等级 "); 27 process(stu, N); 28 29 printf(" 打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级 "); 30 output(stu, N); 31 32 return 0; 33 } 34 35 // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分 36 void input(STU s[], int n) { 37 // 补足代码 38 // ××× 39 FILE *fin; 40 int i; 41 42 fin=fopen("examinee.txt","r"); 43 if(!fin){ 44 printf("failed to open! "); 45 return; 46 } 47 48 for(i=0;i<n;i++){ 49 fscanf(fin,"%d %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective); 50 } 51 52 fclose(fin); 53 } 54 55 // 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级 56 // 不仅输出到屏幕上,还写到文本文件result.txt中 57 void output(STU s[], int n) { 58 // 补足代码 59 // ××× 60 FILE *fout; 61 int i; 62 fout=fopen("result.txt","w+"); 63 for(i=0;i<n;i++) 64 fprintf(fout,"%-4ld %s %-4f %-4f %f %s ",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); 65 for(i=0;i<n;i++) 66 fprintf(stdout,"%-4ld %s %-4f %-4f %f %s ",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); 67 fclose(fout); 68 } 69 70 // 对考生信息进行处理:计算总分,排序,确定等级 71 void process(STU s[], int n) { 72 // 补足代码 73 // ××× 74 int i,t; 75 int k=0; 76 STU temp; 77 for(i=0;i<n;i++){ 78 s[i].sum=s[i].objective + s[i].subjective; 79 if(s[i].sum<60) 80 strcpy(s[i].level,"不及格"); 81 else if(s[i].sum>95) 82 strcpy(s[i].level,"优秀"); 83 else 84 strcpy(s[i].level,"及格"); 85 } 86 87 for(i=0;i<n;i++){ 88 for(t=i+1;t<n;t++){ 89 if(s[t].sum>s[i].sum){ 90 temp=s[i]; 91 s[i]=s[t]; 92 s[t]=temp; 93 } 94 } 95 } 96 }
运行结果:
result.txt
实验任务六
程序源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 80 5 6 //定义结构体; 7 typedef struct student { 8 int num; 9 long int id; 10 char name[20]; 11 char classes[20]; 12 }STU; 13 14 int main(){ 15 FILE *fin,*fout; 16 int i,lucky_num[5],z; 17 STU st[N]; 18 19 time_t t; 20 int n=5; 21 22 fin=fopen("list.txt","r"); 23 if(!fin){ 24 printf("failed to load list! "); 25 exit(0); 26 } 27 28 for(i=0;i<N;i++) 29 fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes); 30 31 fclose(fin); 32 33 fout=fopen("lucky.txt","w"); 34 35 srand((unsigned int)time(NULL)); 36 for( i = 0 ; i < n ; i++ ){ 37 lucky_num[i]=rand() % N; 38 if(lucky_num[i]==0){ 39 lucky_num[i]=1; 40 } 41 } 42 43 for(i=0;i<n;i++){ 44 z=lucky_num[i]; 45 fprintf(fout,"%d %ld %s %s ",st[z].num,st[z].id,st[z].name,st[z].classes); 46 printf("%d %ld %s %s ",st[z].num,st[z].id,st[z].name,st[z].classes); 47 } 48 49 50 fclose(fout); 51 return 0; 52 }
运行结果:
拓展题 Bonus task
重复多次抽取,且不抽出重复的学生,将点过的学生保存在txt文件中。
源程序代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 80 5 6 //定义结构体; 7 typedef struct student { 8 int num; 9 long int id; 10 char name[20]; 11 char classes[20]; 12 int flag; 13 }STU; 14 15 int main(){ 16 //定义变量 17 FILE *fin,*fout; //文件变量 18 int i,lucky_num[5],z,last_lucky_num[5],n=5,count_while; 19 STU st[N]; //工具变量 20 21 for(i=0;i<N;i++) 22 st[i].flag=0; //全体同学设置为未标记 23 time_t t; //随机数 24 25 26 27 28 fin=fopen("list.txt","r"); 29 if(!fin){ 30 printf("failed to load list! "); 31 exit(0); 32 } 33 34 for(i=0;i<N;i++) 35 fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes); 36 37 fout=fopen("lucky.txt","w"); 38 39 printf("Press enter key to select randomly:"); 40 while(getchar()!=EOF){ 41 for(i=0;i<N;i++) 42 fscanf(fin,"%d %ld %s %s",&st[i].num,&st[i].id,st[i].name,st[i].classes); 43 44 fout=fopen("lucky.txt","a+"); 45 46 47 srand((unsigned int)time(NULL)); 48 for(i=0;i<n;i++){ 49 lucky_num[i]=rand() % N; 50 if(lucky_num[i]==0){ 51 lucky_num[i]=1; 52 } 53 z=lucky_num[i]; 54 count_while=0; 55 while(st[z].flag==1){ //判断是否为已标记学生 56 lucky_num[i]=rand() % N; 57 if(lucky_num[i]==0){ 58 lucky_num[i]=1; 59 } 60 z=lucky_num[i]; 61 if(count_while++==80){ //循环结束的条件 62 printf(" Have no enough students to select! Program will break soon…… "); 63 return 0; 64 } 65 } 66 st[z].flag=1; 67 } 68 69 for(i=0;i<n;i++){ //输出 70 z=lucky_num[i]; 71 fprintf(fout,"%d %ld %s %s ",st[z].num,st[z].id,st[z].name,st[z].classes); 72 printf("%d %ld %s %s ",st[z].num,st[z].id,st[z].name,st[z].classes); 73 } 74 75 fclose(fout); 76 printf(" Press enter key to select randomly:"); 77 } 78 fclose(fin); 79 80 return 0; 81 }
运行结果:
实验结论
本章节函数较多,内容较新,需要熟练应用才能掌握。
私以为实验任务六是很重要的,不是选作不选作的问题。task1到5都是程序填空,没有自己完整地写一遍程序。
实验任务五中,我遇到了一个问题:
很清楚很明显就能发现,我把输出结果的数据类型搞错了。
但是当时我认为这并不影响,最多是强制转换。
但过了半个小时,反复调试、中途输出验证的几种debug方法我试了又试,输出结果始终是零。我便开始没办法只能让程序完美化了。
果不其然将int输出改成float就通了。
我的教训就是每一个代码都有他的合理性。
Thanks for reading.