在 C++ 中,动态“数组”将由 std::vector 处理。您可以在此处阅读以了解更多详细信息。
您的问题/任务/要求不是很清楚,而且有点难以理解。无论如何,据我了解,我已将整体任务拆分为较小的任务,并为您创建了一些演示。
如果不是你所期望的,那么请给我一个更好的描述,我会修改它。
请查看众多可能的解决方案之一:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
constexpr size_t MinNumberElementsInVector = 4U;
constexpr size_t MaxNumberElementsInVector = 1024U;
size_t getNumberOfVectorElements() {
// inform user, what to do
size_t result{ 0U };
do {
std::cout << "\nPlease enter, how many numbers the test array should have.\n"
"The given number must be >=" << MinNumberElementsInVector << "and <="
<< MaxNumberElementsInVector << ".\nPlease enter: ";
// Get value from user and check range
if (!((std::cin >> result) && (result >= MinNumberElementsInVector) && (result <= MaxNumberElementsInVector))) {
// Error in input. Reset result to 0 and show error message
result = 0U;
std::cout << "\n\nError during input. Try Again.\n\n";
}
} while (0 == result);
return result;
}
size_t getNumberOfActions() {
// inform user, what to do
size_t result{ 0U };
do {
std::cout << "\n\nPlease enter, how many times the half operation should be done.\n"
"The given number must be > 0.\nPlease enter: ";
// Get value from user and check range
if (!((std::cin >> result) && (result > 0))) {
// Error in input. Reset result to 0 and show error message
result = 0U;
std::cout << "\n\nError during input. Try Again.\n\n";
}
} while (0 == result);
return result;
}
std::vector<int> getVectorWithEvenNumbers(size_t numberOfElements) {
// Limit the number of elements to the correct range
numberOfElements = std::clamp(numberOfElements, MinNumberElementsInVector, MaxNumberElementsInVector);
// Resulting vector. Reserve space for "numberOfElements" numbers
std::vector<int> result(numberOfElements);
// Get numbers from user
for (bool allEven = false; !allEven; ) {
// Give info for user
std::cout << "\n\nPlease enter " << numberOfElements << " even numbers:\n";
// Read all values from user
std::copy_n(std::istream_iterator<int>(std::cin), numberOfElements, result.begin());
// Check, if all values are even
allEven = std::all_of(result.begin(), result.end(), [](const int i) {return (i % 2) == 0; });
// Error message, in case of odd values
if (!allEven) std::cout << "\n\nError during input. Try Again.\n\n";
}
return result;
}
void halfMaxValues(std::vector<int>& values) {
// Search max value
std::vector<int>::iterator max = std::max_element(values.begin(), values.end());
if ((max != values.end()) && ((*max > 2) || (*max < -2))) {
int m = *max;
// Half all found max values, if even
std::for_each(values.begin(), values.end(), [&m](int& i) {if ((i % 2 == 0) && (i == m)) {i /= 2;}});
}
}
// Show contents of vector on screen
inline void displayVector(std::vector<int> values) {
std::cout << "\nResult:\n";
std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}
int main() {
// Get number of elements for our vector
size_t numberOfVectorElements{ getNumberOfVectorElements() };
// Get the elements and put them into the vector
std::vector<int> values{ getVectorWithEvenNumbers(numberOfVectorElements) };
// How many times should we perfom the action
size_t numberOfActions{ getNumberOfActions() };
while (numberOfActions-- && !std::all_of(values.begin(), values.end(), [](int i) {return (i == 2) || (i == -2) || (i % 2 == 1); })) {
halfMaxValues(values);
displayVector(values);
}
}