Правильна ли такая функция?

248
20 ноября 2017, 20:17

Всех приветствую.Только начал разбираться с функциями.Подскажите пожалуйста, правильно ли сделал функцию и передачу параметров?

#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
void Obratn(int a[], int b[], int n);
int main()
{
    int a[10], b[10], i, n;
    cout << "Vvedite razmer massiva: ";
    cin >> n;
    cout << "\nVvedite massiv:\n";
    for (i = 0; i<n; i++)
    {
        cout << "Vvedite a[" << i << "]= ";
        cin >> a[i];
    }
    cout << "\nMassiv a:\n";
    for (i = 0; i<n; i++)
        cout << " " << a[i];
    cout << endl;
    Obratn(a, b,n);
    system("pause");
}
void Obratn(int a[],int b[], int n)
{
    for (int i = 0; i<n; i++)
        b[n - i - 1] = a[i];
    for (int i = 0; i<n; i++){
        a[i] = b[i];
        cout << " " << a[i];
    }
    cout << endl;
}
Answer 1

Ну, я бы на вашем месте сделал так:

void Obratn(int a[], int n)
{
    for (int i = 0, j = n - 1; i < j; ++i, --j)
    {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
}

Это - к тому, что не нужно использовать лишнюю память там, где без нее можно обойтись.

И еще - я убрал отсюда вывод на экран - потому что каждая функция должна заниматься одним делом. Эта - обращением массива. Выводом должна заниматься другая...

P.S. Да, и после cin >> n; следовало бы проверить, что у вас хватит памяти в маcсиве a[10], т.е. что введенный размер не превышает 10.

Answer 2

С этой функцией есть несколько проблем:

  • запись вида int a[] вводит в заблуждение, так как тип a на самом деле int *, соответственно лучше указать тип явно
void Obratn(int * a, int * b, int n);
  • не соблюдается const-correctness, ни один из параметров не помечен как const хотя параметры внутри функции не изменяются, соответственно лучше записть
void Obratn(int * const a, int * const b, int const n);
  • сырые указатели вообще лучше не использовать, вместо них использовать array_view (какую-нибудь реализацию), причем массив тут по факту нужен только один
void Obratn(array_view<int> const a);
  • транслит в именах функций - это безобразие, так же как и ничего не значащие наименования переменных из одной буквы
void Reverse(array_view<int> const items);
  • эта функция вполне может быть реализована без выбрасывания исключений, соответственно можно добавить спецификатор noexcept
void Reverse(array_view<int> const items) noexcept;
READ ALSO
Итератор с шагом

Итератор с шагом

Собственно нужно сделать считывания из multimap c определённым шагом

212
std::string vs std::wstring в русскоязычном приложении

std::string vs std::wstring в русскоязычном приложении

Поскольку в свое время плавно переехал с чистого C на С++/Qt, то все проблемы unicode остались за кадром, скрытые внутри QStringТеперь при переходе...

243
Эффективно найти средний элемент в set&#39;е

Эффективно найти средний элемент в set'е

std::set обычно представлен бинарным деревом поискаУ него есть методы begin и end, которые позволяют получить минимум и максимум, а также lower_bound и upper_bound...

259
Изменение цены с помощью jquery

Изменение цены с помощью jquery

Пытаюсь сделать следующее: при нажатии на input, его value должно прибавляться к value другого input'а, тем самым увеличивая ценуПытался так но не прибавляется

294