我正在编写两个函数:其中一个用于用随机值“填充”数组并设置int第二个函数,我必须使用相同的数组,选择一行并找到该行的min元素。
但是问题是我不知道如何将值从一个函数传递给另一个函数。
这是我的代码:
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
void fillarray(int arr[5][5], int rows, int cols) {
cout << "Static Array elements = \n\n" << flush;
for(int i = 0; i < rows; ++i) {
cout << "Row " << i << " ";
for(int j = 0; j < cols; ++j) {
arr[i][j] = rand() % 10;
cout << arr[i][j] << " " << flush;
}
cout << endl;
}
cout << " \n\n";
}
void minarray(int a, void fillarray) { // don't know what to write here
there:
int min = INT_MAX; // Value of INT_MAX is 2147483648.
if(a > 4) {
cout << "Invalid input! " << endl;
goto there;
}
for(int counter = 0; counter < 5; ++counter) {
if(arr[a][counter] < min) min = arr[a][counter];
}
cout << "Minimum element is " << min << endl;
}
int main() {
int z;
srand(time(NULL));
const int rows = 5;
const int cols = 5;
int arr[rows][cols];
fillarray(arr, rows, cols);
cout << "Enter the number of row: ";
cin >> z;
minarray(z, fillarray)
system("PAUSE");
}
答案 0 :(得分:0)
对于初学者来说,函数fillarray
具有冗余参数cols
,因为从第一个参数int arr[5][5]
的声明中可以知道此数字。
可以像这样声明函数
void fillarray(int arr[5][5], int rows )
如果未在函数中填充整个数组,则可以提供参数cols
。
您已经通过此调用填充了数组
fillarray ( arr, rows, cols );
该功能执行了其任务。因此,您无需在尝试时再次引用该函数
minarray(z, fillarray)
函数minarray
可以像这样声明
void minarray( const int arr[], size_t n );
并称呼为
minarray( arr[z], cols );
初步检查z小于5。
或者可以将其声明为
void minarray( const int arr[][5], size_t n, size_t row );
并称呼为
minarray( arr, rows, z );
请注意,存在标准算法std::min_element
,该算法可以查找数组中的最小元素。要用值填充数组,可以使用标准算法std::generate
。
每个功能只能执行一项任务。例如,函数fillarray
应该用值静默地填充数组。要输出数组,可以编写一个单独的函数。
答案 1 :(得分:0)
我不确定它是否可以编译,但是我猜您想将int arr [x] [y]从fill Array函数传递给minArray函数。为此,您首先需要将arr作为minArray的参数。从那里,您需要通过引用传递它。然后,您可以从fillArray调用minArray。
答案 2 :(得分:0)
您需要做的是调用fillarray来填充数组。所以看起来像
fillarray(arr, rows, cols);
就像您到目前为止一样。现在,您已经全部填写了数组arr。minarray不在乎这是怎么发生的。因此,请不要通过您的填充方法。将其传递给数组。
minarray(cols, arr[z]);
您不需要传递整个数组-只需传递相关行即可。您也在传递宽度。
并更改minarray的定义:
void minarray(int length, int[] array)
现在,您的minarray本身需要更改。首先,摆脱if-check。您现在不需要传递行号,但是您确实需要按长度传递列数。
然后您的for循环如下:
for (int index = 0; index < length; ++index) {
if (array[index] < min) {
min = array[index];
}
}
所以,总结一下:
Main声明数据并调用您的两个方法。
fillarray填充数组。从主要方式调用它就已经拥有了。
minarray在一行上打印最小值。也可以从main调用它,传入数组,而不是填充它的方法。
但是,您还有另外一期。 fillarray将数组大小硬编码为5x5,但是main使用定义的常量。我会将那些内容移到文件的顶部,并在两个地方都使用它们。
移动到顶部,在任何#includes下方:
const int rows = 5;
const int cols = 5;
定义fillarray:
void fillarray(int arr[rows][cols]) {
当您从main调用它时:
fillarray(arr);
答案 3 :(得分:0)
我将让其他答案回答您的问题,并专注于您在评论中询问的goto
周围的代码。
在main
中,您有以下内容:
cout << "Enter the number of row: ";
cin >> z;
minarray(z, fillarray)
在minarray
中,您有以下内容:
void minarray(int a, void fillarray) { // don't know what to write here
there:
int min = INT_MAX; // Value of INT_MAX is 2147483648.
if(a > 4) {
cout << "Invalid input! " << endl;
goto there;
}
首先,绝对没有理由使用goto
。您可以这样做:
void minarray(int a, void fillarray) { // don't know what to write here
int min = INT_MAX; // Value of INT_MAX is 2147483648.
while(a > 4) { // loop for as long as "a > 4"
cout << "Invalid input! " << endl;
}
删除goto
使该错误变得很明显。 a
将永远不会在循环内更改,因此,如果您给它输入无效的输入,它将永远打印Invalid input!
。一种替代方法是当您实际从用户那里获得输入时(在main
中)来验证输入:
while(true) { // loop forever
cout << "Enter the number of row: ";
if(cin >> z) { // check that the user inputs an int
if(z<0 || z>4) // validate the input
cout << "Invalid input!\n";
else
break; // we got valid input, break out of the while loop
} else { // user did not input an int
std::cout << "input failed - aborting\n";
return 1; // return from main to exit the program
}
} // if the program reaches this point, it'll ask the user for input again
// and that will only happen if the user gives it an int that is <0 or >4