学生成绩管理
问题描述
1、 可以存储学生的姓名、学号、性别和 A、B、C 三
门课程的成绩;
2、 能够对所有学生的姓名、学号、性别和三门课程的成绩进
行显示;
3、 能够根据学生三门课程的总成绩对学生的记录进行排序并
输出;
4、 能够输出每位有不及格课程的学生的学号、姓名和不及格
课程的名字和成绩;
问题分析
输入:
用户输入要录入的学生人数
用户输入要录入的学生信息(姓名、学号、性别和A、B、C课程成绩)
用户选择相应功能的输入
输出:
输出所有学生的所有信息
输出按三门课程总成绩降序排序后的所有学生的所有信息
输出每位有不及格课程的学生的学号、姓名和不及格课程的名字和成绩;
主要处理过程:
根据用户输入建立链表存储学生信息
按照三门课程总成绩降序排序并输出排序后的结果
判断每名学生是否有课程不及格并输出判断结果为true的 学生的学号、姓名和不及格课程的名字和成绩
流程设计
模块介绍
链表创建模块:
采用尾插发创建单向链表封装成函数
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:
Feature B:
Feature C:
Feature D:
更多相关内容请参见