Скачать программы Все программы автораЛАБОРАТОРНАЯ РАБОТА 1ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ И РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫЦель работы: выработать практические навыки работы с системой TURBO Pascal, научиться создавать, вводить в компьютер, выполнять и исправлять простейшие программы на языке Pascal в режиме диалога, познакомиться с диагностическими сообщениями компилятора об ошибках при выполнении линейных программ и программ, реализующих алгоритмическую структуру "ветвление" (содержащую операторы If...then... else... и Case). ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Структура программы
Программа на языке Pascal состоит из заголовка , раздела описаний и раздела операторов . PROGRAM Имя (Input,Output); Заголовок программы label - раздел меток const - раздел констант type - раздел типов Раздел описаний var - раздел переменных procedure - раздел процедур function - раздел функций BEGIN Оператор 1 ; Оператор 2 ; Раздел операторов ... (тело программы) Оператор n END. Заголовок содержит служебное слово PROGRAM, имя программы, задаваемое программистом, и в круглых скобках имена стандартных процедур Input, Output для связи программы с внешними устройствами ввода-вывода. Заканчивается заголовок символом ";" (точка с запятой). Раздел описаний предназначен для объявления всех встречающихся в программе данных и их характеристик (имена данных, их тип, возможные значения). Этот раздел содержит следующие подразделы: объявление меток, констант, типов, переменных, объявление процедур и функций. Порядок расположения разделов не важен и описания могут повторяться. Объявление процедур и функций является одним разделом. Следует заметить, что не все перечисленные разделы обязательны в программе. В простых программах могут потребоваться, например, только разделы описания констант и переменных. После каждого описания ставится символ ";". Раздел операторов("тело" программы) заключается в операторные скобки вида: BEGIN ("начать") и END ("окончить"), при этом после служебного слова END обязательно ставится точка. В разделе операторов записывается последовательность исполняемых операторов и каждый выражает действие, которое необходимо выполнить. Исполняемые операторы отделяются друг от друга символом ";". Хороший стиль программирования требует: (1) записывать слова PROGRAM, BEGIN, END с одинаковой позиции строки; (2) по отношению к ним описания и операторы принято сдвигать вправо на 3 символа. Желательно сдвиг делать на одинаковое количество позиций от края или по отношению к предыдущему сдвигу.
Константы и переменные В зависимости от способа хранения в компьютере данные можно разделить на две группы: константы и переменные . В программе они определяются идентификаторами (именами), по которым к ним можно обратиться для получения текущего значения. Константы - это данные, значения которых не изменяются в процессе работы программы. Константы "узнаются" компьютером по форме их записи. В языке Pascal используются константы трех видов: числовые, булевские и символьные Числовые константы предназначены для представления числовых данных (целых и вещественных). Булевские константы используются для представления данных, имеющих смысл логических высказываний (да-нет, истина-ложь). Символьные константы представляют данные, являющиеся последовательностями символов. Значения переменных , в отличие от констант, могут изменяться во время выполнения программы. Переменные "узнаются" компьютером по именам (идентификаторам), более того с каждой переменной программы связывается одна и только одна ее характеристика, называемая типом Тип - это множество значений переменной вместе с множеством операций, которые можно выполнять над элементами этого множества. Приписывая переменной некоторый тип, мы тем самым явно определяем множество значений, которые можно присвоить этой переменной, а также операции, с помощью которых можно манипулировать ее значениями. Число отдельных значений, принадлежащих некоторому типу, называется мощностью типа . Так, например, мощность типа Boolean есть 2. В языке программирования Pascal принято все типы данных разделять на три группы: (1) простейшие , или скалярные (к скалярным типам данных относятся типы данных таких величин, значения которых не содержат составных частей, т.е. простейшие типы: целочисленный, вещественный, логический, символьный, перечисляемый, интервальный (тип диапазон) и ссылочный); (2) структурированные ( структурированный тип данных, или структуры данных, в своей основе имеет один или несколько скалярных типов данных, к ним относятся: строки, массивы, множества, записи, файлы); (3) процедурные и типа object . (этим типам данных трудно поставить в соответствие данные в обычном понимании этого слова. Их названия отражают их базовые признаки и используются, как правило, в объектно-ориентированном программировании, которое поддержано старшими версиями языка Pascal. Понимание работы с этими типами данных требует наличие определенного опыта и навыков программирования). Рассмотрим некоторые скалярные (простейшие) типы данных. 1. Диапазон значений типа Byte: 0..255. Над данными типа Byte допустимы следующие операции: сравнения (= ,<> ,< ,<= ,> ,>= ); При логическом сдвиге биты, оказавшиеся за пределами разрядной сетки кода, отбрасываются, а вместо недостающих устанавливаются нули. 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 допустимы следующие операции : сравнения ( =, <>, <, <=, >, >=); Заметим, что ниже Вам встретятся и другие простейшие типы данных, не включенные в данную классификацию.
Встроенные константы В языке Pascal есть ряд констант, к значениям
которых можно обращаться без предварительного определения. Их называют
встроенными (или зарезервированными). Перечислим некоторые из них:
Встроенные функции Odd (A:Integer): Boolean - возвращает
TRUE, если А нечетно; Для вычисления значений других функций
следует пользоваться тождествами: Процедуры ввода-вывода данных Для организации ввода и вывода информации в языке программирования Pascal служат четыре процедуры: Read и ReadLn, Write и WriteLn. Эти процедуры являются "встроенными" в язык Pascal, поэтому для того, чтобы ввести информацию в оперативную память компьютера для ее дальнейшей обработки, программисту не надо писать специальную программу, а всего лишь нужно правильно обратиться к процедуре Read или ReadLn. Соответственно, чтобы вывести информацию на дисплей из оперативной памяти компьютера, необходимо вызвать процедуру Write или WriteLn.
1. Процедура ввода информации Синтаксис процедуры Read и ReadLn: Отметим, что указанные процедуры Read и ReadLn аналогичны, единственное отличие заключается в том, что после ввода значений переменных, указанных в списке процедуры ReadLn, ввод значений переменных, указанных в списке следующей процедуры ReadLn, будет производится с новой строки. Этого не происходит в ходе выполнения процедуры Read, т.е. ввод осуществляется на той же строке. Таким образом, процедура ReadLn не только вводит значения указанных переменных, но еще и переводит курсор на новую строку. Это позволяет делать суффикс Ln.
2. Процедура вывода информации. Синтаксис процедуры 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 - переменные, значения которых
нужно вывести на экран;
Оператор присваивания Оператор присваивания (:=)
предписывает выполнить выражение, заданное в его правой части, и присвоит
результат переменной, имя которой указано в левой его части. Переменная
и выражение должны быть совместимы по типу. Его синтаксис:
Пустой оператор Пустой оператор не обозначается
и не вызывает никаких действий. Пустой оператор - это просто символ ";" (точка
с запятой) в программе. Операторы отделяются друг от друга символом "точка
с запятой" (;). Поэтому точку с запятой часто называют разделителем .
Если разделитель между двумя операторами отсутствует, то это приведет
к возникновению ошибки, поскольку компилятор часто не может "понять",
что же хотел сказать автор программы. Пусть, например, записано Несмотря на то, что операторы присваивания
записаны на разных строчках, компилятор будет воспринимать эту запись
как В итоге получается "оператор", в котором используются два знака присваивания и неправильный идентификатор 1y (идентификатор не может начинаться с цифры).
Составной оператор Составной оператор представляет
собой группу из произвольного числа операторов, отделенных друг от друга
точкой с запятой, и ограниченную операторными скобками -
зарезервированными словами в языке Pascal - begin и end : Поэтому приведенный оператор можно мысленно представить в таком виде: . Составной оператор используется в том случае, если необходимо выполнить последовательность операторов внутри какой-либо конструкции как единое целое.
Операторы условного перехода (If, Case) Операторы условного перехода позволяют выбрать для исполнения один из нескольких операторов-компонентов в зависимости от условия. 1. Оператор If Его
синтаксис: If A
then else ;
где: 1) A - булевское выражение (возвращающее
TRUE или FALSE); Если значение выражения A - TRUE, то выполняется
оператор ;если значение
выражения A - FALSE, то выполняется оператор Затем,
в обоих случаях управление передается следующему оператору программы.
Допускается и краткая форма условного оператора : 1) A - булевское выражение; Если значение A - TRUE, то выполняется оператор ST. Если значение A - FALSE, то управление передается оператору, следующему за оператором IF. Обычно при написании программы не рекомендуется использовать многократно вложенные друг в друга условные операторы - программа становится громоздкой и трудно понимаемой. Считается, что число уровней вложения не должно превышать двух-трех. Но как быть, если необходимо проверять достаточно много условий и в зависимости от них выполнять те или иные действия? Для этих целей в языке Pascal существует специальный оператор выбора Case . 2. Оператор выбора Case Его синтаксис:
end;
Отметим, что переключатель и метки должны быть одного и того же скалярного типа (но не тип Real!). Оператор Case передает управление тому оператору , с одной из меток которого совпало значение селектора N, а затем - на следующий за end оператор. Если значение селектора N не совпало ни с одной из меток, то исполняется оператор, следующий за зарезервированным словом end.
ПРИМЕРЫ Пример 1. Вывести на экран дисплея предложение: "Это наша первая программа на языке Pascal!" PROGRAM Primer_1; BEGIN WriteLn ('Это наша первая программа на языке Pascal!'); END. Пример 2. Демонстрация операций над данными типа Byte . PROGRAM Primer_2; var x: Byte; { Первый аргумент } y: Byte; { Второй аргумент } z: Byte; { Результат операции } BEGIN Write ('Введите значения двух переменных типа Byte... '); Read (x,y); z:=x+y; WriteLn ('x + y -> ',z); z:=x-y; WriteLn ('x - y -> ',z); z:=x*y; WriteLn ('x * y -> ',z); z:=x DIV 2; WriteLn ('x DIV 2 -> ',z); z:=x MOD 2; WriteLn ('x MOD 2 -> ',z); z:=x ShL 2; WriteLn ('x ShL 2 -> ',z); z:=y ShR 1; WriteLn ('y ShR 1 -> ',z); WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x>=y -> ',x>=y) END. Пример 3. Демонстрация операций над данными типа Word. PROGRAM Primer_3; var x: Word; { Первый аргумент } y: Word; { Второй аргумент } z: Word; { Результат операции } BEGIN Write ('Введите значения двух переменных типа Word... '); Read (x,y); z:=x+y; WriteLn ('x + y -> ',z); z:=x-y; WriteLn ('x - y -> ',z); z:=x*y; WriteLn ('x * y -> ',z); z:=x DIV 2; WriteLn ('x DIV 2 -> ',z); z:=x MOD 2; WriteLn ('x MOD 2 -> ',z); z:=x ShL 2; WriteLn ('x ShL 2 -> ',z); z:=y ShR 1; WriteLn ('y ShR 1 -> ',z); WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x>=y -> ',x>=y) END. Пример 4. Демонстрация операций над типом Integer. PROGRAM Primer_4; var x: Integer; { Первый аргумент } y: Integer; { Второй аргумент } z: Integer; { Результат операции } BEGIN Write ('Введите значения двух переменных типа Integer... '); Read (x,y); z:=x+y; WriteLn ('x + y -> ',z); z:=x-y; WriteLn ('x - y -> ',z); z:=x*y; WriteLn ('x * y -> ',z); z:=x DIV 2; WriteLn ('x DIV 2 -> ',z); z:=x MOD 2; WriteLn ('x MOD 2 -> ',z); z:=x ShL 2; WriteLn ('x ShL 2 -> ',z); z:=y ShR 1; WriteLn ('y ShR 1 -> ',z); WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x>=y -> ',x>=y) END. Пример 5. Демонстрация операций над типом Real. Операции с переменными типа Real реализуются программно, т.е. математический сопроцессор в этом случае не используется PROGRAM Primer_5; var x: Real; { Первый аргумент } y: Real; { Второй аргумент } z: Real; { Результат операции } BEGIN Write ('Введите значения двух переменных типа Real... '); Read (x,y); z:=x+y; WriteLn ('x + y -> ',z); z:=x-y; WriteLn ('x - y -> ',z); z:=x*y; WriteLn ('x * y -> ',z); z:=x/2; WriteLn ('x/2 -> ',z); { Операцию отношения "=" не используйте для типа Real } WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x>=y -> ',x>=y) END. Пример 6. Демонстрация операций над типом Char. PROGRAM Primer_6; var x,y: Char; BEGIN Write ('Введите значения двух переменных типа Char... '); Read (x,y); WriteLn ('x = ',x); WriteLn ('y = ',y); WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x<y -> ',x<y) END. Пример 7. Демонстрация операций над типом Boolean. PROGRAM Primer_7; var x,y,z: Boolean; BEGIN Write ('Введите значения двух переменных типа Boolean... '); Read (x,y); x:=TRUE; y:=FALSE; WriteLn ('x = ',x); WriteLn ('y = ',y); z:=NOT x; WriteLn ('NOT x -> ',z); z:=x AND y; WriteLn ('x AND y -> ',z); z:=x OR y; WriteLn ('x OR y -> ',z); z:=x XOR y; WriteLn ('x XOR y -> ',z); WriteLn ('x=y -> ',x=y); WriteLn ('x<>y -> ',x<>y); WriteLn ('x>y -> ',x>y) END. Пример 8. Демонстрация вычисления значений стандартных функций: UpCase, Ord и Chr PROGRAM Primer_8; var x: Char; BEGIN Write ('Введите значение аргумента типа Char: '); ReadLn (x); WriteLn ('UpCase (x) -> ',UpCase (x)); WriteLn ('Ord (x) -> ',Ord (x)); WriteLn ('Chr (65) -> ',Chr (65)) END. Пример 9. PROGRAM Primer_9; (* Демонстрация вычисления значений элементарных функций *) var X: Real; { Аргумент } Y: Real; { Аргумент } Z: Integer; { Аргумент } F: Real; { Результат } BEGIN WriteLn ('Значение MaxInt: ',MaxInt); WriteLn ('Значение Пи: ',PI); Write ('Введите значение аргумента: '); ReadLn (X); WriteLn ('Trunc (X) -> ',Trunc (X)); WriteLn ('Int (X) -> ',Int (X)); WriteLn ('Frac (X) -> ',Frac (X)); F:=Abs (X); WriteLn ('Значение функции Abs : ',F); F:=Sqrt (X); WriteLn ('Значение функции корень: ',F); F:=Exp (X); WriteLn ('Значение функции Exp : ',F); F:=Ln (X); WriteLn ('Значение функции Ln : ',F); { Аргумент тригонометрических функций выражен в радианах } F:=Sin (X); WriteLn ('Значение функции Sin : ',F); F:=Cos (X); WriteLn ('Значение функции Cos : ',F); F:=ArcTan (X); WriteLn ('Значение функции ArcTg: ',F); { ------------------------------------------------------------- } Write ('Введите значение аргумента: '); ReadLn (Y); F:=Exp (Y*Ln(X)); WriteLn ('Значение функции X^Y : ',F); { ------------------------------------------------------------- } Write ('Введите значение аргумента типа Integer: '); ReadLn (Z); WriteLn ('Odd (Z) -> ',Odd (Z)) END. Пример 10. Определить большее из двух целых чисел X и Y. PROGRAM Primer_10; var X : Integer; { Первый аргумент } Y : Integer; { Второй аргумент } Bolshee: Integer; { Результат } BEGIN Write ('Введите первое число: '); ReadLn (X); Write ('Введите второе число: '); ReadLn (Y); If X>=Y then Bolshee:=X else Bolshee:=Y; WriteLn ('Результат: ',Bolshee) END. Пример 11. Напишите программу, переводящую школьные отметки в оценки. PROGRAM Primer_7; var BALL : Integer; BEGIN Write ('Введите величину отметки: '); Read (BALL); WriteLn; Case BALL of { Перевод отметки в оценку } 1: WriteLn ('Очень плохо...'); 2: WriteLn ('Плохо...'); 3: WriteLn ('Удовлетворительно...'); 4: WriteLn ('Хорошо!'); 5: WriteLn ('Отлично!') END. ЗАДАЧИ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ
1. Вычислить высоту треугольника, опущенную на сторону а, по известным значениям длин его сторон a, b, c. 2. Определить координату середины отрезка (a,b), если a=0.5, b=2. 3. Вычислить объем цилиндра с радиусом основания r и высотой h. 4. Определить расстояние, пройденное физическим телом за время t, если тело движется с постоянным ускорением а и имеет в начальный момент времени скорость 5. Определить время свободного падения физического тела с высоты H. 6. Вычислить площадь треугольника по формуле Герона, если заданы его стороны. 7. Найти действительные корни квадратного уравнения вида . (если действительных корней нет, то выдать соответствующее сообщение). 8. Определить и вывести на печать номер квадранта, в котором расположена точка М(x,y), x и y заданные вещественные числа. 9. Из величин, определяемых выражениями при заданном х, определить и вывести на экран дисплея минимальное значение. 10. Определить, какая из двух точек - или - расположена ближе к началу координат. Вывести на экран дисплея координаты этой точки. 11. Определить, какая из двух фигур (круг или квадрат) имеет большую площадь. Известно, что сторона квадрата равна а, радиус круга r. Вывести на экран название и значение площади большей фигуры. 12. Определить, попадает ли точка М(X,Y) в круг радиусом r с центром в точке . 13. По данным сторонам прямоугольника вычислить его периметр, площадь и длину диагонали. 14. Вычислить площадь прямоугольного треугольника,
а также: 15.Определить координаты вершины параболы . Коэффициенты a,b,c заданы. 16. Определить расстояние на плоскости между двумя точками с за- данными координатами и . 17. Даны действительные числа a, b, c, x, y. Выяснить, пройдет ли кирпич с ребрами a,b,c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия. 18. Сможет ли шар радиуса R пройти в ромбообразное отверстие со стороной P и острым углом Q? 19. Проверить, можно ли из четырех данных отрезков составить параллелограмм. 20. Студент начал решать задачи данного урока программирования, когда электронные часы показывали часов и минут, а закончил, когда было часов и минут. Составьте программу, позволяющую определить, сколько времени студент решал эти задачи. (Будем считать, что задачи решались не дольше суток.) |