1.利用结构体去构建学生信息,学生结构体中要求有学生的学号、姓名、本学年的课程名称、对应的成绩信息。
2.新建一个文件文档,现在学生信息 20 人 (已包含前面学生结构体中的信息)要求利用文件指针去实现从键盘输入学生信息,在原有文件后加入 10 个学生信息。
3.统计每一个学生结构体中学生存在不及格科目、课程名称等信息。
要求: 考虑信息输入过程中是否合法,文件指针是否能够打开等异常现象,并考虑采用一定的控制方式来保证程序的鲁棒性
(编译器为VS2022)
这里我以输入一个同学给你演示的
【运行截图】
【代码】
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define num 1 //新加的人数
// 定义学生结构体
struct Student {
int id;
string name;
string courses[2]; //两门课程
float scores[2]; //两门课程对应的成绩
};
// 写入学生信息到文件中
void write_student_info(ofstream& ofs) {
int i, j;
int id;
string name;
string courses[2];
float scores[2];
for (i = 0; i < num; i++) {
cout << "请输入第" << i + 1 << "个学生的信息:" << endl;
cout << "学号:";
cin >> id;
cout << "姓名:";
cin >> name;
for (j = 0; j < 2; j++) {
cout << "第" << j + 1 << "门课程名称:";
cin >> courses[j];
cout << "第" << j + 1 << "门课程分数:";
cin >> scores[j];
if (scores[j] < 0 || scores[j] > 100) {
cout << "输入成绩不合法!请重新输入!" << endl;
j--;
}
}
ofs << id << " " << name << " " << courses[0] << " " << scores[0] << " " << courses[1] << " " << scores[1] << endl;
}
}
// 从文件中读取学生信息并统计不及格科目数
void read_student_info(ifstream& ifs) {
Student s;
int i, cnt;
while (ifs >> s.id >> s.name >> s.courses[0] >> s.scores[0] >> s.courses[1] >> s.scores[1]) {
cnt = 0; // 记录不及格科目数
cout << "学号:" << s.id << "\t姓名:" << s.name << endl;
for (i = 0; i < 2; i++) {
if (s.scores[i] < 60) {
cout << "第" << i + 1 << "门课程" << s.courses[i] << " 不及格" << endl;
cnt++;
}
}
if (cnt == 0) {
cout << "没有不及格的课程!" << endl;
}
}
}
int main() {
// 新建一个文件文档
ofstream ofs("students.txt", ios::app);
if (!ofs.is_open()) {
cout << "文件打开失败!" << endl;
return -1;
}
// 写入学生信息到文件中
write_student_info(ofs);
// 关闭文件
ofs.close();
// 重新打开文件以读取学生信息
ifstream ifs("students.txt");
if (!ifs.is_open()) {
cout << "文件打开失败!" << endl;
return -1;
}
// 统计每一个学生结构体中,学生存在不及格科目的课程名称
read_student_info(ifs);
// 关闭文件
ifs.close();
return 0;
}
参考思路:
1、学生信息结构体定义:
struct student {
int id;
char name[20];
char course[20];
float score;
};
2、读取学生信息:
#include <stdio.h>
#include <stdlib.h>
struct student students[20];
int num_students = 0;
void read_students() {
FILE *fp;
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
for (int i = 0; i < num_students; i++) {
fscanf(fp, "%d %s %s %f", &students[i].id, students[i].name, students[i].course, &students[i].score);
if (fscanf(fp, "%d %s %s %f", &students[i].id, students[i].name, students[i].course, &students[i].score) != 4) {
printf("数据输入不合法,分别读取为id\tcourse\tscore\n", &students[i].id, students[i].name, students[i].course, &students[i].score);
}
}
fclose(fp);
}
int main() {
read_students();
// 输入新的学生信息
// ...
// 从文件中读取学生信息
// ...
return 0;
}
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
// 定义学生信息结构体
struct Student {
string id; // 学号
string name; // 姓名
vector<string> courses; // 学生本学年的课程名称
vector<int> scores; // 对应的成绩信息
// 统计不及格课程数量
int count_fail() const {
int cnt = 0;
for (int i = 0; i < scores.size(); i++) {
if (scores[i] < 60) {
cnt++;
}
}
return cnt;
}
};
// 从键盘输入学生信息
Student input_student() {
Student student;
cout << "请输入学号:";
cin >> student.id;
cout << "请输入姓名:";
cin >> student.name;
cout << "请输入课程数量:";
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cout << "请输入第" << i + 1 << "门课程名称:";
string course_name;
cin >> course_name;
student.courses.push_back(course_name);
cout << "请输入对应的成绩:";
int score;
cin >> score;
student.scores.push_back(score);
}
return student;
}
// 将学生信息存储到文件中
void write_student_info_to_file(const vector<Student>& students, const char* filename) {
ofstream fout(filename, ios::app); // 以追加写的方式打开文件
if (!fout.is_open()) {
cout << "打开文件失败!" << endl;
return;
}
for (const auto& student : students) {
fout << student.id << ' ' << student.name << ' ';
for (int i = 0; i < student.courses.size(); i++) {
fout << student.courses[i] << ' ' << student.scores[i] << ' ';
}
fout << endl;
}
fout.close();
}
// 从文件中读取学生信息
vector<Student> read_student_info_from_file(const char* filename) {
vector<Student> students;
ifstream fin(filename);
if (!fin.is_open()) {
cout << "打开文件失败!" << endl;
return students;
}
while (!fin.eof()) {
string id, name, course_name;
vector<string> courses;
vector<int> scores;
fin >> id >> name;
if (fin.fail()) {
break;
}
while (fin >> course_name) {
int score;
fin >> score;
courses.push_back(course_name);
scores.push_back(score);
}
Student student = { id, name, courses, scores };
students.push_back(student);
}
fin.close();
return students;
}
int main() {
// 从键盘输入新的学生信息
vector<Student> students;
for (int i = 1; i <= 10; i++) {
cout << "请输入第" << i << "个学生的信息:" << endl;
students.push_back(input_student());
}
// 将新的学生信息追加到文件中
write_student_info_to_file(students, "students.txt");
cout << "学生信息已成功写入文件!" << endl;
// 从文件中读取学生信息并统计不及格科目数量
vector<Student> all_students = read_student_info_from_file("students.txt");
for (const auto& student : all_students) {
int fail_count = student.count_fail();
if (fail_count > 0) {
cout << "学号:" << student.id << ",姓名:" << student.name
<< ",不及格科目数量:" << fail_count << endl;
}
}
return 0;
}
为了保证鲁棒性,可以增加一些边界条件,比如,分数0-100等等。嘿嘿嘿
根据你所给的,按照以下步骤来编写C++代码:
以下是完成这个任务的C++代码示例:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
struct Student {
int id;
std::string name;
std::vector<std::string> courses;
std::vector<int> scores;
};
bool isValidInput(const Student &student) {
if (student.name.empty()) return false;
if (student.courses.size() != student.scores.size()) return false;
for (const auto &course : student.courses) {
if (course.empty()) return false;
}
return true;
}
void inputStudentInfo(std::vector<Student> &students, int count) {
for (int i = 0; i < count; ++i) {
Student student;
std::cout << "请输入第 " << i + 1 << " 名学生的信息:" << std::endl;
std::cout << "学号:";
std::cin >> student.id;
std::cin.ignore();
std::cout << "姓名:";
std::getline(std::cin, student.name);
int courseCount;
std::cout << "请输入课程数量:";
std::cin >> courseCount;
std::cin.ignore();
for (int j = 0; j < courseCount; ++j) {
std::string course;
std::cout << "请输入第 " << j + 1 << " 门课程名称:";
std::getline(std::cin, course);
student.courses.push_back(course);
int score;
std::cout << "请输入第 " << j + 1 << " 门课程的成绩:";
std::cin >> score;
std::cin.ignore();
student.scores.push_back(score);
}
if (isValidInput(student)) {
students.push_back(student);
} else {
std::cout << "输入的学生信息无效,请重新输入。" << std::endl;
--i;
}
}
}
void writeStudentsToFile(const std::vector<Student> &students, const std::string &filename, bool append = false) {
std::ofstream ofs(filename, append ? std::ios::app : std::ios::out);
if (!ofs) {
std::cerr << "无法打开文件:" << filename << std::endl;
return;
}
for (const auto &student : students) {
ofs << student.id << "\n" << student.name << "\n";
ofs << student.courses.size() << "\n";
for (size_t i = 0; i < student.courses.size(); ++i) {
ofs << student.courses[i] << "\n" << student.scores[i] << "\n";
}
}
ofs.close();
}
void readStudentsFromFile(std::vector<Student> &students, const std::string &filename) {
std::ifstream ifs(filename);
if (!ifs) {
std::cerr << "无法打开文件:" << filename << std::endl;
return;
}
while (!ifs.eof()) {
Student student;
ifs >> student.id;
ifs.ignore();
std::getline(ifs, student.name);
int courseCount;
ifs >> courseCount;
ifs.ignore();
for (int i = 0; i < courseCount; ++i) {
std::string course;
std::getline(ifs, course);
student.courses.push_back(course);
int score;
ifs >> score;
ifs.ignore();
student.scores.push_back(score);
}
if (isValidInput(student)) {
students.push_back(student);
}
}
ifs.close();
}
void printFailingCourses(const std::vector<Student> &students) {
for (const auto &student : students) {
std::vector<std::string> failingCourses;
for (size_t i = 0; i < student.courses.size(); ++i) {
if (student.scores[i] < 60) {
failingCourses.push_back(student.courses[i]);
}
}
if (!failingCourses.empty()) {
std::cout << "学生 " << student.name << " 存在不及格科目:" << std::endl;
for (const auto &course : failingCourses) {
std::cout << course << std::endl;
}
}
}
}
int main() {
std::vector<Student> students;
inputStudentInfo(students, 20);
std::string filename = "students.txt";
writeStudentsToFile(students, filename);
students.clear();
inputStudentInfo(students, 10);
writeStudentsToFile(students, filename, true);
students.clear();
readStudentsFromFile(students, filename);
printFailingCourses(students);
return 0;
}
这段代码首先定义了学生结构体,并按照要求从键盘输入学生信息、将学生信息写入文件、读取文件中的学生信息以及统计不及格科目及课程名称等信息。在输入学生信息时,程序会检查输入是否合法,以确保输入的数据有效。在读写文件时,程序还会检查文件指针是否能够打开,以保证程序的鲁棒性。
有问题请继续提,如对你有帮助望采纳
#define _CRT_SECURE_NO_WARNINGS //防报错
#include "stdio.h"
#define M 10
#define N 10000
void menu()
{
printf(" 欢迎访问学生管理系统\n");
printf("\n");
printf(" 0、退出管理系统\n");
printf(" 1、添加学生信息\n");
printf(" 2、查询学生信息\n");
printf("\n");
printf(" 请输入指令(0/1/2)\n");
}
typedef struct
{
unsigned int id;
char gender[M];
char name[M];
float score;
}Student;
Student Info[N] = { };
void add()
{
unsigned int Num, i;
printf("请输入待添加的学生人数:\n");
scanf("%d", &Num);
for (i = 1; i <= Num; i++)
{
printf("请输入待添加的学生学号:\n");
scanf("%d", &Info[Num - 1].id);
printf("请输入待添加的学生性别:\n");
scanf("%s", &Info[Num - 1].gender);
printf("请输入待添加的学生姓名:\n");
scanf("%s", &Info[Num - 1].name);
printf("请输入待添加的学生成绩:\n");
scanf("%f", &Info[Num - 1].score);
printf("学生信息添加成功!\n");
}
}
void seek()
{
unsigned int Num;
printf("请输入要查询的学生学号:\n");
scanf("%d", &Num);
if (Info[Num - 1].id != 0)
{
printf("学号:%d\n", Info[Num - 1].id);
printf("性别:%s\n", Info[Num - 1].gender);
printf("姓名:%s\n", Info[Num - 1].name);
printf("成绩:%.2f\n", Info[Num - 1].score);
}
else
printf("查无此人!\n");
}
int main()
{
unsigned int num;
while (1)
{
menu();
scanf("%d", &num);
if (num == 0)
{
printf("已退出管理系统!\n");
return 0;
}
else if (num == 1)
{
add();
break;
}
else if (num == 2)
{
seek();
break;
}
else
printf("输入错误,请重新输入!\n");
}
return 0;
}