Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка по программироваю 2 семестр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.26 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ и НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Коломенский институт (филиал)

федерального государственного бюджетного образовательного учреждения высшего образования

«Московский политехнический университет»

Лабораторный практикум по дисциплине

«Программирование и основы алгоритмизации»

Основная образовательная программа высшего образования

27.03.04 «Управление в технических системах»

Академический бакалавриат

Направление подготовки:

«Управление в технических системах»

Нормативный срок освоения программы - 4 года

Ежегодно актуализируется и утверждается в составе ООП

на заседании Ученого совета института

Коломна

Содержание

Лабораторная работа № 1 Программирование алгоритмов линейной и разветвляющейся структур. 3

Лабораторная работа № 2 Программирование алгоритмов разветвляющейся и циклической структуры 14

Лабораторная работа № 4 Программирование с использованием подпрограмм пользователя 32

Лабораторная работа № 5 Обработка файловых структур данных 39

Лабораторная работа № 6 Множественный тип данных 51

Лабораторная работа № 7 Организация и использование статической библиотеки (Unit ) в Delphi. Использование списков выбора 57

Лабораторная работа №8 Графические средства в DELPHI 60

Приложение 1 Справка по работе с основным набором визуальных компонентов Delphi, требуемых при выполнении лабораторных работ 72

Список литературы 86

Лабораторная работа № 1 Программирование алгоритмов линейной и разветвляющейся структур.

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

Задания для самостоятельной подготовки

1. Изучить:

— запись констант, переменных, стандартных функций;

— правила записи арифметических выражений;

— арифметический оператор присваивания;

— организацию простейшего ввода-вывода данных.

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

2. Разработать алгоритм решения в соответствии с заданием 1.

3. Составить программу решения задачи.

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

5. Разработать алгоритм решения в соответствии с заданием 2.

6. Составить , отладить и протестировать программу решения задачи 2.

Теоретические сведения

Структура программы

Программа на языке Pascal состоит из заголовка, раздела описаний и раздела операторов.

Program Имя;

Заголовок программы

Label раздел меток

Const раздел констант

Type раздел типов

Var раздел переменных

Procedure раздел процедур

Function раздел функций

Раздел описаний

BEGIN

Оператор1;

Оператор2;

...

ОператорN;

END.

Раздел исполняемых операторов (тело программы)

Заголовок содержит служебное слово PROGRAM, имя программы, задаваемое программистом. Заканчивается заголовок символом ";" (точка с запятой).

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

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

После каждого описания ставится символ ";".

Раздел исполняемых операторов ("тело" программы) заключается в операторные скобки вида: BEGIN ("начать") и END ("окончить"), при этом после служебного слова END обязательно ставится точка. В разделе операторов записывается последовательность исполняемых операторов и каждый выражает действие, которое необходимо выполнить. Исполняемые операторы отделяются друг от друга символом ";".

Хороший стиль программирования требует:

  1. записывать слова PROGRAM, BEGIN, END с одинаковой позиции строки;

  2. по отношению к ним описания и операторы принято сдвигать вправо на 2-3 символа. Желательно сдвиг делать на одинаковое количество позиций от края или по отношению к предыдущему сдвигу.

Константы и переменные

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

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

В языке Pascal используются константы трех видов: числовые, булевские и символьные. Числовые константы предназначены для представления целых и вещественных чисел. Булевские константы используются для представления данных, имеющих смысл логических высказываний (булевские константы могут принимать лишь два значения). Символьные константы представляют данные, являющиеся последовательностями символов.

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

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

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

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

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

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

  2. структурированные (структурированный тип данных, или структуры) данные, в своей основе имеет один или несколько скалярных типов данных, к ним относятся: строки, массивы, множества, записи, файлы;

  3. процедурные и типа object (этим типам данных трудно поставить в соответствие данные в обычном понимании этого слова. Их названия отражают их базовые признаки и используются, как правило, в объектно-ориентированном программировании.

Рассмотрим некоторые скалярные (простейшие) типы данных.

  1. Диапазон значений типа Byte: 0..255. Над данными типа Byte допустимы следующие операции: + (сложение); + (одноместный (унарный) плюс); - (вычитание); - (одноместный (унарный) минус); * (умножение); DIV (деление (получение частного)); MOD (получение остатка (второй операнд должен быть положительным)); ShL (логический сдвиг влево); ShR (логический сдвиг вправо); =, <>, <, <=, >, >= - операции сравнения. При логическом сдвиге биты, оказавшиеся за пределами разрядной сетки кода, отбрасываются, а вместо недостающих устанавливаются нули.

  2. Диапазон значений типа Integer: -32768..32767. Над данными типа Integer допустимы те же операции, что и над данными типа Byte.

  3. Диапазон значений типа Word: 0..65535. Над типом Word допустимы те же операции, что и над данными типа Integer.

  4. Диапазон значений типа Real: 2.9E-39..1.7E+38 (по абсолютной величине). Данные типа Real имеют точность до одиннадцати значащих цифр. Над данными типа Real допустимы следующие операции: + (сложение); + (одноместный (или унарный) плюс); - (вычитание); - (одноместный (или унарный) минус); * (умножение); / (деление); =, <>, <, <=, >, >= (операция сравнения).

  5. Тип данных Char определяет множество символов с кодами ASCII. Над данными типа Char допустимы операции сравнения (=,<>,<,<=,>,>=).

  6. Данные типа Boolean могут принимать два значения: TRUE и FALSE. Над данными типа Boolean допустимы следующие операции: AND (логическое И); OR (логическое ИЛИ); XOR (логическое исключающее ИЛИ); NOT (логическое отрицание); =, <>, <, <=, >, >= (операции сравнения).

Встроенные константы

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

MaxInt: Integer - возвращает число 32767, наибольшее значение типа Integer;

PI: Real - возвращает число =3.14159265358.

Встроенные функции

Odd(A:Integer): Boolean - возвращает TRUE, если А нечётно;

Int(X:Real): Real - возвращает целую часть аргумента;

Round(X:Real): Integer - возвращает результат округления аргумента до ближайшего целого;

Trunc(X:Real): Integer - "отбрасывает" дробную часть аргумента;

Frac(X:Real): Real - возвращает дробную часть аргумента;

Abs(X:Real): Real - возвращает абсолютное значение аргумента;

Abs(X:Integer): Integer - возвращает абсолютное значение аргумента;

Random(A: Integer): Integer - возвращает случайное число из промежутка [0,A);

Ord(A:Char): Byte - возвращает код символа A;

Chr(A:Byte): Char - возвращает символ, код которого равен A.

UpCase(A:Char):Char - превращает строчные буквы латинского алфавита в соответствующие им прописные;

Sqr(X:Integer): Integer - возвращает квадрат аргумента;

Sqr(X:Real): Real - возвращает квадрат аргумента;

Sqrt(X:Real): Real - возвращает квадратный корень аргумента;

Exp(X:Real): Real - возвращает экспоненту аргумента;

Ln(X:Real): Real - возвращает логарифм аргумента;

Sin(X:Real): Real - возвращает синус аргумента;

Cos(X:Real): Real - возвращает косинус аргумента;

ArcTan(X:Real): Real - возвращает арктангенс аргумента.

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

ArcSin(x)=ArcTan(x/Sqrt(1-x*x));

ArcCos(x)=PI/2-ArcTan(x/Sqrt(1-x*x));

ArcCtg(x)=PI/2-ArcTan(x);

Logba=Ln(a)/Ln(b);

ax=Exp(x*Ln(a)), где a>0.

Процедуры ввода-вывода данных

Для организации ввода и вывода информации в языке программирования Pascal служат четыре процедуры: Read и ReadLn, Write и WriteLn. Эти процедуры являются "встроенными" в язык Pascal, поэтому для того, чтобы ввести информацию в оперативную память компьютера для дальнейшей обработки, программисту не надо писать специальную программу, а всего лишь нужно обратиться к процедуре Read или ReadLn. Соответственно, чтобы вывести информацию на дисплей из оперативной памяти компьютера, необходимо вызвать процедуру Write или WriteLn.

Процедуры ввода-вывода данных

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

Read (X,Y); ReadLn (X,Y);

где X, Y - переменные, описанные в разделе описания переменных.

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

Процедура вывода данных

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

Синтаксис процедуры Write и WriteLn:

"Слепой" вывод значений переменных.

Write (X,Y);

WriteLn (X,Y);

Вывод результата выражения.

Write (X+Y);

WriteLn (X+Y);

Форматированный вывод значения переменной

Write (X:6:2);

WriteLn (X:6:2);

Вывод некоторой фразы на дисплей

Write ('Фраза');

WriteLn ('Фраза');

Вывод фразы и значения переменной на экран

Write ('Фраза',Y);

WriteLn ('Фраза',Y);

где: 1) X, Y - переменные, значения которых нужно вывести на экран; 2) 'Фраза' - некоторый пояснительный текст, который обычно сопровождает значение переменной; 3) X:6:2 - указывается формат значения переменной. Это значит, что всего 6 символов, отводится под значение переменной X, причем после десятичной точки будет выведено на экран 2 символа. Это так называемый форматированный вывод числа с фиксированной точкой.

Оператор присваивания

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

Приведём примеры синтаксиса оператора присваивания:

Y:=2; X:='Строка'; P:=V1; Summa:=V2;

где:

(1) X,Y,P,Summa - имена переменных, описанных в разделе описания переменных;

(2) 2, 'Строка' - некоторые значения;

(3) V1, V2 - выражения, значения которых нужно вычислить.

Операторы ветвления

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

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

Оператор if выбирает между двумя вариантами развития событий:

if <условие>

then <один_оператор>

[else <один_оператор>];

Обратите внимание, что перед словом else (когда оно присутствует, конечно же) символ ";" не ставится - ведь это разорвало бы оператор на две части.

Условный оператор if работает следующим образом:

Сначала вычисляется значение <условия> - это может быть любое выражение, возвращающее значение типа boolean.

Затем, если в результате получена "истина" (true), то выполняется оператор, стоящий после ключевого слова then, а если "ложь" (false) - без дополнительных проверок выполняется оператор, стоящий после ключевого слова else. Если же else-ветвь отсутствует, то не выполняется ничего.

Что же произойдет, если написать несколько вложенных операторов if?

В случае, когда каждый оператор if имеет собственную else-ветвь, все будет в порядке. А вот если некоторые из них этой ветви не имеют, может произойти ошибка. Компилятор языка Pascal всегда считает, что else относится к самому ближнему оператору if. Таким образом, если написать

if i>0 then if s>2

then s:= 1

else s:= -1;

подразумевая, что else-ветвь относится к внешнему оператору if, то компилятор все равно воспримет эту запись как

if i>0 then if s>2

then s:= 1

else s:= -1

else;

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

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

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

if i>0 then if s>2

then s:=1

else

else s:=-1;

либо так:

if i>0 then begin if s>2

then s:=1

end

else s:=-1;

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

Оператор выбора case

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

case <переключатель> of

<список_констант> : <один_оператор>;

[<список_констант> : <один_оператор>;]

[<список_констант> : <один_оператор>;]

[else <один_оператор>;]

end;

Замечание: Обратите внимание, что после else двоеточие не ставится.

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

  1. Переключатель должен относиться только к порядковому типу данных, но не к типу longint.

  2. Переключатель может быть переменной или выражением.

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

  4. Повторение констант не допускается.

  5. Тип переключателя и типы всех констант должны быть совместимыми1).

Пример оператора выбора:

case symbol(* :char *) of

'a'..'z', 'A'..'Z' : writeln('Это латинская буква');

'а'..'я', 'А'..'Я' : writeln('Это русская буква');

'0'..'9' : writeln('Это цифра');

' ',#10,#13,#26: writeln('Это пробельный символ');

else writeln('Это служебный символ');

end;

Выполнение оператора case происходит следующим образом:

  1. вычисляется значение переключателя;

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

  3. если такой список найден, то дальнейшие проверки уже не производятся, а выполняется оператор, соответствующий выбранной ветви, после чего управление передается оператору, следующему за ключевым словом end, которое закрывает всю конструкцию case;

  4. если подходящего списка констант нет, то выполняется оператор, стоящий за ключевым словом else. Если else-ветви нет, то не выполняется ничего.

Задание 1

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

Таблица 1.1

Вариант

задания

Расчетные формулы

Пример значений исходных

данных

1

2

3

4

5

6

7

8

9

10

Задание 2

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

варианта

Расчетные формулы

Условие

Исходные данные

1

a= -0,5

b= 2

2

a= 1,5

3

a= 2,8

b=0,3

c = 4

4

a= 1,65

5

a= 2,3

6

a= 2,5

7

b= 1,5

8

9

a= 20,3

10

t= 2,2

11

a= 2,6

b= 0,39

12

a= 0,9

13

a= 2,1

b = 1,8

c = 20,5

14

a= 0,3

n = 10

15

a= 2,5

b = 0,4

Контрольные вопросы

1. Какие типы величин используются в языке программирования?

2. Указать диапазон значений величин целого и действительного типов.

3. Какие имена переменных допустимы в программе? Как задать тип переменной в программе?

4. Указать имена стандартных функций для вычисления

, ex, sin x, ln x, .

5. Можно ли в качестве операнда в арифметическом выражении использовать: а) имя массива; б) имя стандартной функции, например SIN(Y); в) имя символьной переменной или переменной логического типа?

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

7. Указать старшинство выполнения операций при вычислении арифметического выражения.

8. Указать средства, имеющиеся в языке программирования для управления размещением данных на строке. Как организовать вывод значений, сопровождая выводимое числовое значение наименованием переменной? Как организовать пропуск одной, двух строк при выводе? 1. Перечислить действия, реализуемые при выполнении условного оператора.

9. Что такое вычислительный процесс разветвляющейся структуры? Как организовать разветвление вычислений: а) на две ветви; б) на три ветви?

10. Зачем необходимо при отладке программы тестировать все ветви алгоритма?

11. Как выбрать значения исходных данных для тестового варианта счета?