рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

По дисциплине Основы алгоритмизации и программирования

По дисциплине Основы алгоритмизации и программирования - раздел Программирование, Министерство Образования И Науки Красноярского Края Краевое Государс...

Министерство образования и науки Красноярского края

краевое государственное бюджетное образовательное учреждение

среднего профессионального образования

(среднее специальное учебное заведение)

«Канский технологический колледж»

 

 

Методические указания и контрольные задания

для студентов-заочников

КГБОУ СПО «Канский технологический колледж»

по дисциплине

Основы алгоритмизации и программирования

  2012 г. Одобрена цикловой комиссией «Математики и информатики» …  

ВВедение

 

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

Методические указания учебной дисциплины могут быть использованыв дополнительной профессиональной подготовке (в программах повышения квалификации и… 1.2. Место учебной дисциплины в структуре основной профессиональной… Профессиональный цикл, общепрофессиональные дисциплины.

РАБОЧая ПРОГРАММа УЧЕБНОЙ ДИСЦИПЛИНЫ

  1.1. Объем учебной дисциплины и виды учебной работы Вид учебной…  

Раздел 1. Основные принципы алгоритмизации и программирования

Тема 1.1. Основные понятия алгоритмизации

Появление алгоритмов связывают с зарождением математики. Более 1000 лет назад (в 825 году) ученый из города Хорезма Абдулла (или Абу Джафар) Мухаммед бен Муса аль-Хорезми создал книгу по математике, в которой описал способы выполнения арифметических действий над многозначными числами. Само слово алгоритм возникло в Европе после перевода на латынь книги этого математика.

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

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

1. Достать ключ из кармана.

2. Вставить ключ в замочную скважину.

3. Повернуть ключ два раза против часовой стрелки.

4. Вынуть ключ.

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

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

1. Массовость – обеспечивает решение широкого класса задач данного типа;

2. Понятность – перечень команд, которые понятны исполнителю;

3. Дискретность – т.е. разбить на последовательность отдельных шагов, только выполнив один шаг, переходим к другому;

4. Определенность или детерминированность – запись должна быть полной и четкой, чтобы не было потребности домысливать;

5. Результативность – процесс вычисления прекращается за конечное число шагов.

Выполнение алгоритмов определяется следующими правилами:

· Последовательность действий (линия);

· Альтернативность действий (ветвление);

· Использование повторений (цикл);

· Использование вспомогательных алгоритмов.

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

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

Исполнитель - объект, который выполняет алгоритм.

Идеальными исполнителями являются машины, роботы, компьютеры...

Компьютер – автоматический исполнитель алгоритмов.

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

Алгоритм может быть задан

2. Таблично - описание алгоритма в форме таблиц и расчетных формул. 3. Графически - описание алгоритма с помощью геометрических фигур, называемых… 4. Программно – запись алгоритма на языке программирования

Правила оформления блок-схем

Графический способ представления алгоритмов является более ком­пактным и наглядным по сравнению со словесным. При графическом пред­ставлении… Такое графическое представление называется схемой алгоритма или блок-схемой. В… Символ «Процесс» применяется для обозначения одного или последова­тельности действий, изменяющих значение, форму…

Соотношение геометрических элементов символов.

Размер «а» должен выбираться из ряда 10, 15, 20 мм. Допускается уве­личивать размер «а» на число, кратное 5. Размер «b» равен 1,5 × а. При ручном выполнении схем алгоритмов и программ для символов допускается устанавливать «b» равным 2 × а.

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

Типы и структуры данных

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

Принципы построения алгоритмов

Тема 1.1. Логические основы алгоритмизации В древности различные мыслители пробовали давать рецеп­ты правильных… Термин «логика» происходит от древнегреческого logos,оз­начающего «слово, мысль, понятие, рассуждение, закон».

Алгебра высказываний

Действия и преобразования, применяемые в обычной алгеб­ре, в которой буквами обозначаются числа, основываются на не­большом числе определений и… • Существует арифметическое действие, называемое сложе­нием и обозначаемое… 1) a + b = с (существование единственной суммы чисел а и b)

Логические операции

 

Приоритет логических операций:

1) инверсия 2) конъюнкция 3) дизъюнкция 4) импликация 5) эквивалентность

 

1. Конъюнкция: А ^ В или А ∙ В (логическое умножение, чита­ется как союз «и»)

А В А ^ В

 

2. Дизъюнкция: A v В или А + В (логическое сложение, чита­ется как союз «или»)

А В A v В

 

3. Отрицание: . Иногда отрицание называют функцией Вебба или функцией Даггера.

4. Импликация или логическое следование (читается: если А, то В). Обозначается А → В

А В А-> В

 

5. Эквиваленция, или тождественность: А↔В (А ~ В) (чита­ется: А тогда и только тогда, когда В)

A B А↔В

 

При решении логических задач используют приемы:

1. построение таблиц истинности;

2. решение логических уравнений.

 

Построение таблиц истинности

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

 

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

(0, 0), (0, 1), (1, 0), (1, 1).

Если формула содержит три переменные, то возможных наборов значений переменных восемь (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1).

 

Количество наборов для формулы с четырьмя переменными равно шестнадцати и т.д.

 

То есть, количество наборов = 2n, где n – количество высказываний (переменных).

 

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

 

Примеры.

1. Составим таблицу истинности для формулы , которая содержит две переменные x и y. В первых двух столбцах таблицы запишем четыре возможных пары значений этих переменных, в последующих столбцах — значения промежуточных формул и в последнем столбце — значение формулы. В результате получим таблицу:

 

Переменные Промежуточные логические формулы Формула

 

Из таблицы видно, что при всех наборах значений переменных x и y формула принимает значение 1, то есть является тождественно истинной.

 

2. Таблица истинности для формулы :

 

Переменные Промежуточные логические формулы Формула

Из таблицы видно, что при всех наборах значений переменных x и y формула принимает значение 0, то есть является тождественно ложной.

 

3. Таблица истинности для формулы :

Переменные Промежуточные логические формулы Формула

Из таблицы видно, что формула в некоторых случаях принимает значение 1, а в некоторых — 0, то есть является выполнимой.

 

 

4. В классе оказалось разбито стекло. Учитель объясняет директору: это сделал Коля или Саша. Но Саша этого не делал, т.к. в это время сдавал мне зачет. Следовательно, это сделал Коля.

 

Решение:

Формализуем данное сложное высказывание.

К – это сделал Коля

С – это сделал Саша

 

Кол-во простых высказываний n = 2.

Формула высказывания: γ = ( К Ú C ) & Ø С Þ К

1) Определить количество строк и столбцов в таблице истинности.

Т.к. каждое из простых высказываний может принимать всего два значения (0 или 1), то количество разных комбинаций значений n высказываний – 2 n .

 

Количество строк в таблице = 2 n + строка на заголовок.

 

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

 

В нашем примере: количество строк - 22 + 1 = 5 ,

столбцов – 2 + 4 = 6

 

Начертить таблицу и заполнить заголовок

Первая строка – номера столбцов.

Вторая строка промежуточные формулы и соответствующие им условные записи операций над значениями.

Заполнить первые n столбцов.

В нашем примере сначала заполняем 1-й и 2-й столбцы.

Заполнить остальные столбцы.

  Итак, вычисляем значения 3-го столбца по значениям 2-го, потом значения 4-го –…   К С Ø С К Ú C ( К Ú C ) & Ø С (…

Машинно - ориентированное программирование

На ламповых ЭВМ первого поколения программисты составляли свои программы, используя непосредственно команды процессора. При этом программисту… В конце50-х годовдля облегчения труда программистов начали создаваться языки… ADD a, b, c

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

Текст программы на ЯПВУ по своей форме ближе к естественным языкам (чаще всего — английскому), к языку математики. Та же команда сложения двух… Гораздо проще освоить программирование на языке высокого уровня, чем на… Начиная с середины XX века и до нашего времени были созданы сотни языков программирования высокого уровня. Но…

Раздел 2 Программирование на алгоритмическом языке Turbo Pascal

Тема 2.1.Основные элементы языка

 

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

Латинские буквы: от A до Z (прописные) и от а до z. (строчные).

Цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Шестнадцатеричные цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, D, E, F.

Специальные символы: + — * / = < > [ ] . , ( ) : ; { } ^ @ $ #.

Следующие комбинации специальных символов являются едиными символами (их нельзя разделять пробелами):

: = знак присваивания; < = меньше или равно;

> = больше или равно; (* *)ограничители комментариев

< > не равно; (используются наряду с {});

(..) эквивалент [ ].

Пробелы— символ пробела(ASCI1-32) и все управляющие символы кода ASCII (от 0 до 31).

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

Расшифровать это можно так: идентификатор — это любая последовательность букв и цифр, начинающаяся с буквы. В Турбо Паскале к буквам приравнивается также знак подчеркивания. Строчные и прописные буквы в идентификаторах и служебных словах не различаются. Например: max, MAX, MaX и mAx —одно и то же имя.

Длина идентификатора может быть произвольной, но значащими являются только первые 63 символа.

Комментарии. Следующие конструкции представляют собой комментарии и поэтому игнорируются компилятором:

(любой текст, не содержащий символ «}» }

(* любой текст, не содержащий символы «*)»*)

Буквы русского алфавита употребляются только в комментариях, в литерных и текстовых константах.

Строка, начинающаяся с символов {$ или (*$, является директивой компилятора. За этими символами следует мнемоника команды компилятора.

 

Типы данных

       

Условный оператор

Операторы отношений сравнивают два значения, возвращая в результате булевское значение True или False. В Паскале реализуются операторы:

> – больше, чем;
>= – больше, чем или равно;
< – меньше,
= – равно;
<= – меньше, чем или равно;
<> – не равно;
in – является элементом.

Общий формат условного оператора:

 

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

 

где <условие> – любое булевское выражение (вырабатывающее в результате True или False); <оператор1> и <оператор2> – операторы Паскаля. Если выражение принимает значение True, то выполняется <оператор1>; в противном случае – <оператор2>.

Например:

if a > b then max := a else max := b;

Два важных момента, на которые следует обратить внимание при использовании if/then/else. Во-первых, оператор else не является обязательным, другими словами, допустимо использовать оператор if в следующем виде:

if выражение then оператор 1

В этом случае оператор 1 выполняется только тогда, когда выражение имеет значение True. В противном случае пропускается оператор 1 и выполняется следующий оператор. Во-вторых, если необходимо выполнить более одного оператора, в случае, когда выражение принимает значение, True или False, то следует использовать составной оператор. Составной оператор – это последовательность произвольных операторов программы, заключённая в операторные скобки – зарезервированные слова begin ... end.

Например:

if B = 0 then
Writeln('Деление на нуль невозможно.')
else begin
Ratio := A div B;
Writeln('Отношение =', Ratio)
end;

В Паскале есть четыре логических оператора – and, xor, or, not. Эти логические операторы работают с логическими значениями (True и False), позволяя комбинировать выражения отношений, булевские переменные и булевские выражения.

Например:

if (a > b) and (a = 0) then writeln('a = ", a);
if (a > b) and (a = 0) then writeln('a = ", a);

Оператор выбора. Формат этого оператора описывается синтаксической диаграммой:

Здесь <селектор> — это выражение любого порядкового типа; <константа> — постоянная величина того же типа, что и селектор; <оператор> — любой простой или составной оператор. Выполнение оператора выбора происходит так: вычисляется выражение селектор; затем в списках констант ищется такое значение, которое совпадает с полученным значением селектора; далее исполняется оператор, помеченный данной константой. Если такой константы не найдено, то происходит переход к выполнению оператора, следующего после оператора выбора.

В Турбо Паскале допустимо использование в операторе Caseальтернативной ветви после служебного слова Else.

Пример, в случае неверного символа в Str выдать сообщение об этом:

CaseStr Of

‘+’: C:=A+B;

‘-’: C:=A-B;

‘*’: C:=A*B;

Else WriteLn(‘неверный знак операции’)

End;

Оператор перехода

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

Примеры записи оператора перехода:

goto 218;

goto l1;

При использовании оператора перехода должны соблюдаться следующие правила:

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

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

 

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

Для организации цикла нужно выполнить последующие деяния:
1) задать перед циклом изначальное значение параметра цикла;
2) изменять параметр перед каждым новеньким повторением цикла;
3) инспектировать условие повторения цикла;
4) управлять циклом, т.е. перебегать к его началу, ежели он не закончен, либо выходить из него по окончании.

В языке Паскаль, в конце концов, существует 3 вида циклов:

1) цикл с параметром либо цикл типа for,

2) цикл с предусловием либо цикл типа while,

3) цикл с постусловием либо цикл типа repeat ... until.

 

В цикле типа for число повторений понятно заблаговременно, в циклах типа while и repeat ... until число повторений цикла заблаговременно непонятно, делается проверка условия повторения цикла: в цикле типа while - перед циклом, в цикле типа repeat ... until - после его окончания.

В циклах типов for и while повторяющяся часть (тело цикла) состоит из 1-го оператора, ежели требуется выполнить в цикле несколько операторов, они заключаются в операторные скобки begin ... end, образуя составной оператор. В цикле типа repeat ... until тело цикла помещается меж зарезервированными словами языка (лексемами) repeat и until, операторные скобки не требуются, в заглавии цикла его тело условно обозначается 3-мя точками.
При помощи цикла типа for комфортно отыскивать суммы, произведения, находить наибольшие и малые значения и т.п. При нахождении суммы некой переменной, к примеру S присваивается значение 0, потом в цикле к данной переменной прибавляется соответственный член данной последовательности. При нахождении произведения переменной присваивается значение 1, потом в цикле эта переменная множится на общий член последовательности.

Пример цикла типа for

Вычисление n чисел Фибоначчи:
F1=1; F2=1;…; Fn=Fn-1+Fn-2 , например F3=F2+F1=1 + 1 = 2; F4 = 2 + 1 = 3 и т.д.

program fib; {Нахождение чисел Фибоначчи}
var x, y, z, i, n : integer;
begin
writeln (‘Введите n’); read (n);
x:=1; y:=0;

for i:=1 to n do
begin
z:=x ; x:=x+y ; y:=z ;
write (' ', x ) ;
end;
readln;
end.

Пример цикла типа while

Cоставление таблицы функции y = a3/(a2+x2) для х, принадлежащих отрезку [-1; 1] с шагом 0.1. Так как параметр цикла типа for должен быть целочисленным, удобнее использовать цикл while, в котором значение х можно изменять при каждом шаге на Dх = 0.1

 

program cycl_while;
uses crt; {вызов модуля Crt для управления режимом экрана}
var
a, x, y : real ; i : integer;
begin
clrscr ; {процедура очистки экрана из модуля Crt}
writeln ('Введите а ' );
readln (a);
x:= -1.; writeln (‘ x ‘, ‘ y ’);
while do x<1.05 begin
y:= sqr(a)*a/ (a*a+x*x);
writeln (x:6:2, y:8:4);
x:=x+0.1
end;
readln;
end .

Условие х<1.05 соответствует каждому значению х плюс половина шага .

 

Пример цикла типа repeat ... until

Определить число n, при котором сумма квадратов натурального ряда чисел от 1 до n не превысит величину K, введенную с клавиатуры. Т.е.
S >= K, где S=

program sum_sq; {Сумма квадратов натурального ряда }
uses crt;
var k, s, n : integer;
begin
clrscr ;
writeln( 'Введите K' );
readln (k);
s:=0; n:=1;
repeat
s :=s+n*n;
n := n+1;

until s > k;
writeln ('N= ', n : 3, ' s= ' , s : 5 );
readln;
end.

Цикл повторяется до тех пор, пока условие записанное после ключевого слова until, будет ложным (не выполняется). Как только это условие выполнится, происходит выход из цикла. После окончания цикла производится печать результата (оператор writeln). Отметим, что цикл с предусловием (типа while) может не выполниться ни разу, цикл с постусловием repeat ... until выполнится по крайней мере 1 раз. Когда число повторений цикла неизвестно заранее, применяются циклы с предусловием или с постусловием . Когда число повторений цикла известно заранее, как правило, применяется цикл типа for. Но любой цикл типа for можно заменить циклом с предусловием или постусловием.

 

Тема 2.3 Массивы

 

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

 

Месяц
Температура -21 -18 -7,5 5,6 22,2 5,4 -7 -18

 

Такую таблицу называют линейной. Она представляет собой последовательность упорядоченных чисел. Если требуется какая-то математическая обработка этих данных, то для их обозначения обычно вводят индексную символику. Например, через T1, обозначается температура января (первого месяца), Т5 температура мая и т.д. В общем виде множество значений, содержащихся в таблице, обозначается так:

{ T j } , i=l , ... , 12.

Порядковые номера элементов (1, 5, i и т.д.) называются индексами. Индексированные величины удобно использовать для записи их математической обработки. Например, среднегодовая температура выражается следующей формулой:

 

Тср =

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

столбцы соответствуют годам, а строки — месяцам.

 

Год Месяц
1 2 3 4 5 6 7 8 9 10 11 12
1981 -23 -17 -8,4 6,5 14 18,6 25 19 12,3 5,6 -4,5 -19
1982 -16 -8,5 -3,2 7,1 8,4 13,8 28,5 21 6,5 2 -13 -20
1983 -9,8 -14 -9,2 4,6 15,6 21 17,8 20 11,2 8,1 -16 -21
1990 -25 -9,7 -3,8 8,5 13,9 17,8 23,5 17,5 10 5,7 -14 -20

 

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

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

Для значений, хранящихся в такой таблице, удобно использовать двухиндексные обозначения. Например, H1981,2 обозначает температуру в феврале 1981 г. и т.п. А вся совокупность данных, составляющих таблицу, обозначается так:

(Hi, j) , i = 1981 .. 1990; j = 1 .. 12

Обработка подобных данных производится с использованием двухиндексных величин. Например, средняя температура марта за 10 лет вычисляется по формуле:

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

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

массива обозначаются переменными с индексами. Индексы записывают в квадратных скобках после имени массива. Например:

T [ l ], T [ 5 ], T [ i ], H [ 1981,9 ], H [ i, j ] и т.п.

Массив, хранящий линейную таблицу, называется одномерным, прямоугольную таблицу — двумерным. В программах могут использоваться массивы и большей размерности. Тип элементов массива называется его базовым типом. Очевидно, что для рассмотренных массивов температур базовым типом является вещественный (Real).

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

Var <идентификатор>: Array[<тип индекса>] Of <тип компонент>

Чаще всего в качестве типа индекса употребляется интервальный тип. Например, рассмотренный выше одномерный массив среднемесячных температур опишется так:

Var T: Array [1 . . 12] Of Real;

Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе. Последовательные элементы массива располагаются в последовательных ячейках памяти (Т [ 1 ], Т [2 ] и т.д.), причем значения индекса не должны выходить из диапазона 1... 12. В качестве индекса может употребляться любое выражение соответствующего типа. Например, T[i+j ] , T[m div 2].

Тип индекса может быть любым скалярным порядковым типом, кроме integer. Например, в программе могут присутствовать следующие описания:

VarCod: Array[Char]Of 1..100;

L: Array[Boolean] Of Char;

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

cod [ 'x' ]; L[true]; cod[chr (65)]; L[a>0]

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

TypeIndex=(А,В,С,D);

VarClass_10: Array[Index] OfByte;

И если, например, элемент ciass_10[A] равен 35, то это означает, что в 10«А» классе 35 чел. Такое индексирование улучшает наглядность программы. Часто структурированному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.

TypeMasl=Array[1..100] Of Integer;

Mas2=Array[-10..10] OfChar;

VarNum: Mas1; Sim: Mas2;

До сих пор речь шла об одномерных массивах, в которых типы элементов скалярные.

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

 

VarH: Array[1981..1990] Of Array[1..12] Of Real;

 

Вот примеры обозначения некоторых элементов этого массива:

 

Н[1981][1]; Н[1985][10]; Н[1990][12]

 

Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:

Н[1981,1]; Н[1985,10]; Н[1990,12]

 

Переменная Н [1981] обозначает всю первую строку таблицы, т.е. весь массив температур за

1981 г.

Другим вариантом, эквивалентным приведенному выше описанию, является следующий:

 

Type Month=Array[l..12] Of Real;

Year=Array [1981..1990] Of Month;

Var H: Year;

Наиболее краткий вариант описания данного массива такой:

 

Var H: Array[1981..1990,1..12] Of Real;

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

Var A: Array[1..10,1..20,1..30] Of Integer;

Это массив, состоящий из 10*20*30 = 6000 целых чисел и занимающий в памяти 6000*2 = 12000 байт. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый

под массивы. В Турбо Паскале это ограничение составляет 64 килобайта.

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

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

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

 

Const Imax=10; Jmax=20;

Var Mas: Array[1..Imax,1..Jmax] Of Integer;

 

Теперь для изменения размеров массива Mas и всех операторов

программы, связанных с этими размерами, достаточно отредактировать

только одну строку в программе — раздел констант.

Действия над массивом как единым целым.Такие действия допустимы лишь в двух случаях:

• присваивание значений одного массива другому;

• операции отношения «равно», «не равно».

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

 

Var P,Q: Array[l..5,1..10] Of Real;

 

При выполнении операции присваивания Р: =Q все элементы массива Р станут равны соответствующим элементам массива Q.

Как уже отмечалось, в многомерных массивах переменная с индексом может обозначать целый массив. Например, если в таблице Н требуется, чтобы данные за 1989 г. были такими же, как за 1981 г. (девятой строке присвоить значение первой строки), то это

можно делать так:

 

Н[1989]:=Н[1981]

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

 

Р:=Н[1989];Н[1989]:=Н[1981];Н[1981]:=Р;

 

где Р описана так:

 

VarP: Array[1..12] OfReal;

 

Обработка массивовв программах производится покомпонентно. Вот примеры ввода значений в массивы:

ForI:=l To12 Do

ReadLn(T[I]);

ForI:=l To IMax Do

ForJ:=l To JMax Do

ReadLn(Mas[I,J]);

 

Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор Read. Аналогично в цикле по индексной переменной организуется

вывод значений массива. Например:

ForI:=l То 12 Do Write(T[I]:8:4);

Следующий фрагмент программы организует построчный вывод

матрицы на экран:

ForI:=l To IMax Do

Begin

ForJ:=l ToJMax Do

Write(Mas[I,J]:6);

WriteLn

End;

После печати очередной строки матрицы оператор WriteLn без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если JMax не превышает 12 (сами подумайте почему).

Рассмотрим несколько примеров типовых программ обработки массивов.

 

Пример.Вернемся к массиву среднемесячных температур Т [ 1 . . 12]. Требуется вычислить среднегодовую температуру, а также ежемесячные отклонения от этой величины.

ProgramExample;

ConstN = 12;

TypeVec=Array [1..N] Of Real;

VarT,Dt: Vec;

St: Real;

I: Integer;

Begin{Ввод исходных данных}

WriteLn('Вводите таблицу температур');

For I:=l To N Do

Begin

Write (I: 2, ':') ;

ReadLn(T[I])

End;

{Вычисление средней температуры}

St:=0;

ForI:=l ToN Do

St:=St+T[I];

St:=St/N;

{Вычисление таблицы отклонений от среднего}

ForI:=l ToN Do

Dt[I]:=T[I]-St;

{Вывод результатов}

WriteLn('Средняя температура равна',St:6:2);

WriteLn;

WriteLn('Отклонения от средней температуры:');

ForI:=l ToN Do

WriteLn (1:1, ':',Dt[I] :6:2)

End.

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

Пример. Выбор максимального элемента.Пусть из рассмотренного выше массива температур требуется отобрать самую высокую температуру и номер месяца, ей соответствующего. Идея алгоритма решения этой задачи: чтобы получить максимальную температуру в вещественной переменной TMax, сначала в нее заносится первое значение массива T [ 1 ]. Затем поочередно сравнивается значение TMax с остальными элементами массива температур, и каждое значение большее, чем TMax, присваивается этой переменной. Для получения номера самого теплого месяца в целой переменной NumMax в нее следует каждый раз засылать номер элемента массива температур одновременно с занесением в TMax его значения.

ТМах:=Т[1];

NumMax:=1;

ForI:=2 To12 Do

If T[I]>Tmax

Then

Begin

TMax:=T[I];

NumMax:=I

End;

Заметим, что если в массиве температур несколько значений, равных максимальному, то в NumMax будет получен первый номер из этих элементов. Чтобы получить последнюю дату, нужно в операторе if заменить знак отношения > на >=.

Пример. Сортировка массива. Водномерном массиве X из N элементов требуется произвести перестановку значений так, чтобы они расположились по возрастанию, т.е. X1≤X2≤…≤XN

Существует целый класс алгоритмов сортировки. Ниже описан

алгоритм, который называется «метод пузырька». Идея: производится последовательное упорядочивание смежных пар элементов массива: Х1 и Х2 , Х2 и Х3,..., XN-1 и XN. В итоге

максимальное значение переместится в XN. Затем ту же процедуру повторяют до XN-1 и т.д., вплоть до цепочки из двух элементов Х1 и Х2. Такой алгоритм будет иметь структуру двух вложенных циклов с внутренним циклом — переменной (сокращающейся) длины.

ForI:=l ToN-l Do

ForK:=l ToN-I Do

If Х[К]>Х [K+l]

Then

Begin

А:=Х[К];

Х[К]:=Х[К+1];

Х[К+1]:=А

End;

Пример.Дан описанный выше двумерный массив среднемесячных температур за 10 лет. Определить, в каком году было самое теплое лето, т.е. в каком году была наибольшая средняя температура летних месяцев. Идея решения: в векторе S получить средние температуры летних месяцев за 10 лет. Затем найти номер наибольшего элемента в

этом векторе, это и будет искомый год.

 

ProgramExample_2;

TypeMonth=Array[l..12] OfReal;

Year=Array[1981..1990] Of Month;

VarH: Year;

S: Array[1981..1990] Of Real;

I,J,K: Integer;

Begin{Ввод данных с клавиатуры}

For I:=1981 To 1990 Do

ForJ:=l To12 Do

Begin

Write(J:2, ‘.’,1:4, ':');

ReadLn(H[I,J])

End;

{Вычисление вектора средних летних температур)

ForI:=1981 To1990 Do

Begin

S[I]:=0;

ForJ:=6 To8 Do

S[I] :=S[I]+H[I, J];

S[I]:=S[I]/3

End;

{Определение года с самым теплым летом)

К:=1981;

ForI:=1982 То 1990 Do

If S[I]>S[K] ThenK:=I;

WriteLn('Самое теплое лето было в',К, '-м году')

End.

 

Тема 2.4Строки, множества, записи.

 

Строка– это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется её длиной. Длина строки может находится в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными.

Строковая константа есть последовательность символов, заключение в апострофы. Например:

 

' Язык программирования ПАСКАЛЬ ' ,

' IBM PC – computer ' ,

' 33-45-12 ' .

 

Строковая переменная описывается в разделе описания переменных следующим образом:

 

Var<идентификатор>: String[<максимальная длина строки>]

Например:

VarName: String[20]

Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величине – 255. Например:

 

Varslovo: String

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

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

 

Name [5], Name [i], slovo [k+l] .

 

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

Тип String и стандартный тип char совместимы. Строки и символы могут употребляется в одних и тех же выражениях.

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

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

Например :

‘ЭВМ’ + ‘ЧВМ’ + ‘РС’.

В результате получится строка:

‘ЭВМ IBM PC’

Длина результирующей строки не должна превышать 255.

Операции отношения =, <, >, <=, >=, <> производят сравнение двух строк, в результате чего получается логическая величина (True или False). Операция отношения имеет более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и больше считается та строка, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки.

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

Пример:

Выражение Результат

‘cosm1’<’cosm2’ True

‘pascal’>’PASCAL’ True

‘Ключ_’<>’Ключ’ True

‘MS DOS’=’MS DOS’ True

Функция copy (S, POZ, N) выделяет из строки S подстроку длиной в N символов, начиная с позиции POZ.N и POZ – целочисленные выражения.

Например:

Значение S Выражение Результат

‘ABCDEFG’ Copy(S, 2,3) ‘BCD’

‘ABCDEFG’ Copy(S, 4,4) ‘DEFG’

 

Функция Concat (S1,S2,…,SN) выполняет сцепление (конкатенацию) строк S1, . . . , SN в одну строку.

Пример:

Выражение Результат

Concat ( ’А А ‘ , ’X X ‘ , ’Y ‘) ‘AAXXY’

 

Функция Length (S) определяет текущую длину строки s. Результат – значение целого типа.

Пример:

Значение S Выражение Результат

‘t e s t - 5‘ Length (S) 6

‘(А+В) *С’ Length (S) 7

 

Функция POS (S1, S2) обнаруживает первое появление в строке S2 подстроки S1. Результат – целое число, равное номеру позиции, где находится первый символ подстроки S1.

Если в строке S2 подстроки S1 не обнаружено, то результат равен 0.

Пример:

Значение S2 Выражение Результат

‘abcdef’ Pos (‘cd’, S2) 3

‘abcdcdef’ Pos(‘cd’,S2) 3

‘abcdef’ Pos(‘k’,S2) 0

 

Процедура Delete (S, Poz, N) выполняет удаление N символов из строки S, начиная с позиции Poz.

Пример:

Исходное значение S Оператор Конечное значение S

‘abcdefg’ Delete(S,3,2) ‘abefg’

‘abcdefg’ Delete(S,2,6) ‘a’

В результате выполнения процедуры уменьшается текущая длина строки в переменной S.

 

Процедура insert (SI, S2, Poz) выполняет вставку строки SI

в строку S2, начиная с позиции Poz.

Пример:

Начальное S2 Оператор Конечное S2

‘ЭВМ PC’ Insert(‘IBM-‘,S2,5) ‘ЭВМ IBM-PC’

‘Рис.2 ‘ Insert(‘N’,S2,6) ‘Рис.N2’

 

Пример. Следующая программа получает из слова «ВЕЛИЧИНА» слово «НАЛИЧИЕ»:

ProgramSlovo_l;

VarS11,S12: String[10];

Begin

S11:=’ВЕЛИЧИНА’;

S12:=Copy(S11,7,2) +Copy(S11,3,4) +S11[2];

WriteLn(S12)

End.

Пример. По следующей программе из слова «СТРОКА» будет получено слово «СЕТКА».

ProgramSlovo_2;

VarSI: String[10];

Begin

S1:=’СТРОКА’;

Delete (S1,3,2);

Insert (‘E’,S1,2);

WriteLn(S1)

End.

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

ProgramStars;

VarA: String;

N,I: Byte;

Begin

Write(‘Введите число звездочек’);

ReadLn(N);

A: = ';

ForI:=1 To N Do

A:=A+’*’;

WriteLn(A)

End.

Здесь строковой переменной А вначале присваивается значение пустой строки (‘’). Затем к ней присоединяются звездочки.

 

Пример. Всимвольной строке подсчитать количествоцифр, предшествующих первому символу!.

Program С;

VarS: String;

К,I: Byte;

Begin

WriteLn(«Введите строку»);

ReadLn(S);

K:=0;

I:=1;

While(I=Length(S) ) And(S[I]<>’!’) Do

Begin

If (S[I]>='0') And (S[i]<='9')

ThenK:=K+1;

I:=I+1

End;

WriteLn (‘Количество цифр до символа «!» равно’,К)

End.

В этой программе переменная K играет роль счетчика цифр, а переменная I роль параметра цикла. Цикл закончит выполнение при первом же выходе на символ ! или, если в строке такого символа нет, при выходе на конец строки. Символ S [I] является цифрой, если истинно отношение: 0<S[1]<9.

 

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

В отличие от элементов массива от элементы множества не пронумерованы , не упорядочены . Каждый отдельный элемент множества не идентифицируется, и с ним нельзя выполнить какие-либо действия. Действия могут выполняться только над множеством в целом. Тип элементов множества называется базовым типом. Базовый тип может быть любым скалярным, за исключением типа Real.

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

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

[3,4,7,9,12]- множество из пяти целых чисел

[1…100]- множество целых чисел от 1 до 100;

[‘a’,’b’,’c’]- множество, содержащее три литеры a, b, с;

[‘A’…’Z’,’?’,’!’]- множество, содержащее все прописные латинские буквы, а также знаки ? и ! .

Символы [] обозначают пустое множество, т.е. множество, не содержащее никаких элементов.

Не имеет значения порядок записи элементов множества внутри конструктора. Например, [1,2,3] и [3,2,1]эквивалентные множества.

Каждый элемент в множестве учитывается только один раз. Поэтому множество [ 1 , 2 , 3 , 4 , 2 , 3 , 4 , 5 ] эквивалентно [ 1. . 5 ] .

Переменные множественного типаописываются так:

Var <идентификатор>: Set Of <базовый тип>

Например:

Var A,D: Set Of Byte;

В: Set Of ' a ' . . ' z ' ;

C: Set Of Boolean;

Нельзя вводить значения во множественную переменную оператором ввода и выводить оператором вывода. Множественная переменная может получить конкретное значение только в результате выполнения оператора присваивания следующего формата:

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

Например :

А : = [ 50 , 100 , 150 , 200 ] ;

B : = [' m' , ' n ' , ' k ' ] ;

C : = [ True , False ] ;

D : =A;

 

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

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

Объединение множеств. Объединением двух множеств Ан В называется множество, состоящее из всех элементов, принадлежащих хотя бы одному из множеств А или В. Знак операции объединения в Паскале +.

Например :

[ 1 , 2 , 3 , 4 ] + [ 3 , 4 , 5 , 6 ] → [ 1 , 2 , 3 , 4 , 5, 6]

 

Пересечение множеств. Пересечением двух множеств А и В называется множество, состоящее из всех элементов принадлежащих, одновременно множеству А и множеству В

Знак операции пересечения в Паскале *.

Например :

[ 1 , 2 , 3 , 4 ] * [ 3 , 4 , 5 , 6 ] → [ 3 , 4 ]

Разность множеств. Разностью двух множеств А и В называется множество, состоящее из элементов множества А, не принадлежащих множеству В (см. рис. 34, в).

Например:

[ 1 , 2 , 3 , 4 ] - [ 3 , 4 , 5 , 6 ] → [ 1 , 2 ]

[ 3 , 4 , 5 , 6 ] - [ 1 , 2 , 3 , 4 ] → [ 5 , 6 ]

Очевидно, что операции объединения и пересечения — перестановочны, а разность множеств — не перестановочная операция

Операции отношения. Множества можно сравнивать между собой, т.е. для них определены операции отношения. Результатом отношения, как известно, является логическая величина true или false. Для множеств применимы все операции отношения, за исключением > и <. В таблице описаны операции отношения над множествами. Предполагается, что множества А и В содержат элементы одного типа.

 

Отношения Результат
True False
А = В А<> В А<= В А>= В Множества А и В совпадают Множества А и Вне совпадают Все элементы А принадлежат В Все элементы В принадлежат А В противном случае В противном случае В противном случае В противном случае

 

Примерыиспользования операций отношения.

Пусть переменная М описана в программе следующим образом:

Var M: Set of Byte;

В разделе операторов ей присваивается значение:

М:=[3,4,7,9];

Тогда операции отношения дадут следующие результаты:

М=[4,7,3,3,9] - true

M<>[7,4,3,9] - true

[3,4]<=М - true

[]<=М - true

М>=[1..10] - true

М<=[3..9] - true

Операция вхождения. Это операция, устанавливающая связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если х — такая скалярная величина, а м — множество, то операция вхождения записывается так:

х in м

Результат - логическая величина true,если значение х входит в множество м, и false- в противном случае для описного выше множества

4 in м – true

5 in м – false

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

Пример.Дана символьная строка. Подсчитать в ней количество знаков препинания (.-,;:!*?).

Programp1;

Var s: string; I.,K: byte;

Begin

Readln(s); k:=0;

For i:=1 to length(s) do

If s[i] in [‘.’,’-’,’,’,’;’,’:’,’!’,’*’,’?’]

Then K:=K+1;

WriteLn (‘Число знаков препинания равно’, K)

End.

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

(S [ I] = ‘ . ‘) or (S[i] = ' - ') и т.д. Использование множества сокращает запись.

Пример.Даны две символьные строки, содержащие только строчные латинские буквы. Построить строку S3, в которую войдут только общие символы S1 и S2 в алфавитном порядке и без повторений.

Programp2;

TypeMset=Set Of‘a’ . . ‘z’;

VarS1, S2, S3: String;

MS1, MS2, MS3: Mset;

C: Char;

ProcedureSM (S: String; VarMS: Mset);

{Процедура формирует множество MS, содержащее все символы строки S}

VarI: Byte;

BeginMS:=[];

ForI:=l ToLength(S) Do

MS:=MS+[S[I]];

End;

Begin{Ввод исходных строк}

ReadLn(Sl);ReadLn(S2) ;

{Формирование множеств MS1 и MS2 из символов строк S1 и S2}

SM(S1,MS1);

SM(S2,MS2);

{Пересечение множеств - выделение общих элементов в множество MS3}

MS3:=MS1*MS2;

{Формирование результирующей строки S3}

S3:='';

ForС:='а' То'z' Do

IfС InMS3 ThenS3:=S3+C;

WriteLn('Результат:',S3)

End.

 

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

 

 


Такая структура называется двухуровневым деревом. В Паскале эта информация может храниться в одной переменной типа Record (запись). Задать тип и описать соответствующую переменную можно следующим образом:

 

Type Anketal=Record

FIO: String[50]; {поля}

Pol: Char;

Dat: String[16]; {записи}

Adres: String[50]

Curs: 1..5; {или элементы}

Grup: 1..10;

Stip: Real {записи}

End;

VarStudent: Anketa1;

 

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

<имя переменной>.<имя поля>

Например, student. f io; student. dat и т.п. Если, например, требуется полю курс присвоить значение 3, то это делается так:

Student.Curs:=3;

 

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

 

 


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

 

Type Anketa2=Record

FIO: S t r i n g [ 5 0 ];

Pol: Char;

Dat: Record

God: I n t e g e r;

Mes: S t r i n g [ 1 0 ];

Den: 1..31;

End;

Adres: Record

Gorod: S t r i n g [ 2 0 ];

UlDomKv: S t r i n g [ 3 0 ];

End;

Curs: 1..5;

Grup: 1. . 1 0;

S t i p : Real;

End;

Var Student: Anketa2;

 

Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например, s t u d e n t . D a t . G o d ; student.Adres.Gorod. Приведем структурограмму задания комбинированного типа.

 

<комбинированный тип>

Record<Список полей> End

 

<Список полей>

< Имя поля> <Тип>

 

 

В программе могут использоваться массивы записей. Если на факультете 500 студентов, то все анкетные данные о них можно представить в массиве:

VarStudent: Array[1..500] Of Anketal;

В таком случае, например, год рождения пятого в списке студента хранится в переменной student [5] .Dat.God.

 

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

 

ForI:=l То500 Do

WithStudent[I] Do

Begin

Write('Ф.И.О.:'); ReadLn(FIO) ;

Write('Пол (м/ж):'); ReadLn(Pol);

Write("Дата рождения:'); ReadLn(Dat);

Write('Адрес:'); ReadLn(Adres);

Write('Курс:'); ReadLn(Curs);

Write('Группа:'); ReadLn(Grup);

Write('Стипендия (руб.):'); ReadLn(Stip)

End;

 

В этом примере использован оператор присоединения, который имеет следующий вид:

With<переменная типа запись> Do <оператор>;

 

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

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

 

Тема 2.5Процедуры и функции

 

 

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

Для более эффективной разработки программ, содержащих такие повторяющиеся действия, введен механизм подпрограмм.

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

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

В PASCAL для организации подпрограмм используются процедуры и функции. Заметим, что в отличие от некоторых других языков высокого уровня, например, С («си»), в которых существуют только функции, в языке Pascal используются два механизма.

 

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

Функция аналогична процедуре, но имеет два отличия:

1) Функция передает в точку вызова значение (результат своей работы);

2) Имя функции может входить в выражение как операнд.

 

Все процедуры и функции в Pascal подразделяются на:

§ Стандартные (встроенные, реализованные разработчиками системы программирования)

§ Пользовательские (разрабатываемые самим программистом)

Встроенные программы – это часть языка.

Они могут вызываться без предварительного определения в разделе описаний, вызываются по строго фиксированному имени, хранятся в библиотеках подпрограмм (в стандартных модулях). Например, в модулях Opcrt, System, Graph.

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

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

Стандартные и пользовательские процедуры.

Со стандартными процедурами мы уже встречались не один раз. Примеры стандартных процедур Clrscr;

Формат описаний процедуры

const ….. type

Формат вызова процедуры (обращение к процедуре)

 

< «имя» >(<список фактических параметров>);

 

Пример.

Если вычисление суммы двух чисел реализовать с помощью процедуры, то процедура выглядела бы так:

Procedure sum(a,b:real;var c:real);

Begin

c:=a+b;

Writeln;

End;

 

А обращение к ней, например, для вычисления суммы чисел 2 и 3 и записи результата в переменную rez выглядело бы так:

Sum(2,3,rez);

Чтобы вычислить сумму чисел 356 и 752, а затем записать результат в переменную А, следовало бы вызвать процедуру таким образом:

Sum(356,752,A);

Здесь при описании процедуры

Sum – имя процедуры;

Переменные a, b, c – формальные параметры.

При вызове процедуры 2, 3, rez, 356, 752, А – фактические параметры.

 

Пример

Процедура вызова матрицы на экран

 

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

Type

matr: array[1..10,1..10] of real;

….

procedure Vivod_matr(A:matr);

var I,j: byte;

Begin

for i:=1 to 10 do

write(A[I,j]:5:2,’ ‘);

Writeln;

End;

End;

{конец процедуры}

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

 

Vivod_matr(A);

Vivod_matr(B);

Вычислить∑матриц

Vivod_matr(C);

!Необходимо соблюдать соответствие фактических и формальных параметров. Количество и тип формальных параметров должно быть равно количеству и типу фактических параметров.

Пример

Разработаем процеуру, которая задает фон и цвет выводимых символов.

procedure FonColor (Fon, Color:byte);

Begin

Textbackground (Fon);

Clrscr;

Textcolor(Color);

End;

При разработке пользовательской процедуры здесь используются стандартные процедуры.

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

FonColor(blue,white);

 

Глобальные и локальные переменные (константы, типы данных)

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

Program GLOB;

Var

A:<тип>;

…..

Procedure lok;

Var

B:<тип>;

….

Переменная А – глобальная, так как описана в основной программе.

Переменная В – локальная; она описана в процедуре.

 

За исключением того времени, когда процедура действительно выполняется, её локальные переменные в буквальном смысле не существуют.

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

Таким образом, использование переменных там, где это возможно, приводит к эффективности программы по памяти.

 

Задача.

Даны отрезки А, В, С и D. Для каждой тройки из этих чисел необходимо напечатать площадь треугольника, если его возможно построить.

 

 

Program SQ;

Var

A,B,C,:real;

Procedure TR (x,y,z:real);

{процедура будет проверять существование треугольника для тех заданных длин отрезков и, если он существует, выводить на экран площадь треугольника}

Var

p:real;{здесь р –локальная (временная) переменная}

Begin

if (x+y>z) and(x+z>y)and(z+y>x

Then

Begin

p:=(x+y+z)/2;

writeln(sqrt(p*(p-x)(p-y)(p-z):6:3);

End;

else writeln(‘Треугольник не существует’);

end;{конец процедуры}

Begin

{Основная программа будет вводить заданные длины отрезков А, И, С, D и обращаться к процндуре для прверки существования треугольника и печати площади или сообщения о том, что треугольник не существует.}

Writeln (‘Введите через пробел длины отрезков’);

Read (A,B,C,D);

TR(A,B,C);

TR(A,B,D);

TR(A,C,D);

TR(B,C,D);

End;

Функции в языке PASCAL.

Стандартные и пользоваельские функции

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

Формат описания функции

Function <имя> (<список формальных параметров с указанием типов>):<тип результата>;

Сonst

….

Type

….

Var

….

Begin

<операторы функции>

End;

Первая строка функции – это заголовок.

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

Обратим внимание на отличие формата описания функции. Краме имени функции и формальных параметров с описанием их типов

 

!!!В разделе операторов должен ноходиться по крайней мере один оператор, который имени функции присваивает значение

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

 

!!!Вызываемый результат может иметь любой скалярный тип, типы string и указатель.

Обратим внимание: результатом функций не может быть массив, множество или запись. Это очевидно, так как результатом функции должно одно значение, а массив, множество, запись – сложные типы, состоящие из множества элементов.

 

Обращение к функции (вызов функции) также, как и вызов процедуры, осуществляется по имени с указанием фактических параметров:

<имя функции>(<фактическим параметры>);

 

Примеры стандартных функций

Арифметические функции находятся в модуле System.

Напомним, что модуль System подключается автоматически к каждой программе.

 

Abs (x:real):real; модуль
Abs (x:integer):integer; модуль
Arctan (x:real):real; арктангенс
Cos (x:real):real; косинус
Sin (x:real):real; синус
Ln (x:real):real; Ln x
Int (x:real):real; Вычисляет целую часть числа
Flag (x:real):real; Вычисляет дробную часть чтсла
Sqr (x:real):real; Квадрат числа х
Sqr (x:integer):integer; Квадрат числа х
Sqrt (x:real):real; Корень квадратный из х
Odd (x:real):real; Х(нечетное)=true, Х (четное) = false
Random (x:real):real; Генерирует псевдослучайное число из диапазона 0…х
Random (x:real):real; Генерирует псевдослучайное число из диапазона 0…0,99
Pi Число π
Exp (x:real):real; ex

Параметры функций из модуля CRT

Wherex: byte;

Wherey: byte;

Keypressed: Boolean:

Readkey: char;

Это функции БЕЗ параметров.

 

Функции для работы со строками;

Copy (St, Poz, n):string;

Concat (st1, … , stn: string): string;

И другие. Это функции С параметрами.

 

Пример

Возведение вещественного числа в вещественную степень ху

Для примера вычислим значения х3, х4, х5, х6

Program DemoPower;

Var

x, sum:real;

function Pow (x,y:real): real;

{функция вычисляется х в степени у}

Begin

Pow:=exp(y*ln(x));

End;

Begin

{начало основной программы}

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

Readln(x);

writeln(Pow(x,3));{вычисление и одновременный вывод на экран х3}

writeln(Pow(x,4)); { вычисление и одновременный вывод на экран х4}

{Внимание. Далее имя функции используется в выражении как операнд}

sum:=Pow (x,5)+ Pow (x,6);)); {вычисление х56}

Writeln (sum);

End.

Пример

Возведение вещественного числа в натуральную степень.

Вычислить 2,7к+(а+1)-5, где а и к вводятся с клавиатуры.

 

Program Kalk;

Var

a,sum:real;

k:word;

fuktion Step (x:real; n:word):real;

Var

i:word;

st:real;

Begin

st:=1;

for i:=1 to n do

st:=st*x;

Step:=st; {имени функции необходимо присвоить результат}

End;

Begin

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

Readln(k);

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

Readln(a);

{Внимание. Далее имя функции используется в выражении как операнд}

sum:=Step(2.7,k)+1/Step((a+1),5);

writeln (sum:6:2)

End.

 

Параметры процедур и функций

Существует два типа параметров процедур и функций:

1) параметры-значения;

2) параметры-переменные.

 

Параметры-значения

Procedure PRIM (x,y:real); Здесь формальные параметры х и у – параметры-значения. В этом случае параметры передаются процедуре при вызове, или, говоря другими словами, подаются на вход процедуре.

Параметры-переменные

Procedure PRIM (var x,y:real); Здесь формальные параметры х и у – параметры-переменные. В этом случае значение параметров возвращаются после выполнения процедуры основной программе. Или, говоря другими…

Пример

Необходимо в виде подпрограммы оформить вывод элементов одномерного массива на экран.

 

Рассуждения

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

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

 

Type

mas: array[1…100] of real;

….

procedure Vivod (A:mas, kol:byte);

{напомним, что здесь необходимо предварительное описание типа Массив}

Begin

for i:=1 to kol do

write(A[i]:5:2,’ ‘);

End;

Пример

Необходимо в виде подпрограммы оформить ввод элементов одномерного массива.

Рассуждения.

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

2. Параметрами процедуры будут имя массива и количество элементов массива. Количество элементов массива введем в основной программе, поэтому этот параметр необходимо подать на вход (передать) процедуре. Имя массива также необходимо передать процедуре. Однако, если количество элементов известно основной программе (так как ввод этого значения произведется в основном блоке), то значения элементов массива необходимо будет вернуть (передать) в основную программу процедуры. Следовательно, параметр – количество элементов массива – должен быть параметром-значением, а параметр – массив параметром-переменной.

 

Type

mas: array[1…100] of real;

….

procedure Vivod (A:mas; kol:byte);

{обратим внимание, здесь параметры различных типов в отличии от предыдущего примера разделены точкой с запятой}

Begin

for i:=1 to kol do

Begin

write(‘ Ведите‘, i, ‘элемент массива’ );

readln(A[i]:5:2,’ ‘);

End;

End;

……

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

……..

write(‘ Ведите количество элементов массива’ );

Readln (kol);

……..

Рекурсивные подпрограммы

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

Пример

Вычисление факториала числа

Обоснование выбора способа реализации.

Обратим внимание на то, что вычислить факториал числа N можно следующим образом:

N! =N*(N-1)!=N*(N-1)*(N-2)! И так далее

То есть для вычисления факториала числа N требуется вычислить факториал числа (N-1), для вычисления факториала (N-1) необходимо вычислить факториал числа (N-2) и так далее. Заметим, что вычисление факториала числа сводится к вычислению факториала числа, на единицу меньше самого числа.

Реализуем такой алгоритм с использованием механизма рекурсии.

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

 

function Fact (n:byte):integer;

Begin

if n=0 then Fact:=1

else Fact:=n*Fact(n-1);

End;

Здесь имени функции сразу присваивается результат вычисления.

При вызове функции Fact(n-1) согласно оператору Fact:=n*Fact(n-1), где т – параметр функции, вместо n подставляется параметр (n-1) и, следовательно, вычисляется строка n*(n-1)*Fact((n-1)-1) и так далее.

Рекурсивное обращение к функции Fact будет продолжаться до тех пор, пока n не станет равным 0

 

Домашнее задание

Реализовать с помощью рекурсивной подпрограммы возведение числа в натуральную степень.

Подсказка. Заметим, что Xn = X* Xn-1

 

Косвенная рекурсия

Описанный выше механизм часто называют прямой рекурсией.

Существует еще один рекурсивный механизм – косвенная рекурсия

 

Механизм применяется для реализации следующей ситуации

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

Продемонстрируем ситуацию на примере.

Program Kosv_Rec;

…..

procedure A(var x:real);

Begin

….

B(z);

….

End;

procedure B (var y:real);

Begin

….

A(z);

End;

 

Здесь процедура А обращается в процедуру В и наоборот. Какую процедуру первой мы бы ни описали, в любом случае будет ошибка – обращение к еще не описанной процедуре.

 

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

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

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

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

Program Kosv_Rec;

…..

procedure B (var y:real); Forward;

procedure A(var x:real);

Begin

….

B(z);

….

End;

Procedure B;

Begin

….

A(z);

End;

 

 

Тема 2.6Организация ввода-вывода данных. Работа с файлами

 

В Паскале понятие файла употребляется в двух смыслах:

• как поименованная информация на внешнем устройстве (внешний файл);

• как переменная файлового типа в Паскаль-программе (внутренний файл).

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

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

Структура описания файловой переменной:

Var<имя переменной>: F i l e Of<тип элемента>;

где <тип элемента> может быть любым, кроме файлового.

Например:

Var Fi: File OfInteger;

Fr: File OfReal;

Fc: File OfChar;

Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца (<м. к.>):

Эл.0 Эл.1 Эл.N м.к

 

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

Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура Rewrite (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры Rewrite можно представить так:

До:

Эл.0 Эл.1 Эл.N м.к

Rewrite (FV)

После:

м.к  

 

Стрелка внизу отмечает позицию указателя.

Запись в файлосуществляется процедурой Write (FV, V); где v – переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую позицию. Если новый элемент вносится в конец файла, то сдвигается маркер конца. Схема выполнения оператора:

до:

Эл.0 Эл.1 Эл.N м.к

 

Write (FV, V)

 

После:

Эл.0 Эл.1 Эл.N V м.к

 

 

Пример. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.

Var Fx: File OfReal;

X: Real; I: Byte;

Begin

Rewrite(Fx);

ForI:=l To20 Do

Begin

Write ('?'); ReadLn(X);

Write(Fx,X)

End

End.

 

Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV). В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:

до:

Эл.0 Эл.1 Эл.N м.к

 

Reset (FV)

После:

Эл.0 Эл.1 Эл.N м.к

 

Чтение из файла осуществляется процедурой Read (FV, v) ; где v — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную v; указатель смещается

к следующему элементу.

До:

V
Эл.0 Эл.1 Эл.К Эл.К+1 Эл.N м.к  
                 

Read (FV, v)

V
Эл.0 Эл.1 Эл.К Эл.К+1 Эл.N м.к Эл.К
                 

 

Доступ к элементам файла может быть последовательным или прямым. В стандартном Паскале реализован только последовательный доступ.

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

Пример.В переменной х получить 10-й элемент вещественного файла Fx.

Var Fx: File Of Real;

X: Real;

Begin

Reset(Fx);

For I:=l To 10 Do Read(Fx,X)

End.

 

Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true , если указатель установлен на маркер конца, в противном случае false .

Пример.Просуммировать все числа из файла Fx, описанного в предыдущем примере.

Reset(Fx);

Sx:=0;

While NotEof(Fx) Do

Begin

Read(Fx,X);

Sx:=Sx+X;

End;

 

To же самое с помощью цикла Repeat можно делать следующим образом:

Repeat

Read(Fx,X);

Sx:=Sx+X

UntilEof(Fx);

 

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

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

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

CON (консоль) — логическое устройство, связанное при вводе с клавиатурой, при выводе — с экраном;

PRN (принтер) — логическое имя файла, связанного с устройством печати;

AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами;

INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;

OUTPUT — логическое имя стандартного устройства вывода на экран.

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

Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занимаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:

<имя файла>.<тип файла>

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

Например:

PROGRAM.PAS — в файле текст программы на Паскале;

NUMBER.DAT — файл числовых данных;

NAMES.тхт — текстовый файл.

Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения:

Assign (<имя файловой переменной>,

<идентификатор внешнего файла>);

 

Здесь <идентификатор внешнего файла> — строковая величина (константа или переменная). Например:

Assign(Fi,'Number.dat');

 

После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорию.

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

Работа с файлом в программе завершается его закрытием с помощью процедуры Close (<имя файловой переменной>)

Например:

Close(Fi)

 

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

1. Описать файловую переменную.

2. Описать переменную того же типа, что и файл.

3. Произвести назначение (Assign).

4. Открыть файл для записи (Rewrite).

5. Записать в файл данные (Write).

6. Закрыть файл (Close).

 

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

Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число 9999.

ProgramTask1;

VarFt: File OfReal; T: Real;

Begin

Assign(Ft,’Temp.dat’); Rewrite(Ft);

Writeln(‘Вводите данные. Признак конца -9999’);

Readln (T);

WhileT<>9999 Do

Begin

Write(Ft,T); Write (‘?’); Readln(T)

End;

Writeln (‘Ввод данных закончен!’);

Close(Ft)

End.

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

1. Описать файловую переменную.

2. Описать переменную того же типа.

3. Выполнить назначение (Assign).

4. Открыть файл для чтения (Reset).

5. В цикле читать из файла (Read).

6. Закрыть файл (close).

Пример.Определить среднюю температуру для значений, хранящихся в файле Temp.dat.

ProgramTask2;

VarFt: File OfReal;

T,St: Real; N: Integer;

BeginAssign(Ft,'Temp.dat');

Reset(Ft);

St:=0;

While NotEof(Ft) Do

Begin

Read(Ft,T);

St:=St+T

End;

N:=FileSize(Ft) ;

St:=St/N;

WriteLn('Средняя температура 3a',N:3,

'суток равна',St:7:2,'гр-в');

Close(Ft)

End.

В этой программе использована функция определения размера файла:

FileSize(<имя файловой переменной>);

Ее результат — целое число, равное текущей длине файла.

Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов.

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

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

Var <идентификатор>:text;

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

S1 S2 Sk1 м.к.с   S1 S2 Sk2 м.к.с   м.к.ф

 

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

Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере.

В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры Readln и Writeln.

Readln(FV,<список ввода>)

Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода.

Writeln(FV,<список вывода>)

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

Для обнаружения конца строки в текстовом файле используется Функция Eoln(FV)

(End of line — конец строки). Это логическая функция, которая принимает значение true , если указатель файла достиг маркера конца строки и false — в противном случае.

Употребление операторов Read и Readln без указания имени файловой переменной обозначает чтение из стандартного файла input (ввод с клавиатуры). Употребление операторов Write и Writeln без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы input и Output всегда открываются соответственно для чтения и записи при работе любой программы.

При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter.

Процедура Readln может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.

Употребление процедуры Writeln без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки).

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

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

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

VarNote: Text; К: Integer;

BeginAssign(Note,’Note.txt’) ;

Reset(Note);

K:=0;

While NotEof (Note) Do

Begin

Readln(Note); K:=K+1

End;

Writeln(‘Количество строк равно’, К);

Close(Note)

End.

Используемый здесь оператор ReadLn(Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную.

Пример.В текстовом файле Note.txt определить длину самой большой строки.

VarNote: Text;

Мах,К: Integer; С: Char;

Begin

Assign(Note,’Note.txt’);

Reset(Note);

Max:=0;

While NotEof(Note) Do

Begin

K:=0;

While

NotEoln(Note) Do

Begin

Read(Note,С); K:=K+1

End;

If K>Max ThenMax:=K;

Readln(Note)

End;

Writeln('Наибольшая строка имеет',Max,'знаков');

Close(Note)

End.

Здесь каждая строчка прочитывается посимвольно, при этом в переменной K работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.

 

Тема 2.7 Библиотеки подпрограмм

 

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

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

Модуль в Турбо Паскале представляет собой отдельно хранимую и независимо компилируемую программную единицу.

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

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

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

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

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

В общем случае модуль имеет следующую структуру:

unit<имя модуля>; {заголовок модуля}
interface
{ описание видимых программных элементов модуля }
{ описание скрытых программных элементов модуля }
begin
{ операторы инициализации элементов модуля }
end.

В частном случае модуль может не содержать части реализации и части инициализации, тогда структура модуля будет такой:

unit <имя модуля>; {заголовок модуля}
interface
{ описание видимых программных элементов модуля }
implementation

end.

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

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

Исходный текст модуля должен быть откомпилирован с помощью директивы Make подменю Compile и записан на диск. Результатом компиляции модуля является файл с расширением TPU (Turbo Pascal Unit). Основное имя модуля берется из заголовка модуля.

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

uses CRT, Graph;

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

Например, пусть имеется модуль, в котором описана переменная К:

unit M;
interface
var K: Integer;
implementation
..................
end.

Пусть программа, использующая этот модуль, также содержит переменную К:

Program P;
uses M;
var K: Char;
begin
..................
end.

Для того, чтобы в программе P иметь доступ к переменной K из модуля M, необходимо задать составное имя M.K.

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

Рекурсивное использование модулей запрещено.

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

 

Тема 2.8Графика

 

Начиная с четвертой версии Турбо Паскаля для IBM PC появилась мощная графическая библиотека, организованная в модуль Graph. Для его подключения в начале программы необходимо написать строку:

Uses Graph;

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

Графические режимы отличаются:

• размером графической сетки (M x N, где М — число точек по горизонтали, N — число точек по вертикали);

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

Для установки графического режима экрана существуют соответствующие процедуры. В модуле Graph процедура установки графического режима экрана имеет следующий заголовок:

Procedure InitGraph(Var Driver,Mode: Integer; Path: String);

Здесь целая переменная Driver определяет тип графического драйвера; целая переменная Mode задает режим работы графического драйвера; Path — выражение типа String, содержащее маршрут поиска файла графического драйвера.

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

Uses Graph;

Var Driver,Mode: Integer;

Begin

Driver: = VGA;{драйвер}

Mode: = VGAHi;(режим работы}

InitGraph(Driver,Mode,'C:TPBGI');

Здесь указывается, что файл egavga.bgi с драйвером для VGA-монитора находится в каталоге C:TPBGI. Режим VGAHi соответствует графической сетке 640 х 480 с палитрой из 16 цветов.

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

Driver:=Detect;

InitGraph(Driver,Mode,'C:TPBGI');

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

В модуле Graph процедура возвращения в текстовый режим имеет заголовок:

Procedure CloseGraph;

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

Заголовок процедуры установки цвета фона:

Procedure SetBkColor(Color: Word);

Здесь Color — выражение целого типа, определяющее номер цвета фона.

Заголовок процедуры установки цвета линий:

Procedure SetColor(Color: Word);

Заметим, что если в качестве номера цвета линии указывается 0, то это всегда совпадает с цветом фона (невидимая линия).

Если необходимо очистить графический экран (стереть рисунок), то для этого используется процедура очистки экрана.

Заголовок процедуры очистки экрана:

Procedure ClearDevice;

В результате выполнения этой процедуры экран заполняется установленным цветом фона.

Графические координаты. Положение каждого пикселя графической сетки однозначно определяется указанием его координат. Графические оси координат расположены на экране так, как показано на рисунке.

Горизонтальная ось X направлена слева направо, вертикальная ось Y — сверху вниз. На рисунке указаны предельные графические координаты, соответствующие режиму VGAHi.

Можно определить максимальные координаты по осям, соответствующие данному драйверу. Это делается с помощью двух целочисленных функций:

Function GetMaxX;

Function GetMaxY;

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

Заголовок процедуры назначения графического окна:

Procedure SetViewPort(X1,Y1,X2,Y2: Integer; Clip: Boolean);

Здесь (X1, Y1) — координаты левого верхнего угла окна; (Х2, Y2) — координаты правого нижнего угла окна; Clip — ограничитель фигур; если Clip=True, то все построения производятся только в пределах окна, в противном случае они могут выходить за его пределы.

После установки окна координаты точек внутри него отсчитываются от верхнего левого угла.

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

Процедура назначения координат графического курсора:

Procedure MoveTo(X,Y: Integer);

Здесь X, Y — устанавливаемые координаты курсора. Координаты указываются относительно левого верхнего угла окна или, если окно не установлено, экрана.

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

Заголовок процедуры выставления точки на графическом экране:

Procedure PutPixel(X,Y: Integer; Color: Word);

Здесь X, Y — координаты точки, Color — цвет точки.

Пример. Программа устанавливает по центру экрана графическое окно размером 100х100, заливает его желтым фоном и заполняет синими точками, расположенными через 4 позиции.

Uses Graph;

Var Driver,Mode: Integer;

X,Y,Xl,Yl,X2,Y2,Xc,Yc: Integer;

Begin

{Инициализация графического режима}

Driver:=Detect;

InitGraph(Driver, Mode,'C:TPBGI');

{Определение координат центра экрана}

Хс:=GetMaxX Div 2;

Yc:=GetMaxY Div 2;

{Определение координат графического окна}

X1:=Хс-50

Yl:=Yc-50

Х2:=Хс+50

Y2:=Yc+50

{Установка графического окна}

SetViewPort(Xl,Yl,X2,Y2,True);

{Установка цвета фона и очистка экрана}

SetBkColor(Yellow);

ClearDevice;

{Расстановка точек в окне)

For X:=l То 25 Do

For Y:=l To 25 Do

PutPixel(4*X,4*Y,Blue);

{Задержка изображения на экране до нажатия <ENTER>}

ReadLn;

{Выход из графического режима в символьный}

CloseGraph;

End.

 

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

Рассмотрим несколько основных процедур рисования графических примитивов, имеющихся в модуле Graph.

Линия с заданными координатами концов (X1, Y1) и (Х2, Y2):

Procedure Line(X1,Y1,X2,Y2: Integer);

Линия от текущей точки до точки с координатами X, Y:

Procedure LineTo(X,Y: Integer);

Линия от текущей точки до точки с заданными приращениями координат DX, DY:

Procedure LineRel(DX,DY: Integer);

Прямоугольник с заданными координатами верхнего левого угла (X1, Y1) и нижнего правого угла (Х2, Y2):

Procedure Rectangle(XI,Y1,X2,Y2: Integer);

Окружность с центром в точке (X, Y) и радиусом R— в пикселях:

Procedure Circle(X,Y: Integer; R: Word);

Дуга окружности с центром в точке (X, Y), радиусом R, начальным углом BegA и конечным углом EndA. Углы измеряются в градусах против часовой стрелки от направления оси X.

Procedure Arc(X,Y: Integer; BegA,EndA,R: Word);

Эллипсная дуга с центром в точке X, Y с начальным и конечным углами BegA и EndA, горизонтальным радиусом RX и вертикальным радиусом RY:

Procedure Ellipse(X,Y: Integer; BegA,EndA,RX,RY: Word) ;

Пример. Составим программу, рисующую голову робота.

 

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

Uses Graph;

Var Driver,Mode: Integer;

Begin

{Инициализация графического режима}

Driver:=Detect;

InitGraph(Driver, Mode,'C:TPBGI');

SetColor(White);{белый цвет рисунка}

SetBkColor(Black);{черный цвет фона)

Rectangle(100,100,300,300);{голова}

Circle(150,170,30);(левый глаз}

Circle(250,170,30);{правый глаз}

Arc(150,170,45,135,40);{левая бровь}

Arc(250,170,45,135,40);{правая бровь}

Ellipse(200,250,0,359,10,20);{нос}

Rectangle(130,280,270,290);{рот}

MoveTo(100,300);{установка вниз влево}

LineTo(50,350);{три}

LineTo(350,350);{линии}

LineTo(300,300);{шеи}

PutPixel(150,170,Red);{левый зрачок}

PutPixel(250,170,Red);{правый зрачок}

ReadLn;{задержка}

CloseGraph;(выход из графики}

End.

В приведенном примере все линии рисуются сплошными и стандартной толщины. Модуль Graph позволяет управлять стилем линии (сплошная, пунктирная, точечная и т.п.) и толщиной. Для этого существует процедура SetLineStile.

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

Процедура определения типа заполнения (Fill) и цвета заполнения (Color) имеет следующий заголовок:

Procedure SetFillStyle(Fill,Color: Word);

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

Procedure Bar(XI,Y1,X2,Y2: Integer);

Обведенный линией (SetLineColor, SetLineStyle) и закрашенный (SetFillStyle) эллипс:

Procedure FillEllips(X,Y,RX,RY: Integer);

Обведенный линией и закрашенный эллипсный сектор:

Procedure Sector(X,Y: Integer;

BegA,EndA,RX,RY: Word);

Обведенный линией и закрашенный сектор окружности:

Procedure PieSlice(X,Y:Integer;

BegA,EndA: Word);

Наконец, можно закрасить любую область, ограниченную замкнутой линией. Для этого нужно указать какую-нибудь точку внутри этой области (X, Y) и цвет граничной линии (Border). Соответствующая процедура выглядит следующим образом:

Procedure FloodFill(X,Y: Integer; Border: Word);

Модуль Graph позволяет выводить на графический экран тексты. Procedure OutTextXY(X,Y: Integer; Txt: String);

Например, чтобы вывести под нашим рисунком строку «ЭТО РОБОТ», следует в программу добавить оператор OutTextXY(195,400,'ЭТО РОБОТ').

 

 

Список рекомендуемой литературы:

1.Голицына О. Л., Попов И. И. Основы алгоритмизации и программирования. 2008г.

2.Колдаев В.Д, Основы алгоритмизации и программирования. Москва ИД «ФОРУМ»-ИНФРА-М 2009 г.

3.Семакин И.Г., Шестаков А.П. Основы программирования. М.: ИД «Академия», 2008г.

ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ К РАЗДЕЛУ 2:

1. Что такое величина?

2. Какие величины называют аргументами? результатами? промежуточными величинами?

3. Каковы атрибуты величины?

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

5. Какие простые типы величин существуют в языке Pascal?

6. Что определяет тип величины?

7. Расскажите о простых типах данных и их атрибутах.

8. Как осуществляется ввод данных в языке Pascal? Приведите примеры.

9. Как осуществляется вывод данных в языке Pascal? Приведите примеры.

10. Какова общая структура программы в языке Pascal?

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. Почему значение отношения 'Мама'<>'мама' равно TRUE?

45. Какая функция (процедура) является аналогом операции сцепления (+) при работе со строками?

46. Каков будет результат выполнения операции сцепления, если длина результирующей строки превысит значение 255?

47. Какие алгоритмы называют вспомогательными?

48. Какое количество вспомогательных алгоритмов может присутствовать в основном алгоритме?

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

50. Какие параметры называют формальными? фактическими?

51. Какое соответствие должно соблюдаться между формальными и фактическими параметрами?

52. Может ли фактических параметров процедуры (функции) быть больше, чем формальных? А меньше?

53. Существуют ли подпрограммы без параметров?

54. Существуют ли ограничения на число параметров подпрограмм? Если нет, то чем же всё-таки ограничивается это количество в Turbo Pascal?

55. В каком разделе объявляются и реализуются подпрограммы в Turbo Pascal?

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. В каких случаях можно отсутствовать раздел IMPLEMENTATION?

85. Какое расширение имеет имя файла с исходным текстом модуля?

86. Охарактеризуйте три режима компиляции модулей и основной программы.

87. Для чего предназначена интерфейсная часть модуля?

88. Можно ли в программе переопределить объекты, объявленные в интерфейсной части модуля?

89. Как получить доступ к "закрытому" объекту, значение которого вычисляется в модуле, но не используется в программе?

 


Задания для контрольной работы

 

3.1 Требования по оформлению контрольной работы

 

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

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

Контрольная работа представлена в двадцати вариантах.

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

Контрольная работа выполняется компьютерным набором (поля 2см по всем сторонам, шрифт № 14, тип Times New Roman, интервал полуторный).

Блок - схемы вы­полняются с соблюдением требований ГОСТов и ЕСКД либо с помощью соответствующего программного обеспечения.

Тексты программ должны соответствовать правилам оформления [с. 45 В.Д. Колдаев «Основы алгоритмизации и программирования»].

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

 

КОНТРОЛЬНАЯ РАБОТА

1. Задачи для решения на тему «линейные алгоритмы» Вычислите выражения по предложенным формулам. Вариант 1 …  

Перечень практических работ

2. Составление блок-схем циклических алгоритмов. 3.Составление таблиц истинности. 4.Составление программ линейной структуры. Отладка программ

Begin

Write (‘M=’);

Readln (m);

Write (‘N=’);

Readln (n);

Summa := 0;

I := m;

While i<n do

Begin

Summs := Summa + I;

I := Succ (i);

End;

Writeln(‘Сумма равна’, Summa);

End.

 


Информационное обеспечение обучения

Перечень рекомендуемых учебных изданий, Интернет-ресурсов, дополнительной литературы

 

Основная:

1.Голицына О. Л., Попов И. И. Основы алгоритмизации и программирования. 2008г.

2.Колдаев В.Д, Основы алгоритмизации и программирования. Москва ИД «ФОРУМ»-ИНФРА-М 2009г.

3.Семакин И.Г., Шестаков А.П. Основы программирования. М.: ИД «Академия», 2008г

 

 

Дополнительная:

1.Культин Н.Б. Turbo Pascal в задачах и примерах. – СПб.: БХВ – Перетбург, 2006г.


Контроль и оценка результатов освоения учебной дисциплины

Контроль и оценка результатов освоения учебной дисциплины осуществляется преподавателем в процессе проведения практических занятий, тестирования, а…   Результаты обучения (освоенные умения, усвоенные…

ПРИЛОЖЕНИЕ 1

 

Перечень теоретических вопросов и практических заданий к экзамену

по дисциплине "Основы алгоритмизации и программирования"

для подготовки студентов специальности

230401 Информационные системы (по отраслям) очной формы обучения

Теоретические вопросы

2. Основные понятия алгоритмизации 3. Составление блок-схем линейных и разветвляющихся алгоритмов. 4. Составление блок-схем циклических алгоритмов.

Практические задания

1. Составление таблиц истинности

2. Составление программ линейной структуры

3. Составление программ разветвляющейся структуры в языках программирования Turbo Pascal, С++

4. Составление программ циклической структуры в языках программирования Turbo Pascal, С++

5. Формирование линейных массивов в языках программирования Turbo Pascal, С++

6. Обработка одномерных массивов

7. Формирование двумерных массивов

8. Обработка двухмерных массивов в языках программирования Turbo Pascal, С++

9. Сортировка массивов

10. Работа со строковыми переменными

11. Работа с данными типа множество в языке программирования Turbo Pascal

12. Формирование записей (структур). Операции над записями (структурами) в языках программирования Turbo Pascal, С++

13. Объявление и определение процедур в языках программирования Turbo Pascal, С++

14. Объявление и определение функций в языках программирования Turbo Pascal, С++

15. Организация рекурсивных алгоритмов в языках программирования Turbo Pascal, С++

16. Организация файлов в языках программирования Turbo Pascal, С++

17. Построение статических и динамических изображений в языке программирования Turbo Pascal

 

– Конец работы –

Используемые теги: дисциплине, основы, алгоритмизации, программирования0.058

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

Что будем делать с полученным материалом:

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

Еще рефераты, курсовые, дипломные работы на эту тему:

Основы алгоритмизации и Программирование
Московский государственный университет экономики... Статистики и информатики...

На заседании ЦК строительных дисциплин и дизайна Задание к контрольной работе По дисциплине Основы электротехники
государственное образовательное учреждение среднего профессионального образования... Кемеровский государственный профессионально педагогический колледж... ГОУ СПО КемГППК...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ К КУРСОВОЙ РАБОТЕ по дисциплине Основы информационных технологий и программирования Энергетический менеджмент , Теплоэнергетика
Донецкий национальный технический университет... МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ...

Основы алгоритмизации и программирования
Условие - выражение булевского типа. Например Var flag boolean a b a b a b Условие может быть составным, т.е. состоять из нескольких логически… Для связи частей между собой применяются логические операции And и ab and b x… If условие then оператор1 Пример X 2 if x 0 then y 1 else y 2 WriteY Внутри оператора if могут содержаться другие…

Основы алгоритмизации и объектно-ориентированного программирования
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТЕХНОЛОГИЧЕСКИЙ... Кафедра инженерной кибернетики Т В Куренкова Г И...

УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС ДИСЦИПЛИНЫ по дисциплине EUR 1106 - Экология и устойчивое развитие ООД 1 Учебно-методическое пособие по дисциплине Экология и устойчивое развитие / – Астана: Изд-во ЕНУ
Евразийский национальный университет им Л Н Гумилева... Кафедра Управления и инжиниринга в сфере охраны окружающей среды...

Основы планирования. Теоретические основы управления проектами. Основы планирования. Планирование проекта в MS Project 7
Использованная литература В В Богданов Управление проектами в Microsoft Project Учебный курс Санкт Петербург Питер г...

Основы алгоритмизации и программирования
Основы алгоритмизации и программирования... Литература В И Юров Ассемблер Учебник для вузов Н И Голубь Искусство программирования на Ассемблере Лекции и упражнения...

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

ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
РЕСПУБЛИКИ БЕЛАРУСЬ... Учреждение образования... ВЫСШИЙ ГОСУДАРСТВЕННЫЙ КОЛЛЕДЖ СВЯЗИ ВИТЕБСКИЙ ФИЛИАЛ Кафедра программного обеспечения сетей телекоммуникаций...

0.045
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам