PTA 7-1 磁盘文件的读写

编程构建一个Student类,并在main函数中创建5个对象(对象信息如输入样例所示),其中每个对象的数据包括学号num、姓名name、年龄age以及数学maths、英语english、语文chinese三门功课的分数,然后求出每个人的平均分数ave,将学号、姓名和平均分数输出到磁盘文件STUD.DAT中,最后从STUD.DAT文件中读出这些数据,并显示在屏幕上。

输入格式:

5个学生的数据(学号、姓名、年龄以及数学、英语、语文三门功课的分数)。

输出格式:

从STUD.DAT文件中读出学号、姓名和平均分数。

输入样例:

在这里给出一组输入。例如:

Student stu1(1,'A',19,80,79,67);
Student stu2(2,'B',20,90,68,43);
Student stu3(3,'C',19,56,48,29);
Student stu4(4,'D',20,93,44,57);
Student stu5(5,'E',19,33,55,74);

输出样例:

在这里给出相应的输出。例如:

1 A 75.3333
2 B 67
3 C 44.3333
4 D 64.6667
5 E 54

先上自己写的满足题意的写法,但是显示段错误,在编译器上是能通过的

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>	//std::vector
#include <string> 	//std::string

std::ofstream outputFile("STUD.DAT", std::ios::out);
std::ifstream readFile("STUD.DAT", std::ios::in);

class Student {
private:
	int sno;
	char sname;
	int sage;
	int math;
	int english;
	int chinese;
	double avg;
public:
	Student() {}
	Student(int sno, char sname, int sage, int math, int english, int chinese, double avg) {
		this->sno = sno;
		this->sname = sname;
		this->sage = sage;
		this->math = math;
		this->english = english;
		this->chinese = chinese;
		this->avg = avg;
	}
	~Student() {}
	void display() {
		outputFile << sno << ' ' << sname << ' ' << avg << '\n';
	}
	void setStudent(int sno_, char sname_, int sage_, int math_, int english_, int chinese_, double avg_) {
		sno = sno_;
		sname = sname_;
		sage = sage_;
		math = math_;
		chinese = chinese_;
		avg = avg_;
	}
};
//C++ split
std::vector<std::string> Split(const std::string& s, const char& seperator) {
	std::vector<std::string> ans;
	std::istringstream stream(s);
	std::string word;
	while (std::getline(stream, word, seperator)) {
		ans.push_back(word);
	}
	return ans;
}

int main() {
	Student obj[5];
	std::string str;
	for (int i = 0; i < 5; i++) {
		getline(std::cin, str);
		std::string tmp = str.substr(str.find('(') + 1, str.size() - str.find('(') - 2);
		std::vector<std::string> ans = Split(tmp, ',');
		for (auto& x : ans) {
			std::cout << x << ' ';
		}
		std::cout << '\n';
		double avg = 1.0 * (stoi(ans[3]) + stoi(ans[4]) + stoi(ans[5])) / 3.0;
		obj[i].setStudent(stoi(ans[0]), ans[1][1], stoi(ans[2]), stoi(ans[3]), stoi(ans[4]), stoi(ans[5]), avg);
	}
	for (auto& x : obj) {
		x.display();
	}
	outputFile.close();
	for (int i = 0; i < 5; i++) {
		getline(readFile, str);
		std::cout << str << (i == 4 ? "" : "\n");
	}
	readFile.close();
	return 0;
}

 不得不说这题出的真是一言难尽....  后来再仔细读题发现 本题的信息

 编程构建一个Student类,并在main函数中创建5个对象(对象信息如输入样例所示)

意思就是不用再读入数据了 直接在主函数创建所给出的对象即可

这时我继续用字符串读写 编译器仍然能通过 但pta上过不了

/*
	Author: Spare Lin
	Date: 30/05/22 19:03
	Description: 7-1 磁盘文件的读写
*/

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>	//std::vector
#include <string> 	//std::string

std::ofstream outputFile("STUD.txt", std::ios::out);
std::ifstream readFile("STUD.txt", std::ios::in);

class Student {
private:
	int sno;
	char sname;
	int sage;
	int math;
	int english;
	int chinese;
	double avg;
public:
	Student() {}
	Student(int sno, char sname, int sage, int math, int english, int chinese) {
		this->sno = sno;
		this->sname = sname;
		this->sage = sage;
		this->math = math;
		this->english = english;
		this->chinese = chinese;
	}
	~Student() {}
	void display() {
		outputFile << sno << ' ' << sname << ' ' << 1.0 * (math + english + chinese) / 3 << '\n';
	}
};

int main() {
	Student stu1(1,'A',19,80,79,67);
	Student stu2(2,'B',20,90,68,43);
	Student stu3(3,'C',19,56,48,29);
	Student stu4(4,'D',20,93,44,57);
	Student stu5(5,'E',19,33,55,74);
	
	std::vector<Student> ans;
	
	ans.push_back(stu1);
	ans.push_back(stu2);
	ans.push_back(stu3);
	ans.push_back(stu4);
	ans.push_back(stu5);
	
	for (auto &obj : ans) {
		obj.display();
	}
	
	outputFile.close();
	
	std::string str;
	for (int i = 0; i < 5; i++) {
		getline(readFile, str);
		std::cout << str << (i == 4 ? "": "\n");
	}
	
	readFile.close();
	
	return 0;
}

 最后又用二进制读写文件的方法 顺利通过

 AC代码

/*
    Author: Spare Lin
    Date: 30/05/22 19:03
    Description: 7-1 磁盘文件的读写
*/
#include <iostream>
#include <fstream>
#include <vector>    //std::vector
#include <string>    //std::string

class Student {
private:
    int sno;
    char sname;
    int sage;
    int math;
    int english;
    int chinese;
    double avg;
public:
    Student(int sno, char sname, int sage, int math, int english, int chinese) {
        this->sno = sno;
        this->sname = sname;
        this->sage = sage;
        this->math = math;
        this->english = english;
        this->chinese = chinese;
        //this->avg = 1.0 * (math + english + chinese) / 3;
    }

    const int getSno() {
        return sno;
    }

    const char getSname() {
        return sname;
    }

    const double getAvg() {
        return 1.0 * (math + english + chinese) / 3;
    }

    ~Student() {}
};

struct Person {
    int sno;
    char sname;
    double avg;
};

int main() {
    Student stu1(1, 'A', 19, 80, 79, 67);
    Student stu2(2, 'B', 20, 90, 68, 43);
    Student stu3(3, 'C', 19, 56, 48, 29);
    Student stu4(4, 'D', 20, 93, 44, 57);
    Student stu5(5, 'E', 19, 33, 55, 74);

    std::vector<Student> ans;
    ans.push_back(stu1);
    ans.push_back(stu2);
    ans.push_back(stu3);
    ans.push_back(stu4);
    ans.push_back(stu5);

    Person per[5];
    for (int i = 0; i < 5; i++) {
        per[i].sno = ans[i].getSno();
        per[i].sname = ans[i].getSname();
        per[i].avg = ans[i].getAvg();
    }

    std::ofstream outputFile;
    outputFile.open("STUD.DAT", std::ios::out | std::ios::binary);
    for (int i = 0; i < 5; i++) {
        outputFile.write((char*)&per[i], sizeof(per[i]));
    }
    outputFile.close();

    std::ifstream readFile;
    readFile.open("STUD.DAT", std::ios::in | std::ios::binary);
    for (int i = 0; i < 5; i++) {
        readFile.read((char*)&per[i], sizeof(per[i]));
        std::cout << per[i].sno << ' ' << per[i].sname << ' ' << per[i].avg << '\n';
    }
    readFile.close();

    return 0;
}

参考:7-1 磁盘文件的读写_xp_xht123的博客-CSDN博客_磁盘文件的读写

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是一个简单的示例: ``` public class Student { private String name; private int age; private String major; public Student(String name, int age, String major) { this.name = name; this.age = age; this.major = major; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } } public class Main { public static void main(String[] args) { Student student1 = new Student("张三", 20, "计算机科学"); Student student2 = new Student("李四", 21, "英语"); System.out.println(student1.getName() + " " + student1.getAge() + " " + student1.getMajor()); System.out.println(student2.getName() + " " + student2.getAge() + " " + student2.getMajor()); } } ``` 这个示例,我们定义了一个`Student`,包含了学生的姓名、年龄和专业。在`Main`,我们生成了两个`Student`对象,并输出了它们的信息。 ### 回答2: 学生是教育系统一个至关重要的角色,因此设计一个学生是很有必要的。在这个里面,我们可以定义一个学生所拥有的属性和方法,来描述和模拟一个学生的学习和生活情况。下面是一个学生的设计: 1.学生包括以下成员变量: (1)姓名 name; (2)学号 id; (3)性别 gender; (4)年龄 age; (5)成绩 score。 2.学生包括以下方法: (1)构造方法 Student(),用于初始化学生对象; (2)设置姓名和学号的方法 setStudent(name, id),用于设置学生的姓名和学号; (3)设置性别和年龄的方法 setGenderAndAge(gender, age),用于设置学生的性别和年龄; (4)设置成绩的方法 setScore(score),用于设置学生的成绩; (5)获取学生信息的方法 getStudentInfo(),用于获取学生的姓名、学号、性别、年龄和成绩。 在主,我们可以创建一个学生对象,并在学生对象调用各种方法来测试学生的功能。以下是主的设计代码: public class Main { public static void main(String[] args) { Student student = new Student(); // 创建一个学生对象 student.setStudent("小明", "20190001"); // 设置学生姓名和学号 student.setGenderAndAge("男", 18); // 设置学生性别和年龄 student.setScore(90); // 设置学生成绩 student.getStudentInfo(); // 获取学生信息 } } 在上述代码,我们创建一个学生对象 student,并设置了学生的姓名、学号、性别、年龄和成绩。然后我们再调用了学生的 getStudentInfo() 方法,将学生的信息输出到控制台上。 最终运行程序,我们可以看到在控制台输出的结果如下: 学生姓名:小明 学生学号:20190001 学生性别:男 学生年龄:18岁 学生成绩:90分 通过这个例子,我们可以看到,在主创建一个学生对象,并设置和获取学生信息的方法是非常简单和方便的。因此,设计一个学生是非常有益和必要的。 ### 回答3: 首先,我们需要定义一个Student,这个需要包含学生的基本信息,如学生姓名、学号、年龄、性别等。我们可以使用私有属性来对这些信息进行封装,同时提供公有的getter和setter方法来访问和修改这些信息。 下面是一个可能的Student的代码实现: ```java public class Student { private String name; private int id; private int age; private char gender; public Student(String name, int id, int age, char gender) { this.name = name; this.id = id; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public void display() { System.out.println("Name: " + name); System.out.println("ID: " + id); System.out.println("Age: " + age); System.out.println("Gender: " + gender); } } ``` 在这个,我们定义了一个构造方法来初始化学生的信息,同时定义了getter和setter方法来访问和修改这些信息。除此之外,我们还定义了一个display()方法来展示学生的信息。 接下来,我们可以在main生成Student对象进行测试。具体实现如下: ```java public class Main { public static void main(String[] args) { Student student = new Student("张三", 1001, 18, 'M'); student.display(); } } ``` 在这个测试代码,我们先创建一个名为“张三”的学生对象,并传入了其学号、年龄和性别等信息。然后调用了其display()方法,展示了这个学生的信息。运行这个测试代码,我们可以看到如下输出: ``` Name: 张三 ID: 1001 Age: 18 Gender: M ``` 这个输出展示了我们创建的学生对象信息,说明我们的Student设计和实现是正确的。 总之,通过对学生信息进行封装和提供相应的访问和修改方法,我们成功地设计了一个Student,并在main生成了测试对象来验证这个的正确性。通过这样的实践,我们也学习了如何进行面向对象编程,这对我们理解和应用Java等编程语言都有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值