zoukankan      html  css  js  c++  java
  • 课程设计 C语言 学生成绩管理系统

    学生成绩管理系统

    tips : 应该写的注释都写了,适合初学者参考。
    某班最多不超过30人(具体人数由键盘输入),考试科目最多不超过6门(具体门数由键盘输入)。

    请编写一个程序实现如下菜单驱动的学生成绩管理系统;要求:
    (1)录入每个学生 的学号、姓名和各科考试成绩。
    (2)计算每门课程的总分和平均分。
    (3)计算每个学生的总分和平均分。
    (4)按每个学生的总分由高到低排出名次表。
    (5)按学号由小到大排出成绩表。
    (6)按姓名的字典顺序排出成绩表。
    (7)按学号查询学生排名及各科考试成绩。
    (8)按姓名查询学生排名及各科考试成绩。
    (9)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数及所占的百分比。
    (10)输出每个学生的学号、姓名、各科考试成绩、总分、平均分,以及每门课程的总分和平均分。

    code(可直接运行):

      1 #define  _CRT_SECURE_NO_WARNINGS
      2 #include <stdio.h>
      3 #include <string.h>
      4 #include<stdlib.h>
      5 
      6 struct Course {
      7     int C_score;
      8     char C_name[10];
      9 };
     10 struct Stu {
     11     int id;
     12     char name[10];
     13     struct Course courses[6];
     14     int total_score;
     15     int ave;
     16     int ranking;
     17 };
     18 struct Stu stu[30];
     19 int real_stu;
     20 int real_cou;
     21 int temp[30] = { 0 };
     22 int temp_forFun7[30] = { 0 };    //这里在函数5中修改了 temp ,但是fun7 要用,所以但copy出来一个。
     23 int C_total_score[6] = { 0 };
     24 int C_ave[6] = { 0 };
     25 
     26 enum level {
     27     优秀 = 0, 良好, 中等, 及格, 不及格
     28 };
     29 
     30 int getRanking(int id);
     31 struct Stu* getStu(int id);
     32 char* getLevel(int num);
     33 
     34 int fun0();
     35 int fun1();
     36 int fun2();
     37 int fun3();
     38 int fun4();
     39 int fun5();
     40 int fun6();
     41 int fun7();
     42 int fun8();
     43 int fun9();
     44 int fun10();
     45 int main()
     46 {
     47     while (1) {
     48         //输入数字几,则运行程序几
     49         switch (fun0()) {
     50         case  0: exit(0); break;
     51         case  1: fun1(); break;
     52         case  2: fun2(); break;
     53         case  3: fun3(); break;
     54         case  4: fun4(); break;
     55         case  5: fun5(); break;
     56         case  6: fun6(); break;
     57         case  7: fun7(); break;
     58         case  8: fun8(); break;
     59         case  9: fun9(); break;
     60         case 10: fun10(); break;
     61         case 11:/*fun11()*/; break;
     62         }
     63     }
     64 
     65     return 0;
     66 }
     67 
     68 
     69 //0菜单
     70 int fun0() {
     71     //菜单
     72     int n;
     73     printf("*******************************************************
    ");
     74     printf("1. 录入每个学生 的学号、姓名和各科考试成绩.
    ");
     75     printf("2. 计算每门课程的总分和平均分。
    ");
     76     printf("3. 计算每个学生的总分和平均分。
    ");
     77     printf("4. 按每个学生的总分由高到低排出名次表。
    ");
     78     printf("5. 按学号由小到大排出成绩表。
    ");
     79     printf("6. 按姓名的字典顺序排出成绩表。
    ");
     80     printf("7. 按学号查询学生排名及各科考试成绩。
    ");
     81     printf("8. 按姓名查询学生排名及各科考试成绩。
    ");
     82     printf("9. 按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数及所占的百分比。
    ");
     83     printf("10.输出每个学生的学号、姓名、各科考试成绩、总分、平均分,以及每门课程的总分和平均分。
    ");
     84     printf("0. Exit
    ");
     85     printf("*******************************************************
    ");
     86     printf("    Please enter your choice :
    ");
     87     scanf_s("%d", &n);
     88     return n;
     89 }
     90 
     91 //1,录入每个学生的学号、姓名和各科考试成绩。
     92 int fun1() {
     93     //(1)录入每个学生的学号、姓名和各科考试成绩。
     94     printf("请输入总人数(不超过30人):");
     95     scanf("%d", &real_stu);
     96     printf("请输入总课程数(不超过6门):");
     97     scanf("%d", &real_cou);
     98 
     99     //(1)录入、每个 学生 的学号、姓名和各科考试成绩。
    100     for (int i = 0; i < real_stu; i++) {//录入第 i 个学生信息:学号 姓名。
    101         printf("请输入第 %d 个学生的信息  ( 输入格式提示 例如:[学号 姓名] 中括号里面的为一次录入,不用写中括号。)
    ", i + 1);
    102         scanf("%d %s", &(stu[i].id), stu[i].name);
    103 
    104         printf("请输入需要录入课程的信息  ( 输入格式提示 例如:[课程名字 课程分数] 中括号里面的为一次录入,不用写中括号。)
    ");
    105         for (int j = 0; j < real_cou; j++) {//录入第 i 个学生课程信息:课程名字 分数。
    106             scanf("%s %d", stu[i].courses[j].C_name, &(stu[i].courses[j].C_score));
    107         }
    108     }
    109     return 0;
    110 }
    111 
    112 //2,计算每门课程的总分和平均分
    113 int fun2() {
    114     //(2)计算每门课程的总分和平均分
    115 
    116     for (int i = 0; i < real_stu; i++) {
    117         for (int j = 0; j < real_cou; j++) {
    118             C_total_score[j] += stu[i].courses[j].C_score;
    119         }
    120     }
    121     for (int i = 0; i < real_stu; i++) {
    122         C_ave[i] = C_total_score[i] / real_stu;//第i门课的平均分
    123     }
    124     //最后不用print
    125     for (int i = 0; i < real_cou; i++) {
    126         printf("%d  %d
    ", C_total_score[i], C_ave[i]);
    127 
    128     }
    129     return 0;
    130 }
    131 
    132 //3,计算每个学生的总分和平均分。
    133 int fun3() {
    134     //(3)计算每个学生的总分和平均分。
    135     for (int i = 0; i < real_stu; i++) {//第几个学生
    136         for (int j = 0; j < real_cou; j++) {//第几门课
    137             stu[i].total_score += stu[i].courses[j].C_score;
    138         }
    139     }
    140     for (int i = 0; i < real_cou; i++) {
    141         stu[i].ave = stu[i].total_score / real_cou;
    142     }
    143     for (int i = 0; i < real_stu; i++) {
    144         printf("第%d个学生的总分为%d
    ", i + 1, stu[i].total_score);
    145         printf("第%d个学生的平均分为 % d
    ", i + 1, stu[i].ave);
    146     }
    147     return 0;
    148 }
    149 
    150 //4,按每个学生的总分由高到低排出名次表。
    151 int fun4() {
    152     //(4)按每个学生的总分由高到低排出名次表。
    153     for (int i = 0; i < real_stu; i++) {
    154         temp[i] = stu[i].id;    //创建数组,存id,通过id找到信息
    155     }
    156     int temp_for_swap = 0;
    157     //排序
    158     for (int i = 0; i < real_stu - 1; i++) {//轮次,n-1次
    159         for (int j = 0; j < real_stu - i - 1; j++) {//一次排序
    160             if (getStu(temp[j])->total_score < getStu(temp[j + 1])->total_score) {
    161                 //交换 temp[i] temp[i+1]
    162                 //t_temp,为中间作为交换的数组,存放id
    163                 //temp数组为存放id数组
    164                 temp_for_swap = temp[j];
    165                 temp[j] = temp[j + 1];
    166                 temp[j + 1] = temp_for_swap;
    167             }
    168         }
    169     }
    170     //输出
    171     printf("按每个学生的总分由高到低排出的名次表为
    ");
    172     for (int i = 0; i < real_stu; i++) {
    173         printf("%d %s %d
    ", getStu(temp[i])->id, getStu(temp[i])->name, getStu(temp[i])->total_score);
    174     }
    175     //这里在函数5中修改了 temp ,但是fun7 要用,所以但copy出来一个。
    176     memcpy(temp_forFun7,temp,real_stu);
    177     return 0;
    178 
    179 }
    180 
    181 //5,按学号由小到大排出成绩表。
    182 int fun5() {
    183     //(5)按学号由小到大排出成绩表。
    184     //排序,学号大小,也就是说,输入不一定按学号从小到大输入
    185     int temp_for_swap = 0;
    186     //排序
    187     for (int i = 0; i < real_stu - 1; i++) {//轮次,n-1次
    188         for (int j = 0; j < real_stu - i - 1; j++) {//一次排序
    189             if (getStu(temp[j])->id > getStu(temp[j + 1])->id) {
    190                 //交换 temp[i] temp[i+1]
    191                 //t_temp,为中间作为交换的数组,存放id
    192                 //temp数组为存放id数组
    193                 temp_for_swap = temp[j];
    194                 temp[j] = temp[j + 1];
    195                 temp[j + 1] = temp_for_swap;
    196             }
    197         }
    198     }
    199     printf("按每个学生的按学号由小到大排出成绩表为
    ");
    200     for (int i = 0; i < real_stu; i++) {
    201         printf("%d %s %d
    ", getStu(temp[i])->id, getStu(temp[i])->name, getStu(temp[i])->total_score);
    202     }
    203     return 0;
    204 }
    205 
    206 //6,按姓名的字典顺序排出成绩表。
    207 int fun6() {
    208     //(6)按姓名的字典顺序排出成绩表。
    209     //字典顺序,成绩表
    210     //字符串比较
    211     int temp_for_swap = 0;
    212     for (int i = 0; i < real_stu - 1; i++) {
    213         for (int j = 0; j < real_stu - i - 1; j++) {
    214             if (strcmp(getStu(temp[j])->name, getStu(temp[j + 1])->name) > 0) {
    215                 temp_for_swap = temp[j];
    216                 temp[j] = temp[j + 1];
    217                 temp[j + 1] = temp_for_swap;
    218             }
    219         }
    220     }
    221     //print
    222     printf("按学生姓名的字典顺序排出成绩表为
    ");
    223     for (int i = 0; i < real_stu; i++) {
    224         printf("%d %s %d
    ", getStu(temp[i])->id, getStu(temp[i])->name, getStu(temp[i])->total_score);
    225     }
    226     return 0;
    227 }
    228 //7,按学号查询学生排名及各科考试成绩。
    229 
    230 int fun7() {
    231     //按学号查询学生排名及各科考试成绩。
    232     for (int i = 0; i < real_stu; i++) {
    233         getStu(temp_forFun7[i])->ranking = getRanking(temp_forFun7[i]);//排名,由get函数初始化
    234     }
    235     int input_id;
    236     printf("请输入需要查询成绩的学生的学号:");
    237     scanf("%d", &input_id);
    238 
    239     struct Stu* hit_stu = getStu(input_id);//把用getStu函数找到的学生信息,给hit——stu
    240 
    241     printf("学号为%d的学生是%s
    ", hit_stu->id, hit_stu->name);
    242     printf("排名为%d
    ", hit_stu->ranking + 1);
    243     printf("其各科成绩为:
    ");
    244     for (int i = 0; i < real_cou; i++) {
    245         printf("%s %d
    ", hit_stu->courses[i].C_name, hit_stu->courses[i].C_score);
    246     }
    247     return 0;
    248 }
    249 //8,按姓名查询学生排名及各科考试成绩。
    250 int fun8() {
    251     //(8)按姓名查询学生排名及各科考试成绩。
    252     char input_name[10] = { 0 };
    253     printf("请输入需要查询成绩的学生的姓名:");
    254     scanf("%s", input_name);
    255 
    256     struct Stu* hit_stu = NULL;
    257     for (int i = 0; i < real_stu; i++) {
    258         if (strcmp(hit_stu->name, input_name) == 0) {
    259             hit_stu = &stu[i];
    260         }
    261     }
    262     if (hit_stu == NULL) {
    263         printf("姓名为%s的学生不存在
    ", input_name);
    264         return;
    265     }
    266 
    267     printf("学号为%d的学生是%s
    ", hit_stu->id, hit_stu->name);
    268     printf("排名为%d
    ", hit_stu->ranking + 1);
    269     printf("其各科成绩为:
    ");
    270     for (int i = 0; i < real_stu; i++) {
    271         printf("%s %d
    ", hit_stu->courses[i].C_name, hit_stu->courses[i].C_score);
    272     }
    273     return 0;
    274 }
    275 //(9)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,对每门课程分别统计每个类别的人数及所占的百分比。,switch语句,除以总人数,然后打印
    276 int fun9() {
    277 
    278     //(9)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)5个类别,
    279 //对每门课程分别统计 每个类别的人数及所占的百分比。,除以总人数,然后打印
    280     //等价于 int type [][];
    281     // type[ 第几门课 ] [ 该课的类别 ]
    282     //int** type = (int**)malloc(sizeof(int) * 5 * real_cou);
    283     float type[6][5] = {0};
    284     for (int i = 0; i < real_stu; i++) {
    285         for (int j = 0; j < real_cou; j++) {
    286             //type[i][j];
    287             int temp_score = stu[i].courses[j].C_score;
    288             if (temp_score >= 0 && temp_score < 59) {
    289                 type[j][不及格] += 1;//bad
    290             }
    291             else if (temp_score >= 60 && temp_score < 69) {
    292                 type[j][及格] += 1;//及格
    293             }
    294             else if (temp_score >= 70 && temp_score < 79) {
    295                 type[j][中等] += 1;//中等
    296             }
    297             else if (temp_score >= 80 && temp_score < 89) {
    298                 type[j][良好] += 1;//良好
    299             }
    300             else if (temp_score >= 90 && temp_score < 100) {
    301                 type[j][优秀] += 1;//优秀
    302             }
    303         }
    304     }
    305 
    306     //float** ratio = (float**)malloc(sizeof(float) * 5 * real_cou);
    307     float ratio[6][5] = { 0.0 };
    308 
    309     for (int i = 0; i < real_cou; i++)
    310     {
    311         for (int j = 0; j < 5; j++)
    312         {
    313             ratio[i][j] = type[i][j] / real_stu;
    314         }
    315 
    316     }
    317 
    318     //print
    319     for (int i = 0; i < real_cou; i++)
    320     {
    321         printf("第 %d 课程的各等级占比为:
    ", i);
    322         for (int j = 0; j < 5; j++)
    323         {
    324             printf("		 %s 占比 %f: 
    ", getLevel(j), ratio[i][j]);
    325         }
    326 
    327     }
    328 
    329     return 0;
    330 }
    331 //(10)输出每个学生的学号、姓名、各科考试成绩、总分、平均分,以及每门课程的总分和平均分。
    332 int fun10() {
    333     for (int i = 0; i < real_stu; i++)
    334     {
    335         printf("姓名为%s	学号为%d	学生总分为%d	平均分为%d
    ", getStu(temp[i])->name, getStu(temp[i])->id, getStu(temp[i])->total_score, getStu(temp[i])->ave);
    336         for (int j = 0; j < real_cou; j++) {
    337             printf("	科目为:%s 	考试成绩为: %d	科目总分: %d	科目平均分 :%d 。
    ", 
    338                 getStu(temp[i])->courses[j].C_name, getStu(temp[i])->courses[j].C_score, C_total_score[i], C_ave[i]);
    339         }
    340     }
    341     return 0;
    342 }
    343 
    344 int getRanking(int id) {
    345     for (int i = 0; i < real_stu; i++) {
    346         if (id == temp[i]) {
    347             return i;//i即为排名
    348         }
    349     }
    350 }
    351 struct Stu* getStu(int id) {
    352     for (int i = 0; i < real_stu; i++)
    353     {
    354         if (stu[i].id == id) {
    355             return &stu[i];
    356         }
    357     }
    358     return NULL;
    359 }
    360 
    361 char* getLevel(int num) {
    362     //enum level {
    363     //    优秀 = 0, 良好, 中等, 及格, 不及格
    364     //};
    365     switch (num)
    366     {
    367     case 0:
    368 
    369         return "优秀";
    370     case 1:
    371 
    372         return "良好";
    373     case 2:
    374 
    375         return "中等";
    376     case 3:
    377 
    378         return "及格";
    379     case 4:
    380 
    381         return "不及格";
    382     default:
    383         return "unknown";
    384     }
    385 }
    View Code
  • 相关阅读:
    十天冲刺
    《构建之法》阅读笔记04
    每周学习进度第九周
    构建之法阅读笔记03
    返回一个一维整数数组中最大子数组的和(2)
    学习进度条
    冲刺日志05
    冲刺日志04
    冲刺日志03
    冲刺日志02
  • 原文地址:https://www.cnblogs.com/jiujue/p/12391816.html
Copyright © 2011-2022 走看看