提示输入,直到输入最少数量的值

问题描述

我正在编写一个小程序,我必须在其中搜索输入的最小和最大元素。

问题是我制作了一个 10 个元素宽的数组,用户应该输入至少 5 个元素。

如果用户输入的元素少于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 输入需要多少额外的工作。如果你做一些假设,很多代码可以被删掉,但是就用户输入而言,这些假设很少是安全的,更多的是为了快速测试或学习目的。