C语言课程设计题目七:学生成绩管理系统设计

news2024/9/29 6:43:29

题目七:学生成绩管理系统设计
学生成绩信息包括:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)等。
主要功能:

  1. 能按学期、按班级完成对学生成绩的录入、修改。
  2. 能按班级统计学生的成绩,求学生的总分及平均分。
  3. 能查询学生成绩,不及格科目及学生名单。
  4. 能按班级输出学生的成绩单。

要求: 使用二进制文件方式存储数据,系统以菜单方式工作。

在这里插入图片描述
studentPerformance.h

#define _CRT_SECURE_NO_WARNINGS 
#pragma warning(disable:6031)
#pragma once

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

#define STUDENTS_FILE "students.dat"
#define MAX_STUDENTS 100

typedef struct {
    char term[20];      // 学期
    char student_id[20]; // 学号
    char class_name[20]; // 班级
    char name[50];      // 姓名
    int chinese;        // 语文成绩
    int math;           // 数学成绩
    int english;        // 英语成绩
    int computer;       // 计算机成绩
} Student;


// 保存学生信息
void saveStudentsToFile(Student students[], int count);
// 加载学生信息
void loadStudentsFromFile(Student students[], int* count);
// 添加学生信息
void addStudent(Student students[], int* count);
// 修改学生信息
void modifyStudent(Student students[], int count);
// 统计学生成绩
void calculateStatistics(Student students[], int count);
// 查询学生成绩
void searchStudent(Student students[], int count);
// 输出学生成绩单
void printReportCard(Student students[], int count);
// 函数菜单
void mainMenu(Student students[], int* count);

studentPerformance.c

#include"studentPerformance.h"


// 确定Win/Linux操作系统,清屏
void clearScreen() {
#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
}
// 保存学生信息
void saveStudentsToFile(Student students[], int count) {
    FILE* file = fopen(STUDENTS_FILE, "wb");
    if (file == NULL) {
        printf("无法打开文件 %s!\n", STUDENTS_FILE);
        return;
    }
    fwrite(students, sizeof(Student), count, file);
    fclose(file);
}

// 加载学生信息
void loadStudentsFromFile(Student students[], int* count) {
    FILE* file = fopen(STUDENTS_FILE, "rb");
    if (file == NULL) {
        printf("无法打开文件 %s!\n", STUDENTS_FILE);
        *count = 0;
        return;
    }
    size_t numRead = fread(students, sizeof(Student), MAX_STUDENTS, file);
    *count = (int)numRead;
    fclose(file);
}

// 添加学生信息
void addStudent(Student students[], int* count) {
    if (*count >= MAX_STUDENTS) {
        printf("学生信息已满,无法继续添加。\n");
        return;
    }
    Student newStudent;
    printf("请输入学期: ");
    scanf("%s", newStudent.term);
    printf("请输入学号: ");
    scanf("%s", newStudent.student_id);
    printf("请输入班级: ");
    scanf("%s", newStudent.class_name);
    printf("请输入姓名: ");
    scanf("%s", newStudent.name);
    printf("请输入语文成绩: ");
    scanf("%d", &newStudent.chinese);
    printf("请输入数学成绩: ");
    scanf("%d", &newStudent.math);
    printf("请输入英语成绩: ");
    scanf("%d", &newStudent.english);
    printf("请输入计算机成绩: ");
    scanf("%d", &newStudent.computer);

    students[*count] = newStudent;
    (*count)++;
    saveStudentsToFile(students, *count);
    printf("学生信息已保存。\n");
}

// 修改学生信息
void modifyStudent(Student students[], int count) {
    char student_id[20];
    printf("请输入要修改的学号: ");
    scanf("%s", student_id);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].student_id, student_id) == 0) {
            printf("找到的学生信息:\n");
            printf("学期: %s\n", students[i].term);
            printf("学号: %s\n", students[i].student_id);
            printf("班级: %s\n", students[i].class_name);
            printf("姓名: %s\n", students[i].name);
            printf("语文成绩: %d\n", students[i].chinese);
            printf("数学成绩: %d\n", students[i].math);
            printf("英语成绩: %d\n", students[i].english);
            printf("计算机成绩: %d\n", students[i].computer);

            printf("请输入新的学期: ");
            scanf("%s", students[i].term);
            printf("请输入新的班级: ");
            scanf("%s", students[i].class_name);
            printf("请输入新的姓名: ");
            scanf("%s", students[i].name);
            printf("请输入新的语文成绩: ");
            scanf("%d", &students[i].chinese);
            printf("请输入新的数学成绩: ");
            scanf("%d", &students[i].math);
            printf("请输入新的英语成绩: ");
            scanf("%d", &students[i].english);
            printf("请输入新的计算机成绩: ");
            scanf("%d", &students[i].computer);

            saveStudentsToFile(students, count);
            printf("学生信息已更新。\n");
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("未找到该学号的学生信息。\n");
    }
}

// 统计学生成绩
void calculateStatistics(Student students[], int count) {
    char class_name[20];
    printf("请输入要统计的班级: ");
    scanf("%s", class_name);

    int totalStudents = 0;
    double totalScore = 0;
    double averageScore = 0;

    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].class_name, class_name) == 0) {
            int total = students[i].chinese + students[i].math + students[i].english + students[i].computer;
            totalScore += total;
            totalStudents++;
        }
    }

    if (totalStudents > 0) {
        averageScore = totalScore / totalStudents;
        printf("班级 %s 的总人数: %d\n", class_name, totalStudents);
        printf("班级 %s 的总分: %.2f\n", class_name, totalScore);
        printf("班级 %s 的平均分: %.2f\n", class_name, averageScore);
    }
    else {
        printf("未找到该班级的学生信息。\n");
    }
}

// 查询学生成绩
void searchStudent(Student students[], int count) {
    char student_id[20];
    printf("请输入要查询的学号: ");
    scanf("%s", student_id);

    int found = 0;
    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].student_id, student_id) == 0) {
            printf("\n找到的学生信息:\n");
            printf("学期: %s\n", students[i].term);
            printf("学号: %s\n", students[i].student_id);
            printf("班级: %s\n", students[i].class_name);
            printf("姓名: %s\n", students[i].name);
            printf("语文成绩: %d\n", students[i].chinese);
            printf("数学成绩: %d\n", students[i].math);
            printf("英语成绩: %d\n", students[i].english);
            printf("计算机成绩: %d\n", students[i].computer);

            int total = students[i].chinese + students[i].math + students[i].english + students[i].computer;
            printf("总分: %d\n", total);

            printf("不及格科目:\n");
            if (students[i].chinese < 60) printf("语文\n");
            if (students[i].math < 60) printf("数学\n");
            if (students[i].english < 60) printf("英语\n");
            if (students[i].computer < 60) printf("计算机\n");

            found = 1;
            break;
        }
    }
    if (!found) {
        printf("未找到该学号的学生信息。\n");
    }
}

// 输出学生成绩单
void printReportCard(Student students[], int count) {
    char class_name[20];
    printf("请输入要输出成绩单的班级: ");
    scanf("%s", class_name);

    int found = 0;
    printf("\n+-----------------------------------+\n");
    printf("|         学生成绩单                |\n");
    printf("+-----------------------------------+\n");
    printf("| 学期 | 学号 | 班级 | 姓名 | 语文 | 数学 | 英语 | 计算机 |\n");
    printf("+-----------------------------------+\n");

    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].class_name, class_name) == 0) {
            printf("| %-6s | %-6s | %-6s | %-6s | %-3d | %-3d | %-3d | %-3d |\n",
                students[i].term, students[i].student_id, students[i].class_name,
                students[i].name, students[i].chinese, students[i].math,
                students[i].english, students[i].computer);
            found = 1;
        }
    }

    if (!found) {
        printf("未找到该班级的学生信息。\n");
    }
    printf("+-----------------------------------+\n");
}

// 函数菜单
void mainMenu(Student students[], int* count) {
    int choice;
    do {
        clearScreen();
        printf("学生成绩管理系统\n");
        printf("1. 录入学生成绩\n");
        printf("2. 修改学生成绩\n");
        printf("3. 统计学生成绩\n");
        printf("4. 查询学生成绩\n");
        printf("5. 输出学生成绩单\n");
        printf("6. 退出系统\n");
        printf("请选择功能: ");
        scanf("%d", &choice);

        switch (choice) {
        case 1:
            addStudent(students, count);
            break;
        case 2:
            modifyStudent(students, *count);
            break;
        case 3:
            calculateStatistics(students, *count);
            break;
        case 4:
            searchStudent(students, *count);
            break;
        case 5:
            printReportCard(students, *count);
            break;
        case 6:
            printf("退出系统。\n");
            break;
        default:
            printf("无效的选择,请重新输入。\n");
            break;
        }

        getchar(); // 清除输入缓冲区中的换行符
        system("pause"); // 暂停程序,等待用户按键
    } while (choice != 6);
}

test.c

#include"studentPerformance.h"

int main() {
    int count = 0;
    Student students[MAX_STUDENTS];

    loadStudentsFromFile(students, &count);

    mainMenu(students, &count);

    saveStudentsToFile(students, count);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣最热一百题——颜色分类

目录 题目链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;不要脸用sort Java写法&#xff1a; 运行时间 解法二&#xff1a;O1指针 Java写法&#xff1a; 重点 运行时间 C写法&#xff1a;…

Python库matplotlib之二

Python库matplotlib之二 figureAxessubplot figure matplotlib.pyplot.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue, FigureClass<class ‘matplotlib.figure.Figure’>, clearFalse, **kwargs) num&#xff0c;int 或 str 或 fi…

Starfyre:一款使用纯 Python 创建响应式前端应用的 Python Web 框架

Starfyre 是一款基于 WebAssembly (WASM) 的 Python Web 框架&#xff0c;它允许你使用纯 Python 创建响应式前端应用。这意味着你可以轻松地构建交互式、实时应用程序&#xff0c;无需繁琐的 JavaScript 代码。Starfyre 基于 Pyscript 实现客户端功能&#xff0c;并通过 pyxid…

【每天学个新注解】Day 9 Lombok注解简解(八)—@Synchronized、@Locked

Synchronized 通过锁代码块的方式实现同步锁。 当synchronized修饰类属性时&#xff0c;通常用于定义同步代码块&#xff0c;此时需要指定一个锁对象。这个锁对象通常是类的某个私有静态成员变量&#xff0c;因为类属性是静态的&#xff0c;所以锁也应该是静态的&#xff0c;以…

【Python】YOLO牛刀小试:快速实现视频物体检测

YOLO牛刀小试&#xff1a;快速实现视频物体检测 在深度学习的众多应用中&#xff0c;物体检测是一个热门且重要的领域。YOLO&#xff08;You Only Look Once&#xff09;系列模型以其快速和高效的特点&#xff0c;成为了物体检测的首选之一。本文将介绍如何使用YOLOv8模型进行…

二叉搜索树的介绍、模拟实现二叉搜索树、leetcode---根据二叉树创建字符串、leetcode---二叉树的最近公共祖先等的介绍

文章目录 前言一、二叉搜索树的介绍二、模拟实现二叉搜索树三、leetcode---根据二叉树创建字符串四、leetcode---二叉树的最近公共祖先总结 前言 二叉搜索树的介绍、模拟实现二叉搜索树、leetcode—根据二叉树创建字符串、leetcode—二叉树的最近公共祖先等的介绍 一、二叉搜索…

57 长短期记忆网络(LSTM)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录长短期记忆网络&#xff08;LSTM&#xff09;门控记忆元输入门、忘记门和输出门候选记忆元 (相当于RNN中计算 H t H_t Ht​)记忆元隐状态 从零开始实现初始化模型参数定义模型训练和预测 简洁实现小结练习 长短期记忆网络&#xff08;LSTM&a…

0基础学习CSS(六)字体

CSS 字体 CSS字体属性定义字体&#xff0c;加粗&#xff0c;大小&#xff0c;文字样式。 serif和sans-serif字体之间的区别 在计算机屏幕上&#xff0c;sans-serif字体被认为是比serif字体容易阅读 CSS字型 在CSS中&#xff0c;有两种类型的字体系列名称&#xff1a; 通用字体…

Java | Leetcode Java题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; class Solution {public int compress(char[] chars) {int n chars.length;int write 0, left 0;for (int read 0; read < n; read) {if (read n - 1 || chars[read] ! chars[read 1]) {chars[write] chars[read];int num read …

解读文本嵌入:语义表达的练习

【引子】近来在探索并优化AIPC的软件架构&#xff0c;AI产品经理关于语义搜索的讨论给了自己较多的触动&#xff0c;于是重新梳理嵌入与语义的关系&#xff0c;遂成此文。 文本转换成机器可理解格式的最早版本之一是 ASCII码&#xff0c;这种方法有助于渲染和传输文本&#xff…

win10系统K8S安装教程

准备工作 电脑硬件&#xff1a;支持虚拟化的CPU&#xff0c;内存最好在32G以上&#xff0c;16G也可以操作系统&#xff1a;window10 专业版 1 开启虚拟化 1.1 BIOS 由于主板和CPU的品牌不太一样&#xff0c;这里的操作仅供参考&#xff0c;以Intel的平台为例&#xff1a; …

【刷点笔试面试题试试水】有符号变量与无符号变量的值的转换

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: 注意无符号类型与有符合类型参与计算会做类型提升,有符合的变为无符号…

加法器以及标志位

加法器的结构&#xff1a; OF&#xff08;溢出标志位&#xff09;&#xff0c;SF&#xff08;符号标志位&#xff09;&#xff0c;ZF&#xff08;0标志位&#xff09;&#xff0c;ZF&#xff08;进位/借位标志位&#xff09; 有符号数看标志位&#xff1a;OF&#xff0c;SF 无符…

ubuntu 不用每次输入sudo的四种方式

在Ubuntu系统中&#xff0c;如果不希望每次执行需要管理员权限的命令时都输入sudo&#xff0c;有几种方法可以实现这一目标。以下是一些详细的方法&#xff1a; 第一种方式: 切换root用户 (如果你有足够的权限) # 修改root密码命令(没有设置的用户需要设置一下) consolaadmin…

面试中顺序表常考的十大题目解析

在数据结构与算法的面试中&#xff0c;顺序表是一个常见的考点。它作为一种基础的数据结构&#xff0c;涵盖了多种操作和概念&#xff0c;以下将详细介绍面试中关于顺序表常考的十大题目。 &#x1f49d;&#x1f49d;&#x1f49d;如果你对顺序表的概念与理解还存在疑惑&#…

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs-基础版

【Threejs进阶教程-着色器篇】8. Shadertoy如何使用到Threejs - 基础版 前七篇地址,建议按顺序学习致谢带我入门的[X01动力装甲]大佬本文适用范围怎么样在Shadertoy中画出正圆形shadertoy中的坐标系比例转换理解Shadertoy的fragCoord理解Shadertoy中的iResolution 转移Shaderto…

SigmaStudio淡入淡出增益控件(Single SW slew vol(adjustable))延时分析

斜率范围1~23&#xff0c;参考12khz正弦波&#xff08;-17.99db,调减15.2db&#xff09;作为分析依据 一、淡入时间与斜率关系 斜率1-----淡入延时时间大概0.08毫秒 斜率2—淡入延时时间大概0.2毫秒 斜率3–淡入延时时间按大概0.5毫秒 斜率4–淡入延时时间大概1毫秒 斜率5–淡…

C++学习笔记之结构体

C学习笔记之结构体 https://www.runoob.com/cplusplus/cpp-struct.html 结构体是C中一种由用户自定义的数据类型&#xff0c;允许存储不同类型的数据项 1、定义结构体 使用struct语句定义结构体 结构体与C中的类看起来结构相似&#xff0c;同样是可以在其中定义成员变量和成员…

picgo + typora + gitee图床

Picgo打造个人图床&#xff0c;稳定又安全 解决Typora笔记上传到CSDN图片无法显示的问题 typora中

完全二叉树的节点个数 C++ 简单问题

完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层&#xff0c;则该层包含 1~ 2h 个节点。 示例 1&#xff…