Stefan_Lang
Решение 1 делает хорошую работу по исправлению всех ваших ошибок. Однако большинство из этих ошибок были бы невозможны, если бы вы использовали вместо этого функции C++. Вот другое решение, которое позволяет избежать большинства ловушек, в которые вы попали:
#include <iostream>
#include <vector>
using namespace std;
pair<vector<int>,vector<int>> PosNeg(vector<int> input_values)
{
std::vector<int> positives;
std::vector<int> negatives;
for (size_t i = 0; i < input_values.size(); ++i)
if (input_values[i] < 0)
negatives.push_back(input_values[i]);
else
positives.push_back(input_values[i]);
return make_pair(negatives, positives);
}
int main()
{
// read values
std::vector<int> values;
int n;
cout << "Enter numbers. Enter any character to finish." << endl;
do
{
cin >> n;
if (cin.fail())
// could not read (or convert to) integer value --> exit loop
break;
else
// store this value
values.push_back(n);
} while (cin.good());
// separate
auto results = PosNeg(values);
// write output
cout << "negative values:" << endl;
for (size_t i = 0; i < results.first.size(); ++i)
cout << results.first[i] << " ";
cout << endl;
cout << "positive values:" << endl;
for (size_t i = 0; i < results.second.size(); ++i)
cout << results.second[i] << " ";
cout << endl;
return 0;
}
Улучшения по сравнению с тем, что вы делали:
1. нет необходимости выделять какой-либо массив с помощью std::vector
--> нет никакого способа испортить ваше освобождение массива
2. нет необходимости отслеживать размеры массива с помощью std::vector
--> нет необходимости заранее определять требуемые размеры массивов
--> нет необходимости передавать размеры массива в функцию и из нее
3. можно добавить дополнительные значения с помощью vector::push_back()
--> нет необходимости отслеживать значения индекса массива
--> нет способа использовать неверный индекс (ваш вышел за рамки, потому что вы использовали индекс входного массива и для выходных массивов!)
4. можно вернуть два результирующих массива в качестве возврата функции с помощью std::pair
--> нет необходимости указывать (и инициализировать) результирующие массивы перед вызовом функции
--> нет необходимости без необходимости расширять список аргументов функции выходными значениями
--> нет способа испортить передачу выходных значений по значению, а не по ссылке (вы это сделали)
Есть еще много вещей, которые вы могли бы сделать, например, используя синтаксис диапазона вместо значений индекса, но это на самом деле не улучшает программу.
Я надеюсь, что это даст вам представление о полезности типов C++, таких как vector и pair, и даст вам стимул прочитать о функциях C++, чтобы вы могли правильно использовать их в своих будущих программах.