#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;
}
问题出现在add函数中的参数传递上。在C++中,函数的参数传递是按值传递的,而不是按引用传递。因此,head参数在add函数中的修改不会影响到外部的head变量。
解决这个问题的方法是将add函数改为返回一个新的head指针,然后在调用add函数时将返回的指针赋值给head变量。
语法层和底层分开看基本没什么问题,但是一旦两个交互看就会感觉有悖论,这个有人说编译器优化,强行把细节的优化没了,反正现在凌晨3点了我头发掉没了也没悟到引发悖论的细节。用一个物理来说有点波粒二象性,有波的特性也有粒子的特性。语法层的的确确看到是别名和本体公用空间,但是底层你会发现他也是引用变量,那就是他有个双字四字节的小空间(和指针变量所占一样),我是这样理解的比如我们电脑系统不是装在硬盘里面的吗,我们开机是直接进入系统的,但实际上系统前面还有一点点的内存是存放系统信息的好像是ESP我也记不清了 ,那个东西要是没了,你系统就是废掉了,但是感觉举的例子不怎么恰当。我问过很多人,没有人说明白这个小悖论。。。烦啊。C++现在刚起步就要我头发