- •1. Алгоритм и его свойства
- •1 Теорема о структурировании
- •Постановка задачи
- •Метод простых итераций в общем виде
- •Сходимость метода простых итераций
- •Геометрическая интерпретация
- •Билет 7 Процедурный тип
- •Пример задачи, где используется явное преобразование типов
- •Операция явного приведения типов
- •1. Определения
- •2. Примеры
- •3. Свойства алгоритмов
- •4. Способы описания алгоритмов
- •Оператор условного перехода
- •Билет 15
- •Цикл со счётчиком
- •Начало развития
- •[Править]Язык ассемблера
- •[Править]Структурное программирование
- •[Править]ооп
1 Теорема о структурировании
Любой алгоритм может быть эквивалентно представлен структурированным алгоритмом, состоящим из базовых структурных конструкций
Структурные конструкции.
В структурном программировании есть три типа структурных конструкций:
последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;
ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;
цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).
В программе базовые конструкции могут быть вложены друг в друга произвольным образом, но никаких других средств управления последовательностью выполнения операций не предусматривается
Подпрограммы-процедуры. Пример описания и использования
Структура процедуры имеет следующий вид:
Procedure <имяпроцедуры>(формальные_параметры); Var (локальные_переменные) begin ............. end; |
Процедура вызывается по имени:
<имя процедуры> (фактические параметры);
Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Временно управление передаётся процедуре. После завершения работы процедуры управление возвращается в основную программу.
Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования.
Заголовок процедуры может выглядеть так:
PROCEDURE GG(a, b, c : integer);
а вызываться она может так: GG(3, n, m)
Здесь a, b, c – формальные параметры, а 3, n, m – фактические параметры.
Таким образом, в процедуру передаются значения: a=3, b=n, c=m.
Переменные, описанные в процедуре в разделе описаний переменных после слова Var, являются внутренними переменными процедуры, т.е. промежуточными. Они не являются исходными данными для операций внутри процедуры и не являются результатом её выполнения, а нужны лишь для хранения промежуточной информации.
Данные и результаты описываются в круглых скобках после имени процедуры. Перед описанием переменных-результатов пишут служебное слово var.
Например:
Procedure express(a,b,c:real; var x,y:real); Var z : real; begin z:=a + b + c; x:=sqr(z); y:=sqrt(z); end ; |
Эту процедуру можно вызвать следующим образом:
express(8.6, 6.9, 9.5, x1, y1); |
Входные формальные параметры a, b, c принимают значения соответствующих фактических параметров: a=7.6; b=6.8; c=9.5.
При этих значениях выполняется процедура. Результатом выполнения процедуры являются x, y, которые передают свои значения соответствующим фактическим параметрам x1, y1. Таким образом, в основной программе будем иметь x1=625, y1=5.
Фактическими параметрами могут быть константы, переменные, выражения, массивы. В качестве формальных параметров могут выступать только переменные (константы и выражения недопустимы).
Билет №3
Применение логических операций к целым числам
Логические операции применимы не только к логическому типу данных, но и к целочисленному типу данных. Для целых чисел операции выполняются поразрядно, отдельно с каждым битом.
Как уже было сказано, логические операции с целыми числами проводятся поразрядно. Поэтому, чтобы понять, как работают эти операции, переведем значения переменных в двоичный код. Переменным «x» и «y» присвоены значения «11» и «15». В двоичном исчислении 11=1011, а 15=1111.
Над этими переменными производится операции and (логическое умножение). Результат этой операции вычисляется побитовым умножением, т.е. первый бит первого числа умножаем на первый бит второго число, затем второй бит первого числа умножаем на второй бит второго числа и т.д. Как было сказано в предыдущем примере, комбинация 2-х логических переменных, связанных между собой союзом «and» (и) является истиной (т.е. равна 1), если обе переменные истинны (равны 1). В нашем примере 3 комбинации являются истинными, и одна комбинация (на рис. выделена синей рамкой) является ложной.
Таким образом, в результате операции логического умножения получается число 1011. Переведем его в десятичную систему счисления. Получится число 11. Это число и будет результатом операции логического умножения чисел 11 и 15, и это число будет выведено на экран.
Здесь записывается операция or (логическое сложение). Согласно законам булевской алгебры, комбинация 2-х логических переменных, связанных между собой союзом «or» (или) является ложным (т.е. равна 0) только в том случае, если обе переменные ложны (т.е. равны 0). В нашем примере нет комбинаций из 2-х ложных (нулевых) разрядов, поэтому результатом во всех разрядах будет истина (единица).
В итоге получится число 1111. При переводе в десятичную систему счисления получается 15. Это число будет выведено на экран (строка №11).
Записывается операция not (инверсия). Ее результатом будет число, которое получается при увеличении числа, стоящего после not на 1 и изменении знака этого числа. После not стоит переменная «y». Она имеет значение 15. Увеличиваем 15 на единицу. Получается 16. Меняем знак. Получается – 16.
В строке №14 записываем операцию xor (исключающее или). Это операция, которая называется исключающее или. Согласно законам булевской алгебры, комбинация 2-х логических переменных, связанных между собой союзом «xor» (либо) является истинным только в том случае, если обе переменные разные (т.е. одна истинна, другая ложна). В нашем случае только 3-и разряды (справа) разные, поэтому там в результате будет истина (1).
Полученное число 0100 в десятичной системе счисления равно 4.
Ограниченный тип данных
Ограниченный тип данных представляет собой интервал значений порядкового типа, называемого базовым типом. Описание типа задаёт наименьшее и наибольшее значения, входящие в этот интервал.
Например,
Var a: 1..25; ch: 'a' ..'z';
Здесь переменные а и ch могут принимать значения только из указанного интервала; базовым типом для переменой аявляется целый тип, а для переменной ch - символьный.
Переменная ограниченного типа сохраняет все свойства переменных базового типа.
Для чего вводится ограниченный тип данных? Использование ограниченного типа делает программу наиболее понятной и наглядной. Например, если в программе переменная b может принимать только значения 3, 4, 5, 6, 7, 8, то лучше описать её следующим образом: Var b: 3..8;, чем Var b: Integer; так как в случае выхода значения b за диапазон 3..8 в первом случае будет выдано диагностическое сообщение, которое поможет найти ошибку. Во втором случае будет получен неправильный результат, что затруднит поиск ошибки. Таким образом, второй вариант описания переменной следует использовать в тех случаях, когда диапазон значений заранее неизвестен либо занимает весь допустимый интервал значений для рассматриваемого типа.
Пример 1:
Напишите программу, которая переменной t присваивает значения true, если первая дата предшествует (в рамках года) второй дате, и значение false в противном случае.
Решение
rogram Example_24; Var d1, d2 : 1..31; m1,m2: 1..12; t:Boolean; Begin Write( 'Введите первую дату (день, месяц)'); Readln(d1, m1); Write( 'Введите вторую дату (день, месяц)'); Readln(d2, m2); t:=(m1<m2) Or ((m1=m2) And(d1<d2)); Writeln(t); End.
Перечисляемый тип данных
Этот тип данных получил название перечисляемого, потому что он задаётся в виде перечисления некоторых значений. Эти значения образуют упорядоченное множество и являются константами этого типа. Для объявления переменной список возможных значений, разделённых запятой, указывается в круглых скобках. Например,
Var month: (january, february, marth, april, may, june, jule, august, september, october, november, december);
Упорядоченность элементов перечисляемого типа определяется порядком их следования. Самый левый имеет минимальное значение (значение функции ord для него равно 0), а наиболее правый - максимальное.
Билет №4
Параметры-значения
Параметр-значение описывается в заголовке подпрограммы следующим образом:
имя : тип;
Например, передача в процедуру Р величины целого типа записывается так:
procedure P(x : integer);
Имя параметра может быть произвольным. Параметр х можно представить себе как локальную переменную, которая получает свое значение из главной программы при вызове подпрограммы. В подпрограмму передается копия значения аргумента.
Механизм передачи следующий: из ячейки памяти, в которой хранится переменная, передаваемая в подпрограмму, берется ее значение и копируется в область сегмента стека, называемую областью параметров. Подпрограмма работает с этой копией, следовательно, доступа к ячейке, где хранится сама переменная, не имеет. По завершении работы подпрограммы стек освобождается. Такой способ называется передачей по значению.
При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение. Тип выражения должен быть совместим по присваиванию с типом параметра.
Например, если в вызывающей программе описаны переменные
var x : integer;
c : byte;
y : longint;
то следующие вызовы подпрограммы Р, заголовок которой описан выше, будут синтаксически правильными:
P(x); P(c); P(y); P(200); P(x div 4 + 1);
Недостатками передачи по значению являются затраты времени на копирование параметра, затраты памяти в стеке и опасность его переполнения, когда речь идет о параметрах, занимающих много места - например, массивах большого размера. Поэтому более правильно использовать для передачи в подпрограмму исходных данных параметры-константы, о которых речь пойдет чуть дальше.
В языке Паскаль определено пять целых типов.
Тип |
Диапазон допустимых значений |
Отводимая память, в байтах |
shotint |
-128…127 |
1 |
integer |
-32 768…32 767 |
2 |
longint |
-2 147 483 648…2 147 483 647 |
4 |
byte |
0…255 |
1 |
word |
0…65 535 |
2 |
Переменные целого типа могут принимать только целые значения. Такие переменные в программе описываются следующим образом:
a, b, c: integer;
Здесь a, b, c… - имена переменных, integer – тип переменных. Транслятор, встретив такое описание переменных a, b, c, запоминает, что эти переменные могут принимать только целые значения и формирует соответственно этому команды программы.
Таблица. Операции над целыми типами, дающие в результате значение целого типа
Знак операции |
Операция |
+ |
Сложение |
- |
Вычитание |
* |
Умножение |
div |
Целочисленное деление (остаток отбрасывается). Деление без округления (целая часть частного). |
mod |
Деление по модулю (выделение остатка от деления). Остаток от деления: a mod b = a – ((a div b) * b). |
Операции над операндами целого типа выполняются правильно только при условии, что результат и каждый операнд не меньше минимального (крайнего левого) и не больше максимального (крайнего правого) значений диапазона. Например, в Паскале существует константа maxint, в которой содержится максимально допустимое значение для типа integer. Тогда при выполнении операций в программе должны соблюдаться следующие условия: (a операция b) <= maxint, a <= maxint, b <= maxint.
Билет №5
Параметры-переменные
Признаком параметра-переменной является ключевое слово var перед описанием параметра:
var имя : тип;
Например, передача в процедуру Р параметра-переменной целого типа записывается так:
procedure P(var x : integer);
При вызове подпрограммы в область параметров копируется не значение переменной, а ее адрес, и подпрограмма через него имеет доступ к ячейке, в которой хранится переменная. Этот способ передачи параметров называетсяпередачей по адресу. Подпрограмма работает непосредственно с переменной из вызывающей программы и, следовательно, может ее изменить.
ВНИМАНИЕ При вызове подпрограммы на месте параметра-переменной может находиться только ссылка на переменную точно того же типа.
Проиллюстрируем передачу параметров-значений и параметров-переменных на примере.
var a, b, c, d, e : word;
procedure X(a, b, c : word; var d : word);
var e : word;
begin
c := a + b; d := c; e := c;
writeln ('Подпрограмма:');
writeln ('c = ', c, ' d = ', d, ' e = ', e);
end;
begin
a := 3; b := 5;
x(a, b, c, d);
writeln ('Главная программа:');
writeln ('c = ', c, ' d = ', d, ' e = ', e);
end.
Результаты работы этой программы приведены ниже:
Подпрограмма:
c = 8 d = 8 e = 8
Главная программа:
c = 0 d = 8 e = 0
Значение переменной с в главной программе не изменилось, поскольку переменная передавалась по значению, а значение переменной е не изменилось потому, что в подпрограмме была описана локальная переменная с тем же именем.
Массивы: описание и действия с ними
Массив - это упорядоченная совокупность данных одного типа. Такая совокупность характеризуется общим числом элементов (компонент), размером и размерностью, которая определяет способ организации данных внутри массива. Различают одномерные массивы (векторы), двумерные массивы (матрицы) и n-мерные массивы. Величина n ограничивается максимальным размером структуры. Следовательно, вектор характеризуется одним типом индексов, который задает нумерацию его элементов; матрица - двумя типами индексов, один из которых определяет номер строки в массиве, а другой задает номер столбца; n-мерный массив использует n типов индексов.
Одномерный тип-массив описывается следующим образом:
type <имя_типа> = array [<тип_индексов>] of <тип_компонент>;
Тип индексов может быть любым порядковым, кроме Longint, Integer, Word. Компоненты могут быть любого типа, в том числе и структурированного, т.е. можно описать тип-массив, элементами которого будут, например, записи.
Двумерный тип-массив может быть описан одним из двух способов:
type <имя_типа> = array [<тип_индексов_строк>] of
array [<тип_индексов_столбцов>] of <тип_компонент>;
Такой тип представляет собой массив строк, каждая из которых - массив элементов определенного типа. Обычно приведенную конструкцию разбивают для упрощения восприятия описания на две, например так:
type stroka = array [1..5] of byte; {строка матрицы}
matrix = array [1..3] of stroka; {матрица - массив строк}
2) type matrix = array [1..3, 1..5] of byte;
Второй способ описания типа предполагает перечисление через запятую в квадратных скобках типов индексов строк и столбцов матрицы. Оба способа
равнозначны. Элемент матрицы m типа matrix, находящийся на пересечении i-ой строки и j-го столбца, в программе записывается следующим образом:
Действия над массивами Для работы с массивом как единым целым используется идентификатор массива без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения "равно", "не равно" и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы компонентов. Например, если массивы А и В описаны как var А, В: array[1..20] of real; то применение к ним допустимых операций даст следующий результат: Выражение Результат А=В True, если значение каждого элемента массива А равно соответствующему значению элемента массива В А<>В True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В А:=В Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.
Билет №6
Принцип нисходящего проектирования алгоритмов и программ
В рамках структурного программирования применяются две стратегии: "нисходящая" и "восходящая"_При использовании метода восходящего проектирования приложение собирается из компонентов или блоков. В этом методе в первую очередь определяются вспомогательные функции, которые могут потребоваться для проектируемой программы. Функции, определяемые как вспомогательные, при восходящем проектировании, реализуются при помощи модулей самых нижних уровней. После того, как модули низкого уровня разработаны, они используются для определения функций более высокого уровня. Эти функции используются при проектировании программ на более высоком уровне и так далее, пока не будем завершена разработка всей программы.
Метод нисходящего проектирования подобен методу получения дельного изображения из более общего вида с помощью телескопического увеличения. На начальном шаге формируется предположение, описывающее функцию всей программы. Затем определяются се подфункции. Каждая из подфункций может расчленяться до тех пор, пока се составные части не будут окончательно уточнены. Иногда это метод называют функциональной декомпозицией._Основная идея метода - программисту для работы требуется введение абстракции. Требуются абстрактные гипотетические машины. Задача на этом уровне понимается как абстракция, которую должны реализовать на какой - либо машине._Дойдём до уровня, когда наши задачи выполнятся на какой-то конкретной машине средствами программирования._Нисходящее программирование - это процесс пошагового разбиения алгоритма на всё более мелкие части, с целью получить такие элементы, для которых можно легко написать конкретные команды.
Метод простой интерации
