Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты по проге.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
630.61 Кб
Скачать

3.6. Цикл do-while

Цикл с постусловием. (Тело цикло выполняется всегда минимум 1 раз, условие проверяется после выполнения)

Do

Оператор

While(выражение);

3.7. Операторы break и continue

Выход из цикла отличным от проверки условий в начале или конце. Принудительный выход из циклов фо, вайл, ду вайл . выход из ближайшего – внутреннего цикла.

Continue передаёт управление на следующую итерацию ближайшего цикла . В цикле вайл или ду это означает немедленную проверку условия, а в цикле фо – дополнительно выполняется инкрементирование.

For (i=0; i<n; i++){

If (a[i]<0) continue; // обработка только положительных

}

3.8. Оператор goto и метки

Никогда не необходим, не рекомендуется использовать. В основном, когда нужно прекратить работу структуры с большим колвом вложений и выйти сразу из двух и более вложенных циклов.

For(…)

For(…){

If(disaster)

Goto error;

}

.

Error: решение проблемы

После метки – двоеточие, можно ставить перед любым оператором в той же функции, где есть goto. Код всегда можно переписать или добавить проверку.

Оператор goto передает управление на оператор, помеченный меткой. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной, т.е. одно имя метки не может быть использовано для разных операторов программы. Имя метки - это идентификатор. Любой оператор в составном операторе может иметь свою метку. Используя оператор goto, можно передавать управление внутрь составного оператора. Но нужно быть осторожным при входе в составной оператор, содержащий объявления переменных с инициализацией, так как объявления располагаются перед выполняемыми операторами и значения объявленных переменных при таком переходе будут не определены

3.9. Оператор return

Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом. Функция main передает управление операционной системе. Значение выражения, если оно задано, возвращается в вызывающую функцию в качестве значения вызываемой функции. Если выражение опущено, то возвращаемое значение не определено. Если в какой-либо функции отсутствует оператор return, то передача управления в вызывающую функцию происходит после выполнения последнего оператора вызываемой функции. При этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void. Таким образом, использование оператора return необходимо либо для немедленного выхода из функции, либо для передачи возвращаемого значения.

Инвариант

Инвариант – соотношение между значениями переменных цикла или некоторое утверждение о таких значениях, которые остаются неизменными на каждом шаге прохождения цикла. Следствие, является истинным при входе и выходе из цикла.

Инварианты используются в теории верификации программ для доказательства правильности выполнения цикла. Порядок доказательства работоспособности цикла с помощью инварианта сводится к следующему:

  1. Доказывается, что выражение инварианта истинно перед началом цикла.

  2. Доказывается, что выражение инварианта сохраняет свою истинность после выполнения тела цикла; таким образом, по индукции, доказывается, что по завершении цикла инвариант будет выполняться.

  3. Доказывается, что при истинности инварианта после завершения цикла переменные примут именно те значения, которые требуется получить (это элементарно определяется из выражения инварианта и известных конечных значениях переменных, на которых основывается условие завершения цикла).

  4. Доказывается (возможно — без применения инварианта), что цикл завершится, то есть условие завершения рано или поздно будет выполнено.

  5. Истинность утверждений, доказанных на предыдущих этапах, однозначно свидетельствует о том, что цикл выполнится за конечное время и даст желаемый результат.

Пример 1.

for (i=0; i<N; i++) A[i]=0;

Первые i элементов массива уже обнулены

Пример 2.

while (i<N) { if (A[i]!=0) s=s*A[i]; i++;}

Переменная s равна произведению первых i ненулевых элементов

Инвариант для бинарного поиска

Инвариант цикла: пусть левый индекс не больше искомого элемента, а правый — строго больше, тогда если  , то понятно, что   — самое правое вхождение (так как следующее уже больше).

Инвариант для линейного поиска

((i=N)||(a[i]==x))&&( 0<=k<i : a[k]!=x).

Билет 4. Характеристики алгоритмов.

Алгоритм – это последовательность действий, приводящая к достижению результата.

“Алгоритм – это последовательность математических, логических или вместе взятых операций, отличающихся детерменированностью, массовостью, направленностью и приводящая к решению всех задач данного класса за конечное число шагов”.

Программа - последовательность инструкций, предназначенных для исполнения устройством управления вычислительной машины. Программа — один из компонентов программного обеспечения. В зависимости от контекста рассматриваемый термин может относиться также и к исходным текстам программы.

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

Алгоритм

Программа

Язык программирования

Правильность

Правильность

Недопущение ошибок (Структурность, ООП)

Эффективность

Эффективность

Мощность

Универсальность

Универсальность

Гибкость

Понятность

Удобочитаемость (понятность при чтении)

Стильность

Переносимость

Переносимость

?

?

Удобство тестирования

Удобство обучения

Сложность

Детерминированность = Определённость

Надёжность, безопасность

Параллельное программирование

Результативность

Результативность

Видоизменяемость

Завершаемость (конечность)

Массовость

  1. Правильность – алгоритм верный, если его выполнение даёт верные результаты поставленной задачи.

  2. Эффективность – зависимость от затрат, время и память.

  3. Мощность языка – возможность несложными конструкциями решать сложные задачи. (Рекурсия)

  4. Универсальность - алгоритм должен быть применим к разным наборам исходных данных (Массовость)

  5. Гибкость – насколько легко можно добавлять к существующей программе новые функциональные возможности. Это может быть добавление нового набора функций или использование существующей библиотеки для добавления новой функциональности.

  6. Стильность - набор приемов или методов программирования, которые используют программисты, чтобы получить правильные, эффективные, удобные для применения и легкочитаемые программы. (Синтаксис)

  7. Переносимость – алгоритм не должен зависеть от выбранного типа техники или используемого языка программирования. Программа-  Свойство программы, позволяющее переносить ее без изменений или с минимальными переделками с одного компьютера на другой, в особенности, когда эти ЭВМ имеют различную архитектуру. П. п. обеспечивается системами программирования.

  1. Дискретность(детализация) - алгоритм должен представлять процесс решения задачи как последовательное выполнение простых (или ранее определенных) шагов. Каждое действие, предусмотренное алгоритмом, исполняется только после того, как закончилось исполнение предыдущего. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, то есть преобразование исходных данных в результат осуществляется во времени дискретно.

  1. Детерминированность - при применении алгоритма к одним и тем же исходным данным должен получаться всегда один и тот же результат, поэтому, например, процесс преобразования информации, в котором участвует бросание монеты, не является детерминированным и не может быть назван алгоритмом.

  1. Недопущение ошибок включает в себя структурность и ООП, удобство написания.

  1. Определенность – каждое правило алгоритма должно быть четким, однозначным и не оставлять места для произвола. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.

  • Дискретность — алгоритм должен представлять процесс решения задачи как последовательное выполнение некоторых простых шагов..

  • Определенность - в каждый момент времени следующий шаг работы однозначно определяется состоянием системы. Таким образом, алгоритм выдаёт один и тот же результат для одних и тех же исходных данных.

  • Понятность — алгоритм для исполнителя должен включать только те команды, которые ему (исполнителю) доступны, которые входят в его систему команд.

  • Конечность — при корректно заданных исходных данных алгоритм должен завершать работу и выдавать результат за конечное число шагов. 

  • Результативность — завершение алгоритма определёнными результатами (Приводит к решению задачи за конечное число шагов).

  1. Эффективность – алгоритм должен выполнять свою работу за минимальное количество времени и с минимальном количеством занимаемой памяти. (То есть, он должен достигать результата максимально удобным и коротким способом.)

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

Алгоритм

Программа

Язык

Правильность

Правильность

Недопущение ошибок

Эффективность

Эффективность

Мощность

Универсальность

Универсальность

Гибкость

Дискретность

Удобочитаемость

Стильность

Определенность

Переносимость

Уровень

Результативность

Результативность

Видоизменяемость

Понятность

Понятность

Удобство обучения

Детерминированность

Надежность

Параллельное программирование

В информатике параллельный алгоритм, противопоставляемый традиционным последовательным алгоритмам, — алгоритм, который может быть реализован по частям на множестве различных вычислительных устройств с последующим объединением полученных результатов и получением корректного результата.

Некоторые алгоритмы достаточно просто поддаются разбиению на независимо выполняемые фрагменты. Например, распределение работы по проверке всех чисел от 1 до 100000 на предмет того, какие из них являются простыми, может быть выполнено путем назначения каждому доступному процессору некоторого подмножества чисел с последующим объединением полученных множеств простых чисел (похожим образом реализован, например, проект GIMPS).

Билет 5. Массивы и указатели.