学生成绩管理系统(涉及文件创建与修改)

对一个班级学生成绩的管理,使学生了解文件的主要操作。详细的目标如下:

  1. 通过实验中文件的创建、复制和删除等操作完成对文件管理。
  2. 了解文件、文件目录的结构。
  3. 掌握文件的读写、文件指针移动基本操作,并了解文件控制的作用。

编写一个学生成绩管理系统程序,该程序具有创建文件、输入班级成绩、保存文件、复制文件等文件功能,以及查询成绩、修改成绩、显示所有的学生成绩等对学生成绩进行管理的功能。

【代码如下】

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

typedef struct student {
    char name[20];
    int id;
    float score;
} Student;

// 创建文件
void create_file(char *filename) {
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
        printf("无法创建文件!\n");
        exit(1);
    }
    fclose(fp);
    printf("文件创建成功!\n");
}

// 输入班级成绩
void input_score(char *filename) {
    FILE *fp = fopen(filename, "a");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    Student student;
    printf("请输入学生信息 (name/id/score):\n");
    scanf("%s %d %f", student.name, &student.id, &student.score);
    fprintf(fp, "%s %d %.2f\n", student.name, student.id, student.score);
    fclose(fp);
    printf("输入学生成绩成功!\n");
}

// 保存文件
void save_file(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    char new_filename[30];
    printf("请输入新文件名: ");
    scanf("%s", new_filename);
    FILE *new_fp = fopen(new_filename, "w");
    if (new_fp == NULL) {
        printf("无法创建文件!\n");
        exit(1);
    }
    char buffer[50];
    while (fgets(buffer, 50, fp) != NULL) {
        fputs(buffer, new_fp);
    }
    fclose(fp);
    fclose(new_fp);
    printf("文件保存成功!\n");
}

// 复制文件
void copy_file(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    char new_filename[30];
    printf("请输入新文件名: ");
    scanf("%s", new_filename);
    FILE *new_fp = fopen(new_filename, "w");
    if (new_fp == NULL) {
        printf("无法创建文件!\n");
        exit(1);
    }
    char buffer[50];
    while (fgets(buffer, 50, fp) != NULL) {
        fputs(buffer, new_fp);
    }
    fclose(fp);
    fclose(new_fp);
    printf("文件复制成功!\n");
}
// 查询成绩
void query_score(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    int id;
    printf("请输入学生id: ");
    scanf("%d", &id);
    char buffer[50];
    int found = 0;
    while (fgets(buffer, 50, fp) != NULL) {
        Student student;
        sscanf(buffer, "%s %d %f", student.name, &student.id, &student.score);
        if (id == student.id) {
            printf("Name: %s, ID: %d, Score: %.2f\n", student.name, student.id, student.score);
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("未找到该学生!\n");
    }
    fclose(fp);
}

// 修改成绩
void modify_score(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    int id;
    printf("请输入学生id: ");
    scanf("%d", &id);
    char buffer[50];
    int found = 0;
    FILE *new_fp = fopen("temp.txt", "w");
    if (new_fp == NULL) {
        printf("创建文件失败!\n");
        exit(1);
    }
    while (fgets(buffer, 50, fp) != NULL) {
        Student student;
        sscanf(buffer, "%s %d %f", student.name, &student.id, &student.score);
        if (id == student.id) {
            printf("请输入新分数: ");
            scanf("%f", &student.score);
            fprintf(new_fp, "%s %d %.2f\n", student.name, student.id, student.score);
            found = 1;
        } else {
            fprintf(new_fp, "%s %d %.2f\n", student.name, student.id, student.score);
        }
    }
    fclose(fp);
    fclose(new_fp);
    remove(filename);
    rename("temp.txt", filename);
    if (found) {
        printf("分数修改成功!\n");
    } else {
        printf("未找到该学生!\n");
    }
}

// 显示所有学生成绩
void display_score(char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("无法打开文件!\n");
        exit(1);
    }
    char buffer[50];
    while (fgets(buffer, 50, fp) != NULL) {
        Student student;
        sscanf(buffer, "%s %d %f", student.name, &student.id, &student.score);
        printf("Name: %s, ID: %d, Score: %.2f\n", student.name, student.id, student.score);
    }
    fclose(fp);
}
int main() {
    char filename[30];
    printf("请输入文件名: ");
    scanf("%s", filename);
    create_file(filename);
    int choice;
    do {
        printf("\nMenu:\n");
        printf("1. 输入分数\n");
        printf("2. 保存文件\n");
        printf("3. 复制文件\n");
        printf("4. 查询分数\n");
        printf("5. 修改分数\n");
        printf("6. 显示分数\n");
        printf("0. 退出\n");
        printf("请输入您的选择: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                input_score(filename);
                break;
            case 2:
                save_file(filename);
                break;
            case 3:
                copy_file(filename);
                break;
            case 4:
                query_score(filename);
                break;
            case 5:
                modify_score(filename);
                break;
            case 6:
                display_score(filename);
                break;
            case 0:
                printf("再见!\n");
                break;
            default:
                printf("无效的选择!\n");
                break;
        }
    } while (choice != 0);
    return 0;
}

后续可添加使用文件控制,实现指定班级成绩文件的删除操作,实现目录的管理,创建与删除子目录、搜索指定的文件等功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值