我需要帮助弄清楚如何嵌套此循环

时间:2019-08-31 15:34:59

标签: c++

我正在为我的Programming II课程尝试一个Hacker Rank问题。我可以让程序打印正确的值但顺序混乱,或者以正确的顺序打印错误的值

我尝试以不同的方式将循环嵌套在彼此内部,以更改顺序,或保留第一个输入变量值,以便第二个循环可以读取它。到目前为止,我还没有得到想要的结果。

int main() 
{
int n;

for(int k = 0; k < 2; ++k)
{
    cin >> n;
    if(n == 1)
    {
        cout << "one\n";
    }
    else if(n == 2)
    {
        cout << "two\n";
    }
    else if(n == 3)
    {
        cout << "three\n";
    }
    else if(n == 4)
    {
        cout << "four\n";
    }
    else if(n == 5)
    {
        cout << "five\n";
    }
    else if(n == 6)
    {
        cout << "six\n";
    }
    else if(n == 7)
    {
        cout << "seven\n";
    }
    else if(n == 8)
    {
        cout << "eight\n";
    }
    else if (n >= 9)
    {
        cout << "nine\n";
    }
}
for(int j = 0; j < 2; j++)
{
    if(n % 2 == 0)
    {
        cout << "even\n";
    }
    else
    {
        cout << "odd\n";
    }
}


return 0;
}

使用8和11校正结果

八分
九个

奇怪的

我的结果

八分
九个
奇怪的
奇怪的

5 个答案:

答案 0 :(得分:1)

您的代码的问题在于,接受8作为输入后,由于将其替换为11作为输入,因此未保存在任何位置。因此,在第一个for循环结束后,n仍为11,因此两次得到奇数。请改用数组。

#include<iostream>

int main() 
{
int n;
int a[2],counter=0;
for(int k = 0; k < 2; ++k)
{
    std::cin >> n;
    a[counter++] = n;
    if(n == 1)
    {
        std::cout << "one\n";
    }
    else if(n == 2)
    {
        std::cout << "two\n";
    }
    else if(n == 3)
    {
        std::cout << "three\n";
    }
    else if(n == 4)
    {
        std::cout << "four\n";
    }
    else if(n == 5)
    {
        std::cout << "five\n";
    }
    else if(n == 6)
    {
        std::cout << "six\n";
    }
    else if(n == 7)
    {
        std::cout << "seven\n";
    }
    else if(n == 8)
    {
        std::cout << "eight\n";
    }
    else if (n >= 9)
    {
        std::cout << "nine\n";
    }
}
for(int k = 0;k<counter;k++){
    if(a[k] % 2 == 0)
    {
        std::cout << "even\n";
    }
    else
    {
        std::cout << "odd\n";
    }
}


return 0;
}

答案 1 :(得分:0)

此循环:

for(int j = 0; j < 2; j++)
{
    if(n % 2 == 0)
    {
        cout << "even\n";
    }
    else
    {
        cout << "odd\n";
    }
}

在您的第一个循环之外。

您根本就不需要循环,只需要if即可获得偶数或奇数。

答案 2 :(得分:0)

在第二个循环中,您不会检查两个值,而只会检查最后一个(当您第二次覆盖第一个值时,使用n分配给std::cin时)。为了解决这个问题,您可以使用语法nint n[2];声明为数组,然后在循环中循环编写n[k]n[j](在此特定程序中,请记住, n,j和k是任意名称)。在这种情况下,您实际上并不需要嵌套循环,但可以轻松实现嵌套循环,并且通常很有用。语法如下:

for(int i = 0; i < 23; i++)
{
    /*bar*/
    for(int j = 0; j < 42; j++)
    {
        /*foo*/
    }
}

在这种情况下,bar被执行23次,foo被执行23 * 42次

当程序基于变量的值具有不同的行为,并且您只需要检查相等性但针对许多不同的值时,建议使用switch-case块而不是if和else if。

因此,如果我个人不得不编写您正在编写的程序,我会这样做:

#include <iostream>
int main()
{
using namespace std;

int n[2];
for(int k = 0; k < 2; ++k)
{
    cin >> n[k];
    switch(n[k])
    {
    case 1:
        cout << "one\n";
        break;
    case 2:
        cout << "two\n";
        break;
    case 3:
        cout << "three\n";
        break;
    case 4:
        cout << "four\n";
                break;
    case 5:
        cout << "five\n";
        break;
    case 6:
        cout << "six\n";
        break;
    case 7:
        cout << "seven\n";
        break;
    case 8:
        cout << "eight\n";
        break;
    default:
        if(n[k]>=9)
            cout << "nine\n";
        break;
    }
}
for(int j = 0; j < 2; j++)
    if(n[j] % 2 == 0)
        cout << "even\n";
    else
        cout << "odd\n";


return 0;
}

答案 3 :(得分:0)

您可以在一个循环中完成此操作:

static char const * const number_names[] = 
{
  "zero", "one", "two", "three", "four",
  "five", "six", "seven", "eight", "nine"
};  

for (int k = 0; k < 2; ++k)
{
    std::cin >> k;
    if ((k >= 0) && (k < 10))
    {
        std::cout << number_names[k] << "\n";
    }
    else
    {
        std::cout << "number not within range\n";
    }
    if ((k%2) == 0)
    {
        std::cout << "even";
    }
    else
    {
        std::cout << "odd";
    }
    std::cout << "\n";
}

您可以将数字用作数字名称数组的索引。不需要switchif-else-if梯子。通常,在线法官并不关心任务的执行方式。他们还有其他标准。

偶数/奇数测试包含在同一循环中。这样就无需记住数字(即将它们存储到数组中)。

偶数和奇数打印均使用“ \ n”,因此将其排除在外。 (对不起,但是是从前的习惯)。

该数组被声明为静态数组,因为它是私有数组并表示只有一个实例。

该数组包含不变的指针,例如常量。
该数组包含指向常量数据的指针。

选择了一个字符串文字数组,以便可以直接从程序的数据区域访问它,而无需通过诸如std::string之类的中间数据结构。

答案 4 :(得分:-1)

您没有保存n的旧值,这就是为什么您的n不起作用。您可以使用将每个输入保存在数组n [2]中,或者下面的命令也可以工作。正如评论中提到的那样,由于打印顺序错误,因此我使用数组来使其工作。

int main() 
{
int n[2];

for(int k = 0; k < 2; ++k)
{
    cin >> n[k];
    if(n == 1)
    {
        cout << "one\n";
    }
    else if(n == 2)
    {
        cout << "two\n";
    }
    else if(n == 3)
    {
        cout << "three\n";
    }
    else if(n == 4)
    {
        cout << "four\n";
    }
    else if(n == 5)
    {
        cout << "five\n";
    }
    else if(n == 6)
    {
        cout << "six\n";
    }
    else if(n == 7)
    {
        cout << "seven\n";
    }
    else if(n == 8)
    {
        cout << "eight\n";
    }
    else if (n >= 9)
    {
        cout << "nine\n";
    }


}

for(int k = 0; k < 2; ++k)
{
        if(n[k] % 2 == 0)
        {
            cout << "even\n";
        }
        else
        {
            cout << "odd\n";
        }
}
return 0;
}