实验7
实验任务3
正确输出了按分数由高→低排序的信息
生成了文本文件file3.dat
数据信息是正确的且直观可读
实验任务4
正确输出了按分数由高到底排序的学生信息
生成了二进制文件file4.dat
数据不是直观可读的
#include<stdio.h> #include<stdlib.h> #define N 10 typedef struct student { int num; char name[20]; int score; }STU; int main() { FILE *fp; STU st[N]; int j; fp=fopen("file4.dat","rb"); if(!fp) { printf("fail to open file4.dat\n"); exit(0); } fread(st, sizeof(STU), N, fp); //for(i=0; i<N; i++) //{ //错误写法 // fscanf(fp, "%d %s %d", &st[i].num, st[i].name, &st[i].score); //} fclose(fp); for(j=0;j<N;j++) { printf("%-6d %-10s %3d\n", st[j].num, st[j].name, st[j].score); } return 0; }
#include <stdio.h> #include <string.h> #include<stdlib.h> const int N = 10; // 定义结构体类型struct student,并定义其别名为STU 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; } // 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分 void input(STU s[], int n) { // 补足代码 // ××× FILE *fp; int i; fp=fopen("examinee.txt","r"); if(!fp) { printf("Fail to open examinee.txt"); exit(0); } //fread(s, sizeof(STU), N, fp); for(i=0; i<N; i++) { fscanf(fp, "%d %s %f %f", &s[i].id, s[i].name, &s[i].objective,&s[i].subjective); } fclose(fp); } // 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级 // 不仅输出到屏幕上,还写到文本文件result.txt中 void output(STU s[], int n) { // 补足代码 // ××× FILE *fp; fp=fopen("result.txt","w"); int j; for(j=0;j<N;j++) { printf("%-10d %-10s %10.2f %10.2f %10.2f %12s\n", s[j].id, s[j].name, s[j].objective,s[j].subjective,s[j].sum,s[j].level); } fwrite(s, sizeof(STU), N, fp); } // 对考生信息进行处理:计算总分,排序,确定等级 void process(STU s[], int n) { // 补足代码 // ××× int i,j,k,m,p,o; 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(m=0;m<N/10;m++) { strcpy(s[m].level,"优秀"); } for(p=N/10;p<N/2;p++) { strcpy(s[p].level,"及格"); } for(o=N/2;o<=N;o++) { strcpy(s[o].level,"不及格"); } }
实验总结
对于文件的应用及格式化输入/出等有了一定的了解
解开了我关于c语言输入方式的困惑(不局限于小黑框输入),可以整体导入数据。
踩的坑:
对于这两种写法的区别仍有困惑。使用注释掉的代码输出时会出现乱码