Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用for循环从数组打印交替信息?_C++_Arrays_For Loop_Vector - Fatal编程技术网

C++ 如何使用for循环从数组打印交替信息?

C++ 如何使用for循环从数组打印交替信息?,c++,arrays,for-loop,vector,C++,Arrays,For Loop,Vector,我真的很抱歉让人困惑的标题,但是我不知道如何在不向您展示代码的情况下表达这个问题。这就是我的问题。我试图打印出20个学生的信息,这些信息都包含在3个不同的数组中:ID号、姓氏和年龄。数组和向量如下所示: vector<int> studentNumber (20); int age [20] {20, 21, 22, 42, 55, 28, 20, 20, 19,19, 22, 23, 25, 26, 24, 23, 19, 22, 21, 20}; string lastName

我真的很抱歉让人困惑的标题,但是我不知道如何在不向您展示代码的情况下表达这个问题。这就是我的问题。我试图打印出20个学生的信息,这些信息都包含在3个不同的数组中:ID号、姓氏和年龄。数组和向量如下所示:

vector<int> studentNumber (20);
int age [20] {20, 21, 22, 42, 55, 28, 20, 20, 19,19, 22, 23, 25, 26, 24, 23, 19, 22, 21, 20};
string lastName [20] {"Simmons", "Jones", "James", "Little", "Russell", "Haynes", "Marcotte", "Kemper", "Vandergore", "Hume", "Stephens", "Jensen", "Biersack", "Sykes", "Joseph", "Dunn", "Hai", "Meteos", "Aphromoo", "Faker"};
void getAllStudentInfo() {
    for (vector<int>::size_type i = 0; i <= 20; i++) {
    cout << "Student's ID number is: " << 400 + i << endl;
    }
    for (int i = 0; i < 20; i++) {
        cout << "Student's last name is: " << lastName[i] <<endl;
    }
    for (int i = 0; i < 20; i++) {
        cout << age[i] << endl;
    }
    return;
}
我使用3个for循环来打印所有这些信息,我让它们都正常工作。它们是:

vector<int> studentNumber (20);
int age [20] {20, 21, 22, 42, 55, 28, 20, 20, 19,19, 22, 23, 25, 26, 24, 23, 19, 22, 21, 20};
string lastName [20] {"Simmons", "Jones", "James", "Little", "Russell", "Haynes", "Marcotte", "Kemper", "Vandergore", "Hume", "Stephens", "Jensen", "Biersack", "Sykes", "Joseph", "Dunn", "Hai", "Meteos", "Aphromoo", "Faker"};
void getAllStudentInfo() {
    for (vector<int>::size_type i = 0; i <= 20; i++) {
    cout << "Student's ID number is: " << 400 + i << endl;
    }
    for (int i = 0; i < 20; i++) {
        cout << "Student's last name is: " << lastName[i] <<endl;
    }
    for (int i = 0; i < 20; i++) {
        cout << age[i] << endl;
    }
    return;
}

所以他们现在要做的就是把信息打印出来,20个身份证号码,20个姓氏,然后20个年龄。理想情况下,我希望他们打印每个数组的前3个元素,然后打印第二个元素,然后打印第三个元素,依此类推。所以它看起来像,身份证号码,姓氏,年龄,重复二十次,而不是身份证号码x20,姓氏x20,年龄x20。我该如何重构它,使它看起来像我希望的那样?

您需要将for循环组合成一个循环。 首先,您对数据结构的选择是不寻常的。为什么要混合向量和数组?对于这三种情况,最好都使用向量。然后可以在运行时确定学生的数量,再加上优秀的调试器将执行边界检查。您还应该避免硬编码代码中的幻数,例如20。如果数字需要更改,则更新代码会变得更加困难。此外,我不确定studentNumber向量的意义是什么,因为它从不存储任何数据。你只是想要个柜台吗?使用int

使用数据结构的代码如下所示:

for (size_t i = 0; i < numStudents; i++)
{
    cout << "Student's ID number is: " << 400 + i << "\n";
    cout << "Student's last name is: " << lastName[i] << "\n";
    cout << age[i] << "\n";
}
稍后了解getter和setter时,您可以添加一些细节,例如getter和setter

现在按如下方式填充学生的数据结构:

vector<Student> allStudents;

// optional - if you know the number of students in advance, you can give a hint to the vector to increase its performance. the number does not need to be exact and calling reserve does not increase the number of elements in the vector right away
allStudents.reserve(20);

// add student data, possibly from a file?
allStudents.push_back(Student(400, 15, "Billy"));
allStudents.push_back(Student(401, 16, "Sally"));
// alternative slightly more efficient syntax for C++11
allStudents.emplace_back(402, 15, "Jill");
现在只有一个数据结构供您迭代。您可以这样做:

for (size_t i = 0; i < allStudents.size(); i++)
{
    cout << "Student's ID number is: " << allStudents[i].id << "\n";
    cout << "Student's last name is: " << allStudents[i].name << "\n";
    cout << allStudents[i].age << "\n";
}
在C++11中,可以使用更方便的语法:

// remove the const keyword if you want to be able to write to student objects in the vector
for (const auto& student : allStudents)
{
    cout << "Student's ID number is: " << student.id << "\n";
    cout << "Student's last name is: " << student.name << "\n";
    cout << student.age << "\n";
}
请注意,您的数据是如何保存在一个逻辑位置的,如果您不想,您不需要硬编码许多学生,好的调试器现在将执行更多的边界检查

实例:

如果您不需要或不想使用直接原始数组,您可以包含与类结构相关的所有这些信息,您可以在该类对象上实现打印函数,也可以添加重载的std::cout 您只需在单个循环中打印Id、姓名和年龄

void getAllStudentInfo() 
{

  vector<int> studentNumber(20);
  int age [20] {20, 21, 22, 42, 55, 28, 20, 20, 19,19, 22, 23, 25, 26, 24, 23, 19, 22, 21, 20};
  string lastName [20] {"Simmons", "Jones", "James", "Little", "Russell", "Haynes", "Marcotte", "Kemper", "Vandergore", "Hume", "Stephens", "Jensen", "Biersack", "Sykes", "Joseph", "Dunn", "Hai", "Meteos", "Aphromoo", "Faker"};
  int i;
  for (vector<int>::size_type i = 0; i < 20; i++)
  {
    cout << "Student's ID number is: " << 400 + i << endl;
    cout << "Student's last name is: " << lastName[i] <<endl;
    cout << age[i] << endl;
  }
  return;
  }

std::cout在同一个循环中包含不同的信息。然后更改它们是否都需要成为一个数组才能做到这一点?当我把姓氏和年龄结合起来的时候,这很好,但是我怎么把身份证号码结合起来呢?我想出来了。谢谢各位。要点很简单:重构意味着在不改变行为的情况下改变实现。在了解了这一点之后,有几种不同的方法可以使用std::cout对象的stream操作符。您可以让列表使用stream操作符并循环遍历列表中的所有对象,也可以将此操作符添加到StudentInformation结构中,以打印该对象的每个实例的数据。