C++实现学生成绩管理系统(附源码)

【注】致力于讲知识讲明白!不懂请留言!

系统分析

本系统主要是用文件和链表来完成对学生成绩信息处理。
1.输入记录模块,完成将数据存入链表中。
2、查询记录模块,完成在链表中查询学生信息。
3、更新记录模块,对学生信息的维护。
4、统计数据模块,完成对学生各功课的最高分和及格人数的统计。
5 、输出记录模块, 完成对学生信息的输出.

系统功能模块图

在这里插入图片描述

流程图分析

在这里插入图片描述

源代码分析

定义结构体,用来存放学生信息

struct student
{
    char name[10];            // 姓名
    char  id[10];        	 // 学号
    float  Ynum;         	 //语文分数
    float  Snum;      		 //数学分数
    float  Enum;       		 //英语分数
    float  number;    		//总分
    student* next;
};

定义类(包含所用到函数,以及析构函数)

class stud
{
    student* p1, * p2, * head;
public:

    ~stud()                     //析构函数(用来释放空间)
    {

        while (head)
        {
            p1 = head->next;
            delete head;
            head = p1;
        }
    }
    /*
    成员函数
    */
    void output(student* head);             		  //  输出学生成绩
    student* input(student* head);           		 //  增加学生记录
    student* del(student* head, char* p);  			 //  删除记录
    student* find(student* head, char* p, int& n);  // 查找学生记录(可查找多个同名数据)
    student* stat(student* head);       			//排序统计学生总分
    friend void total(student* head);  				 //统计学生总分
    student* insert(student* head);  				 //按学生总分插入记录
    student* clear(student* head);  				 // 删除当前表
    void Inputs(student* p);       					//用于添加数据的子函数
};

各个函数的实现

//用于添加数据的子函数
void stud::Inputs(student* p)
{
    cout << setw(6) << "姓名" << setw(8) << " 学号"
        << setw(8) << "语文" << setw(8) << "数学"
        << setw(8) << "英语" << endl;

    cin >> p->name >> p->id;
    cin >> p->Ynum;
    while (cin.fail())
    {
        cerr << "您的输入有误,请重新输入" << endl;
        cin.clear();
        cin.sync();
        cin >> p->Ynum;
    }
    cin >> p->Snum;
    while (cin.fail())
    {
        cerr << "您的输入有误,请重新输入" << endl;
        cin.sync();
        cin.clear();
        cin >> p->Snum;
    }
    cin >> p->Enum;
    while (cin.fail())
    {
        cerr << "您的输入有误,请重新输入" << endl;
        cin.clear();
        cin.sync();
        cin >> p->Enum;
    }
    total(p); //计算出总分
}

//输出学生成绩
void stud::output(student* head)
{
    p1 = head;
    while (p1 != NULL)
    {
        cout << setw(6) << p1->name << setw(8)
            << p1->id << setw(8) << p1->Ynum
            << setw(8) << p1->Snum << setw(8)
            << p1->Enum << setw(7) << p1->number << endl;
        p1 = p1->next;
    }
}

//插入学生成绩记录
student* stud::insert(student* head)
{
    p1 = new student;
    Inputs(p1); //调用子函数 增加数据

    p2 = head;
    student* p3 = NULL;
    while ((p2->number < p1->number) && p2->next != NULL)
    {
        p3 = p2;
        p2 = p2->next;
    }
    if (p2->number > p1->number)
    {
        p1->next = p2;
        if (p3 == NULL) //  若当前值是最小的
            return p1;
        p3->next = p1;
        return head;
    }
    else
    {
        p2->next = p1;
        p1->next = NULL;
        return head;
    }


//清空数据
student* stud::clear(student* head)
{
    while (head)
    {
        p1 = head->next;
        delete head;
        head = p1;
    }
    return head;
}

//排序统计函数
student* stud::stat(student* head)
{
    p2 = head;
    p1 = p2->next;

    while (p2->next)  //冒泡法
    {

        if (p2->number > p1->number)
        {         // 把头指针指向当前比较小的节点
            p2->next = p1->next;
            p1->next = head;
            head = p1;

            // 把用于比较的两个指针复位             
  //p2=head;      
            p1 = p2->next;
        }
        else
        {           // 指向下一个节点
            p2 = p2->next;
            p1 = p2->next;
        }//-------------------------------------------

    }
    cout << "当前表以按学生总分排序成功" << endl;
    return head;
}

//删除记录
student* stud::del(student* head, char* p)
{
    p1 = head;
    p2 = NULL;

    while (strcmp(p1->name, p) && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }

    if (!strcmp(p1->name, p))
    {
        if (p1 == head)
            head = p1->next;
        else
            p2->next = p1->next;

        cout << "删除成功,OK" << endl;
        delete p1;
    }
    else
        cout << " 没找到姓名" << p << "的学生.\n"; //结点没找到

    return head;
}

//统计总分
void total(student* p)
{
    p->number = p->Ynum + p->Snum + p->Enum;

}

//查找函数
student* stud::find(student* head, char* p, int& n)
{
    p2 = head;
    while (strcmp(p2->name, p) != 0 && p2->next != NULL)
        p2 = p2->next;
    if (0 == strcmp(p2->name, p))
    {
        cout << setw(6) << p2->name << setw(8)
            << p2->id << setw(8) << p2->Ynum
            << setw(8) << p2->Snum << setw(8)
            << p2->Enum << setw(7) << p2->number << endl;
        n++;
        return p2;
    }
    else
        if (n == 0)
        {
            system("cls");
            cout << "对不起,没有您要查找的学生数据" << endl;
        }
    return NULL;
}

//增加学生记录
student* stud::input(student* head)
{
    p1 = new student;
    p2 = head;
    Inputs(p1); //调用子函数 增加数据 
    if (head == NULL)
    {
        head = p1;
        p1->next = NULL;
        return head;
    }
    while (p2->next != NULL)
        p2 = p2->next;
    p2->next = p1;
    p1->next = NULL;

    return head;
}

主函数实现

int main(void)
{
    stud stus;
    student* head = NULL;
    student* pd; //临时指针, 用于查找函数
    char choice; //用于存放用户的选择项
    char name[10];  //查找,删除记录的 key
    while (1)
    {
        system("cls");
        cout << " ☆   学 生 成 绩 管 理 系  统    ☆  " << endl;
        cout << "    ┣━━━━━━━━━-━┫" << endl;
        cout << "    ┃   1.增加学生成绩    ┃" << endl;
        cout << "    ┃   2.显示学生成绩    ┃" << endl;
        cout << "    ┃   3.排序统计成绩    ┃" << endl;
        cout << "    ┃   4.查找学生成绩    ┃" << endl;
        cout << "    ┃   5.删除学生成绩    ┃" << endl;
        cout << "    ┃   6.插入学生成绩    ┃" << endl;
        cout << "    ┃   7.清空所有数据    ┃" << endl;
        cout << "    ┃   8.安全退出系统    ┃" << endl;
        cout << "    ┗━━━━━━━━-━━┛" << endl;
        cout << " 请输入您的选择(1--8):"; cout << endl;

        int n = 0; //计数器,用于在查找时计算有没有同名学生
        cin >> choice;
        fflush(stdin);

        if (choice == '8')  //安全退出
        {
            cout << "谢谢使用,再见" << endl;
            exit(0);
        }//------------------------------------------------
        switch (choice)
        {
        case '1':
            head = stus.input(head);
            break;//------------------------------------------------
        case '2':
            if (head == NULL)
            {
                error();
                break;
            }
            cout << setw(6) << "姓名" << setw(8) << " 学号"
                << setw(8) << "语文" << setw(8) << "数学"
                << setw(8) << "英语" << setw(13) << "总分!!!" << endl;
            stus.output(head);
            _getch();
            break;//------------------------------------------------
        case '3':
            if (head == NULL)
            {
                error();
                break;
            }
            head = stus.stat(head);
            _getch();
            break;//------------------------------------------------

        case '4':
            if (head == NULL)
            {
                error(); //调用函数输出错误信息
                break;
            }
            cout << "请输入想要查找的学生姓名" << " ," << "本系统可以查找重复姓名学生" << endl;
            cin >> name;
            pd = head;
            cout << setw(6) << "姓名" << setw(8) << " 学号"
                << setw(8) << "语文" << setw(8) << "数学"
                << setw(8) << "英语" << setw(13) << "总分!!!" << endl;

            while (pd)   // 循环调用函数, 用于输出多个的同名学生成绩
            {
                pd = stus.find(pd, name, n);
                if (pd == NULL)
                    break;
                pd = pd->next; //指针指向当前以找到的下一个节点,用于查找多个同名学生
            }
            _getch();
            break;//------------------------------------------------
        case '5':
            if (head == NULL)
            {
                error();
                break;
            }
            cout << "请输入想要删除学生姓名" << endl;

            cin >> name;
            head = stus.del(head, name);
            _getch();
            break;//------------------------------------------------

        case '6':
            if (head == NULL)
            {
                error();
                break;
            }
            head = stus.stat(head);
            head = stus.insert(head);
            break;//-----------------------------------------------
        case '7':
            if (head == NULL)
            {
                error();
                break;
            }
            head = stus.clear(head);
            cout << "删除表成功~" << endl;
            _getch();
            break;//-----------------------------------------------
        default:
            cout << " 对不起,您的输入有误,请重新输入。\n";
            _getch();
            break;
        }//------------------------------------------------------
    }
    _getch();
    return 0;
}

实现效果图

在这里插入图片描述

源码

链接: https://pan.baidu.com/s/1Qo-I-sM2Am68MKzr2a8hDQ
提取码:ufd5

发布了33 篇原创文章 · 获赞 38 · 访问量 8446

猜你喜欢

转载自blog.csdn.net/weixin_44480968/article/details/104748826