在找到数组中的最大数字时,数组的正确声明应该是什么?
What should be the proper declaration of array while finding the largest number in array?
C++ 这是我在 C++ 中用于查找数组中最大数字的代码。当我在 IDE 中 运行 时,没有编译错误,但它没有给我输出。我认为问题出在第 8 行的数组声明中。我将第 8 行的数组声明替换为第 11 行,然后它在我的 IDE 中工作正常。所以我不明白为什么数组声明在第 8 行不起作用?
#include <bits/stdc++.h>
using namespace std;
int largest_in_array(int a[], int n);
int main() // main function
{
int n; // User will enter the size of array
int arr[n]; // Line 8
cout << "Enter the size of array: " << endl;
cin >> n;
// Line 11
cout << "\nEnter the elements of array: " << endl;
for (int i = 0; i < n; i++) // This loop will run for each element of array that user wants to enter
{
cout << "Enter the " << (i + 1) << " element:";
cin >> arr[i];
cout << endl;
}
cout << "Elements are: [";
for (int i = 0; i < n; i++) // Prints the elements of array
{
// cout << "Enter the " << (i + 1) << " element:";
cout << arr[i] << " ";
// cout << endl;
}
cout << "]";
int res = largest_in_array(arr, n); //Function call
cout << "\nLargest element in array is: " << arr[res] << endl;
return 0;
}
int largest_in_array(int a[], int n) // function that will return the index of largest element in array
{
int max = 0;
for (int i = 1; i < n; i++)
{
if (a[max] < a[i])
{
max = i;
}
}
return max;
}
当您在第 8 行有 int n
时,它会在您使用它创建数组时进行初始化。当 n
被显式初始化时,它的值是未定义的行为。您可能正在创建一个数组 比您在第 10 行输入的 n
更大,导致该数组具有额外的随机垃圾,它可能更小意味着您的程序确实读取内存不应该等等
- 您在用户向
n
输入值之前声明了 int arr[n];
。 n
在您读取并创建 arr
时具有不确定的值。
- 您不检查用户是否在
n
中输入了正值。零和负大小的数组无效。
其他要点:
bits/stdc++.h
不是标准的 header,这使您的程序不可移植。使用正确的 header 文件,例如 iostream
等
arr[n]
是一个 可变长度数组 (VLA),它不是标准 C++ 的一部分。改成 std::vector<int> arr(n);
。
-
std::endl
的使用是不必要的。这里不需要刷新输出流。请改用 \n
。
示例:
#include <iostream>
#include <limits>
#include <vector>
int largest_in_array(const std::vector<int>& a) {
int max = 0;
for(int i = 1; i < a.size(); i++) {
if(a[max] < a[i]) {
max = i;
}
}
return max;
}
int main() // main function
{
int n; // User will enter the size of array
std::cout << "Enter the size of array:\n";
// check that input succeeds and that the value is valid
if(!(std::cin >> n) || n < 1) return 1;
std::vector<int> arr(n);
std::cout << "\nEnter the elements of array:\n";
for(int i = 0; i < n; i++)
{
std::cout << "Enter the " << (i + 1) << " element:";
if(!(std::cin >> arr[i])) {
std::cout << "invalid input, bye bye\n";
return 1;
}
}
std::cout << "Elements are: [";
for(int i = 0; i < n; i++)
{
std::cout << arr[i] << " ";
}
std::cout << "]";
int res = largest_in_array(arr); // Function call
std::cout << "\nLargest element in array is: " << arr[res] << '\n';
}
也就是说,您可以使用标准算法 std::max_element
而不是自己编写。它 returns 一个 迭代器 到最大元素。
当您不需要知道数组中的索引时,您也可以使用 range-based for 循环,就像在第二个循环中一样。
示例:
#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
#include <limits>
#include <vector>
int main() {
int n; // User will enter the size of array
std::cout << "Enter the size of array:\n";
if(!(std::cin >> n) || n < 1) return 1;
std::vector<int> arr(n);
std::cout << "\nEnter the elements of array:\n";
for(int i = 0; i < n; i++) // This loop will run for each element of
// array that user wants to enter
{
std::cout << "Enter the " << (i + 1) << " element:";
if(!(std::cin >> arr[i])) {
std::cout << "invalid input, bye bye\n";
return 1;
}
}
std::cout << "Elements are: [";
for(auto value : arr) { // a range-based for loop
std::cout << value << ' ';
}
std::cout << "]\n";
auto res = std::max_element(arr.begin(), arr.end());
std::cout << "Largest element in array is: " << *res << '\n';
std::size_t index = std::distance(arr.begin(), res);
std::cout << "which has index " << index << '\n';
}
C++ 这是我在 C++ 中用于查找数组中最大数字的代码。当我在 IDE 中 运行 时,没有编译错误,但它没有给我输出。我认为问题出在第 8 行的数组声明中。我将第 8 行的数组声明替换为第 11 行,然后它在我的 IDE 中工作正常。所以我不明白为什么数组声明在第 8 行不起作用?
#include <bits/stdc++.h>
using namespace std;
int largest_in_array(int a[], int n);
int main() // main function
{
int n; // User will enter the size of array
int arr[n]; // Line 8
cout << "Enter the size of array: " << endl;
cin >> n;
// Line 11
cout << "\nEnter the elements of array: " << endl;
for (int i = 0; i < n; i++) // This loop will run for each element of array that user wants to enter
{
cout << "Enter the " << (i + 1) << " element:";
cin >> arr[i];
cout << endl;
}
cout << "Elements are: [";
for (int i = 0; i < n; i++) // Prints the elements of array
{
// cout << "Enter the " << (i + 1) << " element:";
cout << arr[i] << " ";
// cout << endl;
}
cout << "]";
int res = largest_in_array(arr, n); //Function call
cout << "\nLargest element in array is: " << arr[res] << endl;
return 0;
}
int largest_in_array(int a[], int n) // function that will return the index of largest element in array
{
int max = 0;
for (int i = 1; i < n; i++)
{
if (a[max] < a[i])
{
max = i;
}
}
return max;
}
当您在第 8 行有 int n
时,它会在您使用它创建数组时进行初始化。当 n
被显式初始化时,它的值是未定义的行为。您可能正在创建一个数组 比您在第 10 行输入的 n
更大,导致该数组具有额外的随机垃圾,它可能更小意味着您的程序确实读取内存不应该等等
- 您在用户向
n
输入值之前声明了 intarr[n];
。n
在您读取并创建arr
时具有不确定的值。 - 您不检查用户是否在
n
中输入了正值。零和负大小的数组无效。
其他要点:
bits/stdc++.h
不是标准的 header,这使您的程序不可移植。使用正确的 header 文件,例如iostream
等arr[n]
是一个 可变长度数组 (VLA),它不是标准 C++ 的一部分。改成std::vector<int> arr(n);
。-
std::endl
的使用是不必要的。这里不需要刷新输出流。请改用\n
。
示例:
#include <iostream>
#include <limits>
#include <vector>
int largest_in_array(const std::vector<int>& a) {
int max = 0;
for(int i = 1; i < a.size(); i++) {
if(a[max] < a[i]) {
max = i;
}
}
return max;
}
int main() // main function
{
int n; // User will enter the size of array
std::cout << "Enter the size of array:\n";
// check that input succeeds and that the value is valid
if(!(std::cin >> n) || n < 1) return 1;
std::vector<int> arr(n);
std::cout << "\nEnter the elements of array:\n";
for(int i = 0; i < n; i++)
{
std::cout << "Enter the " << (i + 1) << " element:";
if(!(std::cin >> arr[i])) {
std::cout << "invalid input, bye bye\n";
return 1;
}
}
std::cout << "Elements are: [";
for(int i = 0; i < n; i++)
{
std::cout << arr[i] << " ";
}
std::cout << "]";
int res = largest_in_array(arr); // Function call
std::cout << "\nLargest element in array is: " << arr[res] << '\n';
}
也就是说,您可以使用标准算法 std::max_element
而不是自己编写。它 returns 一个 迭代器 到最大元素。
当您不需要知道数组中的索引时,您也可以使用 range-based for 循环,就像在第二个循环中一样。
示例:
#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
#include <limits>
#include <vector>
int main() {
int n; // User will enter the size of array
std::cout << "Enter the size of array:\n";
if(!(std::cin >> n) || n < 1) return 1;
std::vector<int> arr(n);
std::cout << "\nEnter the elements of array:\n";
for(int i = 0; i < n; i++) // This loop will run for each element of
// array that user wants to enter
{
std::cout << "Enter the " << (i + 1) << " element:";
if(!(std::cin >> arr[i])) {
std::cout << "invalid input, bye bye\n";
return 1;
}
}
std::cout << "Elements are: [";
for(auto value : arr) { // a range-based for loop
std::cout << value << ' ';
}
std::cout << "]\n";
auto res = std::max_element(arr.begin(), arr.end());
std::cout << "Largest element in array is: " << *res << '\n';
std::size_t index = std::distance(arr.begin(), res);
std::cout << "which has index " << index << '\n';
}