我正在尝试构建一个程序,该程序将接受用户的数字并创建Floyd三角形。

我尝试使用Floyd三角形的逻辑,但将其打印为一条线。

例:

Enter total numbers: 5
Enter the numbers: 3,8,2,4,9

O / p:
3
82
249

这是我的代码:
#include <iostream>
using namespace std;

int main()
{
    int totalnos, j, i;

    cout << "Enter total numbers: ";
    cin >> totalnos;

    int numbers[totalnos];

    cout << "Enter the numbers: ";
    for (i = 1; i <= totalnos; i++)
    {
        cin >> numbers[i];
    }


    for (i = 1; i <= totalnos; i++)
    {
        for (j = 1; j <= 1; j++)
        {
            cout << numbers[i];
        }
    }
}

最佳答案

您对以下所示的循环类型有疑问。我不知道这种解决方案是由于您来自Pascal世界,还是因为您在其他地方看到过。无论如何,您都不应使循环从1开始并转到i,或者至少应考虑到在类似C的世界中( C C++ Java C#和其他),数组从索引0开始,到索引n - 1结束,即n是数组的大小。

int numbers[totalnos];

cout << "Enter the numbers: ";
for (i = 1; i <= totalnos; i++)
{
    cin >> numbers[i];
}

问题实际上不是用于循环的索引,而是在访问数组时必须始终使用0..n-1。因此,您可以更改循环以仅正确访问数组:
int numbers[totalnos];

cout << "Enter the numbers: ";
for (i = 1; i <= totalnos; i++)
{
    cin >> numbers[ i - 1 ];
}

或者,您可以像C语言一样从事所有程序员的工作,并直接从0开始索引:
int numbers[totalnos];

cout << "Enter the numbers: ";
for (i = 0; i < totalnos; i++)
{
    cin >> numbers[i];
}

现在,您不再是从1转到totalnos了,而是从0转到了totalnos - 1(注意i < totalnos而不是i <= totalnos,这是一个sutil更改)。

您正在访问超出数组限制的内存,这意味着您的程序将显示未定义的行为(这意味着它可能会崩溃,尽管在某些情况下似乎什么也没有发生,这更加危险)。

现在是算法本身。我还没有听说过 Floyd 三角形。似乎它是用从1开始的自然数构建的。但是,您要输入totalnos数字。为了使用totalnos行构建一个 Floyd 三角形,您将需要多个totalnos数字。这就是为什么您需要考虑到每一行的列数(numPos以0开头)来调整显示数字的位置。
cout << endl;
for (i = 0; i < totalnos; i++)
{
    if ( ( totalnos - i ) < numPos ) {
        numPos = totalnos - i;
    }

    for (j = 0; j < i; j++)
    {
        cout << numbers[numPos] << ' ';
        ++numPos;
    }
    cout << endl;
}

您可以在此处找到整个代码:http://ideone.com/HhjFpz

希望这可以帮助。

09-07 05:59