这是我的作业分配问题,但是我在尝试打印阵列时遇到问题。该程序将提示用户输入“行数”和“列数”,但将立即终止而不打印任何内容,我不确定为什么会这样。
我的排序功能也不起作用。该代码给了我关于指针的错误,但是现在对它们还不太熟悉。如果有一种不用指针的方法,我想那会更好。但是,如果最好的方法是使用指针,请包括在内。帮助将不胜感激
警告:赋值使指针产生整数,而没有强制转换[-Wint-conversion] temp = A [i];
错误:分配给具有数组类型的表达式 A [i] = A [j];
错误:分配给具有数组类型的表达式 A [j] =温度;
<>
答案 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。
cin.get();
来代替getchar();
。system("pause");
确实只有Windows。p.s。另外,请阅读Paul Ogilvie和Mike Housky的其他说明。他们正在写好东西。
p.p.s。原谅,如果有任何错误。英语,而不是我的母语,请随时编辑答案。
如果您有任何疑问,请随时与我联系。我会尽力回答。
答案 1 :(得分:1)
函数fillMatrix
从用户那里检索两个重要值,rows
和columns
,这是整个程序所需要的,但是当函数退出时,这些值会丢失。然后,您继续使用固定值N1
和M1
您应该将函数更改为void fillMatrix(int A[][M1], int *set_rows, int *set_columns)
,并通过引用传递rows
和columns
,以便保存它们的值。
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
才能根据用户为rows
和columns
选择的内容动态分配数组。