码迷,mamicode.com
首页 > 其他好文 > 详细

实验七 文件(实验终章)

时间:2020-12-30 11:10:04      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:const   proc   读取   打开   pen   window   png   student   ISE   

实验七 文件(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 <stdio.h>
#include <stdlib.h>

#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<N; 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<N; i++)
        printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
   
    
    return 0;
}

(运行结果截图)

哭了哭了,所谓的乱码,暂时我实在没有办法解决了,该想的办法我都想过。等我找到办法我回来补上。

 技术图片

技术图片

五、实验任务五

(补足后的完整程序源码)

#include <stdio.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);
    
    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<n; 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<n; 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<n; i++) {
            s[i].sum=s[i].objective+s[i].subjective;
        }
        for(j=0;j<n;j++){
            max=j;
            for (i=j; i<n; i++) {
                if (s[i].sum>s[max].sum) {
                    max=i;
                }
            }
            temp=s[j];
            s[j]=s[max];
            s[max]=temp;
        }
        for (i=0; i<n; 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.

实验七 文件(实验终章)

标签:const   proc   读取   打开   pen   window   png   student   ISE   

原文地址:https://www.cnblogs.com/victoria111/p/14187243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!