m0_62791243 2022-05-09 10:04 采纳率: 80%
浏览 39
已结题

学生成绩管理程序只能输入姓名,无法输入其他的信息,如何解决?(语言-c++)

也不知道哪里出了问题,最后有截图
#include <iostream>
#include<stdlib.h>
#include <fstream>
#include <cstdlib>
using namespace std;
struct sleep {
    char name;//姓名
    int id;//学号
    int Math;//数学成绩
    int Chinese;//语文成绩
    int English;//英语成绩
    int total;//总成绩
    sleep* bed;
};
class Student {
public:
    Student() {//构造函数
    dream = new sleep;
    dream->bed = NULL;
    }
    ~Student(){//析构函数
    sleep* hard;
    while (dream) {
        hard = dream;
        dream = dream->bed;
        delete hard;
      }
    dream = NULL;
     }
    void creat();
    void add(char sname, int sid, int smath, int schinese, int senglish);
    void edit(char sname, int sid, int smath, int schinese, int senglish);
    void deleted(int sid);
    sleep *find(int sid);
    void count();
    void copy(sleep* temp, sleep* p);//学生信息拷贝
    void arrange(int mod);
    void gradepage();
private:
    sleep* dream;

};

void menuscreen()//程序开始的菜单界面
{
    cout << "学生信息管理程序\n";
    cout << "*****************\n";
    cout<<"1--创建成绩单\n";
    cout << "2--添加学生\n";
    cout << "3--编辑学生\n"  ;
    cout << "4--删除学生\n";
    cout << "5--查找学生\n";
    cout << "6--统计成绩\n";
    cout << "7--排序成绩\n";
    cout << "8--显示成绩\n";
    cout << "9--Quit\n";
}
void Student::creat()//创建成绩单
{
    cout << "开始创建成绩单!\n";
    int n;
    sleep* p, * s;
    p = dream;
    cout << "please enter the number of the student:";
    cin >> n;
    for (int i = 0; i <= n; i++)
    {
        s = new sleep;
        cout << "please enter student" << i + 1 << "'s Name:";
        cin >> s->name;
        cout << "please enter student" << i + 1 << "'s ID:";
        cin >> s->id;
        cout << "please enter student" << i + 1 << "'s Math Score:";
        cin >> s->Math;
        cout << "please enter student" << i + 1 << "'s Chinese Score:";
        cin >> s->Chinese;
        cout << "please enter student" << i + 1 << "'s English Score:";
        cin >> s->English;
        s->total = s->Math + s->Chinese + s->English;
        s->bed = p->bed;//s的值赋给p
        p->bed = s;
        p = p->bed;
    }
    if (p == NULL)   //判断成绩单是否创建成功
    {
        cout << "error!";
        creat();
    }
    else cout << "创建成功!";
}

void Student::add(char sname, int sid,int smath, int schinese, int senglish)//在第一个位置插入学生
{
    cout <<"开始添加学生!\n";
    sleep* s, * p;
    s = new sleep;
    cout << "please enter name:"; cin >> sname;
    cout << "please enter id:"; cin >> sid;
    cout << "please enter math:"; cin >> smath;
    cout << "please enter chinese:"; cin >> schinese;
    cout << "please enter english:"; cin >> senglish;
    s->name = sname;
    s->id = sid;
    s->Math = smath;
    s->Chinese = schinese;
    s->English = senglish;
    s->total = s->Math + s->Chinese + s->Chinese;
    p = dream;
    s->bed = p->bed;
    p->bed = s;
    cout << "添加完成!";
}

void Student::edit(char sname, int sid, int smath, int schinese, int senglish)
{
    cout << "开始编辑学生!\n";
    sleep* a = find(sid);   //调用查找函数
    if (a != NULL)
    {
        a->name = sname;
        a->id = sid;
        a->Math = smath;
        a->Chinese = schinese;
        a->English = senglish;
        a->total = a->Math + a->Chinese + a->English;
    }
    cout << "编辑完成!";
}

void Student::deleted(int sid)
{
    cout << "开始删除学生!\n";
    sleep* p, * ptemp;
    p = dream;
    ptemp = p;
    while (p->bed && p->id != sid)//循环终止条件为p->bed不为空而且没有找到对应学号的学生
    {
        ptemp = p;
        p = p->bed;
    }
    if (p->id == sid)
    {
        ptemp->bed = p->bed;
        delete p;
        cout << "删除完成!";
    }
    else
    {
        cout << "error!" << endl;
    }
}

sleep *Student::find(int sid)
{
    cout << "开始查找学生!\n";
    sleep* p;
    p = dream->bed;
    while (p->bed && p->id != sid)   //循环终止条件为p->bed不为空 而且没有找到相应学号的学生
    {
        p = p->bed;
    }
    if (p->id ==sid)
    {
        return p;//输出学生信息
    }
    else
    {
        cout << "未找到该学生信息!" << endl;
        return NULL;
    }
}

void Student::count()
{
    cout << "开始统计成绩!\n";
    int grade[3] = {};
    sleep* p = dream->bed;
    while (p != NULL)
    {
        if (p->Math>=90)
        {
            grade[0]++;
        }
        else if (p->Chinese>=90)
        {
            grade[1]++;
        }
        else if (p->English>=90)
        {
            grade[2]++;
        }
        p = p->bed;
    }
    cout << "数学优秀" << '\t' << "语文优秀" << '\t' << "英语优秀" << '\t' << endl;
    for (int i = 0; i < 3; i++)
    {
        cout << grade[i] << '\t';
    }
    cout << endl;
}

void Student::copy(sleep *temp,sleep *p) {
    if (p == NULL)
    {
        cout << "拷贝目标为空!";
    }
    else
    {
        temp->bed = p->bed;//将p的信息复制到temp中  
    }
}

void Student::arrange(int mod) {
    
    cout << "开始排序成绩单!\n";
    if (mod==1)//升序排列
    {
        for (sleep* p = dream->bed; p != NULL; p = p->bed)
        {
            for (sleep* q = dream->bed; q != NULL; q = q->bed)
            {
                if (p->total > q->total)
                {
                    sleep* temp = new sleep;
                    copy(temp, p);
                    copy(p, q);
                    copy(q, temp);
                }
            }
        }
    }
    else if (mod==2)//降序排列
    {
        for (sleep* p = dream->bed; p != NULL; p = p->bed)
        {
            for (sleep* q = dream->bed; q != NULL; q = q->bed)
            {
                if (p->total < q->total)
                {
                    sleep* temp = new sleep;
                    copy(temp, p);
                    copy(p, q);
                    copy(q, temp);
                }
            }
        }
    }
    else if (mod==3)//按学号排序
    {
        for (sleep* p = dream->bed; p != NULL; p = p->bed)
        {
            for (sleep* q = dream->bed; q != NULL; q = q->bed)
            {
                if (p->id < q->id)
                {
                    sleep* temp = new sleep;
                    copy(temp, p);
                    copy(p, q);
                    copy(q, temp);
                }
            }
        }
        cout<<"排序完成!";
    }
    else
    {
        cout << "error!" << endl;
    }
}

void Student::gradepage()//输出学生信息
{
    cout<<"Gradepage!";
    sleep* p;
    cout << "姓名"<<'\t'<<"学号" << '\t' << "数学" << '\t' << "英语" << '\t' << "语文" << '\t' << "总分" << endl;
    for (p = dream->bed; p != NULL; p = p->bed)
    {
        cout << p->name << '\t' << p->id << '\t' << p->Math << '\t' << p->Chinese << '\t' << p->English << '\t' << p->total << endl;
    }
}
int main() {
    char sname{};
    int sid{}; int smath{}; int schinese{}; int senglish{}; int mod{};
    for(;;){
    int s;
    Student tired;
    menuscreen();
    cout << "Please select a number:";//选择菜单编号
    cin >> s;
    switch (s)
    {
    case 1: tired.creat(); tired.gradepage(); break;
    case 2: tired.add(sname,sid, smath,schinese,senglish); tired.gradepage(); break;
    case 3: tired.edit(sname, sid, smath, schinese, senglish); tired.gradepage(); break;
    case 4: tired.deleted(sid); tired.gradepage(); break;
    case 5:tired.find(sid); break;
    case 6: tired.count();
        break;
    case 7: tired.arrange(mod);
        int mod;
        cout << "你需要如何排序:\n";
        cout << "1——按总成绩升序排列\n";
        cout << "2——按总成绩降序排列\n";
        cout << "3——按学号升序排列\n";
        cin >> mod;
        if (mod == 1 || mod == 2 || mod == 3)
        {
            tired.gradepage();
        }
        else
        {
            cout << "请输入正确选择!" << endl;
        }
        break;
    case 8:tired.gradepage(); break;
    case 9:goto end; break;//引用标签end,如果选择9,则退出
    default:cout << "error!"; break;
    }
    system("pause");
end:system("pause");//end的定义
    }
    return 0;
}

  • 写回答

3条回答 默认 最新

  • Ltd Pikashu CSDN实力新星 2022-05-09 10:43
    关注

    从打印输出里找异常打印是最常用的找代码问题的方法

    1. 截图里你输入到 张三之后就出问题了,那么问题就可以从你输入张三的前后代码段开始找
    2. 找到函数 create ,对应到s->name,对比变量类型就可以找出你的问题所在了
    3. name 的类型为 char,本应该只输入一个字符,但是你输入了 两个中文字符,这就导致后面信息的输入错乱,程序就异常处理了

    解决:把 char name 改成 string name就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 已采纳回答 5月9日
  • 修改了问题 5月9日
  • 创建了问题 5月9日

悬赏问题

  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比