part1
实验验证 2
运行正确
验证实验 3
- #include <stdio.h>
- #include <stdlib.h>
- #define N 10
- // 定义一个结构体类型 STU
- 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;
- // 以只读文本方式打开文件 file1.dat
- fin = fopen("d:\\ 文件 \\file1.dat", "r");
- if( !fin ) { // 如果打开失败, 则输出错误提示信息, 然后退出程序
- printf("fail to open file1.dat\n");
- exit(0);
- }
- // 从 fin 指向的数据文件 file1.dat 中读取数据到结构体数组 st
- for(i=0; i<N; i++)
- fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);
- fclose(fin); // 关闭 fin 指向的文件 file1.dat
- // 调用函数 sort() 对数组 st 中数据, 按分数又高到低排序
- sort(st, N);
- // 以写方式打开 / 创建文本文件 file3.dat
- fout = fopen("d:\\ 文件 \\file3.dat", "w");
- if( !fout ) { // 如果打开失败, 则输出错误提示信息, 然后退出程序
- printf("fail to open file1.dat\n");
- exit(0);
- }
- // 将排序后的数组 st 中数据输出到屏幕, 同时, 也写入文件 file3.dat
- for(i=0; i<N; i++) {
- printf("%-6d%-10s=\n", st[i].num, st[i].name, st[i].score);
- fprintf(fout, "%-6d%-10s=\n", st[i].num, st[i].name, st[i].score);
- }
- fclose(fout); // 关闭 fout 指向的文件 file3.dat
- system("pause");
- return 0;
- }
- // 函数功能描述: 对 pst 指向的 n 个 STU 结构体数据进行排序, 按成绩数据项由高到底排序
- // 排序算法: 冒泡法
- 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;
- }
- }
- // 说明: 冒泡排序算法是确定的, 但其具体实现方式和细节却是灵活多样的
- // 本例中, 冒泡排序算法的函数体中, 都是通过指针变量操作的.
- // 而在前面章节的实例中, 冒泡排序的函数体, 有些是通过数组实现的, 有些是指针和数组的混合
- // 请结合代码体会和理解, 做到理解算法本质, 才能应对和理解灵活多样的实现形式
实验验证 4
- // 从文本数据文件 file1.dat 中读入数据, 按成绩从高到低排序, 并将排序结果输出到屏幕上, 同时, 也以二进制方式存入文件 file4.dat 中.
- #include <stdio.h>
- #include <stdlib.h>
- #define N 10
- // 定义一个结构体类型 STU
- 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;
- // 以只读文本方式打开文件 file1.dat
- fin = fopen("d:\\ 文件 \\file1.dat", "r");
- if( !fin ) { // 如果打开失败, 则输出错误提示信息, 然后退出程序
- printf("fail to open file1.dat\n");
- exit(0);
- }
- // 从 fin 指向的数据文件 file1.dat 中读取数据到结构体数组 st
- for(i=0; i<N; i++)
- fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);
- fclose(fin); // 关闭 fin 指向的文件 file1.dat
- // 调用函数 sort() 对数组 st 中数据, 按分数由高到低排序
- sort(st, N);
- // 以写方式打开 / 创建二进制文件 file4.dat
- fout = fopen("d:\\ 文件 \\file4.dat", "wb");
- if( !fout ) { // 如果打开失败, 则输出错误提示信息, 然后退出程序
- printf("fail to open file1.dat\n");
- exit(0);
- }
- // 将排序后的数组 st 中数据输出到屏幕
- for(i=0; i<N; i++)
- printf("%-6d%-10s=\n", st[i].num, st[i].name, st[i].score);
- // 将排序后的数组 st 中数据写到二进制文件 file4.dat
- fwrite(st, sizeof(STU), N, fout); // 将从地址 st 开始的 sizeof(STU)*N 个字节信息写入 fout 指向的文件 file4.dat 中
- fclose(fout); // 关闭 fout 指向的文件 file4.dat
- system("pause");
- return 0;
- }
- // 函数功能描述: 对 pst 指向的 n 个 STU 结构体数据进行排序, 按成绩数据项由高到底排序
- // 排序算法: 冒泡法
- 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;
- }
- }
- // 说明: 冒泡排序算法是确定的, 但其具体实现方式和细节却是灵活多样的
- // 本例中, 冒泡排序算法的函数体中, 都是通过指针变量操作的.
- // 而在前面章节的实例中, 冒泡排序的函数体, 有些是通过数组实现的, 有些是指针和数组的混合
- // 请结合代码体会和理解, 做到理解算法本质, 才能应对和理解灵活多样的实现形式
二进制文件与文本文件的区别:
- part2
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.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);
- system("pause");
- return 0;
- }
- // 从文本文件 examinee.txt 读入考生信息: 准考证号, 姓名, 客观题得分, 操作题得分
- void input(STU s[], int n) {
- int i;
- FILE *fp;
- if((fp=fopen("d:\\ 文件 \\examinee.txt","r"))==NULL)
- {printf("cannot find file\n");
- exit(0);
- }
- for(i=0;i<N;i++)
- {
- fscanf(fp,"%ld %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*fout;
- if((fout=fopen("d:\\ 文件 \\result.txt","w"))==NULL)
- {printf("cannot find file\n");
- exit(0);
- }
- int i;
- printf("\n 准考证号 \ t 姓名 \ t 客观题得分 \ t 操作题得分 \ t 总分 \ t 等级 \ n");
- for(i=0;i<N;i++)
- {
- printf("\n%ld\t\t %s\t %.2f\t\t %.2f\t\t %.2f\t %s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
- fprintf(fout,"\n%ld\t\t %s\t %.2f\t\t %.2f\t\t %.2f\t %s\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;
- STU p;
- for(i=0;i<N;i++)
- {
- s[i].sum=s[i].subjective+s[i].objective;
- }
- for(i=0;i<N;i++)
- for(j=0;j<N-i-1;j++)
- if(s[j].sum<s[j+1].sum)
- {
- p=s[j];
- s[j]=s[j+1];
- s[j+1]=p;
- }
- for(i=0;i<N;i++)
- {
- if(i<n/10)
- strcpy(s[i].level,"优秀");
- else if(i>=4*n/10)
- strcpy(s[i].level,"不及格");
- else
- strcpy(s[i].level,"及格");
- }
- }
来源: http://www.bubuko.com/infodetail-3359974.html