要求用户在 2d 数组时输入 1 行的值
Posted
技术标签:
【中文标题】要求用户在 2d 数组时输入 1 行的值【英文标题】:ask the user to input the values 1 row at a time of 2d array 【发布时间】:2014-02-07 06:46:17 【问题描述】:编写一个程序,要求用户输入 方 (n x n) 数组的维数 (n),然后要求用户输入值 1 行 一次。例如:
“输入二维数组的大小:” “在数组中输入第 1 行的值,用空格分隔,然后按 Enter:” - 将数组的大小限制为最大 10 x 10 并检查错误。 数组初始化后,检查数组中是否有负元素并显示结果: 如果没有负值:“所有值都是非负的!” 如果有 # 个负值:“有 # 个负值!” … 哪儿是 找到的负值数。
示例运行:
输入二维数组的大小:4 在数组中输入第 1 行的值,用空格分隔,然后按 Enter:1 5 6 3 在数组中输入第 2 行的值,用空格分隔,然后按 Enter:-5 6 -12 5 在数组中输入第 3 行的值,用空格分隔,然后按 Enter:9 4 -3 1 在数组中输入第 4 行的值,用空格分隔,然后按 Enter:7 5 -3 9 有4个负值!
输入二维数组的大小:12 错误:您的数组太大!输入 1 到 10
这是我到目前为止的内容,但我不知道如何一次输入一行信息。 我是否将 的值输入到两个单独的数组中,然后尝试将它们组合起来?但是这些值需要保留在它们的接受行中。 谢谢
#include <iostream>
#include <string>
using namespace std;
int main()
int num;
cout << "please enter the size of the 2D array" << endl;
cin >> num;
while (num < 1 || num > 10)
cout << "You have entered an invalid number that is less than 10"<< endl;
cout << "Enter a new # " << endl;
cin >> num;
cout <<"Enter a sequence of numbers separated by spaces" << endl;
int c = 0;
int arr[num][num];
for(int i = 0; i < num; i++)
for(int j = 0; j < num; j++)
cin >> arr[i][j];
if(arr[i][j] < 0 )
c = c+1;
for(int i=0; i < num; i++)
for(int j=0; j < num; j++)
cout << arr[i][j] << endl;
cout << c << endl;
return 0;
【问题讨论】:
【参考方案1】:使用您的代码,它已经能够每次读取一行整数。事实上,您可以输入每个整数并按回车键,然后输入下一个……依此类推。也可以输入一整行整数,只要计数正确,程序就会接受。
例如,如果我想输入一个 2x2 数组, 我可以输入:
1
2
3
4
或者做:
1 2
3 4
两者都可以。
【讨论】:
您不能创建动态大小的数组,如 OP 代码中所示,因为 C++ 要求数组的大小是常量或在编译时已知 - 用户输入的值也不是。因此,虽然数据的输入和分配是正确的,但所述数组的创建是错误的。 真的吗?但在发布之前,我什至写了一点代码测试,它对我来说很好。我在代码块(mingw)上做到了 咨询这个:learncpp.com/cpp-tutorial/… 感谢您提供的信息。但我认为这仅在旧版本中是不允许的?我也很好奇,所以我用谷歌搜索了它,看看这个:link 原来它在 C99 中很好。 您在这个问题上是正确的。谢谢你的知识。【参考方案2】:有几点:
由于数组的维度是动态的,因此该行无效(更多信息请参见此链接:http://www.learncpp.com/cpp-tutorial/69-dynamic-memory-allocation-with-new-and-delete/):
int arr[num][num];
因此,您需要指针数组(指向数组)或vector
来分配并管理内存(鉴于这是一个赋值,您可能无法使用向量,而必须使用指针)。
关于你的问题:
我是否将 的值输入到两个单独的数组中,然后尝试合并 他们?
您不必这样做。
如果您使用指针(技术上:指向数组的指针数组)或向量,那么您应该能够直接访问和修改特定行和列索引处的内容。
例子:如果你要走指针路线:
#include <iostream>
#include <cstdlib>
int main()
std::size_t size;
std::cout << "Enter a dimension: " << std::endl;
std::cin >> size;
int **arr = new int*[size];
//allocate the memory for the columns:
for (int i = 0; i < size; ++i)
//remember, it's an array of pointers which in turn point to arrays
//so, that's why we have to allocate the memory for each row manually
arr[i] = new int[size];
//now you can alter the data in the array:
for (int i = 0; i < size; ++i)
//the following for loop is how you would prompt the user to enter the value for a specific row:
for (int j = 0; j < size; ++j)
std::cout << "Enter a value for row " << i << " and column " << j << std::endl;
std::cin >> arr[i][j];
//now print the entire thing:
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
std::cout << arr[i][j] << " ";
//print a new line at the end of each row:
std::cout << std::endl;
//free the memory we've allocated:
for (int i = 0; i < size; ++i)
delete [] arr[i];
delete [] arr;
return 0;
但是,正如您所注意到的:这有很多样板代码。如果您可以使用该选项,那么改用矢量可能是一个更好的主意。
有关该讨论的更多信息,请参阅以下内容:
When would you use an array rather than a vector/string?
When to use vectors and when to use arrays in C++?
【讨论】:
int arr[10][10];
对于 OP 来说已经足够简单了。
@Jarod42:也许吧。在这种情况下这是合理的,但在一般意义上并非如此。但是,请注意!以上是关于要求用户在 2d 数组时输入 1 行的值的主要内容,如果未能解决你的问题,请参考以下文章
检查输入时出错:预期 conv2d_1_input 的形状为 (3, 32, 32) 但得到的数组的形状为 (32, 32, 3)
ValueError:检查输入时出错:预期 conv2d_input 有 4 个维度,但得到的数组具有形状(无,1)
检查模型输入时出错:预期的 convolution2d_input_1 有 4 个维度,但得到了形状为 (32, 32, 3) 的数组