由于使用了一个input函数进行输入数据所以不知道再怎么办了
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
#include<Windows.h>
#include <cstring>
using namespace std;
#define HEADER1 " -------------------------学生信息---------------------- \n"
#define HEADER2 " | 学号 | 姓名 | 性别 | 年龄 | 系别 |\n"
#define HEADER3 " |----------|----------|----------|----------|----------|\n"
int num; //学生总数
class Student //定义学生类
{
public:
char id[20];//学号
string name;//名字
string sex;//性别
int age;//年龄
string xibie;//系别
Student* next;
void input();//输入函数
void ReadFile(istream& in);//读取文件
void show();//显示方法
};
void Student::input() //输入学生信息函数
{
cout << "\t\t学号:";
cin >> id;
cout << "\t\t姓名:";
cin >> name;
cout << "\t\t性别:";
cin >> sex;
cout << "\t\t年龄:";
cin >> age;
cout << "\t\t系别:";
cin >> xibie;
}
void Student::ReadFile(istream& in) //读取文件
{
in >> id >> name >> sex >> age >> xibie;
}
void Student::show() //输出学生信息
{
cout << " |" << setw(5) << id << " |" << setw(5) << name << " |" << setw(8) << sex << " |" << setw(6) << age << " |" << setw(6) << xibie << " |" << endl;
}
class StudentMassage //定义学生信息类,包含各项处理功能
{
public:
StudentMassage();
~StudentMassage();
void ShowMenu();
void Display();
void AddItem();
void Find();
void save();
void ModifyItem();
void RemoveItem();
int ListCount();
int Count();
private:
Student* Head, * End;
ifstream in;
ofstream out;
Student* Findid(char* id);
Student* Findname(string name);
};
Student* StudentMassage::Findid(char* id)
{
Student* p;
for (p = Head; p->next != End; p = p->next)
if (!strcmp(p->next->id, id))
return p;
return NULL;
}
Student* StudentMassage::Findname(string name)
{
Student* p;
for (p = Head; p->next != End; p = p->next)
if (p->next->name.length()== name.length())
return p;
return NULL;
}
StudentMassage::StudentMassage() //构造函数
{
Head = new Student;
Head->next = new Student;
End = Head->next;
in.open("学生成绩.txt");
if (!in)
cout << "\n\t\t这是一个新系统,无学生信息,请先输入。" << endl;
else
{
while (!in.eof())
{
End->ReadFile(in);
if (End->name[0] == '\0')
break;
End->next = new Student;
End = End->next;
}
in.close();
cout << "\n\t\t读取学生信息成功!" << endl;
}
}
StudentMassage::~StudentMassage() //析构函数
{
Student* temp;
save();
for (temp; Head->next != End; )
{
temp = Head->next;
Head->next = Head->next->next;
delete temp;
}
delete Head, End;
}
void StudentMassage::ShowMenu() //显示菜单
{
cout << "\n\n\t\t\t\t 主菜单" << endl << endl << endl;
cout << "\t\t****************************************" << endl << endl;
cout << "\t\t1、增加学生信息 2、显示学生信息" << endl << endl;
cout << "\t\t3、删除学生信息 4、修改学生信息" << endl << endl;
cout << "\t\t5、保存学生信息 6、查找学生" << endl << endl;
cout << "\t\t0、系统安全退出 " << endl << endl;
cout << "\t\t****************************************" << endl << endl << endl;
cout << "\t\t请选择:";
}
void StudentMassage::Display() //显示学生信息
{
Student* p;
cout << endl << HEADER1 << HEADER2 << HEADER3;
for (p = Head->next; p != End; p = p->next)
p->show();
cout << "\n\n输入任意字符,继续......";
system("pause");
}
void StudentMassage::AddItem() //添加学生信息
{
End->input();
End->next = new Student;
End = End->next;
cout << "\n\t\t添加成功!" << endl;
cout << "\n输入任意字符,继续......";
system("pause");
}
void StudentMassage::Find() //查找函数
{
char id[20], name[20];
int x;
Student* p = NULL;
cout << "\n\t\t****************************************\n";
cout << "\t\t\t 1、按学生学号查找" << endl;
cout << "\t\t\t 2、按学生姓名查找";
cout << "\n\t\t****************************************\n\n\t\t请选择:";
cin >> x;
switch (x)
{
case 1: //按学号查找
{
cout << "\n\t\t请输入要查找的学生的学号:";
int n;
cin >> id;
n = StudentMassage::ListCount();
if (p = Findid(id))
{
cout << endl << HEADER1 << HEADER2 << HEADER3;
for (int i = 1; i <= n; i++)
{
if (p == Findid(id))
{
p->next->show();
break;
}
}
cout << "\n请输入任意字符,继续......";
system("pause");
}
else
{
cout << "\t\t没有找到该学号的学生!" << endl << endl;
cout << "请输入任意字符,继续......";
system("pause");
}
} break;
case 2: //按班级查找
{
cout << "\n\t\t请输入要查找的学生的名字:";
cin >> name;
if (p = Findname(name))
{
cout << endl << HEADER1 << HEADER2 << HEADER3;
p->next->show();
cout << "\n请输入任意字符,继续......";
system("pause");
}
else
{
cout << "\n\t\t没有找到该班级的学生!" << endl << endl;
cout << "请输入任意字符,继续......";
system("pause");
}
} break;
}
}
void StudentMassage::ModifyItem() //修改学生信息
{
char name[20];
Student* p = NULL;
cout << "\n\t\t请输入要修改的学生的学号:";
cin >> name;
if (p = Findid(name))
{
cout << "\n\t\t已找到该学生,请输入新的信息!" << endl;
p->next->input();
cout << "\n\t\t修改成功!" << endl;
Display();
}
else
{
cout << "\n\t\t没有找到!" << endl;
cout << "\n输入任意字符!继续.......";
system("pause");
}
}
void StudentMassage::RemoveItem() //删除学生信息
{
char uid[20];
Student* p = NULL, * temp = NULL;
cout << "\n\t\t请输入要删除的学生的学号:";
cin >> uid;
if (p = Findid(uid))
{
temp = p->next;
p->next = p->next->next;
delete temp;
cout << "\n\t\t删除成功!" << endl;
Display();
}
else
{
cout << "\t\t没有找到!" << endl;
cout << "输入任意字符!继续......";
system("pause");
}
}
int StudentMassage::ListCount() //返回记录的学生总数
{
Student* p;
int n = 0;
if (!Head)
return 0;
for (p = Head->next; p != End; p = p->next)
n++;
num = n;
return num;
}
int StudentMassage::Count() //成绩统计
{
Student* p;
int x, count = 0;
if (!Head)
{
cout << "\n\t\t没有资料可以统计!" << endl;
return 0;
}
}
void StudentMassage::save() //存入文件
{
out.open("学生成绩.txt");
for (Student* p = Head->next; p != End; p = p->next)
out << p->id << "\t" << p->name << "\t" << p->sex << "\t" << p->age << "\t" << p->xibie << "\t" << '\n';
out.close();
cout << "\n\t\t学生成绩文件保存成功!" << endl;
cout << "\n输入任意字符,继续......";
system("pause");
}
int main(
)
{
int x;
bool quit = false;
cout << "\n\n\n\n\n\n\n\n";
cout << "\t\t********************************************" << endl;
cout << "\t\t 欢迎使用学生信息管理系统!" << endl;
cout << "\t\t********************************************" << endl;
StudentMassage Grade;
Sleep(1000);
while (!quit)
{
system("cls");
Grade.ShowMenu();
cin >> x;
switch (x)
{
case 0:quit = true; break;
case 1:Grade.AddItem(); break;
case 2:Grade.Display(); break;
case 3:Grade.RemoveItem(); break;
case 4:Grade.ModifyItem(); break;
case 5:Grade.save(); break;
case 6:Grade.Find(); break;
}
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:第1行:2个整数,n(n<=18)和k(1<=k<=10)
第2行:共有k个从小到大排列的整数,表示要输出的解的编号。
解决方案:
为了避免学号冲突,我建议在添加新学生信息之前,检查该学号是否已经存在于系统中。具体实现方法如下:
在学生信息管理系统中,每个学生都有一个唯一的学号,这个学号可以作为该学生的唯一标识符。
在添加新学生信息之前,先输入该学生的学号,并对输入的学号进行合法性检查,如长度、是否为数字等。如果学号不合法,提示用户重新输入,直到输入合法为止。
在系统存储学生信息的地方(如数组、链表等)中,必须保证每个学生的学号唯一,因此添加新学生信息时需要遍历已有的学生信息,检查新学生的学号是否已经存在于系统中。
如果新学生的学号已经存在于系统中,提示用户重新输入学号,直到输入一个未出现过的学号为止。
下面是一个简单的示例代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 学生信息结构体
struct Student {
string id; // 学号
string name; // 姓名
int age; // 年龄
};
int main() {
vector<Student> students; // 用 vector 存储学生信息
while (true) {
Student student;
// 输入学生信息
cout << "请输入学号: ";
cin >> student.id;
// 检查学号是否已经存在
bool idExist = false;
for (const auto& s : students) {
if (s.id == student.id) {
idExist = true;
break;
}
}
if (idExist) {
// 如果学号已存在,提示用户重新输入
cout << "学号已经存在,请重新输入!" << endl;
continue;
}
cout << "请输入姓名: ";
cin >> student.name;
cout << "请输入年龄: ";
cin >> student.age;
students.push_back(student); // 添加新学生信息到 vector 中
// 是否继续添加学生信息
cout << "是否继续添加新学生信息?(y/n)";
char choice;
cin >> choice;
if (choice != 'y' && choice != 'Y') {
break;
}
}
return 0;
}
在上面的示例代码中,我们通过一个 bool 变量 idExist 来判断学号是否已经存在于系统中。如果学号已经存在,则提示用户重新输入。这个变量在循环已有学生信息时进行赋值,判断是否存在目标学号。
输入学号的时候判断下是否学号已经存在,为了便于查找,可以使用二分查找算法+有序列表存储学号