【问题标题】:Trouble with an if else if statement c++if else if语句c ++的问题
【发布时间】:2013-04-29 05:11:01
【问题描述】:

我正在做一个成绩册项目,该项目有 5 名学生,我想读取他们的姓名,然后使用内部循环为每个学生获取 4 个成绩。某些东西在这个循环上不起作用。这是我得到的:

请输入学生 1 的姓名:Dave
请输入 Dave 的 1 年级:100
请输入 Dave 的 2 年级:100
请输入 Dave 的 3 年级:100
请输入 Dave 的 4 年级:10
请输入学生 2 的姓名:James
请输入 James 的 5 年级:100
请输入学生 3 的姓名:Sam
请输入 Sam 的 5 年级:100
请输入学生 4 的姓名:Jack
请输入 Jack 的 5 年级:100
请输入学生 5 的姓名:Mike
请输入迈克的 5 年级:100

它应该在跳到下一个学生之前抢到 4 个等级。在过去的几个小时里,我一直无法弄清楚这一点。这是我到目前为止的代码:

#include <iostream>
#include <string>

using namespace std;

const int STUDENTS = 5; //holds how many students we have
const int SCORES = 4;

void getNames(string names[], double student1[SCORES], double student2[SCORES],
          double student3[SCORES], double student4[SCORES], double student5[SCORES],            int SCORES, int STUDENTS);

int main()
{
    string names[STUDENTS]  = {""};
    char grades[STUDENTS]   = {""};
    double student1[SCORES] = {0};
    double student2[SCORES] = {0};
    double student3[SCORES] = {0};
    double student4[SCORES] = {0};
    double student5[SCORES] = {0};

getNames(names, student1, student2, student3, student4, student5, SCORES,  STUDENTS);


//  Make sure we place the end message on a new line
    cout << endl;

//  The following is system dependent.  It will only work on Windows
    system("PAUSE");

    return 0;
}

void getNames(string names[], double student1[SCORES], double student2[SCORES],
          double student3[SCORES], double student4[SCORES], double student5[SCORES],     int SCORES, int STUDENTS)
{
     for (int i = 0; i < STUDENTS; i++)
     {
         cout << "Please enter the name for student " << i+1 << ": ";
         cin >> names[i];
         cout << endl;

         if (i == 0)
         {
            int count1 = 0;
            for (count1; count1 < SCORES; count1++)
            {
                cout << "Please enter the grade number " << count1+1 << " for " << names[i] <<": ";
                cin >> student1[count1];
                cout << endl;
            }
         }
         else if (i == 1)
         {
            int count2 = 0; 
            for (count2; count2 < SCORES; count2++);
            {
                cout << "Please enter the grade number " << count2+1 << " for " << names[i] <<": ";
                cin >> student2[count2];
                cout << endl;
            }
         }
         else if (i == 2)
         {
            int count3 = 0; 
            for (count3; count3 < SCORES; count3++);
            {
                cout << "Please enter the grade number " << count3+1 << " for " << names[i] <<": ";
                cin >> student3[count3];
                cout << endl;
            }
         }
         else if (i == 3)
         {
            int count4 = 0; 
            for (count4; count4 < SCORES; count4++);
            {
                cout << "Please enter the grade number " << count4+1 << " for " << names[i] <<": ";
                cin >> student4[count4];
                cout << endl;
            }
         }
         else
         {
            int count5 = 0; 
            for (count5; count5 < SCORES; count5++);
            {
                cout << "Please enter the grade number " << count5+1 << " for " << names[i] <<": ";
                cin >> student5[count5];
                cout << endl;
            }
         }

     }
}

感谢您对此的任何帮助!

【问题讨论】:

  • 为什么你有数组 student1, 2, 3, 4, 5 而不是学生数组?特别是因为你知道数组......(是的,你可以拥有数组数组,结构数组,任何你想要的)
  • 如果里面有那么大的 if/else,为什么还要有循环呢?
  • 相信你还没有掌握循环的概念。
  • 该项目要求我有五个数组,每组四个双打来保存每个学生的考试成绩。
  • std::array&lt;std::array&lt;double,SCORES&gt;,STUDENTS&gt;

标签: c++


【解决方案1】:

这里发生了一些相当粗糙的事情,但问题是除了第一个循环之外,你的所有内部循环都有一个分号:

for (count2; count2 < SCORES; count2++);

去掉分号,大括号里的东西就会成为循环的一部分。

我建议您在输入函数时将所有这些函数参数放入它们自己的数组中,从而使您的代码更整洁,更不容易出错,如下所示:

double *scores[5] = { student1, student2, student3, student4, student5 };

然后你去掉所有重复 - 复制/粘贴是导致你的问题开始的原因:

for (int i = 0; i < STUDENTS; i++)
{
    cout << "Please enter the name for student " << i+1 << ": ";
    cin >> names[i];
    cout << endl;

    for (int s = 0; s < SCORES; s++)
    {
        cout << "Please enter the grade number " << s+1 << " for " << names[i] <<": ";
        cin >> scores[i][s];
        cout << endl;
    }
}

【讨论】:

  • 谢谢你这样做。是的,它看起来很粗糙,随着时间的流逝,它变得越来越粗糙,我并不觉得那很傻;错误。感谢您的帮助,现在是时候听从您的建议并整理一下了。
  • 没问题。只是一些一般性建议,当您询问成绩时,您应该立即质疑count2 的值如何从4 开始。结尾的分号(空的 for 循环)是一个狡猾且难以发现的问题,但质疑您的输出应该会直接将您带到源头。一些实验(例如切换(i==0)(i==1) 条件会确定该循环存在问题,然后您可以尝试将其与工作循环逐个字符进行比较,以便快速找到问题。无论如何,快乐编码 =)
  • 谢谢帕迪,我总是很感激学习新的解决问题的方法。我在编程基础 1 中,在课堂上没有遇到太多麻烦,几乎可以在家中学习。再次感谢。还要感谢所有其他提供解决方案的人,我尝试他们所有人来了解更多信息。
【解决方案2】:

为什么不能像这样使用两个嵌套循环

  for (int studix=0, stduix<STUDENTS; studix++) { 
     //...
     for (int gradix=0; gradix<SCORE; gradix++) {
        //...
     }
     //....
  }

顺便说一句,条件可能更复杂,例如内部循环是

     bool goodgrade=true;
     for (int gradix=0; goodgrade && gradix<SCORE; gradix++) {
       // you could modify goodgrade or use break; inside the loop
     }

不要忘记在循环中可能使用 continuebreak

请花点时间阅读一些不错的 C++ 编程书籍

【讨论】:

  • 该项目特别要求使用包含4个等级的5个数组。我看不出嵌套循环对我有什么帮助,因为我现在无法告诉循环它是下一个数组轮流。还是我错过了什么?我知道有更简单的方法可以做到这一点,但这些是我编写这个程序的准则。
  • 我认为您需要展示如何在内循环中建立索引,因为“项目需要”使用五个数组。看起来double *gradeArray[STUDENTS]; 是解决方案的一部分。然后gradeArray[0]=student1;
  • 你知道breakcontinue语句
  • yes break 让我跳出 if 语句并继续移动到下一次迭代。让我试试看。
【解决方案3】:

以 Basile 的回答和我的 cmets 为基础:

int main()
{
string names[STUDENTS]  = {""};
char grades[STUDENTS]   = {""};
double student1[SCORES] = {0};
double student2[SCORES] = {0};
double student3[SCORES] = {0};
double student4[SCORES] = {0};
double student5[SCORES] = {0};

double *gradeArray[STUDENTS];
gradeArray[0] = student1;
gradeArray[1] = student2;
gradeArray[2] = student3;
gradeArray[3] = student4;
gradeArray[4] = student5;

for (int studix=0, stduix<STUDENTS; studix++) { 
 // get the name of the student
 for (int gradix=0; gradix<SCORE; gradix++) {
    // put the grades in gradeArray[studix][gradix]...

 }
 //....
}

是的,我知道二维数组,但我试图明确说明如何使用“五个单独的数组”来完成。笨拙,但我相信这行得通。

【讨论】:

  • 当你在做 double *gradeArray[STUDENTS]; * 对数组做了什么?抱歉,我在编程基础 1 中提出了一个愚蠢的问题,但还没有回答。
  • @paddy 在他的回答中所做的相同......我声明了一个“指针数组” - 因为数组的“名称”实际上是一个指针。所以当你有double student1[5] 时,student1 实际上是一个指针(指向第一个元素)。当你创建一个指针数组时,你可以“选择使用哪个数组”——在我的例子中,gradeArray[2] 指向student3 的开始,所以gradeArray[2][3] 是学生 3 的四年级(记住数组开始为零)。这为你解释了吗?
  • 澄清一下:double *anything 声明 anythingpointer to double 类型。并且指针和数组有着非常密切的关系——这对于理解大量 C(和 C++)代码至关重要,而且非常值得你动脑筋。一个常见的错误是使用指针而不确保它们指向一个有效的地址——为你预留的内存。当您声明 double myArray[5] 时,这会自动为您完成 - 但是通过真正了解指针的作用可以解锁很多功能。
  • 我们的老师一直告诉我们,当我们谈论指针的时候真的很有趣,但是我们刚刚完成了数组,并不太希望本学期我们会使用指针看起来我必须弄清楚这一点我自己出去。我开始看到指针让思考变得更容易。
  • 是的 - 它确实很有趣。一开始有点混乱,但很有趣。这是您必须开始使用的东西之一,然后突然发出咔哒声。但是在你真正得到它之前,你会有一些 SEGFAULTS。我们都去过那里。不过,绝对值得努力!但是当你使用数组时,你已经在使用指针了——你只是不知道而已。 myArray[2] 实际上与*(myArray + 2) 相同。 (“当您将两个位置指向 myArray 所指向的点之后,您将获得的元素)。大量学习 - 在旅途中玩得开心!