Форум программистов, компьютерный форум, киберфорум
Наши страницы
CoderHuligan
Войти
Регистрация
Восстановить пароль
Рейтинг: 2.00. Голосов: 4.

Уроки программинга. Урок 5. Начало просветления.

Запись от CoderHuligan размещена 29.05.2019 в 17:52
Обновил(-а) CoderHuligan 29.05.2019 в 21:02

Предварительные замечания на полях.

По поводу срача и священных войн возникших в комментах. Стоит ли и дальше потешать любителей попкорна?.. Похоже на то, что объяснять с нуля всё же не получится.. Возможно нужно будет ограничится лишь узкими местами языка Си: указателями, приведением типов и т. п. Всё же я хотел ограничиться только алгоритмизацией, а не начальным обучением. Это долго, нудно, всё это уже написано в учебниках. А если люди учебники не читают, то почему они будут читать этот блог? Или я не прав и надо продолжать всё разжёвывать с нуля? Хотя бы понемногу? Или тупо удалять эти комменты?.
Давайте поступим так: постепенно будут вводится новые понятия, а не всё сразу, но в каждом уроке займёмся началами алгоритмизации, прежде всего. А то теряется основная нить, ради чего всё и затевалось.. А то буду только объяснять тривиальные вещи целый год, которых полно в десятках учебников, а воз алгоритмизации останется мёртвым грузом.. Предлагаю, если что непонятно обращаться к учебникам для дополнительного изучения. Я лишь буду объяснять некоторые места по ходу освоения примеров.

Указатели в Си.

Указатель это именованная переменная, в которой содержится не её значение, а адрес некоторой ячейки памяти, в которой, в свою очередь, и содержится само значение. Таким образом реализуется возможность косвенной адресации. То есть по простому, в указателе значением является адрес какой-то произвольной ячейки памяти. На самом деле боятся указателей не нужно: это самая простая концепция. Немножко потренировавшись вы полюбите косвенную адресацию. Указатели это душа языка Си. Опять же я не буду пересказывать учебники. На конкретных примерах будет видно что к чему. Си это язык профессионалов, поэтому учебники довольно пухлы, но оно того стоит.

Строки в Си.


В языке Паскаль был своеобразный способ представления строк. Это был байтовый массив, в котором первый байт содержал число символов в строке. А так как одним байтом можно представить всего 256 значений беззнакового типа, то и подобные строки не могли быть длиннее 255 символов. Естественно, что такие строки начинались не с нулевого индекса, а с 1. Недостаток таких строк очевиден: они не могут иметь размер больший 255 символов.
В Си пошли другим путём. Чтобы было возможно иметь строки произвольной длины, решили не писать явно их размер, ибо в таком случае не ясно стало бы какой тип предпочесть для значения этого размера, да и тип самих элементов массива стал бы неодинаков с типом его размера. Пришлось бы вводить структуру, а это привело бы к большой сложности таких строк. Решили просто добавить некий символ, который бы обозначал конец строки. Лучшим символом оказался нулевой байт. В двоичном коде: 00000000, в шестнадцатеричном - '\x00', или '\0'.
В этом случае строки оказались достаточно просты, и с ними стало легко работать. Хотя есть у них и свои недостатки. Во-первых они статические. Это значит, что их размер жёстко ограничен на этапе трансляции. Хотя эти строки и могут иметь любую длину в пределах установленных заранее, однако выйти за эти пределы они не могут, разве что вместе с крахом самой программы. Во-вторых, не имея информации о фактическом размере строки, мы будем почти всегда искать её конец путём тупого перебора, а это долго. Есть, конечно решения данной проблемы, но они не являются частью языка, а всего лишь библиотеками функций. Однако в общем и целом данное решение достаточно рабочее, хотя и временами тормозное.
Имя строки по сути является константным указателем на её первый элемент в памяти. Поэтому в отличие от других переменных, в функцию массив передаётся по ссылке, а не по значению. То есть копируется не весь массив строковых элементов, а только адрес его первого элемента. Это сильно ускоряет работу программы. По умолчанию все остальные переменные передаются по значению, то есть в функции передаются их копии.

Условные конструкции в Си.

Условных конструкций две: полная и неполная. Неполная конструкция выглядит так:

C
1
2
3
4
5
if (/*логич_выражение*/) 
{
    //выражение/я;
}
 //остальной код программы;
Если условие возвращает истину (в Си это число 1) то выполнится блок, который идёт сразу же за условной конструкцией if()(блоки в си представляют из себя некоторое количество операций, которые заключены в фигурные скобки - {}). Если if() возвратит ложь (0), то выполнение программы продолжится сразу же после блока (в фигурных скобках).
Внимание! Данная структурная конструкция уже изменила порядок выполнения кода так, как это было в ассемблере! Обратите внимание на то, что в ассемблере команда условия представляет из себя конструкцию к примеру такого вида:
предположим в регистре EDX лежит какое-то значение.
Assembler
1
2
3
cmp EDX, 0 ;сравниваем это значение с 0
jz label ; если получили 0 в регистре флагов, то переход на некоторую метку(адрес): label
; если не 0, то произойдёт переход на следующую команду в этом месте
Заметьте один факт! В Си и других подобных языках, в случае истинности логического выражения, выполняется некоторый блок кода, а в ассемблере и в первых версиях Бейсика будет ПЕРЕХОД на некоторый блок кода. Хотя компилятор преобразует данную конструкцию в ассемблерные инструкции подобного рода, однако семантическая связь языков будет потеряна.
Можно сказать: так ведь Си и другие подобные языки структурного типа это высоко-уровневые языки, они и не должны строго следовать низкоуровневым инструкциям ассемблера. На это можно сказать следующее: должны потому, что иначе строго говоря невозможно правильно структурировать алгоритм!
То есть, вспомним первые версии "бейсиков", где подобные конструкции делались так:
QBasic/QuickBASIC
1
IF a < b THEN GOTO label
или вот так:
QBasic/QuickBASIC
1
IF a < b GOTO label
или:
QBasic/QuickBASIC
1
IF a < b THEN label
Здесь на лицо полное семантическое соответствие между ассемблером и Бэйсиком. И хотя в поздних версиях появились такие же конструкции:
QBasic/QuickBASIC
1
IF a < b THEN блок кода
Это уже не соответствует настоящему "дзену", так как здесь уже отсутствует абстрактное именование некоторого блока кода - оно неявно и скрыто. Почему это не правильно позже.

Следующая разновидность условных конструкций это полная условная конструкция:
C
1
2
3
4
5
6
7
8
if (/*логич_выражение*/) 
{
   // выражение/я;
}
else 
{
    //выражение/я;
}
то есть, если истина, то выполняется первый блок до else, если не истина, то второй. Обе ветки сходятся в одной точке сразу после последней завершающей скобки. К слову скобки можно и не писать, если операция одна единственная.
В Бейсике это эмулировалось таким образом:
QBasic/QuickBASIC
1
2
3
4
10 IF условие GOTO 30
20 блок_кода2 : GOTO 40
30 блок_кода1
40 выход
Конечно, эмулировать таким образом чисто структурные конструкции это признак плохого тона, лучше использовать структурные конструкции. Однако, соединение веток в одной точке происходит лишь в самых простых случаях. В большинстве же алгоритмов эти ветки НИКОГДА не встречаются! Поэтому структурные конструкции и не тянут в мало-мальски сложных алгоритмах.

Циклы в Си.

Существуют три разновидности циклов в Си. Как мы помним, если ещё не забыли, что цикл это одна из трёх основных конструкций структурной парадигмы.
Первая разновидность это цикл while ("пока"):

C
1
2
3
4
while (/*условие*/) 
{
    // тело цикла
}
Здесь тело цикла расположено ПОСЛЕ условия его выполнения. То есть оно может и не выполнится ни разу.

Вторая разновидность это цикл do while ("до"):

C
1
2
3
4
do 
{
    // тело цикла
} while (/*условие*/);
Здесь тело цикла выполняется всегда хотя бы один раз. Тело его находится ДО условия. Если условие истинно (возвратило "да"), то цикл продолжится. В Паскале наоборот цикл продолжится если условие возвратило "нет", что на мой взгляд чистое уродство.
Третья разновидность это цикл for:

C
1
2
3
4
for (часть1; часть2; часть3)
{
    // тело
}
часть1 это инициализация переменных. Часть 2 это условие продолжения цикла, часть3 это приращение счётчика и другие действия, которые выполняются ПОСЛЕ проверки условия(если условие возвратило истину). Цикл for введён для удобства и краткости. Однако, на мой взгляд данный цикл совершенно излишен. Во-первых он неявен - невозможно понять в начале тела или в конце тела проверяется условие, это часто путает новичков. Предполагается, что условие проверяется в начале данного цикла, хотя ассемблерный листинг показывает обратно: там условие проверяется в конце основного тела. Будет ли тогда цикл for циклом "до"? Нет, не будет, ибо компилятор делает jmp (переход) на условие минуя тело в самом начале его выполнения, поэтому чисто технически этот цикл является циклом ("пока").
В общем и целом мы имеем всего лишь две разновидности этих циклов: цикл "пока" и цикл "до".
Прерывать циклы можно при помощи оператора break, - в этом случае произойдёт выход из цикла. Чтобы не выходить из цикла, но иметь возможность пропустить какие-то операции в теле цикла ввели оператор continue.
В старых бейсиках это эмулировалось таким вот образом.
Цикл "пока":
QBasic/QuickBASIC
1
2
3
10 IF не_истина GOTO 30
20 тело_цикла : GOTO 10
30 выход_из_цикла
Цикл "до":
QBasic/QuickBASIC
1
2
3
10 тело_цикла
20 IF истина GOTO 10
30 выход_из_цикла
Данный цикл очень простой, так как если условие возвратит ложь, то никаких переходов больше не произойдёт, а программа продолжится со следующей команды сразу после условной конструкции, прямо как в ассемблере.
Цифры 10, 20, 30 в коде, это номера строк. Номера строк нужны в бейсике для того, чтобы можно было на них делать переход. Сейчас метки представляют из себя осмысленные имена, но в то время это были просто номера строк.

Тут необходимо сделать некоторые важные замечания.
Смотрите: в конструкциях с goto, существует лишь две единственные сущности: это условие if и goto. Всего два слова. При помощи всего двух слов мы умудрились эмулировать все условные и циклические конструкции!
Далее, если нам потребуется прервать цикл в любом месте, то мы не будем выдумывать такие слова, как break, continue, - мы просто перейдём куда нам нужно при помощи всё того же goto.
Важая вещь: отказавшись от самой простой вещи нам пришлось выдумать много-много других. На лицо усложнение и нагромождение излишних сущностей в программах.
Продолжение следует..
Размещено в Без категории
Просмотров 659 Комментарии 46
Всего комментариев 46
Комментарии
  1. Старый комментарий
    Аватар для Croessmah
    Ну блин, вот опять. Вы сами читаете что пишете?
    Цитата:
    Указатель это именованная переменная, в которой содержится не её значение, а адрес некоторой ячейки памяти, в которой, в свою очередь, и содержится само значение.
    Чего? Что значит "Указатель это именованная переменная, в которой содержится не её значение"?
    А чьё значение содержится в указателе? Бродячий цирк оставил что-то в нем?
    Цитата:
    То есть по простому, в указателе значением является адрес какой-то произвольной ячейки памяти.
    Вот! Почему сразу нельзя было?

    Цитата:
    Далее, если нам потребуется прервать цикл в любом месте, то мы не будем выдумывать такие слова, как break, continue, - мы просто перейдём куда нам нужно при помощи всё того же goto.
    И убьем сами себя. )
    Цитата:
    Важная вещь: отказавшись от самой простой вещи нам пришлось выдумать много-много других. На лицо усложнение и нагромождение излишних сущностей в программах.
    Что за бредятину Вы несете, товарищ?
    Все эти конструкции как раз призваны упростить написание и чтение кода.
    Код с повсеместными goto очень быстро превращается в лапшу.
    Кстати, непонятно, зачем тебе тогда функции, да и вообще C.
    Запись от Croessmah размещена 29.05.2019 в 22:17 Croessmah на форуме
  2. Старый комментарий
    Аватар для Usaga
    Цитата:
    Далее, если нам потребуется прервать цикл в любом месте, то мы не будем выдумывать такие слова, как break, continue, - мы просто перейдём куда нам нужно при помощи всё того же goto.
    Почему не будем? Потому, что через жопу сделать проще? Не понимаешь что такое структура кода? Да ну и фиг на это, да?) И других будем учить так делать.

    Боинг не упадёт, если даже взлететь не сможет.
    Запись от Usaga размещена 30.05.2019 в 06:23 Usaga на форуме
  3. Старый комментарий
    Я хочу поддержать ТС. Он говорит Истину. Предыдущие ораторы повторяют чьи-то слова. Ну бог с ними. В стаде программистов всегда есть паршивая овца...
    Запись от нтч размещена 30.05.2019 в 06:59 нтч вне форума
  4. Старый комментарий
    Аватар для rerf2010rerf
    Предлагаю провести практический эксперимент. Выбираем какой-нибудь реальный проект - не уровня хеллоу ворлда, что-то более сложное и приближенное к реальному. CoderHuligan пишет его в его любимой "макаронной" парадигме, с оператором goto и всем таким. Мы пишем в нормальном стиле. Потом находим третье незаинтересованное лицо и просим как-нибудь эти проекты усовершенствовать, какую-нибудь простую фичу добавить. Ну и наслаждаемся результатом Впрочем, полагаю, для всех, кроме CoderHuligan, результат довольно очевиден.
    Есть энтузиасты?
    Запись от rerf2010rerf размещена 30.05.2019 в 08:48 rerf2010rerf вне форума
  5. Старый комментарий
    Аватар для Usaga
    Вторая и третья стороны тут излишни. Достаточно, чтобы ТС показал код какого-нибудь своего проекта решающего какую-нибудь практическую задачу. С его слов, он ничего такого не писал. Или повода не было или парадигма помешала. Но что-то доказывать нам он не станет, ибо не царское это дело.
    Запись от Usaga размещена 30.05.2019 в 09:26 Usaga на форуме
  6. Старый комментарий
    Аватар для bedvit
    Темы затрагивающие GOTO заведомо холиварные. Я поэтому в предыдущей части в коментах упоминал про попкорн. Что бы такая тема стала годной, нужно разбирать конкретику (код). Остальное - это все набросы на вентилятор. Надеюсь, здесь тема будет развиватся в этом, конструктивном ключе.
    Возможно, CoderHuligan хочет что-то донести до нас, есть какая-то идея.
    Запись от bedvit размещена 30.05.2019 в 09:45 bedvit на форуме
  7. Старый комментарий
    Аватар для bedvit
    Цитата:
    В языке Паскаль был своеобразный способ представления строк. Это был байтовый массив, в котором первый байт содержал число символов в строке. А так как одним байтом можно представить всего 256 значений беззнакового типа, то и подобные строки не могли быть длиннее 255 символов. Естественно, что такие строки начинались не с нулевого индекса, а с 1. Недостаток таких строк очевиден: они не могут иметь размер больший 255 символов.
    Ещё немного подумав, родили строки - BSTR. Всем нам известный СОМ.
    typedef OLECHAR * BSTR;
    Где строка содержит символы UNICODE с префиксом из четырех байт в котором содержится длина. А по простому байтовый массив, с первыми 4 байтами под размер строки.
    Запись от bedvit размещена 30.05.2019 в 09:52 bedvit на форуме
  8. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Темы затрагивающие GOTO заведомо холиварные.
    Не думаю, что это какая-то холиварная тема.
    goto нужен там, где нужен именно goto.
    Использовать goto ради goto нет никакой необходимости.
    Автор же хотел научить всех как правильно, а в результате сводит всё к тому,
    что миллионы программистов дебилы и только он знает истину.
    Высокоуровневые языки придумали не от хорошей жизни.
    Автор говорит о борьбе со сложностью, но сам эти сложности создает.
    Запись от Croessmah размещена 30.05.2019 в 12:50 Croessmah на форуме
    Обновил(-а) Croessmah 30.05.2019 в 12:52
  9. Старый комментарий
    Аватар для Usaga
    Так он с этой сложностью и борется. Только сложность для него это всё, что "выше" процедурного подхода. Даже структурный подход ему чужд, судя по фразе с GOTO.

    Автор, видимо, не писал ничего, что под своим собственным весом бы скрипело и гнулось, как башня пизанская. И где как в джунглях потеряться можно на раз-два. Вот и мерещится ему, что все практики борьбы с такими ситуациями вымысел и заговор масонов с рептилоидами, которые на досуге ещё и боинги сбивают.
    Запись от Usaga размещена 30.05.2019 в 13:42 Usaga на форуме
  10. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Croessmah Просмотреть комментарий
    Чего? Что значит "Указатель это именованная переменная, в которой содержится не её значение"?
    Вы правы - сказанул несколько расплывчато.

    Цитата:
    Сообщение от Croessmah Просмотреть комментарий
    Что за бредятину Вы несете, товарищ?
    Все эти конструкции как раз призваны упростить написание и чтение кода.
    Код с повсеместными goto очень быстро превращается в лапшу.
    Кстати, непонятно, зачем тебе тогда функции, да и вообще C.
    Не бредятину. Просто это только начало изложения, не всё сразу. У меня и времени мало, выкраиваю как могу.
    Упростить написание кода? Мне кажется всё совсем наоборот: так кодируются только тривиальные алгоритмы, а чуть посложнее, то кирдык с вашими "крисстальными" конструкциями..
    А чтение тоже упрощается? Нет, потому что такой код как правило содержит структурные костыли в виде переменных-флагов.
    Запись от CoderHuligan размещена 30.05.2019 в 14:11 CoderHuligan вне форума
  11. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Потому, что через жопу сделать проще? Не понимаешь что такое структура кода? Да ну и фиг на это, да?) И других будем учить так делать.
    Да. Сделать ГОРАЗДО проще. И это вовсе не жопа. Жопа это то, что сейчас мы имеем и к чему пришли.
    Запись от CoderHuligan размещена 30.05.2019 в 14:12 CoderHuligan вне форума
  12. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от rerf2010rerf Просмотреть комментарий
    Предлагаю провести практический эксперимент. Выбираем какой-нибудь реальный проект - не уровня хеллоу ворлда, что-то более сложное и приближенное к реальному. CoderHuligan пишет его в его любимой "макаронной" парадигме, с оператором goto и всем таким. Мы пишем в нормальном стиле. Потом находим третье незаинтересованное лицо и просим как-нибудь эти проекты усовершенствовать, какую-нибудь простую фичу добавить. Ну и наслаждаемся результатом Впрочем, полагаю, для всех, кроме CoderHuligan, результат довольно очевиден.
    Есть энтузиасты?
    Не, я двумя руками за. Предлагайте тему. Только не Операционную систему.
    Запись от CoderHuligan размещена 30.05.2019 в 14:14 CoderHuligan вне форума
  13. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от bedvit Просмотреть комментарий
    Возможно, CoderHuligan хочет что-то донести до нас, есть какая-то идея.
    Да, вы правы. Я хочу донести нечто важное, просто начинаю несколько издалека. Но мы уже близко.
    Не знаю будет ли сегодня следующий урок, так как сегодня зашился в работе. Посмотрим.
    Друзья, дело ведь не в goto как таковом, а в способах алгоритмизации в соответствии с некоторыми математическими концепциями. Научными концепциями. Программировать по научному, а не так как вздумается, вот к чему я призываю.
    Запись от CoderHuligan размещена 30.05.2019 в 14:18 CoderHuligan вне форума
  14. Старый комментарий
    Всем противникам оператора GOTO предлагаю решить задачу
    Задача.
    Условие: дано 9 чисел: 47, 88, 22, 86, 94, 83, 97, 62, 27
    Требуется найти те числа, которые в сумме дадут число 300
    Если решений несколько, то распечатать все решения
    ...
    примечание
    1. задача имеет два решения
    2. тут будет девятикратный цикл. Вот и интересно, как можно обойтись без GOTO?
    Запись от нтч размещена 30.05.2019 в 14:24 нтч вне форума
  15. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    Вот и интересно, как можно обойтись без GOTO?
    Выход из вложенных циклов - это первый аргумент в пользу goto всегда.
    Во многих случаях можно сделать такой выход без goto, но нужно смотреть на целесообразность.
    Я не вижу, чтобы кто-то здесь писал, что goto вообще нигде никогда не нужен.
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    тут будет девятикратный цикл.
    В тексте предлагается эти самые циклы и условия тоже организовать на goto и метках, никаких for'ов, никаких if'ов с блоками кода (if (...) goto туды; else goto сюды;)
    Запись от Croessmah размещена 30.05.2019 в 14:41 Croessmah на форуме
  16. Старый комментарий
    Аватар для liv
    Ну и какие проблемы? Все решается легко и просто и без goto
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    
    #include <iostream>
    using namespace std;
     
    int main()
    {
        const int N = 9;
        int data[N] = { 47, 88, 22, 86, 94, 83, 97, 62, 27 };
        int sum;
     
        for (int i0 = 0; i0 < N-4; i0++)
        {
            for (int i1 = i0+1; i1 < N; i1++)
            {
                sum = data[i0] + data[i1];
                if (sum == 300)
                    cout << data[i0] << " " << data[i1] << endl;
                else if (sum > 300)
                    continue;
                else
                {
                    for (int i2 = i1+1; i2 < N; i2++)
                    {
                        sum = data[i0] + data[i1] + data[i2];
                        if (sum == 300)
                            cout << data[i0] << " " << data[i1] << " " << data[i2] << endl;
                        else if (sum > 300)
                            continue;
                        else
                        {
                            for (int i3 = i2+1; i3 < N; i3++)
                            {
                                sum = data[i0] + data[i1] + data[i2] + data[i3];
                                if (sum == 300)
                                    cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << endl;
                                else if (sum > 300)
                                    continue;
                                else
                                {
                                    for (int i4 = i3+1; i4 < N; i4++)
                                    {
                                        sum = data[i0] + data[i1] + data[i2] + data[i3] + data[i4];
                                        if (sum == 300)
                                            cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << " " << data[i4] << endl;
                                        else if (sum > 300)
                                            continue;
                                        else
                                        {
                                            for (int i5 = i4+1; i5 < N; i5++)
                                            {
                                                sum = data[i0] + data[i1] + data[i2] + data[i3] + data[i4] + data[i5];
                                                if (sum == 300)
                                                    cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << " " << data[i4] << " " << data[i5] << endl;
                                                else if (sum > 300)
                                                    continue;
                                                else
                                                {
                                                    for (int i6 = i5+1; i6 < N; i6++)
                                                    {
                                                        sum = data[i0] + data[i1] + data[i2] + data[i3] + data[i4] + data[i5] + data[i6];
                                                        if (sum == 300)
                                                            cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << " " << data[i4] << " " << data[i5] << " " << data[i6] << endl;
                                                        else if (sum > 300)
                                                            continue;
                                                        else
                                                        {
                                                            for (int i7 = i6+1; i7 < N; i7++)
                                                            {
                                                                sum = data[i0] + data[i1] + data[i2] + data[i3] + data[i4] + data[i5] + data[i6] + data[i7];
                                                                if (sum == 300)
                                                                    cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << " " << data[i4] << " " << data[i5] << " " << data[i6] << " " << data[i7] << endl;
                                                                else if (sum > 300)
                                                                    continue;
                                                                else
                                                                {
                                                                    for (int i8 = i7+1; i8 < N; i8++)
                                                                    {
                                                                        sum = data[i0] + data[i1] + data[i2] + data[i3] + data[i4] + data[i5] + data[i6] + data[i7] + data[i8];
                                                                        if (sum == 300)
                                                                            cout << data[i0] << " " << data[i1] << " " << data[i2] << " " << data[i3] << " " << data[i4] << " " << data[i5] << " " << data[i6] << " " << data[i7] << " " << data[i8] << endl;
                                                                        else if (sum > 300)
                                                                            continue;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }
    Запись от liv размещена 30.05.2019 в 16:29 liv на форуме
    Обновил(-а) liv 30.05.2019 в 16:31
  17. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Ну и какие проблемы? Все решается легко и просто и без goto
    Вы так издеваетесь?
    Это что - читаемый код? Вот это что энто такое:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
                       }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    Это не клиника, не?..
    Если это не лапша тогда что лапша?..
    Это даже в кошмарном сне не приснится..
    Ребята вы меня сподвигаете на дополнительные подвиги!
    Спасибо вам!!
    Запись от CoderHuligan размещена 30.05.2019 в 16:44 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 30.05.2019 в 16:57
  18. Старый комментарий
    Аватар для liv
    Замечу, почему плохо использовать goto.
    1) Операторы break, continue работают только в соответствующих конструкциях.
    Если поставить не туда, еще на этапе компиляции получим ошибку. А это дополнительный контроль. Чем плохо?
    2) Использование оператора goto практически никак не проверяется компилятором.
    Контроль его использования целиком и полностью на программисте!
    Легко можно отправить не туда, а потом долго искать, почему не работает...

    Лично я пишу больше на Ассемблере, поэтому использовать переходы мне легко,
    я слежу за тем, куда отправляю, очень внимательно. Специфика языка обязывает
    Но молодым программистам, только осваивающим язык Си, полагаю, очень легко отправить не туда...
    Не случайно, использование goto не рекомендуется... Тем более, можно без лишних усилий обойтись без оного...
    Посмотрите на мой код, все понятно и, мне кажется, даже красиво...
    Да, можно использовать и goto, но при условии более тщательной проверки написанного кода... А оно надо?
    Запись от liv размещена 30.05.2019 в 16:59 liv на форуме
  19. Старый комментарий
    Аватар для liv
    Цитата:
    Это что - читаемый код?
    Конечно!
    Девять вложенных циклов, как-никак, плюс условные операторы...
    Все выделяется отступами, видно уровни вложенности...
    Я так понимаю, Вы не используете отступы...
    Покажите свой код... Посмотрим
    Запись от liv размещена 30.05.2019 в 17:03 liv на форуме
  20. Старый комментарий
    Аватар для Usaga
    Цитата:
    Всем противникам оператора GOTO предлагаю решить задачу
    А кто тут противник GOTO?

    Цитата:
    Да. Сделать ГОРАЗДО проще. И это вовсе не жопа. Жопа это то, что сейчас мы имеем и к чему пришли.
    Т.е. объявлять метки и безусловно к ним скакать ПРОЩЕ? И проще, чем что? И к чему мы сейчас пришли? Или лично вы пришли?
    Запись от Usaga размещена 30.05.2019 в 17:15 Usaga на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru