- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我和我的 friend 正在尝试将用户定义的数组传递给函数,并对在函数外部定义的数组执行“二维数组”排序机制。
我们在网上找到了一个函数,可以对自身内部的预定义数组进行排序,并尝试使用该函数。
我们的问题在于尝试在函数中使用用户定义的数组。
请检查下面的代码(请注意,我们不知道如何使用结构)
问题是:我们如何在排序数组函数中使用 orderListArray[][]?
#include <stdio.h>
#include <stdlib.h>
// define for sort array function later on
#define ARRAYSIZE(array) (sizeof(array)/sizeof(*(array)))
// function prototype
int sortArray();
int printOrderlist();
// data variables to be used throughout the code.
int itemNumber;
int itemAmount;
int maxItem = 0;
int lineCount = 0;
int priceToPrint = 0;
float totalPrice = 0;
// array we wish to implement into "sortArray" function
int orderListArray[][2];
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
int orderList()
{ // begin orderList
// makes sure user enters a maximum of 5 orders
int k = 0; // first place in array
int g = 0; // second place in array
do
{ // begin do1
printf("%d %d\n", k,g);
// asks for item number
puts("Enter item number (1-100):");
scanf("%d", &itemNumber);
// add scan to first spot (k) which is 0,0 (row 0, spot 0)
orderListArray[k][g] = itemNumber;
// add g++ to go to 0,1 ( row 0, spot 1)
g++;
// asks for amount
printf("%d %d\n", k, g);
printf("You can order %d more items\n", 5-itemAmount);
printf("Enter amount:\n");
scanf("%d", &itemAmount);
maxItem = maxItem + itemAmount;
// add itemAmount to g which is 0,1
orderListArray[k][g] = itemAmount;
k++; // go to row 1 instead of row 0
g--; // go back to spot 0 in row.
// lineCount is used when we print rows of array since that is not predefined
lineCount++;
} // end do1
// runs as long as the total amount of items inputed matches.
while (maxItem <= 4);
return 0;
} // end orderList
//////////////////////////////////////////////////////////////////////////////// //////////
//////////////////////////////////////////////////////////////////////////////// //////////
int main(void)
{
orderList();
sortArray();
return 0;
}
//////////////////////////////////////////////////////////////////////////////// //////////
//////////////////////////////////////////////////////////////////////////////// //////////
// is used in sortArray() to sort 2d array.
int compare(const void *a, const void *b) {
int x1 = *(const int*)a;
int x2 = *(const int*)b;
if (x1 > x2) return 1;
if (x1 < x2) return -1;
// x1 and x2 are equal; compare y's
int y1 = *(((const int*)a)+1);
int y2 = *(((const int*)b)+1);
if (y1 > y2) return 1;
if (y1 < y2) return -1;
return 0;
}
//////////////////////////////////////////////////////////////////////////////// //////////
//////////////////////////////////////////////////////////////////////////////// //////////
// sortArray function (here we want to implement the orderListArray[k][g]
// and run on that instead of predefined matrix which is included in the code
int sortArray(int b[], size_t size)
{ // begin sortArray
int matrix[][2] = {{8,6}, {4,2}, {1,0}, {4,8}, {2,4},
{4,3}, {1,2}, {2,2}, {8,3}, {5,5}};
printf("Original: ");
for (size_t i = 0; i < ARRAYSIZE(matrix); i++)
printf("(%d,%d) ", matrix[i][0], matrix[i][1]);
putchar('\n');
qsort(matrix, ARRAYSIZE(matrix), sizeof(*matrix), compare);
printf("Sorted : ");
for (size_t i = 0; i < ARRAYSIZE(matrix); i++)
printf("(%d,%d) ", matrix[i][0], matrix[i][1]);
putchar('\n');
return 0;
} // end sortArray
最佳答案
您有一个真正的
二维数组。这是一个数组的数组,因此元素是数组,因此您的比较函数接收指向数组的指针作为其参数。您的比较代码实际上并没有错误,但确认您正在比较的元素的正确类型会更干净、更清晰:
int compare(const void *a, const void *b) {
const int (*x1)[2] = a;
const int (*x2)[2] = b;
if ((*x1)[0] > (*x2)[0]) return 1;
if ((*x1)[0] < (*x2)[0]) return -1;
if ((*x1)[1] > (*x2)[1]) return 1;
if ((*x1)[1] < (*x2)[1]) return -1;
return 0;
}
然而,主要问题似乎是由这段代码注释代表的:
here we want to implement the orderListArray[k][g] and run on that instead of predefined matrix
对于k
来说,作为一个可调整的参数并不是一个特殊的问题,但是对于g
来说,它是一个可调整的参数,这使得事情变得非常复杂。甚至声明您的函数都需要伪造类型或使用可变长度数组。无论哪种方式,您的函数签名都没有提供足够的信息。您必须知道或假设数组的两个维度,并且只有一个参数size
来传达该信息。
如果您假设要排序的数组将是一个对数组,就像示例代码中的 matrix
一样,那么只需编写函数签名,如下所示:
int sortArray(int b[][2], size_t size) // ...
并依赖调用者通过size
参数提供元素(对)的数量。然后你可以像这样调用qsort
:
qsort(b, size, sizeof(*b), compare);
如果矩阵行的长度可变,那就会更加困惑,因为这样您必须动态选择特定于正确长度的比较函数,或者概括您的比较函数并通过其他方式将行长度传递给它比它的参数(因此,可能通过文件范围变量)。这两种方法都有明显的缺点。
第三种方法是依靠 sortArray()
的调用者提供合适的比较函数,但如果这样做,则必须考虑 sortArray()< 的值是什么
实际上是相对于直接调用 qsort()
提供的。
关于c - 如何在其他函数中使用二维数组?不知道如何让它发挥作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39645034/
我是一名优秀的程序员,十分优秀!