Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билет отв.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
337.48 Кб
Скачать
  • 1. Определения

Алгоритм - это конечная последовательность команд (предписаний) исполнителю совершить конечную последовательность действий, которая направлена на достижение определённой цели.

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

Система команд исполнителя - перечень команд, которые понимает и может исполнить исполнитель.

  • 2. Примеры

ВЫЧИСЛИТЕЛЬНЫЕ:

  • ПРАВИЛО ВОЗВЕДЕНИЯ ЧИСЛА В СТЕПЕНЬ; ИЗВЛЕЧЕНИЕ КОРНЯ;

  • СЛОЖЕНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ ДРОБЕЙ;

  • РЕШЕНИЕ ЛИНЕЙНЫХ, КВАДРАТНЫХ И ДР. УРАВНЕНИЙ;

  • НАХОЖДЕНИЕ S И V ФИГУР,

  • ВЫЧИСЛЕНИЕ НОД, НОК,

НЕВЫЧИСЛИТЕЛЬНЫЕ (БЫТОВЫЕ):

  • РЕЦЕПТ ПРИГОТОВЛЕНИЯ БЛЮД;

  • ПРАВИЛО ПОЛЬЗОВАНИЯ ЛИФТОМ, МЕЖДУГОРОДНИМ ТЕЛЕФОНОМ;

ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ ЭЛЕКТРОПРИБОРОВ

3. Свойства алгоритмов

  • Дискретность - алгоритм должен быть разбит на шаги (отдельные законченные действия);

  • Определённость - у исполнителя не должно возникать двусмысленностей в понимании шагов алгоритма (исполнитель не должен принимать самостоятельные решения);

  • Результативность (конечность) - алгоритм должен приводить к конечному результату за конечное число шагов;

  • Понятность - алгоритм должен быть понятен для исполнителя;

  • Эффективность - из возможных алгоритмов выбирается тот алгоритм, который содержит меньше шагов или времени на его выполнение требуется меньше.

  • 4. Способы описания алгоритмов

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

Алгоритмы записываются в виде:

  • словесных правил,

  • блок схем,

  • программ.

Оператор условного перехода

Оператор условного перехода в Турбо Паскаль имеет вид:

if условие then оператор 1 else оператор 2;

условие - это логическое выражение, в зависимости от которого выбирается одна из двух альтернативных ветвей алгоритма. Если значение условия истинно (TRUE), то будет выполняться оператор 1, записанный после ключевого слова then. В противном случае будет выполнен оператор 2, следующий за словом else, при этом оператор 1 пропускается. После выполнения указанных операторов программа переходит к выполеннию команды, стоящей непосредственно после оператора if.

Необходимо помнить, что перед ключевым словом else точка с запятой никогда не ставится!

else - часть в операторе if может отсутствовать:

if условие then оператор 1;

Тогда в случае невыполнения логического условия управление сразу передается оператору, стоящему в программе после конструкции if.

Следует помнить, что синтаксис языка допускает запись только одного оператора после ключевых слов then и else, поэтому группу инструкций обязательно надо объединять в составной оператор (окаймлять операторными скобками begin ... end). В противном случае возникает чаще всего логическая ошибка программы, когда компилятор языка ошибок не выдает, но программа тем не менее работает неправильно.

Примеры.

if x > 0 then modul := x else modul := -x;

if k > 0 then WriteLn('k - число положительное');

if min > max then begin

t := min;

min := max;

max := t;

end;

Билет №11

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

Побитовые логические операции

Ряд источников по языкам низкого уровня называет побитовые логические операции просто логическими,[1][2] но в терминологии программирования на языках высокого уровня в названиях битовых операций присутствуют прилагательные битовый, побитовый (например: «побитовое логическое И», оно же «побитовое умножение»),поразрядный.

Побитовое отрицание (NOT)

Побитовое отрицание (или побитовое НЕ, или дополнение) — это унарная операция, действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0. Например:

НЕ

01

10

Побитовое И (AND)

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

Пример:

И

0011

0101

0001

Побитовое ИЛИ (OR)

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

Пример:

ИЛИ

0011

0101

0111

Сложение по модулю два (XOR)

Основная статья: Сложение по модулю два

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

Пример:

Искл. ИЛИ

0011

0101

0110

Первое русское название операции обусловлено тем, что результат данной операции отличается от результата «ИЛИ» только в одном случае из 4 случаев входа — обоих 1 (случай одновременной истинности аргументов «исключается»). Ещё в русской грамматике значение данной логической связки передаётся союзом «либо».

Второе название — тем, что действительно является сложением в кольце вычетов по модулю два, из чего следуют некоторые интересные свойства. Например, в отличие от вышеописанных «И» и «ИЛИ», данная операция является обратимой, или инволютивной:  .

Битовые сдвиги

Основная статья: Битовый сдвиг

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

Также различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).

Логический сдвиг

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

Логические сдвиги влево и вправо используются для быстрого умножения и деления на 2, соответственно.

Арифметический сдвиг

Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде. Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

Циклический сдвиг

При циклическом сдвиге, значение последнего бита по направлению сдвига копируется в первый бит (и копируется в бит переноса).

Также различают циклический сдвиг через бит переноса — при нём первый бит по направлению сдвига получает значение из бита переноса, а значение последнего бита сдвигается в бит переноса.

Билет №12

Строки типа String. Пример действий с ними

Для организации необходимых действий со строками в Turbo Pascal используется стандартный тип данных string. Строки записываются в виде заключенных в апострофы символов, например: ‘aurinko’, ‘солнце’, ‘’(пустая строка), ‘ ’(пробел), ‘об’’ем’(апостроф указывается дважды). Строковые переменные описываются следующим образом:

var st : string[<константное выражение>];

Значение константного выражения (обозначим его через n) называют объявленным размером строки. N измеряется в байтах и находится в следующих пределах: 0  n  255. Если размер строки не указан, то считается, что n = 255 . При вводе или присваивании строк символы, выходящие за объявленный предел, отбрасываются. Символы в стринге пронумерованы от нуля. В нулевом байте содержится информация о длине строки, представленная символом, т.е. фактический размер строки может быть определен как ord(st[0]). Приведем простой пример описания и некоторых действий со строковыми переменными.

program primer;

type stroka = string[30]; {Тип-строка, содержащая не более 30 символов}

var s : stroka;

s1 : string; {Строка максимального размера}

s2 : string[10]; {Строка из 10 символов}

begin

s2 := ‘Это string’;

s2[0] := chr(3); {Изменяем размер строки}

writeln(s2) end. {На экран будет выведено слово “Это”}

При сравнении строк большей считается та строка, в которой содержится больше символов. Если число символов в строках одинаковое, то решение принимается по первым неодинаковым символам, например ‘Это’ < ‘это’, ‘Марс’ > ‘Марк’ и т. д. Ниже приводятся стандартные процедуры и функции, используемые при работе со строками.

Функция length(s) возвращает фактический размер стринга s.

Функция pos(s1,s) возвращает позицию первого вхождения подстроки s1 в строку s.

Функция copy(s, p, n) копирует из строки s n символов, начиная с символа, находящегося на позиции p.

Процедура delete(s, p, n) удаляет из строки s n символов, начиная с символа на позиции p.

Процедура insert(s1, s, p) вставляет подстроку s1 и строку s, начиная с позиции p.

Функция concat(s1, s2, …) объединяет в одну строки s1, s2, …

Для взаимного преобразования строковых и числовых данных служат процедуры:

str((<число>[:n[:k]], <переменная типа string>);

val(<строка>, <переменная-число>, <номер>).

В процедурах строка может содержать только цифры и разделитель целой и дробной частей числа, номер возвращает номер ошибочно введенной позиции, n и k задают формат числа (k - число позиций, отводимых под дробную часть).

Пустой оператор

Пустой оператор не выполняет никакого действия и никак не отображается в программе

(за исключением, быть может, метки или точек с запятыми, отделяющих пустой оператор

от предыдущих или последующих операторов).

Он может потребоваться для осуществления на него безусловного перехода

(см. пример в п. 5.1.2).

Составной оператор

Составной оператор представляет собой совокупность последовательно выполняемых

операторов, заключенных в операторные скобки begin и end:

begin

<оператор 1>;

<оператор 2>;

<оператор N>

end;

Он может потребоваться в тех случаях, когда в соответствии с правилами построения

конструкций языка можно использовать ОДИН оператор, а выполнить нужно несколько

действий. В такой составной оператор входит ряд операторов, выполняющих требуемые

действия.

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

может быть и составной оператор.

Отдельные операторы внутри составного оператора отделяются друг от друга точкой с

запятой (см. пример в п. 5.1.2, где тело цикла представляет составной оператор).

Так как завершающее составной оператор слово end не является отдельным предложением,

то перед ним точку с запятой можно не ставить, в противном случае компилятор будет

считать, что перед словом end стоит пустой оператор.

Можно считать, что и само тело программы, т. к. оно заключено в операторные скобки

begin и end, тоже является составным оператором.

Оператор условного перехода

Оператор условного перехода в Турбо Паскаль имеет вид:

if условие then оператор 1 else оператор 2;

условие - это логическое выражение, в зависимости от которого выбирается одна из двух альтернативных ветвей алгоритма. Если значение условия истинно (TRUE), то будет выполняться оператор 1, записанный после ключевого слова then. В противном случае будет выполнен оператор 2, следующий за словом else, при этом оператор 1 пропускается. После выполнения указанных операторов программа переходит к выполеннию команды, стоящей непосредственно после оператора if.

Необходимо помнить, что перед ключевым словом else точка с запятой никогда не ставится!

else - часть в операторе if может отсутствовать:

if условие then оператор 1;

Тогда в случае невыполнения логического условия управление сразу передается оператору, стоящему в программе после конструкции if.

Следует помнить, что синтаксис языка допускает запись только одного оператора после ключевых слов then и else, поэтому группу инструкций обязательно надо объединять в составной оператор (окаймлять операторными скобками begin ... end). В противном случае возникает чаще всего логическая ошибка программы, когда компилятор языка ошибок не выдает, но программа тем не менее работает неправильно.

Примеры.

if x > 0 then modul := x else modul := -x;

if k > 0 then WriteLn('k - число положительное');

if min > max then begin

t := min;

min := max;

max := t;

end;

Операторы ввода-вывода

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

Read(<Список ввода>);<br /> Readln(<Список ввода>);

Операторы вывода

Write(<Список вывода>); Writeln(<Список вывода>);

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

Билет №13

Правила оформления схем алгоритмов

Условные обозначения и правила выполнения схем алгоритмов регламентируются требованиями Единой системы программной документации в соответствии с ГОСТ 19.701-90 [6].

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

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

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

Рис. 4

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

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

Специфическим видом массива является символьный массив. Так как при вводе его элементов все набираемые с клавиатуры символы становятся значимыми, целесообразно производить их ввод персонально с помощью оператора readln. Вывод не обязательно проводить посимвольно, одномерные символьные массивы (строки) выводятся целиком (без организации цикла).

Ниже приведен пример действий с вектором символов.

program Stroki;

const k = 7;

var s1 : array[1..k] of char;

s2 : array[1..10] of char;

i, n : byte;

begin

s2 := ‘Это Pascal’; {Так можно задавать значения элементам массива}

for i := 1 to k do begin {Вводим посимвольно другой массив}

writeln(‘Введите ’, i, ‘-й символ’ );

readln(s1[i]) end;

writeln(‘Первая строка: ’,s1); {Вывод первой строки}

if s2[4] < s1[7] then s2 := ‘Turbo Pasc’;

writeln(‘Вторая строка: ’,s2) end.

Одним из часто встречающихся действий с массивами является их сортировка. Выше приведен алгоритм одного из простых способов сортировки - метод стандартного обмена. Сортируются по нарастанию n элементов вектора.

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

Билет 14

Кроме рассмотренных видов параметров подпрограмм, версия 7.0 языка позволяет использовать еще один вид параметра - одномерные массивы открытого типа и строки открытого типа. В качестве фактических параметров здесь могут выступать массивы и строки любого размера.

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

Пример 3. Решить задачу примера 2 с помощью массива открытого типа.

program Otkr_Massiv;

const {Задаем исходные массивы}

a : array[6..10] of real = (1, 2, 3, 4, 5);

b : array[1..4] of real = (6, 7, 8, 9);

function Sum_Otkr(z : array of real) : real; {z - массив открытого типа}

var i : byte; s : real;

begin s := 0;

for i := 0 to High(z) do {Нумерация элементов z от нуля!}

s := s + z[i];

Sum_Otkr := s end; {Sum_Otkr}

begin {Основная программа}

writeln(‘Сумма элементов вектора a = ’, Sum_Otkr(a) : 2 : 0);

writeln(‘Сумма элементов вектора b = ’, Sum_Otkr(b) : 2 : 0);

end.

Итак, массив открытого типа позволяет сократить число передаваемых в подпрограмму параметров.

Итерационные циклы: сумма бесконечного ряда

Запись выражения для на языке Turbo Pascal обычно не вызывает затруднений. Однако есть частные случаи, когда выражение для содержит целые степени аргумента x и факториалы. В этих случаях применяют следующий прием. Выражают очередное слагаемое как функцию от предыдущего слагаемого: или

, (2)

где . (3)

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

Пример 1. Вычислить с погрешностью =0,001 для заданного значения аргумента x значение функции sin(x) с помощью ее разложения в ряд:

,

где (2n – 1)! = 123 (2n – 1).

Выразим вспомогательную функцию из выражения (3):

.

С ее помощью по формуле (2) будем определять очередное слагаемое t. Первый член ряда находим непосредственно из формулы для общего члена ряда, подставив в нее n = 1. Далее приведен алгоритм решения задачи.

Запишем алгоритм на языке программирования:

program Summa_Ryada;

const

e = 0.001;

var

n: byte;

fi, summa, t, x: real;

begin

writeln(‘Введите x’);

readln(x);

summa:=0; t:=x; n:=2;

while abs(t) > e do begin

summa:=summa + t;

fi:=- x*x/(2*n-2)/(2*n-1);

t:=t*fi;

n:=n + 1

end; {while}

writeln(‘Сумма ряда = ‘, summa);

writeln(‘Учтено ‘, n-1, ‘ слагаемых’);

writeln(‘Синус = ‘, sin(x))

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]