用0-99的随机数填充C中的2D数组,然后按降序排序

时间:2018-07-12 16:30:20

标签: c pointers multidimensional-array

这是我的作业分配问题,但是我在尝试打印阵列时遇到问题。该程序将提示用户输入“行数”和“列数”,但将立即终止而不打印任何内容,我不确定为什么会这样。

我的排序功能也不起作用。该代码给了我关于指针的错误,但是现在对它们还不太熟悉。如果有一种不用指针的方法,我想那会更好。但是,如果最好的方法是使用指针,请包括在内。帮助将不胜感激

警告:赋值使指针产生整数,而没有强制转换[-Wint-conversion]      temp = A [i];

错误:分配给具有数组类型的表达式      A [i] = A [j];

错误:分配给具有数组类型的表达式      A [j] =温度;

<>

2 个答案:

答案 0 :(得分:2)

是的,很好。首先sortMatrix(int A[][M1]...。在这种情况下,您要传递一个指向数组行的指针。在C ++中,没有其他方法可以仅通过指针将数组传递给函数。 Look over there.

第二,当您执行类似A[i] > A[j]的操作时,您正在比较行指针(顺便说一下,comparing pointers is UB。但是,在您的情况下,那只是比较行地址,这仍然是,而不是您要对数组进行排序时应该做的事情。 我建议这个A[i][M1] > A[j][M1]。这样,您将比较元素。

最后,但并非最不重要。

  

但将立即终止而不打印任何内容

您是说控制台窗口立即关闭吗?在这种情况下,您可能需要在打印数组之后将cin.get();添加到代码中,或者如果使用的是透明C,则需要添加system("pause");,否则请添加something like this

UPD。

  1. 如果您使用的是干净的C,则应该使用cin.get();来代替getchar();
  2. system("pause");确实只有Windows。

p.s。另外,请阅读Paul Ogilvie和Mike Housky的其他说明。他们正在写好东西。

p.p.s。原谅,如果有任何错误。英语,而不是我的母语,请随时编辑答案。

如果您有任何疑问,请随时与我联系。我会尽力回答。

答案 1 :(得分:1)

函数fillMatrix从用户那里检索两个重要值,rowscolumns,这是整个程序所需要的,但是当函数退出时,这些值会丢失。然后,您继续使用固定值N1M1

您应该将函数更改为void fillMatrix(int A[][M1], int *set_rows, int *set_columns),并通过引用传递rowscolumns,以便保存它们的值。

if(rows < 0 && rows >= 100)
{
    printf("Invalid Input.\n");
    printf("Enter a number of rows: ");
    scanf("%i", &rows);
}

行的有效范围应为1到M1。您还应该做好准备,以防用户再次输入错误的值。

没有标准方法可以对矩阵中的值进行排序。您要对每一行进行排序吗?您可以使用qsort对一维数组进行排序。

#define TOTAL_ROWS 100
#define TOTAL_COLUMNS 100
void fillMatrix(int A[][TOTAL_COLUMNS], int *set_rows, int *set_columns)
{
    int rows = 0, columns = 0;

    //ASK FOR ROWS
    while(1)
    {
        printf("Enter a number of rows: ");
        scanf("%i", &rows);
        if(rows > 0 && rows < TOTAL_ROWS)
            break;
        printf("Invalid Input.\n");
    }

    //ASK FOR COLUMNS
    while(1)
    {
        printf("Enter a number of columns: ");
        scanf("%i", &columns);
        if(columns > 0 && columns < TOTAL_COLUMNS)
            break;
        printf("Invalid Input.\n");
    }

    for(int i = 0; i < rows; i++)
        for(int j = 0; j < columns; j++)
            A[i][j] = rand() % 100;

    *set_rows = rows;
    *set_columns = columns;
}

int compare(const void *a, const void *b)
{
    return (*(int*)a - *(int*)b);
}

void sortMatrix(int A[][TOTAL_COLUMNS], int rowsize, int colsize)
{
    for(int r = 0; r < rowsize; r++)
        qsort(A[r], colsize, sizeof(int), compare);
}

void displayArray(int A[][TOTAL_COLUMNS], int rows, int columns)
{
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < columns; j++)
            printf("%3i ", A[i][j]);
        printf("\n");
    }
}

int main(void)
{
    srand((unsigned int)time(NULL));
    int array[TOTAL_ROWS][TOTAL_COLUMNS] = { 0 };
    int rows, columns;
    fillMatrix(array, &rows, &columns);
    sortMatrix(array, rows, columns);
    displayArray(array, rows, columns);
    return  0;
}

如果要使用自己的排序或专门用于冒泡排序,请为一维数组编写一个简单的冒泡排序函数,然后一次对矩阵进行1行排序:

void bubble_sort(int *arr, int count)
{
    for(int i = 0; i < count - 1; i++)
    {
        for(int j = 0; j < count - i - 1; j++)
        {
            if(arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

void sortMatrix(int A[][TOTAL_COLUMNS], int rowsize, int colsize)
{
    for(int r = 0; r < rowsize; r++)
        bubble_sort(A[r], colsize, sizeof(int), compare);
}

最后,如果提前不知道行和列,则声明int array[100][100]不是最佳方法。在gcc编译器中,您可以使用变量数组。在Visual Studio中,必须使用malloc才能根据用户为rowscolumns选择的内容动态分配数组。