#include"Student.h" #include<iostream> #include<string> #include<fstream> using namespace std; Student::Student(int num, char* n, char* g, int m, int e, int c) { this->num = num; strcpy_s(name,n); strcpy_s(gender,g); Math = m; English = e; Computer = c; sum = Math + English + Computer; aver = sum / 3; } void Student::setNum(int num) { this->num = num; } void Student::setName(char* n) { strcpy_s(name,n); } void Student::setGender(char* g) { strcpy_s(gender,g); } void Student::setMath(int m) { Math = m; } void Student::setEnglish(int e) { English = e; } void Student::setComputer(int c) { Computer = c; } void Student::showStudentInfor() { cout << endl << "=========>> 显示学生成绩 <<=========" << endl; cout << "-------------------------------------------------------" << endl; cout << "学号" << "\t" << "姓名" << "\t" << "性别" << "\t" << "高数" << "\t" << "英语" << "\t" << "计算机" << "\t" << "平均分" << endl; cout << "-------------------------------------------------------" << endl; cout << num << "\t" << name << "\t" << gender << "\t" << Math << "\t" << English << "\t" << Computer << "\t" << aver << endl; }该怎样去定义且初始化Student类的对象数组
时间: 2023-07-19 19:05:20 浏览: 64
你可以使用以下方式定义并初始化一个名为students的Student对象数组:
```c++
Student students[3] = {
Student(1001, "张三", "男", 80, 75, 90),
Student(1002, "李四", "女", 85, 90, 87),
Student(1003, "王五", "男", 90, 88, 92)
};
```
这将创建一个长度为3的Student对象数组,每个对象都使用构造函数进行初始化。你可以根据需要更改数组的长度和对象的初始化值。注意,如果你的构造函数接受char*类型的参数,则必须使用strcpy_s函数将字符串复制到类的成员变量中,以避免内存错误。
相关问题
补充代码 #include<iostream> #include<string> #include <string.h> # include<fstream> using namespace std; //完成三个命名空间中的Student定义 /***********begin**********/ /**************end**********/ int main(int argc, char *argv[]) { n1::Student student[3]; n3::Student stu[3]; int num=0; //读取file1.dat中学生信息到student[]中 ifstream fin("/data/workspace/myshixun/data/file1.dat",ios_base::in|ios_base::binary); for(int i=0;i<3;i++) { n1::Student st; fin.read((char*)&st,sizeof(st)); student[i]=st; } fin.close(); //读取/data/workspace/myshixun/data/file2.dat中数据,并完成以 学号相等判断是否存在于student[]。如果存在,则生成新的学生信息,并存入stu[]中 /**********begin************/ /***********end*************/ ofstream fout2("/data/workspace/myshixun/data/file3.dat",ios_base::out|ios_base::binary); for(int i=0;i<num;i++) { fout2.write((char*)&stu[i],sizeof(stu[i])); cout<<stu[i].no<<","<<stu[i].name<<","<<stu[i].score<<endl; } return 0; }
好的,根据你的要求,我可以补充完整代码如下:
```c++
#include<iostream>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;
// 定义三个命名空间中的Student类
namespace n1 {
class Student {
public:
int no;
char name[20];
int score;
};
}
namespace n2 {
class Student {
public:
int no;
char name[20];
int age;
};
}
namespace n3 {
class Student {
public:
int no;
char name[20];
int age;
char gender;
int score;
};
}
int main(int argc, char *argv[]) {
n1::Student student[3];
n3::Student stu[3];
int num = 0;
// 读取file1.dat中学生信息到student[]中
ifstream fin("/data/workspace/myshixun/data/file1.dat", ios_base::in | ios_base::binary);
for (int i = 0; i < 3; i++) {
n1::Student st;
fin.read((char*)&st, sizeof(st));
student[i] = st;
}
fin.close();
// 读取/data/workspace/myshixun/data/file2.dat中数据,并完成以学号相等判断是否存在于student[]。如果存在,则生成新的学生信息,并存入stu[]中
ifstream fin2("/data/workspace/myshixun/data/file2.dat", ios_base::in | ios_base::binary);
for (int i = 0; i < 3; i++) {
n2::Student st;
fin2.read((char*)&st, sizeof(st));
// 判断学号是否存在于student[]中
bool exists = false;
for (int j = 0; j < 3; j++) {
if (st.no == student[j].no) {
exists = true;
break;
}
}
// 如果存在,则生成新的学生信息,并存入stu[]中
if (exists) {
n3::Student new_st;
new_st.no = st.no + 1000;
strcpy(new_st.name, st.name);
new_st.age = st.age;
new_st.gender = 'M';
new_st.score = st.score + 10;
stu[num] = new_st;
num++;
}
}
fin2.close();
// 将stu[]中的学生信息输出到file3.dat中
ofstream fout("/data/workspace/myshixun/data/file3.dat", ios_base::out | ios_base::binary);
for (int i = 0; i < num; i++) {
fout.write((char*)&stu[i], sizeof(stu[i]));
cout << stu[i].no << "," << stu[i].name << "," << stu[i].score << endl;
}
fout.close();
return 0;
}
```
上述代码中,我根据你的要求定义了三个命名空间中的`Student`类,然后分别读取了`file1.dat`和`file2.dat`中的学生信息,并完成了以学号相等判断是否存在于`student[]`的功能。如果存在,则生成新的学生信息,并存入`stu[]`中。最后,将`stu[]`中的学生信息输出到`file3.dat`中。
需要注意的是,上述代码中假设每个学生信息的大小为20个字节,这个数值需要根据实际情况进行修改。同时,需要根据文件中存储的数据类型来确定读写文件时的数据类型和字节数。
C++中,譬如我设定了一个student类,里面有int age,string name,string Num,并且我已经将他们通过链表类串联,并且txt文件写入了student.txt中,那么比如我存了一些数据,我要指定修改某一个对象的age值再放回文件,我该怎么操作
要修改 student.txt 文件中某个学生对象的 age 值,可以先读取该文件中的所有学生对象数据,然后找到需要修改的学生对象,将其 age 值修改后再重新写入到 student.txt 文件中。以下是一个示例代码,可以实现该功能:
```c++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Student {
public:
Student(int age, string name, string num) : age(age), name(name), num(num) {}
int getAge() const {
return age;
}
void setAge(int age) {
this->age = age;
}
string getName() const {
return name;
}
void setName(string name) {
this->name = name;
}
string getNum() const {
return num;
}
void setNum(string num) {
this->num = num;
}
void writeToTxt(ofstream& file) const {
file << age << " " << name << " " << num << endl;
}
private:
int age;
string name;
string num;
};
class LinkedList {
public:
LinkedList() : head(nullptr) {}
void add(Student* student) {
Node* newNode = new Node;
newNode->student = student;
newNode->next = nullptr;
if (head == nullptr) {
head = newNode;
} else {
Node* temp = head;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = newNode;
}
}
void display() const {
Node* temp = head;
while (temp != nullptr) {
cout << "Name: " << temp->student->getName() << ", Age: " << temp->student->getAge() << ", Num: " << temp->student->getNum() << endl;
temp = temp->next;
}
}
void writeToTxt(string fileName) const {
ofstream file(fileName);
Node* temp = head;
while (temp != nullptr) {
temp->student->writeToTxt(file);
temp = temp->next;
}
file.close();
}
void modifyAge(string num, int newAge) {
Node* temp = head;
while (temp != nullptr) {
if (temp->student->getNum() == num) {
temp->student->setAge(newAge);
break;
}
temp = temp->next;
}
}
~LinkedList() {
Node* temp = head;
while (temp != nullptr) {
Node* next = temp->next;
delete temp->student;
delete temp;
temp = next;
}
}
private:
struct Node {
Student* student;
Node* next;
};
Node* head;
};
LinkedList* readFromTxt(string fileName) {
LinkedList* list = new LinkedList();
ifstream file(fileName);
if (file.is_open()) {
string line;
while (getline(file, line)) {
int age;
string name, num;
stringstream ss(line);
ss >> age >> name >> num;
Student* student = new Student(age, name, num);
list->add(student);
}
file.close();
} else {
cout << "Unable to open file " << fileName << endl;
}
return list;
}
int main() {
LinkedList* list = readFromTxt("student.txt");
cout << "Before modification:" << endl;
list->display();
list->modifyAge("001", 20);
cout << "After modification:" << endl;
list->display();
list->writeToTxt("student.txt");
delete list;
return 0;
}
```
在以上示例代码中,我们定义了一个 Student 类和一个 LinkedList 类。Student 类中包含了 age、name 和 num 三个属性,并提供了读取和修改这些属性的方法以及将该对象写入 txt 文件的方法。LinkedList 类中包含了添加学生对象、展示学生对象、将学生对象写入 txt 文件和修改学生对象 age 值的方法。在 main 函数中,我们首先调用 readFromTxt 方法读取 student.txt 文件中的所有学生对象数据,并将其存储到 LinkedList 对象中。然后,我们展示了所有学生对象的信息,并调用 modifyAge 方法修改了学号为 "001" 的学生对象的 age 值。最后,我们将修改后的学生对象数据重新写入到 student.txt 文件中。需要注意的是,在读取文件时,需要使用 ifstream 类型的对象,并使用 getline 函数逐行读取文件中的内容。同时,在修改数据时,需要遍历链表找到需要修改的学生对象,并调用其 setAge 方法修改其 age 值。
阅读全文