Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Оператор цикла с параметром






Конспект лекций

 

по дисциплине «Алгоритмизация и языки про­граммирования» __

 

 

 

Оглавление

Тема 1. ОСНОВЫ АЛГОРИТМИЗАЦИИ ЗАДАЧ.  
Тема 2. ПРОГРАММИРОВАНИЕ НА БАЗОВОМ ПРОЦЕДУРНО-ОРИЕНТИРОВАННОМ АЛГОРИТМИЧЕСКОМ ЗЫКЕ. ОПЕРАТОР ПРИСВАИВАНИЯ. КОНТРОЛЬНЫЕ ВОПРОСЫ  
Тема 3 АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ.ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА ДАННЫХ. КОНТРОЛЬНЫЕ ВОПРОСЫ    
Тема 4. ОПИСАНИЕ ЛИНЕЙ­НЫХ И РАЗВЕТВЛЯЮЩИХСЯ СТРУКТУР АЛГОРИТМОВ. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ СТРУКТУР. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ    
Тема 5.ОРГАНИЗАЦИЯ ВЫПОЛНЕНИЯ ПРОГРАММ НА ПК. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ  
Тема 6.СТРУКТУРЫ ДАННЫХ: МАССИВЫ, МНОЖЕСТВА, ЗАПИСИ. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА МАССИВОВ.    
Тема 7. ОРГА­НИЗАЦИЯ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ КОНТРОЛЬНЫЕ ВОПРОСЫ  
Тема 8. ПРОГРАММИРОВАНИЕ ВВОДА-ВЫВОДА МАССИВОВ. СТРОКОВЫЕ ДАННЫЕ. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ  
Тема 9. ПОДПРОГРАММЫ. ОБРАЩЕНИЕ К ПОДПРОГРАММАМ. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ  
Тема 10. АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ  
Тема 11. ПРОГРАММИРОВАНИЕ В СРЕДЕ DELPHI. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ  
Тема 12. РАБОТА С ФАЙ­ЛАМИ. ПРИМЕРЫ РАБОТЫ С ФАЙЛАМИ.  
Тема 11. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ. УКАЗАТЕЛИ. РАБОТА С ОЧЕРЕДЯМИ И СТЕ­КОМ.(2 часа)  
Тема 12. МАШИННАЯ ГРАФИКА.ПРИМЕРЫ ПРОГРАММ С РАЗЛИЧНОЙ СТРУКТУРНОЙ ОРГАНИЗАЦИЕЙ. (1 часа)  
   
   
   
Приложение А.  
Литература  

Тема 1. ПРОГРАММНЫЕ СРЕДСТВА ПК. ОСНОВЫ АЛГОРИТМИЗАЦИИ ЗАДАЧ.

(1 часа)

План лекции 1:

1. Определение алгоритма.

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

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

4. Разновидности структур алгоритмов

 

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

Здесь мы ввели понятие действия. В дальнейшем будем считать тождественными понятия

действие ≡ инструкция ≡ оператор.

Действия (инструкции, операторы) выполняются некоторым исполнителем. Для нас

исполнитель ≡ процессор.

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

1) действия должны быть понятны исполнителю;

2) разные исполнители должны одинаково понимать одни и те же действия.

В жизни алгоритмы встречаются нам повсюду. Любая целенаправленная деятельность человека – алгоритм (или его выполнение).

 

Рассмотрим эти конструкции на примерах алгоритмов для вычислений по формулам.

 

Х = А2-1. вход – А, выход – Х

Тогда словесная запись алгоритма будет следующей.

1. Задать значение для А.

2. Умножить А на А, запомнить результат.

3. Из результата п.2 вычесть 1, запомнить результат в переменной Х.

Здесь у нас появилось важное действие – запоминание. Будем называть его присваиванием. Это фундаментальное понятие. Оно связано с понятием память.

Чтобы различать разные значения, их располагают в разных участках памяти. Под переменные значения отводится свободное место в памяти. Следовательно, можно сказать: ”Результат присвоить переменной Х”.

Этот пример определяет нам первую базовую конструкцию структурного программирования – следование: если в записи алгоритма друг за другом написаны несколько действий, то они будут выполняться последовательно.

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

Рассмотрим следующий пример.

 

0, x ≤ 0 вход - x,

f = выход – f.

x2, x > 0

 

Записать алгоритм вычисления f можно следующим образом.

1. Задать значение х.

2. Если х ≤ 0

то 2.1. задать f = 0

иначе 2.2. задать f = x * x.

Получили новую конструкцию, которая задает разветвление в порядке выполнения действий. Такая конструкция называется условной (соответственно алгоритм – условным) или конструкцией ЕСЛИ – ТО – ИНАЧЕ, по-английски IF – THEN – ELSE. Запись в общем виде:

ЕСЛИ условие

ТО последовательность действий 1

ИНАЧЕ последовательность действий 2.

 

Упрощенная или усеченная форма:

ЕСЛИ условие

ТО последовательность действий.

 

Пример. Подсчитать сумму нечетных чисел от 1 до 25.

 

вход – пустой,

выход – S.

 

Алгоритм вычисления S.

Задать S равным 0.

Задать n равным 0.

Пока n ≤ 12 выполнять

3.1. к S добавить 2*n + 1

3.2. увеличить n на 1

Алгоритм будет работать до тех пор, пока выполняется условие п.3.

Здесь мы получили третью базовую конструкцию – циклическую. Она означает следующее: пока истинно некоторое условие, – делай то-то и то-то. Называется она конструкцией ПОКА – ДЕЛАЙ, по-английски WHILE – DO. Соответствующий алгоритм называется циклическим алгоритмом. Он задает многократное выполнение одних и тех же действий. Запись в общем виде:

ПОКА условие ВЫПОЛНИТЬ

последовательность действий.

Последовательность может выполняться 0, 1, …, ∞ раз.

Этих трех конструкций (трех типов алгоритмов) достаточно для написания алгоритмов любой сложности.

 
 

Рассмотрим алгоритм еще с одной точки зрения. Если не вдаваться в его структуру, то любой алгоритм можно представить в виде “черного ящика”:

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

Выход – совокупность переменных и значений, которые получены после вычислений.

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

Семантика – смысловая часть описания языка. Она определяет, как понимать (человеку) и выполнять (машине) алгоритмы.

Синтаксис – набор формальных правил написания алгоритмов на алгоритмическом языке.

 

 

Тема 2. ПРОГРАММИРОВАНИЕ НА БАЗОВОМ ПРОЦЕДУРНО-ОРИЕНТИРОВАННОМ АЛГОРИТМИЧЕСКОМ ЗЫКЕ. КЛАССИФИКАЦИЯ ОПЕРАТОРОВ АЛГОРИТМИЧЕСКОГО ЯЗЫКА. ОПЕРАТОР ПРИСВАИВАНИЯ. ОПЕРАТОРЫ УПРАВЛЕНИЯ. (2 часа)

План лекции 2:

1. Цели и задачи дисциплины " Алгоритмизация и технология программи­рования".

2. Алфавит языка.

3. Правила записи основных объектов языка.

4. Типы данных. Константы.

5. Переменные. Метки.

 

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

· громоздкость и излишняя многословность;

· неоднозначность понимания.

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

Запись алгоритма на языке программирования называется программой. Pascal – разработан в 1968–1971 годах Никлаусом Виртом в Цюрихском Институте Информатики (Швейцария).

Цель-овладеть инструментом для обучения программированию как систематической дисциплине. Обнаружилась чрезвычайная эффективность при применении и надежность программирования.

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

· исходить из некоторого набора вычислительных структур (структур данных);

· вводить как составные операции, так и составные (структурированные) объекты;

· выбрать форму, удобную как для человека, который описывает алгоритм, так и для человека, который должен будет читать и понимать этот алгоритм, – форму, соответствующую кругу человеческих понятий и представлений.

Три составляющие (любого) языка: алфавит, синтаксис и семантика.

Алфавит – набор основных символов, «букв алфавита», никакие другие символы в предложениях языка не допускаются.

Основные символы языка (лексемы) – либо отдельные литеры на клавиатуре, либо их некоторые комбинации.

 

< лексема>:: = < буква> |< цифра> |< спецсимвол>

< буква>:: = a|b|...|z|A|B|...|Z|_

< цифра>:: = 1|2|3|4|5|6|7|8|9|0

< спецсимвол>:: = < знак арифметической операции> |

< знак операции сравнение> |

< разделитель> |

< служебное слово>

< знак арифметической операции>:: = *| /| +| –

< знак операции сравнения>:: = =| < > | < | > | < =| > =

< разделитель>:: =.|, |; |: | (|)|{| }|{| }| ^| '| #| $| @

Служебные слова – «зарезервированные» слова – служат для определенных целей.

< служебные слова>:: = begin| end| var| const| if| then| else| function| for|......

 

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

Пример определения конструкций произвольной длины:

 

Другой вариант определения:

 

 

В общем случае рекурсии не избежать. Для примера опишем конструкции следующего вида (t), ((t)), (((t))), ((((t)))),....

 

< слово>:: = (t) | (< слово>)

Правильное определение:

 

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

Имя переменной в Паскале синтаксически описывается с помощью идентификаторов:

< идентификатор>:: = < буква> {< цифра> |< буква> }

Длина идентификатора произвольна, но компилятор с языка Турбо-Паскаль воспринимает только первые 63 символа.

Пример описания переменных:

var

a: integer;

x, y, z: real;

Sinus: real;

Пример описания констант:

const

One=1;

HighLimit=1000;

pi=3.14159265358;

Тип константы определяется по ее значению.

Схема программы:

const

< описания констант>

var

< описания переменных>

begin

< операторы>

end.

 

План лекции 3:

1. Выражения. Арифметические и логические выражения.

2. Оператор присваивания. Операторы управления.

3. Организация ввода-вывода данных. Структура программы.

4. Переход от схемы алгоритма к схеме программы.

 

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

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

Операнды представляют собой «элементарные» значения; ими могут быть переменные, константы, вызовы функций.

Примеры выражений:

a+b+c*2

a/b/c

7-a*(sin(x)+2)

a=b

(2> 3)=(7< > 10)

pred('x')< x

(not(2> 3))or(1=1)

true< =false

Значение выражения вычисляется во время вычисления. Мы говорим о выражениях целого, вещественного, булевского и других типов, имея в виду тип значения, вычисляемого данным выражением. Тип выражения определяется синтаксически, исходя из типов операндов и операций.

Поэтому выражения должны быть синтаксически правильными.

Примеры неправильных выражений:

2**3

e==3

(2+1))

true+false

not (a) - недопустимо, если a не булевского типа.

 

 

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

 
 

Это ограничение также связано с тем, что машина может “читать” только последовательность знаков.

X: = SIN (A), а также использовать любую из стандартных функций: COS (X), LN (X), SQRT (X), EXP (X), ABS (X) и т.д. При этом

 

F: = (1 – SQRT(X)) / (SIN (2 * X) – COS (X / 2)).

 

 

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

< оператор присваивания>:: = < переменная>: =< выражение>

Выражение в правой части должно иметь тот же тип, что и переменная.

const

pi=3.14159;

var

sym, alpha, beta: char;

x, a, b, c, r: real;

i: integer;

begin

.........

x: =0;

i: =i+1; {пример использования предыдущего значения переменной}

c: =sqrt(a*a+b*b);

sym: ='+';

alpha: =sym;

 

Идентификатор Описание типа Множество допустимых значений
Shortint 8-битный целый со знаком –128…127
Longint 32-битный целый со знаком –2147483648...2147483647
Byte 8-битный целый без знака 0…255
Word 16-битный целый без знака 0…65535

DIV – деление нацело с отбрасыванием остатка (нахождение целой части результата);

MOD – нахождение остатка от деления.

Для выполнения операций ввода-вывода служат четыре процедуры: read, readln, write, writeln.

Процедура чтения read обеспечивает ввод числовых данных, символов и некоторых других типов данных с клавиатуры, в результате чего эти данные становятся значениями переменных.

Вызов процедуры: read(X1, X2,..., XN);

где X1, X2,..., XN – переменные допустимых типов данных.

Используя служебные слова begin и end, можно из последовательности операторов сделать составной оператор:

begin

S1;

S2;

.....

SN

end

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

Пример.

PROGRAM P (INPUT, OUTPUT);

VAR A, B, X: REAL;

BEGIN

WRITE (‘Введи A’);

READ (A);

WRITE (‘Введи B’);

READ (B);

X: = A*B-A;

WRITE (‘X=’, X);

END.

Значения выводятся в той форме, в какой они описаны, например,

- 2.300000Е+05 - для вещественных чисел.

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

WRITE (X: 2); - для целых,

WRITE (Y: 10: 2); - для вещественных (10 – общее количество цифр, 2 – количество цифр в дробной части).

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

WRITELN (< список вывода>);

Оператор осуществляет переход к новой строке после печати значений списка.

 

 

Тема 3. ОПИСАНИЕ ЛИНЕЙ­НЫХ И РАЗВЕТВЛЯЮЩИХСЯ СТРУКТУР АЛГОРИТМОВ. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ СТРУКТУР.(1 часа)

План лекции 4:

1. Линей­ные структуры алгоритмов.

2. разветвляющиеся структуры алгоритмов.

3. Классификация операторов алгоритмического языка.

 

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

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

Все метки, используемые в программе (блоке), должны быть описаны в специальном разделе label. Метка представляет собой идентификатор или целое число от 1 до 9999.

Пример:

label

m, 1, metka, 56;

Оператор, помеченный меткой, имеет вид

< метка>: < оператор>;

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

 

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

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

Условный оператор if C then S1 else S2 выражается с помощью следующей блок-схемы, изображенной на рис. 1

 

 

Рис. 1

Операторы присваивания (и вызовы подпрограмм) записываются в прямоугольниках. Булевские выражения, управляющие потоком, записываются в ромбах.

Последовательной композиции S1; S2 соответствует соединение блок-схем для S1 и соответственно для S2 с помощью стрелки от S1 до S2 (рис.2).

 

 

Рис. 2

Оператору цикла while B do S соответствует блок-схема рисунка 3.

 

 

Рис. 3

 

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

 

Условный оператор применяется для задания разветвления в программе, т.е. выбора действий в зависимости от истинности или ложности какого-либо условия.

Пример:

Для того чтобы z стало равным наибольшему из двух чисел x и y, необходимо выполнить присвоение z: =x либо z: =y.

Две формы условного оператора: полная и сокращенная.

< полный условный оператор>:: =

if < логическое выражение> then < оператор>

else < оператор>

Примеры:

if x> y then z: =x

else z: =y;

if x< 0 then begin

x: =x+h;

y: =y-h;

d: = not d

end

else begin

x: =0;

y: =0

end;

if x> 0 then sgn: =1

else if x=0 then sgn: =0 else sgn: =-1;

< сокращенный условный оператор>:: =

if < логическое выражение> then < оператор>;

Например, оператор x: =abs(x) эквивалентен if x< 0 then x: =-x.

Поменять местами значения переменных x и y так, чтобы в x было большее значение:

if y> x then begin

t: =x;

x: =y;

y: =t

end;

Ветви then и else могут снова содержать условные операторы, например:

if x> 0 then sgn: =1

else if x=0 then sgn: =0 else sgn: =-1;

Неоднозначность в условном операторе следующего вида:

if B1 then if B2 then S1 else S2

Возможные истолкования

a) if B1 then begin

if B2 then S1 else S2

end;

b) if B1 then begin if B2 then S1 end

else S2;

В Паскале используется вариант a).

Вводится последовательность целых чисел, 0 – конец последовательности. Найти два наименьших числа.

Переменные:

x – очередное число;

min1 – первое наименьшее число;

min2 – второе наименьшее число (min2> =min1).

Алгоритм решения задачи:

1) устанавливаем начальные значения min1 и min2 по двум первым числам;

2) последовательно считываем числа и, если очередное число x меньше или равно min1 (min1< min2), то переприсваиваем значение min1 и min2;

3) если x попадает в интервал от min1 до min2, то переприсваиваем только min2;

4) выводим результат.

var x, min1, min2: integer;

begin

write('Введите x=');

readln(x);

min1: =x;

write('Введите x=');

readln(x);

min2: =x;

{min1< =min2}

repeat

if x< =min1 then

begin

min2: =min1;

min1: =x;

end

else

if (min1< x) and (x< min2) then min2: =x;

write('Введите x=');

readln(x);

until (x=0);

writeln('Два наименьших числа равны', min1, 'и', min2);

end.

 

Тема 4. ОРГАНИЗАЦИЯ ВЫПОЛНЕНИЯ ПРОГРАММ НА ПК. СТРУКТУРЫ ДАННЫХ: МАССИВЫ. МНОЖЕСТВА. ЗАПИСИ. (2 часа)

План лекции 5:

1Работа с инструментальными интегрированными турбосистемами.

2 реализация этапов трансля­ции, редактирования и выполнения программ.

3Запись выражений, операторов присваивания.

4Запись программ линей­ных структур алгоритмов на языке Паскаль.

 

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

Результаты тестирования являются исходными данными для отладки. Последовательность событий:

симптом (ошибки) ® причина (ошибки) ® исправление (ошибки).

 

Как искать ошибку?

1. Поймите ошибку. Какие данные правильные, какие – неправильные?

2. Постройте гипотезу о причине ошибки.

3. Проверьте гипотезу (для этого пропустите новый тест).

4. При подтверждении гипотезы следует внести исправление, а потом повторить все тесты (не внесли ли вы новую ошибку – вероятность этого от 0, 2 до 0, 5).

Можно пользоваться автоматизированными средствами отладки: в интегрированной среде Паскаля имеется отладчик debug, который предлагает средства отслеживания и трассировки программы (в том числе печать переменных, счетчиков, критических значений).

Парадоксы программной ошибки:

· ошибка - не всегда результат недостатков;

· ошибка не всегда может быть выявлена;

· выявленная ошибка не всегда может быть описана;

· описанная ошибка не всегда может быть понята;

· понятая ошибка не всегда может быть исправлена;

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

Известна некоторая статистика о программных ошибках.

· Язык C++ дает на 25 % больше ошибок, чем традиционные Си или Паскаль.

· Исправление ошибок в объектно-ориентированных программах на C++ требует в 2-3 раза большего времени. Наследование порождает в 6 раз больше ошибок, чем его отсутствие.

· 33% всех ошибок случаются реже, чем 1 раз за 5000 лет работы системы.

· Каждый Кбайт кода содержит 0, 5-2 ошибки.

 

План лекции 6:

1. Структуры данных: Массивы.

2. Множества. Записи.

3. Организация ввода-вывода массивов.

4. Печать заголовков таблиц с разделением на графы, нумерацией строк, столбцов.

 

Составные типы задают множества «сложных» значений; каждое значение из такого множества образует некоторую структуру (совокупность) нескольких значений другого типа.

Каждое значение регулярного типа (массива) состоит из фиксированного числа элементов одного и того же базового типа (т.е. значение содержит фиксированное число однотипных компонент).

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

· тип элементов массива,

· количество и «способ нумерации» элементов.

type

< идентификатор - тип массива> = array[T1] of T2;

T1 - тип индекса: (ограниченный, литерный,

перечислимый);

T2 - тип элементов массива (любой тип).

Примеры:

const n=20;

type vector=array[1..100] of real;

m=array[char] of boolean;

matrix=array[1..n] of array[1..n] of integer;

var v: vector;

SymTab: m;

arr1, arr2: matrix;

s: array['a'..'z'] of boolean;

Мы можем «нумеровать» элементы массива не только целыми числами, но и значениями произвольного дискретного типа (типа, на котором действуют функции ord, succ, pred).

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

Следующие два определения эквивалентны:

v: array[1..10] of array[1..20] of integer;

v: array[1..10, 1..20] of integer;

Число индексов (размерность массива) не ограничена.

 

Синтаксис:

< регулярный тип>:: =

 

----> array--> [----> < тип индекса> ---> ]---> of--> < тип> --->

| |

< ---------, ---< ---

 

Единственное возможное действие над массивом в целом - это присваивание: v1: =v2;

Типы обоих массивов в данном случае должны совпадать.

Доступ к элементам массива:

< идентификатор массива> [< индекс> ]

или

< идентификатор массива> [< список индексов через запятую> ]

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

Примеры: v[1]

v[(i+2)*6]

Пусть

v2: array[1..10] of array[5..20] of integer

– двухмерный массив, тогда v2[k] - k -ый массив в группе из 10 массивов целых чисел, v2[k][5] – 5-ый элемент этого массива, тот же элемент получаем и так v[k, 5].

Элемент массива считается переменной:

· он может получать значения (например, в операторе присваивания);

· он может участвовать в выражениях там, где может присутствовать переменная данного типа.

Ассортимент операций над элементами массива полностью определяется типом этих элементов.

Примеры:

v2[i, j]: =v2[i, j-1]+1;

SymTab['z']: =not SymTab['a'];

Ошибки в работе с массивами:

Выход индекса за допустимые пределы

var v: array[0..10] of real;

....

v[11]: =0.5; < ==== транслятор обнаружит ошибку

i: =11;

v[i]: =0.5; < ==== эта ошибка может быть обнаружена только во время исполнения и то, если осуществляется контроль диапазона, иначе это может привести к непредсказуемым последствиям

Множественный тип задается с помощью двух служебных слов – set и of – и следующего за ним базового типа. Например:

type digits = set of 1..5;

var s: digits;

Переменная s в качестве значений может принимать следующие множества целых чисел: пустое множество, {1}, …, {5}, {1, 2}, …, {4, 5}, {1, 3, 5}, …, {4, 5, 3, 2}, …, {1, 2, 3, 4, 5} (всего 32 различных множества).

Обратите внимание:

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

· Порядок «расположения» элементов в множестве никак не фиксируется.

Базовый тип множества может быть:

символьным, перечислимым, ограниченным.

Базовый тип должен содержать не более 256 значений.Если базовый тип – ограниченный целый, то значения должны быть в диапазоне от 0 до 255.

Пример:

type

elemColor =(red, yellow, blue);

color = set of elemColor;

Задача. Ввести последовательность из n чисел и распечатать ее с конца. var

i: integer;

s: array[1..100] of integer;

begin

writeln('Введите количество чисел');

readln(n);

writeln('Введите ', n, ' чисел');

for i: =1 to n do read(s[i]); {ввод потоком}

writeln; writeln('Вывод: ');

for i: =n downto 1 do write(s[i], ' ') end.

В отличие от массивов, компоненты записи обозначаются идентификаторами.

type person = record

name, secondName, surName: string;

sex: (male, female);

speciality: integer

end;

Элементы записи называются полями. Каждое описание поля выглядит как описание простой переменной.

Структура записи:

· фиксированное число полей;

· каждое поле имеет имя (уникальное в пределах записи, но может совпадать с любым идентификатором вне этой записи);

· каждое поле имеет произвольный тип.

Описание переменных комбинированного типа:

var Sasha, Masha: person;

Доступ к полям записи осуществляется с помощью селектора записи – конструкции вида

< переменная типа записи>.< идентификатор поля>

Использование:

Sasha.name: ='Александр';

Masha.name: ='Мария'; Masha.Speciality: =Sasha.Speciality;

Тема 5. ОРГА­НИЗАЦИЯ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ. АЛГОРИТМИЧЕСКОЕ ОПИСА­НИЕ ВЛОЖЕННЫХ ЦИКЛИЧЕСКИХ СТРУКТУР. (1 часа)

План лекции 7:

1. Циклические структуры с за­данным числом повторений.

2. Итерационные циклы.

3. Вложенные циклические структуры

 

Оператор цикла с параметром

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

Оператора цикла определяет:

· диапазон изменения значений управляющей переменной и, одновременно, число повторений оператора, содержащегося в теле цикла;

· направление изменения значения переменной (возрастание или убывание);

· собственно действия, выполняемые на каждой итерации (оператор тела цикла).

< оператор цикла с параметром>:: =

for < переменная>: = < диапазон> do < оператор>

< диапазон>:: =

< выражение> < направление> < выражение>

< направление>:: = to | downto

На использование управляющей переменной (параметра) налагаются следующие ограничения:

1. Управляющая переменная должна иметь дискретный тип (целый, символьный, булевский, перечислимый).

2. Начальные и конечные значения диапазона должны иметь тот же тип, что и параметр.

3. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

4. После завершения оператора значение параметра становится неопределенным.

Семантику данного оператора цикла можно представить следующим образом. Оператор

for V: = Expr1 to Expr2 do Body;

эквивалентен оператору:

begin

Temp1: =Expr1;

Temp2: =Expr2;

if Temp1 < = Temp2 then

begin

V: =Temp1;

Body;

while V < > Temp2 do

begin

V: =succ(V);

Body

end

end

end

Примеры:

{y=x^n}

y: =1;

for i: =1 to n do y: =y*x;

{печать латинского алфавита с конца}

for c: ='z' downto 'a' do write(c);

 

while < логическое выражение> do | заголовок цикла

< оператор> | тело цикла

Оператор цикла с предусловием.

Тело цикла повторяется, пока истинно предусловие.

Примеры:

{s=сумма целых чисел от 1 до n}

s: =0; i: =1;

while i< =n do

begin

s: =s+i;

i: =i+1

end

{x1=наибольший общий делитель x и y}

x1: =x; y1: =y;

while x1< > y1 do

if x1> y1 then x1: =x1-y1

else y1: =y1-x1;

 

{Для данного M> 0 требуется найти наименьшее целое число k> =0, такое что 3^k > M}

y: =1; k: =0;

while y< =M do

begin

k: =k+1;

y: =y*3;

end;






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.