2D阵列打印不正确

时间:2016-04-01 04:21:58

标签: c arrays for-loop multidimensional-array traveling-salesman

我在为旅行商问题打印出2D数组时遇到了问题。我使用输入重定向从文本文件中获取输入。该文件包含具有城市之间距离的城市和弧。这是一个小例子。

c 1
c 2
a 1 2 1400

在设置我的数组并绘制城市之间的距离后,我使用嵌套的for循环打印出数组,但它看起来像这样。

    0       1       2       3       4       5

    1       0       1400    1800    4000    3500

    2       1       0       0       3400    3600

    3       1800    1200    0       2300    0

    4       4000    3400    2300    0       2100

    5       3500    3600    0       2100    0

编辑:我想让它看起来像这样

    0       1       2       3       4       5

    1       0       1400    1800    4000    3500

    2       1400    0       1200    3400    3600

    3       1800    1200    0       2300    2700

    4       4000    3400    2300    0       2100

    5       3500    3600    2700    2100    0

我尝试以不同的方式操纵for循环,但我似乎无法弄清楚我的问题在循环中的位置,或者它是否在我的代码中的其他位置。

// Sets up the array
int CityArray [6][6] = { {0, 0, 0, 0, 0, 0},
                         {0, 0, 0, 0, 0, 0},
                         {0, 0, 0, 0, 0, 0},
                         {0, 0, 0, 0, 0, 0},
                         {0, 0, 0, 0, 0, 0},
                         {0, 0, 0, 0, 0, 0}
                       };

int main(void) // Takes in a variable number of arguments
{
    // Sets a string input for the city
    char Cbuffer[32];
    char *b = Cbuffer;
    size_t cbufsize = 32;
    size_t cinput;

    // Other vairables
    int x = 1; // used to go through the array
    int n1, n2, n3, n4, cost; // variables to store the value pulled the cost from the arc

    // Reads in the city and sets the prices for each arc
    while((cinput = getline(&b, &cbufsize, stdin)) != -1)
    {
        if (Cbuffer[0] == 'c')
        {
            // Stores the last element as a digit to CityArray
            if (Cbuffer[2] >= '0' && Cbuffer[2] <= '9')
            {
                CityArray[x][0] = Cbuffer[2] - '0';
                int z = CityArray[x][0];
                // Flips it
                CityArray[0][x] = Cbuffer[2] - '0';
                z = CityArray[0][x];
                // printf("CityArray[%d] is '%d' \n", x, z);
                x++;
            }
        }
        else if (Cbuffer[0] == 'a')
        {
            int y = 1;
            // I know this looks ugly but it's the only way I could think of getting the prices
            if ((Cbuffer[6] >= '0' && Cbuffer[6] <= '9') && (Cbuffer[7] >= '0' && Cbuffer[7] <= '9') &&
                    (Cbuffer[8] >= '0' && Cbuffer[8] <= '9') && (Cbuffer[9] >= '0' && Cbuffer[9] <= '9'))
            {
                for (x = 1; x < 6; x++)
                {
                    for (y; y < 6; y++)
                    {   // converts the char to a int
                        n1 = CityArray[x][6] = Cbuffer[6] - '0';
                        n2 = CityArray[x][7] = Cbuffer[7] - '0';
                        n3 = CityArray[x][8] = Cbuffer[8] - '0';
                        n4 = CityArray[x][9] = Cbuffer[9] - '0';
                    }
                } // sets all converted ints to = cost
                cost = (n1 * 1000) + (n2 * 100) + (n3 * 10) + (n4 * 1);
                x++;
            }
            // Checks where the arc is located and plots the distance of the trip
            if (Cbuffer[2] == '1')
            {
                if (Cbuffer[4] == '2')
                {
                    CityArray[1][2] = cost;
                    CityArray[2][1] = cost;
                }
                else if (Cbuffer[4] == '3')
                {
                    CityArray[1][3] = cost;
                    CityArray[3][1] = cost;
                }
                else if (Cbuffer[4] == '4')
                {
                    CityArray[1][4] = cost;
                    CityArray[4][1] = cost;
                }
                else if (Cbuffer[4] == '5')
                {
                    CityArray[1][5] = cost;
                    CityArray[5][1] = cost;
                }
            }
            else if (Cbuffer[2] == '2')
            {
                if (Cbuffer[4] == '3')
                {
                    CityArray[2][3] = cost;
                    CityArray[3][2] = cost;
                }
                else if (Cbuffer[4] == '4')
                {
                    CityArray[2][4] = cost;
                    CityArray[4][2] = cost;
                }
                else if (Cbuffer[4] == '5')
                {
                    CityArray[2][5] = cost;
                    CityArray[5][2] = cost;
                }
            }
            else if (Cbuffer[2] == '3')
            {
                if (Cbuffer[4] == '4')
                {
                    CityArray[3][4] = cost;
                    CityArray[4][3] = cost;
                }
            else if (Cbuffer[4] == '5')
            {
                    CityArray[4][5] = cost;
                    CityArray[5][4] = cost;
                }
            }
            else if (Cbuffer[2] == '4')
            {
                if (Cbuffer[4] == '5')
                {
                    CityArray[4][5] = cost;
                    CityArray[5][4] = cost;
                }
            }
        }   
    }

    // Prints the array
    int i, j;
    printf("\n\nThe cost list is:\n\n");
    for(i = 0; i < 6;i ++)
    {
        printf("\n\n");
        for(j = 0; j < 6; j++)
        {
            printf("\t%d", CityArray[i][j]);
        }
        printf("\n");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

            for (x = 1; x < 6; x++)
            {
                for (y; y < 6; y++)
                {   // converts the char to a int
                    n1 = CityArray[x][6] = Cbuffer[6] - '0';
                    n2 = CityArray[x][7] = Cbuffer[7] - '0';
                    n3 = CityArray[x][8] = Cbuffer[8] - '0';
                    n4 = CityArray[x][9] = Cbuffer[9] - '0';
                }
            } // sets all converted ints to = cost
            cost = (n1 * 1000) + (n2 * 100) + (n3 * 10) + (n4 * 1);
            x++;

首先,你不需要循环;在这里循环意味着您将进行多次转换。 (更糟糕的是,实际上:因为你没有初始化y,你可能根本不会进行转换。如果你激活了警告,你就会对标准的“声明没有效果”这样做。 {1}}。)

其次,将转换后的数字存储在y中,但是6及以上的索引超出范围。这是未定义的行为。实际上,您会覆盖下一个城市的数据。

第三,你不应该使用CityArray[x][6 ... 9]作为循环变量和变量来保存城市的数量。循环将覆盖数据。 (但是当你移除循环时,这个问题就会消失。)

只是做:

x

代码仍有许多问题。特别是,城市和距离的解析非常有限。如果城市的费用不是四位数,会发生什么?如果第一个城市的数量大于第二个城市会发生什么?

您还可以使用ASCII转换为城市的单个数字整数:

            n1 = Cbuffer[6] - '0';
            n2 = Cbuffer[7] - '0';
            n3 = Cbuffer[8] - '0';
            n4 = Cbuffer[9] - '0';

            cost = (n1 * 1000) + (n2 * 100) + (n3 * 10) + (n4 * 1);

这将摆脱很多代码。而不是硬编码所有可能性,你的能量更好地用于编写有意义的错误消息,例如,如果一个城市的id超出界限。

您还应该考虑使用标准方法来解析输入。 int from = Cbuffer[2] - '0'; int dest = Cbuffer[4] - '0'; CityArray[from][dest] = cost; CityArray[dest][from] = cost; getline结合使用可能是一种很好的方法。

编辑:下面是输入的示例实现。它最多可以占用10个城市,由一个字符标识,可以是一个数字。它对scanfc行的确切格式没有任何限制,也会跟踪变量a中实际城市的数量。它接受以ncitiy开头的空行和行作为非命令。

尽管检查错误,但此程序比您的程序短一些。这是:

#