学生成绩记录和排序
实验目的:练习指针、结构体数据类型和动态内容分配的使用方法
实验内容:
- 编写一个软件存储学生的姓名、学号、性别和A、B、C三门课程的成绩;
- 能够对所有学生的姓名、学号、性别和三门课程的成绩进行显示;
- 能够根据学生三门课程的总成绩对学生的记录进行排序并输出;
- 能够输出每位有不及格课程的学生的学号、姓名和不及格课程的名字和成绩;
实验要求:
- 程序开始询问学生数量,用户输入后根据用户输入的学生数量创建单向链表保存学生信息;
- 学生的性别用枚举类型Gender的对象来记录,输出的时候用Male和Female来显示;
- 根据总分排序需要调整链表节点的顺序以达到按照总分将链表节点降序排列;
- 作为一个软件,请为软件设计一个良好的交互流程和方式;
- 所有输出请采用格式化的表格形式对齐输出(不需要输出表格线);
代码实现:
#include"pch.h"//visual studio 编译必须添加的头文件预编译,可以去掉的。
#include<iostream>
#include<string.h>
#include <fstream>
#include"stdlib.h"
using namespace std;
enum gender{male,female};
struct Node {
int num;
char name[20];
float A;
float B;
float C;
gender sex;
float gradesum;
Node *next;
};
struct StudList
{
Node *head; //头节点
StudList();
void CreateList(); //创建链表
void Display(); //显示链表
int getlen(); //获取链表长度
Node *GetHead();
void pushBack();
void gradesum(Node *node); //求平均成绩
void sortsum(); //平均成绩排序
void CountNot(); //查询某一门学科不及格的人数和成绩单
int CountNotM();
int CountNotE();
int CountNotP();
};
void menu(StudList *list);
int main() {
StudList list;
list.CreateList();
menu(&list);
return 0;
}
StudList::StudList()
{
head = new Node();
head->next = NULL;
}
void StudList::Display() {
Node *cur = head;
int len = getlen();
cout << "len:" << len << endl;
while (len--) {
cout << " 学号:" << cur->num;
cout << " 姓名:" << cur->name;
cout << " A:" << cur->A;
cout << " B:" << cur->B;
cout << " C:" << cur->C;
if (cur->sex == 0) cout << "男";
else cout << "女";
cout << " 总成绩:" << cur->gradesum << endl;
cur = cur->next;
}
}
void StudList::CreateList()
{
head->num = 0;
}
void StudList::pushBack() {
Node *cur, *p, *t;
if (!head) {
head = new Node();
}
cur = head;
p = new Node();
t = head;
while (cur->next) {
cur = cur->next;
}
cout << "输入学号:" << endl;
cin >> p->num;
while (t) {
if (t->num == p->num) {
cout << "已存在该学号!" << endl;
return;
}
t = t->next;
}
cout << "输入姓名:" << endl;
cin >> p->name;
cout << "输入A成绩:" << endl;
cin >> p->A;
cout << "输入B成绩:" << endl;
cin >> p->B;
cout << "输入C成绩:" << endl;
cin >> p->C;
cout << "请输入性别0为男,1为女" << endl;
cin >> (int&)p->sex;
gradesum(p);
if (head->num == 0) {
head = p;
return;
}
cur->next = p;
p->next = NULL;
}
Node *StudList::GetHead() {
return head;
}
void StudList::gradesum(Node *node) {
node->gradesum = (node->A + node->B + node->C);
}
int StudList::getlen() {
int n = 0;
Node *cur;
cur = head;
while (cur) {
n++;
cur = cur->next;
}
return n;
}
void swapNode(Node *a, Node *b) { //交换两节点的信息
int temp;
char c;
float ft;
temp = a->num;
a->num = b->num;
b->num = temp;
for (int i = 0; i < 20; i++) {
c = a->name[i];
a->name[i] = b->name[i];
b->name[i] = c;
}
ft = a->A;
a->A = b->A;
b->A = ft;
ft = a->B;
a->B = b->B;
b->B = ft;
ft = a->C;
a->C = b->C;
b->C = ft;
ft = a->gradesum;
a->gradesum = b->gradesum;
b->gradesum = ft;
}
void StudList::sortsum() {
int len, inlen, rank = 1;
Node *cur;
cur = head;
len = getlen();
while (--len) {
inlen = len;
cur = head;
while (cur&&inlen--) {
if (cur->gradesum < cur->next->gradesum) {
swapNode(cur, cur->next);
}
cur = cur->next;
}
}
cur = head;
while (cur) {
cout << "学号:" << cur->num << " 姓名:" << cur->name << " A-成绩:" << cur->A << " B-成绩:" << cur->B
<< " C-成绩:" << cur->C << " 成绩:" << cur->gradesum << " 名次:" << rank << endl;
if (cur->next&&cur->gradesum == cur->next->gradesum) {
cur = cur->next;
continue;
}
rank++;
cur = cur->next;
}
}//统计不及格成绩名单
int StudList::CountNotM() {
int n = 0;
Node *cur;
cur = head;
while (cur) {
if (cur->A < 60) {
cout << "学号:" << cur->num << " 姓名:" << cur->name << " 成绩:" << cur->A << endl;
n++;
}
cur = cur->next;
}
cout << "共计A不及格人数:" << n << endl;
return n;
}
int StudList::CountNotE() {
int n = 0;
Node *cur;
cur = head;
while (cur) {
if (cur->B < 60) {
cout << "学号:" << cur->num << " 姓名:" << cur->name << " 成绩:" << cur->B << endl;
n++;
}
cur = cur->next;
}
cout << "共计B不及格人数:" << n << endl;
return n;
}
int StudList::CountNotP() {
int n = 0;
Node *cur;
cur = head;
while (cur) {
if (cur->C < 60) {
cout << "学号:" << cur->num << " 姓名:" << cur->name << " 成绩:" << cur->C << endl;
n++;
}
cur = cur->next;
}
cout << "共计C不及格人数:" << n << endl;
return n;
}
void StudList::CountNot() {
int m;
cout << "1.统计A不及格名单。" << endl;
cout << "2.统计B不及格名单。" << endl;
cout << "3.统计C不及格名单。" << endl;
cout << "输入选择方式:";
cin >> m;
switch (m) {
case 1:
CountNotM();
break;
case 2:
CountNotE();
break;
case 3:
CountNotP();
break;
default:
break;
}
}
//菜单
void menu(StudList *list) {
int a;
cout << "************************************" << endl;
cout << "** 欢迎使用学生成绩表管理系统 **" << endl;
cout << "************************************" << endl;
while (1) {
system("pause");
system("cls");
cout << "********************************" << endl;
cout << "* 0.添加一个成员。 *" << endl;
cout << "* 1.显示学生成绩表。 *" << endl;
cout << "* 2.统计某一课成绩不及格人数。*" << endl;
cout << "* 3.成绩排名。 *" << endl;
cout << "********************************" << endl;
cin >> a;
switch (a) {
case 0:
list->pushBack();
break;
case 1:
list->Display();
break;
case 2:
list->CountNot();
break;
case 3:
list->sortsum();
break;
return;
}
}
}