第七次实验的总结与体会
这周进行了最后一次实验,是有关文件打开/关闭与文件读写操作的实验,总的来说实验操作起来还行,我之前基础不太好,如果有些的不对的地方请指出来,我会改正的,下面是实验内容。
Part1:验证性实验
#include <stdio.h> #include <stdlib.h> int main() { FILE *fin, *fout; int ch; fin = fopen("file1.txt", "r"); if (fin == NULL) { printf("fail to open file1.txt\n"); exit(0); } fout = fopen("file2.txt", "w"); if (fout == NULL) { printf("fail to open or create file2.txt\n"); exit(0); } while( !feof(fin) ) { ch = fgetc(fin); if(ch >= 'a' && ch <= 'z') ch -= 32; fputc(ch, fout); } fclose(fin); fclose(fout); return 0; }


#include <stdio.h> #include <stdlib.h> #define N 10 typedef struct student { int num; char name[20]; int score; }STU; int main() { STU st, stmax, stmin; int i; FILE *fp; fp = fopen("file1.dat", "r"); if( !fp ) { printf("fail to open file1.dat\n"); exit(0); } stmax.score = 0; stmin.score = 100; for(i=0; i<N; i++) { fscanf(fp, "%d %s %d", &st.num, st.name, &st.score); if(st.score > stmax.score) stmax = st; else if(st.score < stmin.score) stmin = st; } fclose(fp); printf("最高分学生信息: %5d%15s%5d\n", stmax.num, stmax.name, stmax.score); printf("最低分学生信息: %5d%15s%5d\n", stmin.num, stmin.name, stmin.score); return 0; }

尝试对line29做修改:

修改后的输出和未修改的一样。
验证性实验3:从文件fle1.dat中读入数据,按成绩从高到低排序,将排序结果输出到屏幕上,同时也以文本方式存入文件file3.dat中。
#include <stdio.h> #include <stdlib.h> #define N 10 typedef struct student { int num; char name[20]; int score; }STU; void sort(STU *pst, int n); int main() { FILE *fin, *fout; STU st[N]; int i; fin = fopen("file1.dat", "r"); if( !fin ) { printf("fail to open file1.dat\n"); exit(0); } for(i=0; i<N; i++) fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score); fclose(fin); sort(st, N); fout = fopen("file3.dat", "w"); if( !fout ) { printf("fail to open file1.dat\n"); exit(0); } for(i=0; i<N; i++) { printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score); fprintf(fout, "%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score); } fclose(fout); return 0; } void sort(STU *pst, int n) { STU *pi, *pj, t; for(pi = pst; pi < pst+n-1; pi++) for(pj = pi+1; pj < pst+n; pj++) if(pi->score < pj->score) { t = *pi; *pi = *pj; *pj = t; } }

运行程序,能正确输出按分数高到低排序的信息,在当前路径下,生成了file3.dat,里面的信息全部正确,可直观可读。
验证性实验4:从文件fle1.dat中读入数据,按成绩从高到低排序,将排序结果输出到屏幕上,同时也以二进制方式存入文件file4.dat中。
#include <stdio.h> #include <stdlib.h> #define N 10 typedef struct student { int num; char name[20]; int score; }STU; void sort(STU *pst, int n); int main() { FILE *fin, *fout; STU st[N]; int i; fin = fopen("file1.dat", "r"); if( !fin ) { printf("fail to open file1.dat\n"); exit(0); } for(i=0; i<N; i++) fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score); fclose(fin); sort(st, N); fout = fopen("file4.dat", "wb"); if( !fout ) { printf("fail to open file1.dat\n"); exit(0); } for(i=0; i<N; i++) printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score); fwrite(st, sizeof(STU), N, fout); fclose(fout); return 0; } void sort(STU *pst, int n) { STU *pi, *pj, t; for(pi = pst; pi < pst+n-1; pi++) for(pj = pi+1; pj < pst+n; pj++) if(pi->score < pj->score) { t = *pi; *pi = *pj; *pj = t; } }

运行后,屏幕上正确输出了按分数高到低排序的信息,虽然生成了file4.dat文件,但数据不可读。
Part2:编程练习
1. 改写「实验6」中的「编程练习2」,使得成绩信息从文本文件examinee.txt读入,计算后的结果不仅在屏幕上显示,也写入文本文件result.txt中。
#include <stdio.h> #include <string.h> #include <stdlib.h> const int N = 10; typedef struct student { long int id; char name[20]; float objective; float subjective; float sum; char level[10]; }STU; void input(STU s[], int n); void output(STU s[], int n); void process(STU s[], int n); int main() { STU stu[N]; printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N); input(stu, N); printf("\n对考生信息进行处理: 计算总分,确定等级\n"); process(stu, N); printf("\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\n"); output(stu, N); return 0; } void input(STU s[], int n) { FILE *fin; fin=fopen("examinee.txt","r"); if(!fin) { printf("Failed to open file\n"); exit(0); } int i; for(i=0;i<n;i++) { if(fscanf(fin,"%ld %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective)==0) printf("读取错误!"); } fclose(fin); } void output(STU s[], int n) { int i; FILE *fout; fout=fopen("result.txt","w"); printf("准考证号 姓名 客观题得分 操作题得分 总分 等级\n"); fprintf(fout,"准考证号 姓名 客观题得分 操作题得分 总分 等级\n"); for(i=0;i<n;i++) { printf(" %-9ld%-10s%-13.2f%-10.2f%-7.2f%-8s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); fprintf(fout," %-9ld %-10s%-13.2f%-10.2f%-7.2f%-8s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level); } fclose(fout); } void process(STU s[], int n) { int i,j,k; int a1,a2; a1=(int)(N*0.1),a2=(int)(N*0.5); STU temp; for(i=0;i<n;i++) s[i].sum=s[i].objective+s[i].subjective; for(j=0;j<n-1;j++) { for(k=0;k<n-j-1;k++) { if(s[k].sum<s[k+1].sum) { temp=s[k]; s[k]=s[k+1]; s[k+1]=temp; } } } for(i=0;i<a1;i++) strcpy(s[i].level,"优秀"); for(i=a1;i<a2;i++) strcpy(s[i].level,"合格"); for(i=a2;i<n;i++) strcpy(s[i].level,"不合格"); }



Part3:拓展综合应用
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define N 80 int main() { FILE *fin,*fout; int i,j,num[5]; char str[N][64]; time_t t; char strtime[60]={0}; struct tm *info; t=time(0); info=localtime(&t); strftime(strtime,60,"%Y-%m-%d.txt",info); fin=fopen("list.txt","r"); if(!fin) { printf("fail to open list.txt"); exit(0); } for(i=0;i<N;i++) { fgets(str[i],64,fin); srand(time(0)); num[0]=(rand()%N); } for(i=1;i<5;i++) { num[i]=rand()%N; for(j=0;j<i;j++) { if(num[i]==num[j]) { num[i]=(rand()%N); j = 0; } } } fout = fopen(strtime, "w"); if(!fout) { printf("fail to open %s",strtime); exit(0); } for(i=0; i<5; i++) { printf("%s\n",str[num[i]]); fprintf(fout,"%s\n",str[num[i]]); } fclose(fin); fclose(fout); return 0; }

这一部分自主练习刚开始怎么写都是错的,本来想放弃的,但还是想把它写出来,就从网上找了相应的部分,看了一会儿,看懂了一些,花了很长时间写出来,还是要多练。
总结与体会:
这次实验总体来说还不错,但还是会把一些程序写错,我容易把一些词写错,少写或多写。感觉程序是对的,但还是出错,这还是因为不熟练。虽然这是最后一次实验,但平时我还要多练,多写程序,巩固自己的基础。期末快到了,希望我们所有人都过,加油!
互评:
https://www.cnblogs.com/Xoy31415926/p/11083729.html
https://www.cnblogs.com/zxy-345/p/11081994.html
https://www.cnblogs.com/hsc6/p/11080530.html
浙公网安备 33010602011771号