关于C++程序运行问题


#include<fstream>
#include<string>    
#include<iostream>    
using namespace std;
//学生类 
class Student {
public:
    void stu_Name(string Name) {
        this->Name = Name;
    }

    void stu_Sex(string Sex) {
        this->Sex = Sex;
    }
    void stu_Major(string Major) {
        this->Major = Major;
    }
    void stu_Year(int Year) {
        this->Year = Year;
    }
    void stu_Month(int Month) {
        this->Month = Month;
    }
    void stu_Day(int Day) {
        this->Day = Day;
    }
    void stu_Adress(string Adress) {
        this->Adress = Adress;
    }
    void stu_Score(int Score) {
        this->Score = Score;
    }
    string get_Name() {
        return Name;
    }
    string get_Sex() {
        return Sex;
    }
    string get_Major() {
        return Major;
    }
    int get_Year() {
        return Year;
    }
    int get_Month() {
        return Month;
    }
    int get_Day() {
        return Day;
    }
    string get_Adress() {
        return Adress;
    }
    int get_Score() {
        return Score;
    }
private:
    string Name;
    string Sex;
    string Major;
    int Year;
    int Month;
    int Day;
    string Adress;
    int Score;
};
typedef struct StuNode {
    Student s;
    struct StuNode* next;
} stu;
//链表类 
class StuListLink {
public:
    void add(stu* head);
    void print(stu* head);
    void Delete(stu* head);
    void Sort(stu* head);
    void Look(stu* head);
    void sta_Sex(stu* head);
    void sta_Major(stu* head);
    void sta_Age(stu* head);
    void Save(stu* head);
private:
    stu* head;
    stu* tail;
    int count;
};
void StuListLink::add(stu*head) {
    stu* p;
    cout << "请输入学生总数:" << endl;
    cin >> count;
    if (count < 0) {
        cout << "错误,总数不能小于0" << endl;
        return;
    }
    head = new stu;
    head->s.stu_Name("\0");
    head->s.stu_Sex("\0");
    head->s.stu_Major("\0");
    head->s.stu_Year(0);
    head->s.stu_Month(0);
    head->s.stu_Day(0);
    head->s.stu_Adress("\0");
    head->s.stu_Score(0);
    head->next = NULL;
    tail = head;
    for (int i = 0; i < count; i++) {
        cout << "请输入第" << i + 1 << "个学生的信息" << endl;
        p = new stu;
        cout << "请输入学生姓名" << endl;
        string c1;
        cin >> c1;
        p->s.stu_Name(c1);
        cout << "请输入学生性别" << endl;
        cin >> c1;
        while (c1 != "男" && c1 != "女") {
            cout << "输入有误,请重新输入" << endl;
            cin >> c1;
        }
        p->s.stu_Sex(c1);
        cout << "请输入学生专业" << endl;
        cin >> c1;
        p->s.stu_Major(c1);
        cout << "请输入学生出生日期\n年:" << endl;
        int i1;
        cin >> i1;
        while (i1 < 2000 || i1>2021) {
            cout << "输入有误,请重新输入" << endl;
            cin >> i1;
        }
        p->s.stu_Year(i1);
        cout << "月:" << endl;
        cin >> i1;
        while (i1 < 1 || i1>12) {
            cout << "输入有误,请重新输入" << endl;
            cin >> i1;
        }
        p->s.stu_Month(i1);
        cout << "日:" << endl;
        cin >> i1;
        while (i1 < 1 && i1>31) {
            cout << "输入有误,请重新输入" << endl;
            cin >> i1;
        }
        p->s.stu_Day(i1);
        cout << "请输入学生住址" << endl;
        cin >> c1;
        p->s.stu_Adress(c1);
        cout << "请输入学生成绩" << endl;
        cin >> i1;
        p->s.stu_Score(i1);
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    cout << "学生信息添加成功,一共添加" << count << "个学生的信息" << endl;
    system("pause");
}
//打印全部学生信息 
void StuListLink::print(stu*head) {
    stu* p = head;
    p = p->next;
    int a = 0;
    while (p != NULL) {
        a++;
        cout << a << ".\n" << "学生姓名: " << p->s.get_Name() << "\n学生性别: " << p->s.get_Sex() << "\n学生专业: " << p->s.get_Major() << "\n学生出生日期:年/月/日 " << p->s.get_Year() << "/" << p->s.get_Month() << "/" << p->s.get_Day() << "\n学生住址: " << p->s.get_Adress() << "\n学生英语成绩: " << p->s.get_Score() << "\n\n" << endl;
        p = p->next;
    }
    system("pause");
}
//按姓名查找学生 
void StuListLink::Look(stu* head) {
    stu* p, * p1;
    p = head;
    p1 = p->next;
    cout << "请输入要查找学生的姓名:" << endl;
    string N1;
    cin >> N1;
    while (p1 != NULL) {
        if (p1->s.get_Name() == N1) {
            cout << "学生姓名: " << p1->s.get_Name() << "\n学生性别: " << p1->s.get_Sex() << "\n学生专业: " << p1->s.get_Major() << "\n学生出生日期:年/月/日 " << p1->s.get_Year() << "/" << p1->s.get_Month() << "/" << p1->s.get_Day() << "\n学生住址: " << p1->s.get_Adress() << "\n学生英语成绩: " << p1->s.get_Score() << "\n\n" << endl;
            cout << "查找完毕" << endl;
            system("pause");
            return;
        }
        p = p1;
        p1 = p->next;
    }
    if (p1 == NULL) {
        cout << "没有该学生!" << endl;
        system("pause");
    }
}
//删除学生信息 
void StuListLink::Delete(stu* head) {
    stu* p, * p1;
    p = head;
    p1 = p->next;
    cout << "请输入要删除学生的姓名:" << endl;
    string N1;
    cin >> N1;
    while (p1 != NULL) {
        if (p1->s.get_Name() == N1) {
            p->next = p1->next;
            delete p1;
            cout << "删除成功:" << endl;
            system("pause");
            return;
        }
        p = p1;
        p1 = p->next;
    }
    if (p1 == NULL) {
        cout << "没有该学生!" << endl;
        system("pause");
    }
}
//统计性别 
void StuListLink::sta_Sex(stu* head) {
    stu* p, * p1;
    p = head;
    p1 = p->next;
    cout << "请输入要统计的性别:" << endl;
    string S1;
    cin >> S1;
    int k = 0;
    while (p1 != NULL) {
        if (p1->s.get_Sex() == S1) {
            k++;
            cout << "学生姓名: " << p1->s.get_Name() << "\n学生性别: " << p1->s.get_Sex() << "\n学生专业: " << p1->s.get_Major() << "\n学生出生日期:年/月/日 " << p1->s.get_Year() << "/" << p1->s.get_Month() << "/" << p1->s.get_Day() << "\n学生住址: " << p1->s.get_Adress() << "\n学生英语成绩: " << p1->s.get_Score() << "\n\n" << endl;
        }
        p = p1;
        p1 = p->next;
    }
    cout << "有" << k << "个" << S1 << "生" << endl;
    system("pause");
}
//统计专业 
void StuListLink::sta_Major(stu* head) {
    stu* p, * p1;
    p = head;
    p1 = p->next;
    cout << "请输入要统计的专业:" << endl;
    string M1;
    cin >> M1;
    int k = 0;
    while (p1 != NULL) {
        if (p1->s.get_Major() == M1) {
            k++;
            cout << "学生姓名: " << p1->s.get_Name() << "\n学生性别: " << p1->s.get_Sex() << "\n学生专业: " << p1->s.get_Major() << "\n学生出生日期:年/月/日 " << p1->s.get_Year() << "/" << p1->s.get_Month() << "/" << p1->s.get_Day() << "\n学生住址: " << p1->s.get_Adress() << "\n学生英语成绩: " << p1->s.get_Score() << "\n\n" << endl;
        }
        p = p1;
        p1 = p->next;
    }
    cout << M1 << "专业有" << k << "个人" << endl;
    system("pause");
}
//统计年龄 
void StuListLink::sta_Age(stu* head) {
    stu* p, * p1;
    p = head;
    p1 = p->next;
    cout << "请输入要统计的年龄:" << endl;
    int A1;
    cin >> A1;
    int k = 0;
    while (p1 != NULL) {
        if ((2021 - p1->s.get_Year()) == A1) {
            k++;
            cout << "学生姓名: " << p1->s.get_Name() << "\n学生性别: " << p1->s.get_Sex() << "\n学生专业: " << p1->s.get_Major() << "\n学生出生日期:年/月/日 " << p1->s.get_Year() << "/" << p1->s.get_Month() << "/" << p1->s.get_Day() << "\n学生住址: " << p1->s.get_Adress() << "\n学生英语成绩: " << p1->s.get_Score() << "\n\n" << endl;
        }
        p = p1;
        p1 = p->next;
    }
    cout << "年龄为" << A1 << "的有" << k << "个人" << endl;
    system("pause");
}
//统计信息 
void Statistics() {
    cout << "请选择需要统计的内容" << endl;
    cout << "统计性别按1\n" << "统计专业按2\n" << "统计年龄按3" << endl;
    int m;
    cin >> m;
    switch (m) {
    case 1:
        void sta_Sex();
        break;
    case 2:
        void sta_Major();
        break;
    case 3:
        void sta_Age();
        break;
    }
}
//按英语成绩排序 
void StuListLink::Sort(stu* head) {
    stu* p, * p1, * q;
    p = head;
    p1 = head->next;
    system("cls");
    while (p->next != NULL) {                     //冒泡排序
        while (p1->next != NULL) {
            if (p->s.get_Score() < p1->s.get_Score()) {
                q = p->next;
                p->next = p1->next;
                p1->next = p1->next->next;
                p->next->next = q;
            }
            else {
                p1 = p1->next;
            }
        }
        p = p->next;
        p1 = p->next;
    }
    cout << "已按学生成绩从高到低排序" << endl;
    system("pause");
    p = head->next;
    int a = 0;
    while (p != NULL) {
        a++;
        cout << a << ".\n" << "学生姓名: " << p->s.get_Name() << "\n学生性别: " << p->s.get_Sex() << "\n学生专业: " << p->s.get_Major() << "\n学生出生日期:年/月/日 " << p->s.get_Year() << "/" << p->s.get_Month() << "/" << p->s.get_Day() << "\n学生住址: " << p->s.get_Adress() << "\n学生英语成绩: " << p->s.get_Score() << "\n\n" << endl;
        p = p->next;
    }
    system("pause");
}
//保存学生信息 
void StuListLink::Save(stu* head) {
    ofstream outfile("D:\\xsxx.txt");
    stu* p = head->next;
    int a = 0;
    while (p != NULL) {
        a++;
        outfile << a << ".\n" << "学生姓名: " << p->s.get_Name() << "\n学生性别: " << p->s.get_Sex() << "\n学生专业: " << p->s.get_Major() << "\n学生出生日期:年/月/日 " << p->s.get_Year() << "/" << p->s.get_Month() << "/" << p->s.get_Day() << "\n学生住址: " << p->s.get_Adress() << "\n学生英语成绩: " << p->s.get_Score() << "\n\n" << endl;
        p = p->next;
    }
    outfile.close();
    cout << "学生信息保存成功" << endl;
    system("pause");
}
int main() {
    system("mode concols=100 lines=30");
    system("color 3E");
    stu* head = (stu*)malloc(sizeof(stu));
    head->next = NULL;
    char a;
    while (1) {
        system("cls");
        cout << "\t\t\t\t\t**************************\n";
        cout << "\t\t\t\t\t*  欢迎使用学生管理系统  *\n";
        cout << "\t\t\t\t\t*  请选择想要使用的功能  *\n";
        cout << "\t\t\t\t\t*    添加学生信息请按1   *\n";
        cout << "\t\t\t\t\t*    查看学生信息请按2   *\n";
        cout << "\t\t\t\t\t*  按照姓名查找学生请按3 *\n";
        cout << "\t\t\t\t\t*    按照成绩排序请按4   *\n";
        cout << "\t\t\t\t\t*    删除学生信息请按5   *\n";
        cout << "\t\t\t\t\t*    统计学生信息请按6   *\n";
        cout << "\t\t\t\t\t*    保存学生信息请按7   *\n";
        cout << "\t\t\t\t\t*      退出系统请按8     *\n";
        cout << "\t\t\t\t\t**************************\n";
        cin >> a;
        switch (a) {
        case '1':
            system("cls");
            void add(stu*head);
            break;
        case '2':
            system("cls");
            void print(stu * head);
            break;
        case '3':
            system("cls");
            void Look(stu * head);
            break;
        case '4':
            system("cls");
            void Sort(stu * head);
            break;
        case '5':
            system("cls");
            void Delete(stu*head);
            break;
        case '6':
            system("cls");
            Statistics();
            break;
        case '7':
            system("cls");
            void Save(stu * head);
            break;
        case '8':
            exit(0);
            break;
        default:
            system("cls");
            printf("输入方式错误,请重新输入!\n");
            system("pause");
            break;
        }
    }
    return 0;
}

img


为什么我运行出来按1没有反应啊,谁来帮帮我😭

问题出现在add函数中的参数传递上。在C++中,函数的参数传递是按值传递的,而不是按引用传递。因此,head参数在add函数中的修改不会影响到外部的head变量。

解决这个问题的方法是将add函数改为返回一个新的head指针,然后在调用add函数时将返回的指针赋值给head变量。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7463116
  • 这篇博客也不错, 你可以看下用c++语言实现数据结构各种常见排序,有详细解释。
  • 除此之外, 这篇博客: C++筑器 引用生死唯一中的 引用(这篇博客是我现有知识只能这样写) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 语法层和底层分开看基本没什么问题,但是一旦两个交互看就会感觉有悖论,这个有人说编译器优化,强行把细节的优化没了,反正现在凌晨3点了我头发掉没了也没悟到引发悖论的细节。用一个物理来说有点波粒二象性,有波的特性也有粒子的特性。语法层的的确确看到是别名和本体公用空间,但是底层你会发现他也是引用变量,那就是他有个双字四字节的小空间(和指针变量所占一样),我是这样理解的比如我们电脑系统不是装在硬盘里面的吗,我们开机是直接进入系统的,但实际上系统前面还有一点点的内存是存放系统信息的好像是ESP我也记不清了 ,那个东西要是没了,你系统就是废掉了,但是感觉举的例子不怎么恰当。我问过很多人,没有人说明白这个小悖论。。。烦啊。C++现在刚起步就要我头发

  • 您还可以看一下 韩东君老师的任鸟飞逆向C++基础篇课程中的 有符号和无符号区别,强制转换类型小节, 巩固相关知识点