#c++#统计学生信息

1.利用结构体去构建学生信息,学生结构体中要求有学生的学号、姓名、本学年的课程名称、对应的成绩信息。
2.新建一个文件文档,现在学生信息 20 人 (已包含前面学生结构体中的信息)要求利用文件指针去实现从键盘输入学生信息,在原有文件后加入 10 个学生信息。
3.统计每一个学生结构体中学生存在不及格科目、课程名称等信息。

要求: 考虑信息输入过程中是否合法,文件指针是否能够打开等异常现象,并考虑采用一定的控制方式来保证程序的鲁棒性
(编译器为VS2022)

这里我以输入一个同学给你演示的
【运行截图】

img


【文件信息】

img

【代码】

#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++代码:

  1. 定义学生结构体
  2. 从键盘输入学生信息并存储在结构体数组中
  3. 将20名学生信息写入文件
  4. 从键盘输入10名学生信息并追加写入文件
  5. 读取文件中的学生信息并统计不及格科目及课程名称

以下是完成这个任务的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;
}