Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
1

Кажется написал ужасный код. Можно его как-то оптимизировать?

26.08.2019, 22:46. Показов 808. Ответов 8
Метки нет (Все метки)

Решал одну задачку:
Даны натуральное число n, целые числа x 1 , ..., x n (все числа попарно
различны). Поменять местами наибольший и наименьший элементы.

И написал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
int main()
{
    int n = 0, max = 0, min = 0;
    std::cout << "Enter the n number: ";
    std::cin >> n;
    double *number = new double[n];
    for (std::size_t a = 0; a < n; a++) {
        std::cout << "Enter x" << a + 1 << ": ";
        std::cin >> number[a];
    }
    std::cout << "Before: ";
    for (std::size_t a = 0; a < n; a++) {
        std::cout << number[a] << " ";
    }
    std::cout << std::endl;
    min = number[0];
    for (std::size_t a = 0; a < n; a++) {
        if (min > number[a]) { min = number[a]; }
        if (max < number[a]) { max = number[a]; }
    }
    int temp_max = max, temp_min = min;
    for (std::size_t a = 0; a < n; a++) {
        if (max == number[a]) {
            number[a] = temp_min;
            a++;
        }
        if (min == number[a]) { number[a] = temp_max; }
    }
    std::cout << "After: ";
    for (std::size_t a = 0; a < n; a++) {
        std::cout << number[a] << " ";
    }
    std::cout << std::endl;
    delete[] number;
    std::system("pause");
    return 0;
}
Код работает, но ощущения, что для такой маленькой задачки я написал слишком длинный код.
Подскажите как его можно оптимизировать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2019, 22:46
Ответы с готовыми решениями:

Определить, что делает код, и как его можно оптимизировать
не могу понять что делает код . как его можно максимально сократить? #include &lt;iostream&gt; #include...

Можно ли оптимизировать код, избавившись от его повторяющихся (похожих) участков
Здравствуйте, помогите пожалуйста расписать код что сначыт каждая строчка, те строчки которые...

Написал Гороскоп . Подскажите как можно было его упростить?
#include &lt;cmath&gt; #include &lt;iostream&gt; using namespace std; int main() { int x , year; cout...

Как можно оптимизировать код?
#include &lt;stdio.h&gt; unsigned int A; int main(){ int i,p; p=6; for(i=5;i&gt;=0;i--){ __asm{...

8
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
26.08.2019, 23:03 2
Через указатели?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    std::size_t n;
    std::cin>>n;
    double*array=new double[n];
    for(std::size_t pos=0;pos<n;++pos)
        std::cin>>array[pos];
    double*min=array;
    double*max=array;
    for(std::size_t pos=1;pos<n;++pos)
    {
        if(array[pos]<*min)
            min=array+pos;
        if(array[pos]>*max)
            max=array+pos;
    }
    double temp=*min;
    *min=*max;
    *max=temp;
    for(std::size_t pos=0;pos<n;++pos)
        std::cout<<array[pos]<<std::endl;
    return 0;
}
2
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
26.08.2019, 23:09 3
Через stl?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    size_t n;
    std::cin >> n;
    std::vector<int> vec(n);
    for (auto& it : vec) {
        std::cin >> it;
    }
    std::iter_swap(std::min_element(vec.begin(), vec.end()), std::max_element(vec.begin(), vec.end()));
    for (auto& it : vec) {
        std::cout << it << ' ';
    }
    return 0;
}
2
Мозгоправ
1729 / 1023 / 468
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
27.08.2019, 00:16 4
Цитата Сообщение от nalbe666 Посмотреть сообщение
Через stl?
Лаконично, но неэффективно.
В строке 13 массив (вектор) будет просматриваться от начала до конца дважды.
Решение от Renji выглядит лучше. Массив просматривается один раз.
Единственно, в этом решении строки 17-19 я бы заменил на вызов std::swap(*min, *max).
0
New man
27.08.2019, 01:08
  #5

Не по теме:

nalbe666, ну зачем пихать столько действий в одну строку?

0
6500 / 4422 / 2531
Регистрация: 18.12.2017
Сообщений: 13,827
27.08.2019, 01:55 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
int main()
{
    int n, imax=0, imin=0;
    cout << "n="; cin >> n;
    
    int *a = new int[n];
    
    cout << "Enter " << n << " integer numbers:\n";
    for (int i = 0; i < n; i++)
    {
    cin >> a[i];
    if (a[i]>a[imax]) imax=i;
    if (a[i]<a[imin]) imin=i;
    }  
    swap(a[imax],a[imin]);
    
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";    
    cout << "\n";
    
    delete[] a;
system("pause");
return 0;
}
1
Модератор
1638 / 1092 / 487
Регистрация: 17.07.2012
Сообщений: 5,344
27.08.2019, 13:22 7
Цитата Сообщение от L0M Посмотреть сообщение
Лаконично, но неэффективно.
Линейное время. Если нужно за 1 проход, то можно так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
#include <algorithm>
 
int main() {
    size_t n;
    std::cin >> n;
    std::vector<int> vec(n);
    for (auto& it : vec) {
        std::cin >> it;
    }
    auto min_max = std::minmax_element(vec.begin(), vec.end());
    std::iter_swap(min_max.first, min_max.second);
    for (auto& it : vec) {
        std::cout << it << ' ';
    }
    return 0;
}
https://rextester.com/TSW69080
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 49
28.08.2019, 19:30  [ТС] 8
Цитата Сообщение от Renji Посмотреть сообщение
Через указатели?
Хотел уточнить ваши действия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main()
{
    std::size_t n;//инициирование переменной n
    std::cin>>n;//присваивание переменной n значение
    double*array=new double[n];//создание массива array
    for(std::size_t pos=0;pos<n;++pos)
        std::cin>>array[pos];//присваивание значений для элементов массива array
    double*min=array;//тут возник вопрос. В этой строке вы создаёте новые переменные с указателем
    double*max=array;//и приравниваете их к array. Если я правильно помню, то array это суть array[0]?
/*И такой вопрос, к чему создание переменной с указателем? В смысле, какой цели это служит?*/
    for(std::size_t pos=1;pos<n;++pos)
    {
        if(array[pos]<*min)
            min=array+pos;//Не понятен синтаксис "array+pos". Я так понимаю это всё равно что 
        if(array[pos]>*max)//array[pos], но тогда бы вы наверное это так и написали? Вы бы могли рассказать что это значит?
            max=array+pos;
    }
    double temp=*min;//тут вы создаёте новую переменную и с помощью неё меняете значения max и min
    *min=*max;//а теперь я кажется понял. min и max ссылаются напрямую на элементы массива
    *max=temp;//и меняя их значения вы меняете значения элементов массива. Хотя я и не понял как именно это работает.
/*"array+pos" имеет к этому какое-то отношение?*/
    for(std::size_t pos=0;pos<n;++pos)
        std::cout<<array[pos]<<std::endl;
    return 0;
}
Добавлено через 5 минут
Цитата Сообщение от nalbe666 Посмотреть сообщение
Через stl?
Да, я понимаю о чём вы. Но я подумал, что суть задания создать алгоритм, который выполнит работу, а не использовать имеющиеся.
Был такой соблазн, да и не применял я его еще, хоть и понимал, что такая функция в С++ быть должна.
Но спасибо за совет!

Добавлено через 3 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
C++
1
2
3
4
5
6
* * for (int i = 0; i < n; i++)
* * {
* * cin >> a[i];
* * if (a[i]>a[imax]) imax=i;
* * if (a[i]<a[imin]) imin=i;
* * } *
}
Действительно лучше решение, в отличие от моего!
Благодарю за ответ.
0
2723 / 1887 / 559
Регистрация: 05.06.2014
Сообщений: 5,499
28.08.2019, 20:31 9
Цитата Сообщение от MungenHara Посмотреть сообщение
Хотел уточнить ваши действия.
Курите адресную арифметику. Элементы массива идут в памяти строго друг за другом, поэтому &array[pos]=*(array+pos). И так как от перемены мест слагаемых сумма не меняется, &array[pos] также равно &pos[array] (да, так тоже можно писать в порядке выпендрежа). Менять min=array+pos на min=array[pos] нельзя, потому что в первом случае получится указатель, во втором - значение по этому указателю.

Ну и для большинства целей указатель на первый элемент массива и указатель на массив полностью эквивалентны друг другу.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2019, 20:31

Как можно оптимизировать код?
Здравствуйте! Столкнулся с проблемой. VBA стал ругаться на сильно длинный код. Надо его...

Как можно оптимизировать код?
#include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using namespace std; int main() {...

Как можно оптимизировать код?
Здравствуйте. Написал скрипт, позволяющий считывать с сервера картинку, преобразовывать ее в...

Как можно оптимизировать код?
Здравствуйте, помогите пожалуйста ускорить работу программы. Программа читает журнал событий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.