- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/* Попытка обьединить четыре цикла в один.
Первый - Присвоение элементам массива значения.
Второй - Поиск минимального значения.
Третий - Поиск максимального значения.
Четвертый - Вывод содержимого массива.
*/
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int array[100];
int flag;
int min = 0;
int max = 0;
for (flag=0;flag<100;flag++){
array[flag]=rand();
if ( ! min && ! max){ //Инициализация переменных, для первой итерации.
max = array[0];
min = array[0];
}
if (array[flag] >=max) max = array[flag];
if (array[flag] <= min) min = array[flag];
cout << array[flag] << "\n";
}
cout << "\nМаксимальное значение: " << max;
cout << "\nМинимальное значение: " << min << '\n';
return 0;
}
Писал я, пытаясь переделать пример из книжки, в котором для этой же задачи использовалось 4 цикла.
Просьба обьективно обгадить сей код, дабы мне было над чем подумать.
P.S только учусь.
santa_microbe 18.02.2013 04:30 # +1
Замени на flag == 0
ну и условия >= и <=, я бы заменил на > и <
santa_microbe 18.02.2013 04:47 # +1
>> max = array[0];
>> min = array[0];
>>}
В принципе это можно вытащить из цикла и цикл начинать с 1, но тогда перед циклом
надо будет вставить,
Будет экономия на спичках.
bormand 18.02.2013 05:57 # +4
> Просьба обьективно обгадить сей код
А зачем объединять 4 независимых куска? Обычно наоборот стараются разнести независимый код в разные функции. Тогда будет какой-никакой code-reuse - функции чтения, заполнения рандомом, поиска мин./макс, вывода массива можно будет применить в других лабах, а не писать каждый раз заново.
> flag
Какой же это флаг? Это ж счетчик.
> using namespace std
Отвыкайте, особенно в ашках ;)
P.S. Придирка, конечно, но в строках 26, 28 не помешал бы перевод строки между условием и действием.
brainiac 18.02.2013 20:10 # +3
absolut 18.02.2013 21:18 # +4
Наверное, если поискать ещё можно найти std::govnokod_solution(12610), который выполнит все необходимые действия.
3.14159265 18.02.2013 21:31 # +2
Полагаю для того MS и запилила LINQ.
brainiac 18.02.2013 22:10 # +1
govnomonad 18.02.2013 06:25 # +2
не нужно. создавай переменные таким образом, чтобы они жили как можно меньше. В этом случае flag после цикла не используется, поэтому ограничь его областью видимости цикла.
> Попытка обьединить четыре цикла в один.
к вышесказанному bormand'ом добавлю, что короткие циклы могут уместить к кэш процессора и несколько коротких отработать быстрее чем один длинный. В некоторых случаях(например opengl/directx) вообще сначала подготавливаются все данные, а потом они передаются функции для отрисовки.
>int array[100];
>for (flag=0;flag<100;flag++)
запили константу для размера
и в C++ используй C++ контейнеры, например, std::vector, std::array и тп. Смесь C и С++ выглядит нереально уродливо.
>cout << "\nМаксимальное значение: "
ЕМПЕН \n не всегда может означать переход строки; юзай std::endl()
defecate-plusplus 18.02.2013 07:38 # +2
и что такое емпен? связано с люмпенами?
bormand 18.02.2013 08:46 # 0
roman-kashitsyn 18.02.2013 08:58 # 0
Это я к тому, что с моей точки зрения, flush при работе с терминалом чаще полезен, чем вреден.
absolut 18.02.2013 09:17 # +3
roman-kashitsyn 18.02.2013 10:31 # +6
defecate-plusplus 18.02.2013 09:48 # 0
stdout для \n самостоятельно флюшит буфер
ну и кроме терминальных бывают еще потоки, которых иногда желательно флюшить вручную (в принципе, stdout тоже можно зафлюшить, не используя \n)
но это всё оффтоп :)
absolut 18.02.2013 09:55 # 0
Странно, что stdlog при этом буферизированный.
defecate-plusplus 18.02.2013 10:05 # 0
слово stdlog в имеющихся у меня REPLICA драфтах С и С++ упоминается ровно 0 раз
roman-kashitsyn 18.02.2013 10:31 # 0
absolut 18.02.2013 10:34 # 0
roman-kashitsyn 18.02.2013 10:39 # 0
absolut 18.02.2013 14:13 # 0
Что значит самостоятельно?
roman-kashitsyn 18.02.2013 14:19 # +1
defecate-plusplus 18.02.2013 14:20 # 0
так что, по идее, это задача рантайма, а не уровня ОС, следить за \n в line-buffered потоке, например, в stdout
самостоятельно - в том смысле, что программист не вовлекается
absolut 18.02.2013 14:36 # 0
roman-kashitsyn 18.02.2013 15:16 # 0
absolut 18.02.2013 15:49 # 0
defecate-plusplus 18.02.2013 15:54 # +1
http://liveworkspace.org/code/2bYbly$0
absolut 18.02.2013 16:14 # 0
Причудилось, что \n в std::cout должен флашить буфер.
defecate-plusplus 18.02.2013 16:37 # 0
но, видимо, на разных платформах это не так (видимо, речь идёт о хитрожопом поведении на g++/libstdc++) - наверное, кое-каким разработчикам, которым не платят зарплату за общественно полезную работу, было не с руки имитировать line-buffered в работе std::filebuf при получении \n - но, зато, потенциально std::cout работает на linux быстрее (что сложно замерить, т.к. основные тормоза в консольных приложениях под виндой явно не в рантайме, а в убогом эмуляторе cmd)
absolut 18.02.2013 17:06 # 0
absolut 18.02.2013 21:51 # 0
bormand 18.02.2013 23:28 # 0
bormand 18.02.2013 08:52 # +4
bot 18.02.2013 07:43 # +13
absolut 18.02.2013 09:19 # +9
absolut 18.02.2013 09:26 # +2
А вообще действительно, как сказал @bormand объединять в кучу то, что надо бы делать отдельно, не есть гуд.
И в довесок к стандартным контейнерам, использовать стандартные алгоритмы min/max.
bormand 18.02.2013 10:10 # 0
P.S. А ну да, до кучи обосрем пустую строку 17 - в ней нету вызова srand(), поэтому всегда будут одинаковые результаты.
LispGovno 18.02.2013 10:31 # −1
Строки со скобками сейчас обосрет тарас, ну а мне инклуды не нравятся. Лучше бы сделали import module вместо них создатели языка
absolut 18.02.2013 10:38 # 0
http://en.cppreference.com/w/cpp/numeric/random
shim 19.02.2013 00:29 # 0
guest 19.02.2013 10:14 # 0
inseminator 25.08.2021 21:02 # 0