深圳大学-电信院-C程序设计实验-文件程序设计

实验目的

一、 进一步掌握C语言的编程方法;
二、 进一步掌握数组的定义与使用;
三、 进一步掌握函数的定义和函数调用方法;
四、 学习和掌握结构体的定义和使用方法;
五、 学习和掌握文件的基本输入输出方法;

实验内容

编写一个通过键盘或文件输入学生信息,并将学生信息输出到文件和屏幕的程序。本次实验需要定义7个函数,其中,5个函数与实验十四一致(可直接使用实验十三编写的函数,或参考“优秀案例”中的相关程序),另外需要新编2个函数。程序的具体要求如下:

  1. 定义一个 student 结构体如下:

struct student {
char name[20]; /姓名/
float score[4]; /四门功课的成绩/
float average; /四门功课的平均成绩/
};

其中,name 中存放学生的姓名;score[4]数组中存放学生的英语、数学、物理、化学成绩;average中存放上述四门功课的平均成绩。

  1. 编写下面7个函数(前5个为实验十四中的函数,后2个为新编函数)。函数的具体要求:

void inputFromKeyboard(struct student stu[], int num)

从键盘输入学生信息的函数。stu 为结构体数组,num 为数组中元素的个数。

void outputToScreen(struct student stu[], int num)

将学生信息(姓名、各科成绩和平均成绩)输出到屏幕的函数。stu 为结构体数组,num 为数组中元素的个数(或学生人数)。

void averageScore(struct student stu[], int num)

计算学生平均成绩的函数。stu 为结构体数组,num 为数组中元素的个数。

int compare(struct student stu1, struct student stu2)

对两个学生的平均成绩进行比较。若学生1的平均成绩高于学生2,返回值为1,否则返回值为0。stu1 和stu2为两个结构体变量,分别代表学生1和学生2。

void sortByAverageScore(struct student stu[], int num)

根据学生的平均成绩对学生信息整体排序的函数,其中两学生成绩比较要求调用函数compare。stu 为结构体数组,num 为数组中元素的个数。

void inputFromFile(struct student stu[], int num, FILE *fp)

从文件输入学生信息(姓名、各科成绩和平均成绩)的函数。stu 为结构体数组,num 为数组中元素的个数,fp 为文件指针。(注:文件的打开和关闭放在主函数中,fp为以“读”方式打开的文本文件指针)。

void outputToFile(struct student stu[], int num, FILE *fp)

将学生信息(姓名、各科成绩和平均成绩)输出到文件的函数。stu 为结构体数组,num 为数组中元素的个数,fp 为文件指针。(注:文件的打开和关闭放在主函数中,fp为以“写”方式打开的文本文件指针)。

3)编写主函数对你所编写的上述7个函数进行调用验证。主函数应有以下功能(注意:文件的打开与关闭放在主函数中):

①利用结构体类型struct student定义结构体数组student_info[5]和结构体数组student_info1[5]; 同时用FILE定义文件指针fp;

②调用函数inputFromKeyboard由键盘输入学生的信息( 姓名、英语、数学、物理、化学成绩 )。5名学生信息可能如下:
孙颖莎 88.0 76.0 78.0 77.0
王曼昱 98.0 67.0 79.0 65.0
王艺迪 89.0 79.0 85.0 79.0
陈梦 90.0 95.0 97.0 85.0
钱天一 86.0 83.0 82.0 75.0
注:函数inputFromKeyboard输入参数为student_info和5

③调用函数averageScore求出每位学生的平均成绩;
注:函数averageScore输入参数为student_info和5;

④并以文本“写”方式打开文本student1.txt文件,调用函数outputToFile,将这5个同学的信息存入student1.txt 文本文件,关闭该文件;
注:函数outputToFile输入参数为student_info、5和已打开的文件指针fp。

⑤以文本“读”方式打开文本 student1.txt 文件,调用函数inputFromFile,将这5个同学的信息读入并存放到结构体数组student_info1中,关闭该文件;
注:函数inputFromFile输入参数为student_info1、5和已打开的文件指针fp。

⑥调用函数outputToScreen 将输入的学生信息(姓名、各科成绩和平均成绩)显示到屏幕上。
注:函数outputToScreen输入参数为student_info1和5;

⑦调用函数sortByAverageScore 根据学生的平均成绩对学生信息进行排序。
注:函数sortByAverageScore输入参数为student_info1和5;

⑧以文本“写”方式打开文本student2.txt文件,调用函数outputToFile,将排好后的学生信息存入student2.txt 文本文件,关闭该文件;
注:函数outputToFile输入参数为student_info1、5和已打开的文件指针fp。

⑨调用函数outputToScreen将排好后的学生信息显示到屏幕上。
注:函数outputToScreen输入参数为student_info1和5;

在程序执行后,使用windows的“记事本”文本编辑器打开文本文件student1.txt 和student2.txt查看是否正确。

实验代码

#include <stdio.h>
#include <stdlib.h>

struct student {
    char name[20];
    float score[4];
    float average;
};

void inputFromKeyboard(struct student stu[], int num) {
    int i;
    for (i = 0; i < num; i++) {
        scanf("%s %f %f %f %f", stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
    }
}

void outputToScreen(struct student stu[], int num) {
    int i;
    printf("姓名\t英语\t数学\t物理\t化学\t平均成绩\n");
    for (i = 0; i < num; i++) {
        printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].average);
    }
    printf("\n");
}


void averageScore(struct student stu[], int num) {
    int i;
    for (i = 0; i < num; i++) {
        stu[i].average = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2] + stu[i].score[3]) / 4;
    }
}

int compare(struct student stu1, struct student stu2) {
    return stu1.average > stu2.average;
}

void sortByAverageScore(struct student stu[], int num) {
    struct student temp;
    int i, j;
    for (i = 0; i < num - 1; i++) {
        for (j = 0; j < num - 1 - i; j++) {
            if (!compare(stu[j], stu[j + 1])) {
                temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
}

void inputFromFile(struct student stu[], int num, FILE* fp) {
    int i;
    for (i = 0; i < num; i++) {
        fscanf(fp, "%s %f %f %f %f %f", stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3], &stu[i].average);
    }
}

void outputToFile(struct student stu[], int num, FILE* fp) {
    int i;
    for (i = 0; i < num; i++) {
        fprintf(fp, "%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].average);
    }
}

int main() {
    struct student student_info[5], student_info1[5];
    FILE* fp;

    inputFromKeyboard(student_info, 5);
    averageScore(student_info, 5);

    fp = fopen("student1.txt", "w");
    outputToFile(student_info, 5, fp);
    fclose(fp);

    fp = fopen("student1.txt", "r");
    inputFromFile(student_info1, 5, fp);
    fclose(fp);

    outputToScreen(student_info1, 5);

    sortByAverageScore(student_info1, 5);

    fp = fopen("student2.txt", "w");
    outputToFile(student_info1, 5, fp);
    fclose(fp);

    outputToScreen(student_info1, 5);

    return 0;
}

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值