问题描述
我正在编写一个小程序,我必须在其中搜索输入的最小和最大元素。
问题是我制作了一个 10 个元素宽的数组,用户应该输入至少 5 个元素。
这是我写的代码,但它不起作用:
#include <iostream>
using namespace std;
int main()
{
int arr[10],largest,smallest,i = 1,j = 1;
cout << "Enter the values in array at least 5 and maximum 10 " << endl;
for (int i = 0; i < 10; i++)
{
cin >> arr[i];
}
while (arr[i] >= 5)
{
largest = arr[0];
smallest = arr[0];
if (largest <= arr[j])
{
largest = arr[j];
}
if (smallest > arr[j])
{
smallest = arr[j];
}
j++;
i++;
}
getch();
return 0;
}
解决方法
此代码演示了如何找到 std::vector
的最小值和最大值。相同的原则适用于数组。这段代码不允许可变数量的输入。
#include <algorithm> // std::min_element() & std::max_element
#include <iostream>
#include <random>
#include <vector>
int main() {
// Set up; Fills vector with 10 random digits in range [1,10]
std::mt19937 prng(std::random_device{}());
std::uniform_int_distribution<int> dist(1,10);
std::vector<int> numbers(10);
for (unsigned int i = 0; i < numbers.size(); ++i) {
numbers[i] = dist(prng);
}
// Find minimum and maximum,the easy way
auto min = std::min_element(numbers.begin(),numbers.end());
auto max = std::max_element(numbers.begin(),numbers.end());
// Find minimum and maximum,the hard way
int minIdx = 0;
int maxIdx = 0;
for (unsigned int i = 0; i < numbers.size(); ++i) {
if (numbers[i] < numbers[minIdx]) minIdx = i;
if (numbers[i] > numbers[maxIdx]) maxIdx = i;
}
// Print all numbers to verify
for (auto i : numbers) {
std::cout << i << ' ';
}
// This print goes with the std::min_element approach
std::cout << "\nMin: " << *min << "\nMax: " << *max << '\n';
// This print goes with the for loop approach
std::cout << "\nMin: " << numbers[minIdx] << "\nMax: " << numbers[maxIdx]
<< '\n';
}
输出:
1 5 2 10 2 8 6 7 6 7
Min: 1
Max: 10
Min: 1
Max: 10
在这两种方法中,WHERE 存储的最小值和最大值就是记录的内容。第一个方法返回一个迭代器,for循环方法记录索引。知道您的最小值和最大值在哪里比只知道值更有价值。
处理可变数量的输入和需要最少的输入是事情变得非常复杂。最简单但不是最好(主观)的方法是使用标记值。这是用户必须输入的内容以表明他们已完成输入。这里的问题是用户可以输入数字 10。所以我拿出一些更大的枪来处理这个问题。大枪的一个好处是它们不需要哨兵值。用户只需按 Enter。
下面的代码和你一样使用了一个C-array,因此比较繁琐。 std::vector
知道它们的大小,您只需向其中添加元素即可。对于 C 数组,您必须单独跟踪大小,确保它始终正确,等等。我失去了使用基于范围的 for 循环的能力,因为该数组可能仅被部分利用。
#include <algorithm> // std::min_element() & std::max_element
#include <iostream>
#include <iterator>
#include <random>
#include <string>
int main() {
constexpr int capacity = 10;
int numbers[capacity];
int size = 0;
std::string tmp;
while (size < capacity && std::getline(std::cin,tmp)) {
if (tmp == "" && size >= 5) {
break;
}
if (tmp == "" && size < 5) {
std::cerr << "Need at least 5 elements.\n";
continue;
}
std::size_t pos;
int num;
try {
num = std::stoi(tmp,&pos);
} catch (...) {
std::cerr << "Exception thrown.\n";
continue;
}
if (pos != tmp.length()) {
std::cerr << "Bad Value.\n";
continue;
}
if (num >= 0 && num <= 10) {
numbers[size] = num;
++size;
}
}
// Find minimum and maximum,the easy way
auto min = std::min_element(std::begin(numbers),std::begin(numbers) + size);
auto max = std::max_element(std::begin(numbers),std::begin(numbers) + size);
// Find minimum and maximum,the hard way
int minIdx = 0;
int maxIdx = 0;
for (int i = 0; i < size; ++i) {
if (numbers[i] < numbers[minIdx]) minIdx = i;
if (numbers[i] > numbers[maxIdx]) maxIdx = i;
}
// Print all numbers to verify
for (int i = 0; i < size; ++i) {
std::cout << numbers[i] << ' ';
}
// This print goes with the std::min_element approach
std::cout << "\nMin: " << *min << "\nMax: " << *max << '\n';
// This print goes with the for loop approach
std::cout << "\nMin: " << numbers[minIdx] << "\nMax: " << numbers[maxIdx]
<< '\n';
}
您可以知道仅基本的 ASCII 输入需要多少额外的工作。如果你做一些假设,很多代码可以被删掉,但是就用户输入而言,这些假设很少是安全的,更多的是为了快速测试或学习目的。