C ++文件输入/输出和数组辅助

时间:2013-12-10 01:20:15

标签: c++ arrays file

我有一个C ++项目要为我的课做,而且至少对我来说这是非常错综复杂的。我已经掌握了一般的想法和概念,但是当谈到数组和文件时,我遇到了其他一些问题。以下是项目的内容

您将为教师建立和修改课程名册系统,以管理他的班级名单和最终成绩。这个计划 将使用各种菜单选项的功能,您将使用 数组或向量中的数据。该程序将提供一个菜单系统,允许教师执行任务,直到他选择关闭该程序。该程序将读取和写入一个名为的文件 classroster.txt。名单的任何和所有添加,删除或更改都将保存在classroster.txt文件中。 该文件将包含班级中每个学生的成绩及其成绩。有关如何将数据存储在classroster.txt文件中的示例,请参阅以下示例。您应该使用数组或向量处理数据。

Jim Jones C
Kevin James B
Marc Cohen A+

当程序启动时,它应该将classroster.txt中的数据读入数组或向量中。在程序运行时,它应该在使用程序时使用数组或向量来执行函数。程序结束时,如果更改了某些内容,则应覆盖classroster.txt文件。该 程序菜单将提供以下选项,并允许用户继续执行功能,直到他们选择退出程序(提示!!!!!您将需要使用菜单系统的循环)

添加新学生 - 这将允许用户将新学生添加到系统中。系统应提示新学生姓名,然后评分。 它应验证等级是否为以下值 (A +,A,A-,B +,B,B-,C +,C-,C-,D +,D,D-,F)如果不是 在批准的列表中,它应该提示用户有效等级。

更改学生成绩 - 这将找到有问题的学生并改变成绩。如果指定的学生不存在,程序应该打印一条错误消息,告诉用户您找不到指定的学生 改变他们的成绩。

删除学生 - 将从名册中删除学生及其成绩。如果指定的学生不存在,程序应该打印一条错误消息,告诉用户您找不到要删除的指定学生。

展示班级名册 - (如果可以显示名称,则可以按字母顺序加分)这个 功能将显示所有学生及其成绩的列表 屏幕看起来像这样:

Student Name Grade
Jim Jones C
Kevin James B-
Marc Cohen A+

这是我到目前为止,它显然还没有完成

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    const int num_of_students;
    const int new_student = 1, change_grade = 2, remove_student = 3, display_roster = 4, quit = 5;
    int classroster[num_of_students];
    int student_grade[num_of_students];
    string possible_grades[13] = {"A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "D-", "F"};
    int choice;
    ofstream class_file;


    cout << "How many students do you have in your class?" << endl;
    cin >> num_of_students;

    cout << "---MENU---" << endl;
    cout << "1. Add A New Student" << endl;
    cout << "2. Change A Students Grade" << endl;
    cout << "3. Remove A Student" << endl;
    cout << "4. Display Class Roster" << endl;
    cout << "5. Quit" << endl;
    cout << "Enter your choice: ";
    cin >> choice;

    if (choice == new_student) {
        for (int index = 0; index < num_of_students; index++) {
        class_file.open("classroster.txt");
        cout << "What is the name of the student you want to add? ";
        getline(cin, classroster);
        if (student_grade == possible_grades) {
        cout << "What is the final grade of this student? ";
        getline(cin, student_grade);
            }
        else {
                "Please enter a valid grade!"
            }
        cout << "Student added!";
        }
    }

    else if (choice == change_grade) {
        class_file.open("classroster.txt");
        cout << "What is the name of the student whose grade you want to change? ";
        getline(cin, )
    }

    else if (choice == remove_student) {

    }

    else if (choice == display_roster) {

    }

    else if (choice == quit) {

    }

    else {
        cout << "Please enter a valid choice!"
    }

    system("PAUSE");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

首先,回答你的问题,这是搜索一系列学生姓名的一种方法:

int index = -1;

for(int k=0; k<num_of_students; ++k)
{
  if(names[k] == name)
    index = k;
}

这是一种改变成绩阵列的方法:

student_grade[index] = 3;

更一般地说,你采取了错误的方法。您的代码无法编译,因此在测试任何代码之前,看起来好像是在编写代码。因为他们似乎从未在学校教过,你应该从小而简单的东西开始,一次增加一点复杂性,在每一步测试,永远不要添加到不起作用的代码。 < / p>

让我们从学生人数开始:

int main() {
  const int num_of_students;
  cout << "How many students do you have in your class?" << endl;
  cin >> num_of_students;
  return(0);
}

尝试编译这个,你会发现有什么不对劲。修复它并尝试构造一个int数组并填充它。一旦它工作,尝试一个string数组。小步骤。

答案 1 :(得分:0)

你真的应该使用地图来解决这个问题,它最有意义。这是从文件中读取地图的代码。获得地图后,您需要的所有操作都已在STL中实现。我意识到你可能需要使用vector,但我想你不会因为聪明而且实际上写一个合适的解决方案而受到惩罚。

#include <map>
#include <fstream>
#include <iostream>

using namespace std;

int main(){

    map<string,string> data;

    fstream fs("classroster.txt");

    while(fs.good()){
        string fname, lname, grade;
        fs >> fname;
        fs >> lname
        fs >> grade;
        fname += lname; //Concat Names to get full
        if(grade == "A") //Check other grades as well.
            data.emplace(fname,grade);

    }

    while(1){
        string option;
        std::cout << "Options:" << endl;
        cin >> option;
        //Your option selection code here

    }
    return 0;
}

编辑: map也按键名排序,因此按字母顺序打印非常简单,无需排序。

for(auto& pairs : data)
    cout << pairs.first << " " << pairs.second << endl;