学生成绩管理程序

学生成绩管理



问题描述

1、 可以存储学生的姓名、学号、性别和 A、B、C 三
门课程的成绩;
2、 能够对所有学生的姓名、学号、性别和三门课程的成绩进
行显示;
3、 能够根据学生三门课程的总成绩对学生的记录进行排序并
输出;
4、 能够输出每位有不及格课程的学生的学号、姓名和不及格
课程的名字和成绩;


问题分析

输入:
用户输入要录入的学生人数
用户输入要录入的学生信息(姓名、学号、性别和A、B、C课程成绩)
用户选择相应功能的输入

输出:
输出所有学生的所有信息
输出按三门课程总成绩降序排序后的所有学生的所有信息
输出每位有不及格课程的学生的学号、姓名和不及格课程的名字和成绩;

主要处理过程:
根据用户输入建立链表存储学生信息
按照三门课程总成绩降序排序并输出排序后的结果
判断每名学生是否有课程不及格并输出判断结果为true的 学生的学号、姓名和不及格课程的名字和成绩


流程设计

process

模块介绍

链表创建模块:
采用尾插发创建单向链表封装成函数
creatLink需要传入节点个数n,返回有n个 节点的链表的头指针,完成存储结构的创建

排序模块:
封装成函数lowerOrder
需要传入链表的头指针,对该链表进行降序排序 后,调用输出函数getMessage输出排序后的所有 学生信息

输出模块:
封装成函数getMessage
需要传入链表的头指针,输出该链表所有节点的 出指针域外的所有信息

输出不及格学生模块:
封装成函数failStuMessage
需要传入学生信息链表的头指针, 输出不及格学生的学号,姓名和不 及格课程的名字、成绩


源代码

#include <iostream>
#include <string.h>
#include <new>
#include<conio.h>
#include<stdlib.h>

using namespace std;

enum Gender {Male,Female};

//初始化学生的信息(模拟用户输入情形)
//定义学生学号数组,这里只是不用重复输入,在结构体数组中读取即可(测试用)读者可将其改为接受用户输入
char stuNo[5][20] = {
    "2018117001",
    "2018117002",
    "2018117003",
    "2018117004",
    "2018117005",
    };
//定义学生姓名数组
char stuName[5][20] = {
    "Tom",
    "Amy",
    "Lily",
    "Jack",
    "Rose",
};
//定义学生性别数组
Gender stuSex[5] = {Male,Female,Female,Male,Female};
//定义学生三门课成绩数组
double stuA[5] = {45.54,59.5,68.5,75.5,85.0};
double stuB[5] = {55.5,87.6,45.26,98.5,35.4};
double stuC[5] = {78.6,58.65,95.5,46.2,76.55};


typedef struct Node{
    char no[20]; //学号
    char name[20];//姓名
    Gender sex;//性别
    double scoreA;//三门课成绩
    double scoreB;
    double scoreC;
    struct Node* next;
}node,*link;


//创建单链表
link createLink(){
    //创建头节点
    link h = new node;
    //用尾指针r指向头结点
    h ->next = NULL;
    link r = h;
//尾插法
    for(int i=0;i<5;i++){
        link n = new node;
        n ->next = NULL;
        strcpy(n->no,stuNo[i]);
        strcpy(n->name,stuName[i]);
        n->sex = stuSex[i];
        n->scoreA = stuA[i];
        n->scoreB = stuB[i];
        n->scoreC = stuC[i];
        r ->next = n;
        r = n;
    }
    return h;
}

//显示所有学生信息
void getMessage(link L){
    link p = L->next;
    cout << "学号\t\t姓名\t性别\tA\tB\tC" << endl;
    while(p){
        cout << p->no << "\t" << p->name << "\t" ;
        if(p->sex == 0)
            cout << "Male";
        else
            cout << "Female";
        cout<< "\t" << p->scoreA<<"\t" <<p->scoreB<< "\t" << p->scoreC<<endl;
        p = p->next;
    }

    char answer;
    cout << "pressing any key to continue: ";
    answer = getch();
}

//总成绩降序排序并输出排序后学生的信息
void lowerOrder(link L){
    link p = L;
    //这里使用选择排序法进行排序
    //区别是,这里的p,q,m始终指向应该指向元素的前一个元素,方便交换两个节点的位置
    while(p->next){
        link m = p;
        link q = p->next;
        while(q->next){
            if((q->next->scoreA + q->next->scoreB + q->next->scoreC) > (m->next->scoreA + m->next->scoreB + m->next->scoreC))
                m = q;
                q = q->next;
        }
		//以下交换节点指针域的顺序不可改变,否则会进入死循环
        link temp;
        temp = p->next;
        p->next = m->next;
        m->next = temp;

        temp = p->next->next;
        p->next->next = m->next->next;
        m->next->next = temp;

        p = p->next;

    }

    getMessage(L);

}

void failStuMessage(link L){
    link p = L->next;
    //这里大量使用选择控制语句实现函数功能,读者可以采用更为简单的方法
    while(p){
        if(p->scoreA < 60){
            if(p->scoreB < 60){
                if(p->scoreC < 60){
                    cout <<p->no << "\t" << p->name << "\tA:" << p->scoreA
                    << "\tB:" << p->scoreB << "\tC:" <<p->scoreC <<endl;
                }
                else{
                    cout <<p->no << "\t" << p->name << "\tA:" << p->scoreA
                    << "\tB:" << p->scoreB <<endl;
                }
            }
            else{
                    if(p->scoreC < 60)
                    cout <<p->no << "\t" << p->name << "\tA:" << p->scoreA <<"\tC:" << p->scoreC <<endl;
            }
        }
        else{
            if(p->scoreB<60){
                if(p->scoreC<60){
                    cout <<p->no << "\t" << p->name << "\tB:" << p->scoreB << "\tC:" <<p->scoreC <<endl;
                }
                else{
                    cout <<p->no << "\t" << p->name << "\tB:" << p->scoreB <<endl;
                }
            }
            else{
                if(p->scoreC<60){
                    cout <<p->no << "\t" << p->name << "\tC:" << p->scoreC <<endl;
                }
            }
        }
        p = p->next;
    }
    char answer;
    cout << "pressing any key to continue: ";
    answer = getch();
}



int main()
{
    cout << "welcome to use the system!" <<endl;
    cout << "pressing any keys to continue ";
    char ch;
    ch = getch();
    system("cls");
//程序控制语句
    do{
             link L = createLink();
            cout << "A: Output all of the messages of students "<<
            endl << "B:Output Low the order of which total score of three courses"<<
            endl << "C:Output all of the failure students "<<
            endl << "D:exit the system" <<
            endl << "please select:";

            ch = getch();
            system("cls");
            switch(ch){
                case 'A':getMessage(L);break;
                case 'B':lowerOrder(L);break;
                case 'C':failStuMessage(L);break;
                default:break;
            }
            system("cls");
    }while(ch != 'D');

    cout << "Thanks to use,goodbye!";
    return 0;
}

功能测试

Feature A:

A

Feature B:
B
Feature C:
C
Feature D:

D

更多相关内容请参见

我的博客

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值