基于C语言实现简单学生成绩管理系统

基于C语言实现简单学生成绩管理系统攻略

1. 设计思路

学生成绩管理系统可以分为以下几个模块:

  1. 学生信息模块:包括学生信息的存储、读取和显示功能;

  2. 成绩信息模块:包括成绩的录入、修改和查询功能;

  3. 统计信息模块:包括成绩排名和平均成绩计算功能。

2. 模块设计与实现

2.1 学生信息模块

学生信息存储采用文件存储,每个学生对应一个文件。其中文件名是学生的学号,文件内容存储学生的姓名、性别、年龄等信息。

#define STU_FILE "stuInfo.txt"//学生信息存储文件名

//定义学生信息结构体
typedef struct Student{
    char num[15];//学号
    char name[10];//姓名
    char sex[5];//性别
    int age;//年龄
}Student;

//学生信息读取函数
void readStuInfo(Student* stu){
    FILE* fp = fopen(STU_FILE, "r");
    if(fp == NULL){
        printf("读取文件失败!\n");
        return;
    }
    while(fscanf(fp,"%s%s%s%d",stu->num,stu->name,stu->sex,&stu->age)!=EOF){
        printf("%s\t%s\t%s\t%d\n",stu->num,stu->name,stu->sex,stu->age);
    }
    fclose(fp);
}

//学生信息录入函数
void inputStuInfo(Student* stu){
    printf("请输入学生学号:");
    scanf("%s",stu->num);
    printf("请输入学生姓名:");
    scanf("%s",stu->name);
    printf("请输入学生性别:");
    scanf("%s",stu->sex);
    printf("请输入学生年龄:");
    scanf("%d",&stu->age);
    FILE* fp = fopen(STU_FILE,"a+");
    if(fp == NULL){
        printf("保存文件失败!\n");
        return;
    }
    fprintf(fp,"%s\t%s\t%s\t%d\n",stu->num,stu->name,stu->sex,stu->age);
    fclose(fp);
}

2.2 成绩信息模块

成绩信息存储采用文件存储,每个学生对应一个文件。其中文件名是学生的学号,文件内容存储学生的语文、数学、英语、总分和平均分等信息。

#define SCORE_FILE "score.txt"//成绩信息存储文件名

//定义成绩信息结构体
typedef struct Score{
    char num[15];//学号
    float chinese;//语文成绩
    float math;//数学成绩
    float english;//英语成绩
    float total;//总成绩
    float average;//平均成绩
}Score;

//成绩信息读取函数
void readScore(Score* score){
    FILE* fp = fopen(SCORE_FILE, "r");
    if(fp == NULL){
        printf("读取文件失败!\n");
        return;
    }
    while(fscanf(fp,"%s%f%f%f%f%f",score->num,&score->chinese,&score->math,&score->english,&score->total,&score->average)!=EOF){
        printf("%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",score->num,score->chinese,score->math,score->english,score->total,score->average);
    }
    fclose(fp);
}

//成绩信息录入函数
void inputScore(Score* score){
    printf("请输入学生学号:");
    scanf("%s",score->num);
    printf("请输入学生语文成绩:");
    scanf("%f",&score->chinese);
    printf("请输入学生数学成绩:");
    scanf("%f",&score->math);
    printf("请输入学生英语成绩:");
    scanf("%f",&score->english);
    score->total = score->chinese + score->math + score->english;
    score->average = score->total / 3.0;
    FILE* fp = fopen(SCORE_FILE,"a+");
    if(fp == NULL){
        printf("保存文件失败!\n");
        return;
    }
    fprintf(fp,"%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",score->num,score->chinese,score->math,score->english,score->total,score->average);
    fclose(fp);
}

2.3 统计信息模块

统计信息包括按总分进行成绩排名和计算平均成绩。

//按总分降序排序并输出
void sortByTotal(){
    Score score[100];
    Score temp;
    int count = 0;
    FILE* fp = fopen(SCORE_FILE, "r");
    if(fp == NULL){
        printf("读取文件失败!\n");
        return;
    }
    while(fscanf(fp,"%s%f%f%f%f%f",score[count].num,&score[count].chinese,&score[count].math,&score[count].english,&score[count].total,&score[count].average)!=EOF){
        count++;
    }
    fclose(fp);
    for(int i=0;i<count;i++){
        for(int j=i+1;j<count;j++){
            if(score[i].total<score[j].total){
                temp = score[i];
                score[i] = score[j];
                score[j] = temp;
            }
        }
    }
    printf("学号\t语文\t数学\t英语\t总分\t平均分\n");
    for(int i=0;i<count;i++){
        printf("%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",score[i].num,score[i].chinese,score[i].math,score[i].english,score[i].total,score[i].average);
    }
}

//计算平均成绩
void averageScore(){
    Score score;
    float chinese_sum=0,math_sum=0,english_sum=0;
    int count=0;
    FILE* fp = fopen(SCORE_FILE, "r");
    if(fp == NULL){
        printf("读取文件失败!\n");
        return;
    }
    while(fscanf(fp,"%s%f%f%f%f%f",score.num,&score.chinese,&score.math,&score.english,&score.total,&score.average)!=EOF){
        chinese_sum += score.chinese;
        math_sum += score.math;
        english_sum += score.english;
        count++;
    }
    fclose(fp);
    printf("语文平均分:%.2f\n",chinese_sum/count);
    printf("数学平均分:%.2f\n",math_sum/count);
    printf("英语平均分:%.2f\n",english_sum/count);
}

3. 实现示例

3.1 录入学生信息和成绩信息

int main(){
    Student stu;
    Score score;
    int choice;
    while(1){
        printf("1. 录入学生信息;\n");
        printf("2. 录入学生成绩;\n");
        printf("0. 退出系统。\n");
        printf("请选择操作:");
        scanf("%d",&choice);

        if(choice == 1){
            inputStuInfo(&stu);
        }
        else if(choice == 2){
            inputScore(&score);
        }
        else if(choice == 0){
            printf("欢迎下次使用!\n");
            break;
        }
        else{
            printf("输入无效,请重新选择!\n");
        }
    }
    return 0;
}

3.2 统计信息并按总分排名

int main(){
    int choice;
    while(1){
        printf("1. 按总分排名并输出;\n");
        printf("2. 计算平均成绩;\n");
        printf("0. 退出系统。\n");
        printf("请选择操作:");
        scanf("%d",&choice);

        if(choice == 1){
            sortByTotal();
        }
        else if(choice == 2){
            averageScore();
        }
        else if(choice == 0){
            printf("欢迎下次使用!\n");
            break;
        }
        else{
            printf("输入无效,请重新选择!\n");
        }
    }
    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C语言实现简单学生成绩管理系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C C++ LeetCode题解在二叉树中增加一行示例详解

    C C++ LeetCode题解在二叉树中增加一行示例详解 在二叉树中增加一行的题目通常会让很多人头疼,本文将为大家提供一个详细而完整的攻略,同时提供两条示例说明。 题目描述 给定一个二叉树,根节点为第1层,现在要在第d层插入一个值为v的节点,使得原来的树变成新的树。插入完之后,新节点应该在原来第d层节点的左子树的位置上。 解题思路 一般情况下,我们可以采用…

    C 2023年5月23日
    00
  • C语言函数超详细讲解下篇

    我来为您详细讲解一下“C语言函数超详细讲解下篇”的完整攻略。 一、前言 本文将会重点介绍 C 语言中函数的相关知识,主要包括以下几个部分: 函数的概念及基本使用方法。 函数的参数传递方式及注意事项。 函数的返回值类型及返回值的使用方法。 递归函数的使用方法及注意事项。 二、函数的概念及基本使用方法 函数是 C 语言中的一种重要的代码模块化机制,它通常由一段可…

    C 2023年5月23日
    00
  • C语言实现链队列代码

    首先,我们需要了解链队列的定义和基本操作。 链队列是一种基于链表结构实现的队列,与普通队列相比,其主要不同点是使用链表来存储队列元素,所以不会存在队列溢出的情况。 链队列的基本操作包括: 初始化:创建一个空队列。 入队:在队列末尾插入一个元素。 出队:删除队首元素,并返回其值。 队列长度:返回队列中元素的个数。 遍历:依次访问队列中的每个元素。 下面是C语言…

    C 2023年5月23日
    00
  • PHP生成及获取JSON文件的方法

    这里为你详细讲解 PHP 生成和获取 JSON 文件的方法,包括示例说明。 一、生成 JSON 文件 生成 JSON 文件非常简单,我们只需要使用 PHP 的 json_encode() 函数将数据格式化为 JSON 字符串,再将其写入到文件中即可。 // 创建 PHP 数组 $data = array( ‘name’ => ‘Tom’, ‘age’ …

    C 2023年5月23日
    00
  • 用实际代码演示Ruby的容易被误解的6个特性

    下面是用实际代码演示Ruby的容易被误解的6个特性的完整攻略。 1. 变量作用域 Ruby 中的变量作用域可能会让人感到有些混乱。首先,Ruby 有全局变量、实例变量、类变量和局部变量四种。而且,Ruby 采用的是静态作用域,也就是说,变量的作用域是在写代码时决定的,而非在运行时决定的。 $a = 10 def test puts $a end test #…

    C 2023年5月23日
    00
  • C++使用jsoncpp解析json的方法示例

    下面是“C++使用jsoncpp解析json的方法示例”的完整攻略。 1.前言 在开发过程中,经常需要使用json来进行数据交互。本文主要介绍如何在C++中使用jsoncpp库来解析json数据。 2.环境 操作系统:Windows/Linux 编译器:gcc/g++/VS jsoncpp库 3.安装jsoncpp库 jsoncpp库是一个用来解析json的…

    C 2023年5月23日
    00
  • 简述c++ 发展史

    简述C++ 发展史 C 语言的诞生 C++ 是在 C 语言的基础上发展出来的语言,因此我们先来介绍一下 C 语言的诞生。 C 语言诞生于 1972 年,由 Dennis Ritchie 在贝尔实验室开发,为 Unix 操作系统的编写提供了有效的工具。1983 年,C 语言的标准被 ANSI 委员会采纳。 C++ 的诞生 C++ 是在 C 语言基础上开发的,1…

    C 2023年5月23日
    00
  • C语言系统调用约定

    C语言系统调用约定 在C语言中,系统调用使得程序能够与操作系统进行交互,包括执行I/O操作、内存管理等等。C语言中的系统调用约定是指C语言程序如何调用操作系统提供的系统调用。在不同的操作系统中,系统调用的约定可能不同,因此我们需要针对不同的操作系统学习和使用不同的系统调用约定。 基本概念 在C语言中,我们可以使用syscall函数进行系统调用。syscall…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部