C语言-学生成绩管理

Posted 梦之海岛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言-学生成绩管理相关的知识,希望对你有一定的参考价值。

文章目录

前言

这篇文章和代码是专门针对下方学生成绩管理这个题目,使用的语言为C
全部的代码为博主独立完成,不存在抄袭的情况,如有雷同纯属巧合。
本代码可能含有BUG,若出现BUG的话可在文章下方评论。

一、题目信息

有N名学生,每名学生含有如下信息:学号、姓名、某四门课的成绩,并计算其总分,用一结构体数组表示之。然后实现以下功能:
(1)将这些数据存放至文件stuf.dat中;
(2)将文件中的数据读出至结构体数组中,并显示之;
(3)输出总分最高分和最低分的名字;
(4)输出总分在340分,单科成绩不低于80分的名单;
(5)求出各科平均分数;
(6)按总分排名;
(7)输出补考名单并存入文件。

二、生成测试数据-C语言

  • 因为每次输入学生数据的时候很费力,得一直打,还容易打错,所以就弄了一个可随机的学生数据。
  • 生成测试数据的代码生成的学生数据仅在本题目中使用,使用到了随机数生成的知识。

C语言笔记-指定范围下随机数的生成


/*
代码作者:小狐狸
代码介绍:
生成的学生数据student.txt仅在学生信息管理系统中使用,
你可以在生成学生数据后打开student.txt文件直接复制黏贴即可.

生成stuf.dat文件与student.txt文件的内容相同,
stuf.dat可移动到学生信息管理主程序.c的目录下使用.


生成从a~(a+b-1)的随机数赋值给Y:
1. srand((int)time(NULL))
2. Y=rand()%b+a;
*/
#include<stdio.h>
#include<stdlib.h>  //随机数、清屏使用需要的文件头
#include<time.h>    //随机数需要的文件头
#define OK 1
#define ERROR -1
#define Max 99
int CreateTest(int N,int Len)//创建测试学生数据,并存入student.txt和stuf.dat文件,N为学生个数,Len为学生学号长

    char Name[Max]='f','o','x';//若需要变更学生姓名在此处变更即可
    FILE *op,*op2;//文件指针
    op=fopen("student.txt","w");//以重建模式打开文件
    op2=fopen("stuf.dat","w");//以重建模式打开文件
    int i,j;
    srand((int)time(NULL));//设置随机数种子
    fprintf(op,"%d\\n",N);//第一行为文件中学生的总数
    fprintf(op2,"%d\\n",N);//第一行为文件中学生的总数
    for(i=1;i<=N;i++)//学生总测试数
    
        for(j=1;j<=Len;j++)//学号
        
            int fox;//临时变量
            if(j==1)//首位不为0,从1-9选择
            
                fox=rand()%9+1;//生成从1-9的随机数
                fprintf(op,"%d",fox);//存入student.txt
                fprintf(op2,"%d",fox);//存入stuf.dat
            
            else//从0-9选择
            
                fox=rand()%9;//生成从0-9的随机数
                fprintf(op,"%d",fox);//存入student.txt
                fprintf(op2,"%d",fox);//存入stuf.dat
            
        
        fprintf(op," ");
        fprintf(op2," ");
        int score1,score2,score3,score4;
        score1=rand()%100+1;//生成从1-100的随机数
        score2=rand()%100+1;
        score3=rand()%100+1;
        score4=rand()%100+1;
        //student.txt文件操作
        fprintf(op,"%s%d ",Name,i);//姓名
        fprintf(op,"%d ",score1);//成绩1
        fprintf(op,"%d ",score2);//成绩2
        fprintf(op,"%d ",score3);//成绩3
        fprintf(op,"%d\\n",score4);//成绩4
        //stuf.dat文件操作
        fprintf(op2,"%s%d ",Name,i);//姓名
        fprintf(op2,"%d ",score1);//成绩1
        fprintf(op2,"%d ",score2);//成绩2
        fprintf(op2,"%d ",score3);//成绩3
        fprintf(op2,"%d\\n",score4);//成绩4
    
    fclose(op);
    return OK;

int main()


    while(1)
    
        int fox;//临时变量
        printf("---------------<学生随机数据生成系统>-----------------\\n");
        printf("|       0. 退出系统                                  |\\n");
        printf("|       1. 生成新的数据存入student.txt和stuf.dat文件 |\\n");
        printf("|       2. 清屏                                      |\\n");
        printf("------------------------------------------------------\\n");
        scanf("%d",&fox);
        if(fox==0) break;
        else if(fox==1)
        
            int N;//学生总数
            int Len;//学号长度
            printf("测试学生总数: ");
            scanf("%d",&N);
            printf("学生学号长度: ");
            scanf("%d",&Len);
            CreateTest(N,Len);
            printf("创建成功,请到student.txt中查看!\\n");
        
        else system("cls");
    
    return OK;


三、学生成绩管理-C语言

代码所必须的注释都已经写在代码开头和代码中,删除注释代码前请先浏览一遍注释。
考虑到课设老师可能会要求多写一些功能,所以就添加了一个功能10,用于查找各科不及格学生

[1]. 除了文件导入功能的效果展示

[2]. 文件导入功能展示

[3]. 代码

/*
代码作者:小狐狸
代码介绍:
若作为作业进行提交的话,建议对某些变量名进行变更.
此代码仅为了实现题目要求的功能,需要拓展的话可自己设计新的函数.
对菜单函树Menu()进行提示修改,并添加到main()主函数的switch()语句中即可.

各个函数是按菜单中数字顺序进行放置,可根据主菜单中所需功能查找对应函数位置
代码开头的注释可自行删除.
经过测试若学号或姓名达到8位或8位以上的字符时,数据将会不对齐

若使用%s进行输入字符串时,取址符'&'可进行省略,
strcpy(字符串A,字符串B),将字符串B复制给字符串A.
文件当中仅保存学生总数、学号、姓名、成绩1、成绩2、成绩3、成绩4

排序部分使用的是冒泡排序,若想要运算的效率更高的话,
可以采用基数排序、归并排序、快速排序、堆排序、简单选择排序、希尔排序、直接插入排序算法.

Windows系统下OS命令行中清屏: cls
c语言中清屏: system('cls');

文件操作全流程:
1. FILE *文件指针=fopen("文件路径","操作方式")
常用操作方式有以下三种。
w: 为重新创建文件并写入
r: 为只读取文件,不对文件内容进行修改,要求文件必须存在否则返回NULL
a: 为追加内容到文件末尾
+: 可读可写,和w、r、a进行组合而不能单独存在,即w+、a+、r+

2.
将变量内容存入: fprintf(文件指针,"%s",变量);  //%s表示字符串型变量
读取内容到变量: fscanf(文件指针,"%s",变量);
每次的存入和读取类似于排队,前者被存入或读取后,
下一次的存入或读取将会跳过已操作的那些,
文件中以空白符为两个不同内容的分隔,
空格、换行、制表符(tab)都算是空白符
如: tu r中tu和r被空格隔开,tu若被fscanf()取出一次后,
    下一次的fscanf()读取的是r,fprintf()与fscanf()类似

3. 关闭文件: fclose(文件指针);
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define Max 99
struct

    char Number[Max];//学号
    char Name[Max];//姓名
    int Score1;//成绩1
    int Score2;//成绩2
    int Score3;//成绩3
    int Score4;//成绩4
    int All;//四科成绩总分
    int Avg;//平均分
STU[Max],FOX[Max],NEW[Max];//学生结构体数组,下标从1开始
//STU用于存储学生数据,FOX、NEW为临时使用的结构体数组
int Menu();//菜单显示
int InputStudent(int N);//输入学生信息,N为学生总数
int PrintStudent(int N);//显示学生信息,N为学生总数
int Upload(int N);//将结构体数组中的数据存入文件,N为学生总数
int AddUpload(int N);//将学生信息存入文件末尾,N为学生总数
int Download();//将文件数据读出至结构体数组,返回值为学生总数
int HighLowName(int N);//输出最高分和最低分的名字,N为学生总数
int PrintSix(int N);//输出总分在340分,单科成绩不低于80分的名单
int PrintAverage(int N);//计算所有学生的平均分并显示
int PrintLevel(int N);//按总分进行排名并打印,N为学生总数
//未使用的函数:int PrintLevel2(int N);//按总分进行排名并打印,N为学生总数
int UploadFail(char loser[],char course[]);//将需要补考的名单存入文件fail.txt,loser存储不及格学生的姓名,course为该学生不及格的科目.
int Fail(int N);//将需要补考的名单进行打印
int ScoreFail(int N);//打印指定科目不及格的学生
int main()

    int N=0;//学生总数,N不能放于while循环中,否则进行一次循环后.N值将会改变
    while(1)
    
        int fox;//临时变量
        Menu();//主菜单显示
        printf("请选择: ");
        scanf("%d",&fox);
        if(fox==0) break;//退出操作
        switch(fox)
        
            case 1://输入学生信息
                
                    while(1)//确保N值≥0,当N=0时将不会执行输入学生信息
                    
                        printf("学生总数(退出请输入0): ");
                        scanf("%d",&N);
                        if(N<0)//N为负值时
                            printf("请输入≥0的数!");
                        else break;
                    
                    InputStudent(N);
                
                break;
            case 2://显示学生信息
                
                    if(N==0)//没有学生信息时
                    
                        printf("请先输入学生信息!\\n");
                        break;
                    
                    else   PrintStudent(N);
                
                break;
            case 3://将学生数据存入stuf.dat,若已存在则添加至末尾
                
                    FILE *Fox;//临时文件指针
                    if((Fox=fopen("stuf.dat","r"))!=NULL)//若文件存在时
                    
                        AddUpload(N);//将数据添加到文件末尾
                    
                    else//若文件不存在时直接存入
                        Upload(N);
                
                break;
            case 4://将文件数据读出至结构体
                
                    FILE *Fox;//临时文件指针
                    if((Fox=fopen("stuf.dat","r"))==NULL)//若文件不存在时
                    
                        printf("stuf.dat文件不存在,请先创建一个再执行此操作!\\n");
                    
                    else//文件存在时
                    
                        N=Download();//返回一个文件中的学生总数
                        if(N==0)//当文件中的学生人数为0时
                            printf("stuf.dat文件中没有学生信息!\\n");
                    
                
                break;
            case 5://输出总分最高分和总分最低分的名字
                
                    HighLowName(N);
                
                break;
            case 6://输出总分在340分,单科成绩不低于80分的名单
                
                    PrintSix(N);
                
                break;
            case 7://求出每个学生的各科平均数并显示
                
                    PrintAverage(N);
                
                break;
            case 8://按总分排名并打印
                
                    PrintLevel(N);//使用NEW数组来排序和打印
                
                break;
            case 9://输出补考名单并存入文件fail.txt
                
                    Fail(N);
                
                break;
            case 10://打印指定科目不及格的学生
                
                    ScoreFail(N);
                
                break;
            case 11://清屏
                
                    system("cls");//需要使用头文件#include<stdlib.h>才不会报错
                
                break;
            default: break;
        
    
    printf("退出成功!\\n");
    return 0;

int Menu()//菜单显示

    printf("---------------------------------------------------------------\\n");
    printf("|       0. 退出系统                                           |\\n");
    printf("|       1. 输入学生信息                                       |\\n");
    printf("|       2. 显示学生信息                                       |\\n");
    printf("|       3. 将学生数据存入stuf.dat,若已有数据则添加至末尾      |\\n");
    printf("|       4. 将文件数据导出至结构体数组                         |\\n");
    printf("|       5. 输出总分最高分和最低分的名字                       |\\n");
    printf("|       6. 输出总分在340分,单科成绩不低于80分的名单           |\\n");
    printf("|       7. 求出各科平均分数并打印                             |\\n");
    printf("|       8. 按总分排名并打印                                   |\\n");
    printf("|       9. 输出补考名单并存入文件fail.txt                     |\\n");
    printf("|       10.打印指定科目不及格的学生名单                       |\\n");
    printf("|       11. 清屏                                              |\\n");
    printf("---------------------------------------------------------------\\n");
    return OK;

int InputStudent(int N)//输入学生信息,N为学生总数

    int i;
    if(N<=0)
        return ERROR;
    printf("请按学号 姓名 成绩1 成绩2 成绩3 成绩4填写!\\n");
    for(i=1;i<=N;i++)//将所有学生数据存入结构体数组
    
        printf("第%d名学生:\\n",i);
        scanf("%s",STU[i].Number);//学号
        scanf("%s",STU[i].Name);//姓名
        scanf("%d",&STU[i].Score1);//成绩1
        scanf("%d",&STU[i].Score2);//成绩2
        scanf("%d",&STU[i].Score3);//成绩3
        scanf("%d",&STU[i].Score4);//成绩4
        STU[i].All=STU[i].Score1+STU[i].Score2+STU[i].Score3+STU[i].Score4;//计算总分
    
    return OK;

int PrintStudent(int N)//显示学生信息,N为学生总数

    int i;
    if(N<=0)
        return ERROR;
    printf("=============================================<分隔线>=======================================================\\n");
    printf("学号\\t\\t姓名\\t\\t成绩1\\t\\t成绩2\\t\\t成绩3\\t\\t成绩4\\t\\t总分\\n");
    for(i=1;i<=N;i++)
    
        printf("%s\\t\\t",STU[i].Number);//学号
        printf("%s\\t\\t",STU[i].Name);//姓名
        printf("%d\\t\\t",STU[i].Score1);//成绩1
        printf("%d\\t\\t",STU[i].Score2);//成绩2
        printf("%d\\t\\t",STU[i].Score3);//成绩3
        printf("%d\\t\\t",STU[i].Score4);//成绩4
        STU[i].All=STU[i].Score1+STU[i].Score2+STU[i].Score3+STU[ic语言学生成绩管理系统

C语言程序设计学生成绩管理系统

C语言(学生成绩管理系统)

C语言学生成绩管理系统

学生成绩管理系统的c语言程序

求用C语言编写一个简单的学生信息管理程序和课程设计报告