C ++:2D数组;代码不能正常工作。通常的学生和标记数组

时间:2014-05-21 23:56:07

标签: c++ multidimensional-array

学生一栏,标记栏一栏。 我为此研究了很多,但代码仍然无法正常工作。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string arr[2][2];

    for (int i=0; i<2; i++)
    {
        for (int j=0; j<2; j++)
        {
            cout<<"Enter name: "<<(i+1)<<endl;
            cin>>arr[i][0];
            cout<<"Enter marks: "<<(i+1)<<endl;
            cin>>arr[i][1];

        }

    }


    cout<<arr[0][0]<<"\t\t";
    cout<<arr[0][1]<<endl;
    cout<<arr[1][0]<<"\t\t";
    cout<<arr[1][1]<<endl;
    return 0;
}

当我输入数据时,我会插入8个元素而不是4个。这是一个2x2表。

2 个答案:

答案 0 :(得分:4)

想想你的双循环。你要去:

i: 0
j: 0

i: 0
j: 1

i: 1
j: 0 etc.. 

是的,这是4,但每次你输入2x用户。

试试这个:

for (int i=0; i<2; i++)
{  
    cout<<"Enter name: "<<(i+1)<<endl;
    cin>>arr[i][0];
    cout<<"Enter marks: "<<(i+1)<<endl;
    cin>>arr[i][1];
}

我的意思是你甚至没有在循环中使用j?作为一个有趣的补充,请考虑使用不同的类型来存储用户和标记。我认为你最好使用map

std::map<string, int> gradeRegister;
for (int i=0; i<2; i++)
{  
    string name;
    int grade;
    cout << "Enter name " << i+1 << ": " << std::flush;
    cin >> name;
    cout << "Enter grade " << i+1 << ": " << std::flush;
    cin >> grade;
    gradeRegister[name] = grade;
}

地图在这种情况下更有意义,因为那时你将有一个独特的名称来评分,它易于搜索,你可以扩展它以更容易地包含更多的人。请查看 here 以获取更多信息。

答案 1 :(得分:1)

虽然您可以询问值,但更方便用户的方法是在为其他用户询问所有标记之前输入单个用户的所有标记。
(以下代码假设一个学生可以有多个分数,学生名称是唯一的)

#define MAXIMUM_STUDENTS 3
#define MAXIMUM_MARKS_PER_STUDENT 4

typedef std::vector<std::string> Marks_Container;
typedef std::map<std::string, Marks_Container> Registry_Container;
Registry_Container student_registry;

  for (int student = 0; student < MAXIMUM_STUDENTS; student++)
  {
    cout<<"Enter student name name: " << endl;
    std::string student_name;
    getline(cin, student_name);

    Marks_Container student_marks(MAXIMUM_MARKS_PER_STUDENT);
    for (int mark_index = 0;
         mark_index < MAXIMUM_MARKS_PER_STUDENT;
         ++mark_index)
    {
      cout << "Enter mark "
           << (mark_index + 1)
           << ": " << endl;
      std::string mark;
      getline(cin, mark);
      student_marks.push_back(mark);
    }
    student_registry[student_name] = student_marks;
  }

没有理由复制学生姓名,这是std::map<name, marks>结构的原因。关键字段是学生姓名,值字段是标记的矢量。