实验七 文件(Last one)
p.s最后一个实验居然是最坎坷的一个实验,怎么说呢,用的MacOS,一直在担心文件操作不能做,刚做的时候不断报错,上网查了半天,打开了路径开关,变成fail to find。心如死灰,选择到机房在Windows系统下做实验,结果结果,不知道是不习惯系统还是操作的问题,还是不行。好吧好吧,在问了一个互联网行业的哥哥之后,选择了绝对路径来打开文件。终于成功读写。但是(关键性的转折),文件读是正常的,文件写总是乱码,最后还是在老师面前调试,解决了问题。实验报告虽迟但到。
p.p.s.终于终于,是最后一个实验了。怎么说呢,其实现在心里有点空空的。开始学习c语言之前听说不简单,给自己打了鸡血说要好好学习。看过很多数模竞赛的经验帖,都说事实上学会了一门语言之后,剩下的只是类比。我一直不相信在一个学期的学习之后就能完全掌握一门语言,但是,我总是希望自己能够学一点框架,至少学会一点计算机语言。无论会不会考试,至少会用这门语言写一点小东西。所以,七篇实验,还有很多心血来潮想到的小程序,每一个都在好好对待。所以现在在敲下实验终章的时候,有点感慨,不用再在周四恐慌这周的实验还没有打开,不用再被实验运行结果不对而抓破脑袋,我所期待了一个学期的实验终章,真正到来的时候却是有点不舍。今天是圣诞节,那就许愿今天能写完实验,期末考试能合自己心意。好了,啰哩啰嗦一大堆,实验终章,开机。
一.实验任务一
(验证性实验略)
二、实验任务二
(验证性实验略)
三、实验任务三
基于运行观察,回答问题:
1.运行程序,观察在屏幕上是否正确输出了按分数从高到低的排序信息?同时,在当前路径下,是否生成了文本文件file3.dat?
正确输出了按分数从高到低的排序信息。在当前路径下生成了文本文件file.dat;
2.尝试用记事本程序打开文件file3.dat观察里面的数据信息是否是正确的,并且是直观可读的?
是不正确的(数据正确,但是不知道是不是macOS的问题,名字乱码)和不直观可读的,名字乱码。
四、实验任务四
1.task1
回答子任务1中的问题:
运行程序,观察屏幕上是否正确输出了按分数由高到低排序的学生信息?同时,在当前路径下,是否生成了二进制文件file4.dat?尝试用记事本程序打开文件file.dat,观察里面的数据信息是否直观可读?
正确输出了分数由高到低的学生信息,同时在当前路径下,生成了二进制文件file4.dat。不直观可读,名字是乱码。
2.task2
(程序源代码)
// main.c
// task4.2
//
// Created by zky on 2020/12/24.
// 从文本数据文件file1.dat中读入数据,按成绩从高到低排序,并将排序结果输出到屏幕上,同时,也以二进制的方式存入文件file4.dat中
#include
#include
#define N 10
// 定义一个结构体类型STU
typedef struct student {
int num;
char name[20];
int score;
}STU;
int main() {
FILE *fin;
STU st[N];
int i;
// 以只读文本方式打开文件file4.dat
fin = fopen("/Users/zky/Desktop/C/实验七/task4/file4.dat", "r");
if( !fin ) { // 如果打开失败,则输出错误提示信息然后退出程序
printf("fail to open file4.dat\n");
exit(0);
}
//从fin指向的数据文件file1.dat中读取数据到结构体数组st
for(i=0; i)
fscanf(fin, "%d %s %d", &st[i].num, st[i].name, &st[i].score);
fclose(fin); // 关闭fin指向的文件file4.dat
// 将排序后的数组st中数据输出到屏幕
for(i=0; i)
printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
return 0;
}
(运行结果截图)
哭了哭了,所谓的乱码,暂时我实在没有办法解决了,该想的办法我都想过。等我找到办法我回来补上。
五、实验任务五
(补足后的完整程序源码)
#include
#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);
return 0;
}
// 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
void input(STU s[], int n) {
FILE *fin;
int i;
fin=fopen("/Users/zky/Desktop/C/实验七/task5/examinee.txt", "r");
if (!fin) {
printf("fail to open examinee.txt\n");
}
for (i=0; i) {
fscanf(fin, "%ld %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective);
}
fclose(fin);
}
// 输出考生完整信息:准考证号,姓名,客观题得分,操作题得分,总分,等级
// 不仅输出到屏幕上,还写到文本上result.txt中
void output(STU s[], int n) {
FILE *fout;
int i;
fout=fopen("/Users/zky/Desktop/C/实验七/task5/result.txt", "w");
if (!fout) {
printf("fail to open result.txt\n");
}
for (i=0; i) {
printf("%-6ld%-10s%3.2f%3.2f%3.2f%10s\n",s[i].id,s[i].name,s[i].objective,s[i].subjective,s[i].sum,s[i].level);
}
fwrite(s, sizeof(STU), n, fout);
}
//对考生信息进行处理:计算总分,排序,确定等级
void process(STU s[], int n) {
int i,j;
int max=0;
char level1[20]="优秀";
char level2[20]="合格";
char level3[20]="不合格";
STU temp;
for (i=0; i) {
s[i].sum=s[i].objective+s[i].subjective;
}
for(j=0;j){
max=j;
for (i=j; i) {
if (s[i].sum>s[max].sum) {
max=i;
}
}
temp=s[j];
s[j]=s[max];
s[max]=temp;
}
for (i=0; i) {
if (i+1<=0.1*n) {
strcpy(s[i].level, level1);
}else if (i+1<=0.5*n){
strcpy(s[i].level, level2);
}else{
strcpy(s[i].level, level3);
}
}
}
(运行结果截图)
六、实验总结
1.本次实验中踩的坑
天呐,这不就是我在开头写的?重复一下,重复我的悲伤:最后一个实验居然是最坎坷的一个实验,怎么说呢,用的MacOS,一直在担心文件操作不能做,刚做的时候不断报错,上网查了半天,打开了路径开关,变成fail to find。心如死灰,选择到机房在Windows系统下做实验,结果结果,不知道是不习惯系统还是操作的问题,还是不行。好吧好吧,在问了一个互联网行业的哥哥之后,选择了绝对路径来打开文件。终于成功读写。但是(关键性的转折),文件读是正常的,文件写总是乱码,最后还是在老师面前调试,解决了问题。实验报告虽迟但到。
2.理解和思考
思考了选做实验,尝试了一下没有结果,因为时间的关系期末考前没有很多时间去抠它,但是,寒假的时候我会把它写出来的。I promise.
实验七 文件(实验终章)