Студопедия
Главная страница | Контакты | Случайная страница

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

Процедурные типы

Читайте также:
  1. Процедурные правила
  2. Процедурные технологии: медиация.
  3. Процедурные технологии: фасилитация.

 

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

идентификатор типа = определение типа;

30. Для обозначения текущих значений данных используются константы – числовые, текстовые, логические.

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

Пример. В языке Паскаль – типы определяются ключевыми словами integer, real, char, string, boolean. Каждый тип данных допускает использование определенных операций со значениями типа ("с типом").

Для текстового (литерного) типа данных можно использовать еще и операцию конкатенации (присоединения справа) текстов "+". Например, "аб"+"ба" даст новый текст "абба". Для данных логического типа определены логические операции и отношения сравнения. Например, на Паскале для логических переменных a, b, c можно записать корректное выражение: a and b or (c not a). Текстовые (символьные) константы обычно заключают в апострофы.

 

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

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

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

year: integer = 2001;
symb: char = ‘?’;
money: real = 57.23;

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

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

Y

(а + b) * с

sin(t)

а > 2

not Flag and (а = b)

NIL

[1, 3..7] * set1

32. Оператор присваивания - основной оператор любого языка программирования. Общая форма записи оператора:

имя величины:= выражение

Например, V:=A; или V:=A+1;

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

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

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

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

34. В Турбо Паскале определены следующие операции:

унарные not, @;

мультипликативные *, /, div, mod, and, shl, shr;

аддитивные +, -, or, xor;

отношения =, <>, <, >, <=, >=,in.

Приоритет операций убывает в указанном порядке, т.е. наивысшим приоритетом обладают унарные операции, низшим - операции отношения. Порядок выполнения нескольких операций равного приоритета устанавливается компилятором из условия оптимизации кода программы и не обязательно слева направо. При исчислении логических выражений операции равного приоритета всегда вычисляются слева направо, причем будут вычисляться все или только достаточные операции в зависимости от установленной в среде Турбо Паскаля опции OPTIONS/COMPILER/ COMPLETE BOOLEAN EVAL: при установленном значении этой опции вычисляются все операции отношения, при не установленном - только те, которые достаточны для получения результата.

35.

Если вы помните, при рассмотрении примера работы оператора присваивания мы столкнулись с необходимостью узнать результат выполнения программы. Мы разобрались с тем, как информацию сохранять (в переменных), как обрабатывать (с использованием выражений), но два фундаментальнейших информационных процесса остались вне нашего внимания: получение информации и передача ее во внешний по отношению к компьютеру мир. Пока наши программы могут использовать лишь информацию, которая находится непосредственно в тексте программы. Узнать, какие значения в данный момент имеют переменные, также не представлялось возможным. Программирование в таких условиях теряет смысл. Взаимодействие устройств обработки и хранения информации с внешней средой (хотя бы с пользователем) является совершенно необходимым. За такой интерфейс в языке Паскаль отвечают операторы ввода-вывода информации. Эти инструкции позволяют ввести аргументы, параметры расчетов во время выполнения программы (а не на этапе ее написания), осуществить вывод рассчитанных данных в понятном человеку виде. Сначала операторы ввода (форматы операторов): Read(<Список ввода>); Readln(<Список ввода>); В таком формате эти команды позволяют вводить данные в переменные во время выполнения программы с клавиатуры. Элементами списка ввода могут быть имена переменных, которые должны быть заполнены значениями, введенными с клавиатуры. Выполнение операторов ввода происходит так: ход программы приостанавливается, на экран выводится курсор, компьютер ожидает от пользователя набора данных для переменных, имена которых указаны в списке ввода. Пользователь с клавиатуры вводит необходимые значения в том порядке, в котором они требуются списком ввода, нажимает Enter. После этого набранные данные попадают в соответствующие им переменные и выполнение программы продолжается. Примечание: данные при вводе разделяются пробелами. Разница между работой процедур Read и Readln (от Read line) состоит в следующем: после выполнения Read значение следующего данного считывается с этой же строчки, а после выполнения Readln - с новой строки. Для вывода информации в Паскале также есть две команды: Write(<Список вывода>); Writeln(<Список вывода>); Такой формат использования Write и Writeln позволяет выводить на экран монитора данные из списка вывода. Элементами списка вывода могут являться имена переменных, выражения, константы. Прежде чем вывести на экран компьютер значения выражений сначала вычислит. Элементы списка, также как и в операторах ввода, разделяются запятыми. Различие между двумя операторами вывода таково: после выполнения оператора Writeln (от Write line) происходит переход на новую строчку, а после выполнения инструкции Write, переход на новую строчку не происходит и печать по последующим командам вывода Write или Writeln будет происходить на той же строчке. При вызове оператора Writeln без параметров просто происходит переход на новую строчку.   Эта программа запрашивает у пользователя значение радиуса круга, обеспечивает возможность ввести его значение, рассчитывает и выводит на экран величину площади круга с таким радиусом. Таким образом, появляется возможность, не внося изменений в текст программы, вводить различные значения радиуса и получать, соответствующие им значения площади круга. Для этого достаточно несколько раз запустить программу. Также эта программа демонстрирует следующее правило: выдача результатов должна быть прокомментирована так, чтобы был ясен смысл напечатанных чисел. Действительно, ведь можно было бы ограничиться Writeln(S), но значение выведенного программой числа в этом случае было бы ясно только тому, кто эту программу написал.

36.

Если условие выполняется, то будет выполнена инструкция "1", если нет, то - инструкция "2". Несмотря на то, что в схеме присутствуют два действия, выполнено будет только одно, так как условие либо ложно, либо истинно. Третьего не дано. Такая схема позволяет решать задачи, в которых в зависимости от сложившихся обстоятельств требуется совершить то или иное действие. Нет никакого сомнения, что число задач такого рода огромно. Более того, очень сложно придумать реально значимое задание, алгоритм выполнения которого содержал бы в себе простое прямое следование команд. Даже примитивный пример, взятый из курса математики, как вы увидите, не может быть решен без использования ветвления. Итак, необходимо вычислить значение выражения y=1/x. Вам известно, что данная функция не всегда имеет значение, то есть не для всех значений аргумента существует значение результата. Наша задача так составить алгоритм, чтобы исполнитель ни в коем случае не встал в тупик, даже при получении нуля в качестве аргумента. Сформулировать это на естественном языке не трудно:
1. Получить значение x.
2. Если x=0, то сообщить, что выражение значения не имеет, иначе - вычислить y как 1/x.

Таким образом используется приведенная выше алгоритмическая структура. Она может быть выражена простыми словами:
Если <усл.> {Если выполняется условие}
то <действие 1> {то выполнить действие № 1 }
иначе <действие 2> {иначе - выполнить действие № 2 }
все

Как это записать на Паскале? Да точно так же, только по-английски.

Формат условного оператора на языке Паскаль:
If <условие>
Then <оператор 1>
Else <оператор 2>;

Обратите внимание на то, что в Then - и Else - части стоит только один оператор. Но что делать, чтобы решить задачу, в которой по выполнению или невыполнению условия нужно совершить не одно, а несколько действий? Здесь приходит на помощь уже известный вам составной оператор. В операторные скобки можно заключить любое количество операторов.

Вариант условного оператора в этом случае:
If <условие>
Then Begin <группа операторов 1> end
Else Begin < группа операторов 2> end;

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

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

В простых условиях могут применяться знаки операций сравнения: >(больше), <(меньше), =(равно), <>(не равно), >=(больше или равно), <=(меньше или равно).

Примеры простых условий: A=5 {Значение переменной А равно 5}
(C+D3)>=(D1*(45-2)) {Значение выражения в левой части больше либо равно значению выражения из правой части}
S<>'ABC' {Значение переменной S не равно строковой константе 'ABC'}

Приведем пример решения еще одной задачи: "Из двух чисел выбрать наибольшее".

На первый взгляд решение очевидно, но оно не столь тривиально, как кажется.

Program Example;
Var A,B,C: Real; {A,B - для хранения аргументов, C - результат}
Begin

Writeln ('Введите два числа');
Readln (A,B); {Вводим аргументы с клавиатуры}
If A>B Then C:=A Else C:=B; {Если A>B, то результат - A, иначе результат - B}
Writeln (C); {Выводим результат на экран}

End.

Еще один классический пример: "По заданным коэффициентам решить квадратное уравнение". Эта задача сложнее, поэтому перед тем как писать программу составим алгоритм, записав его в виде блок-схемы.Сначала вводим коэффициенты, затем вычисляем дискриминант. Теперь возникает две возможности: либо отсутствие действительных корней в случае отрицательного дискриминанта, либо эти корни можно все-таки вычислить и вывести на экран в случае неотрицательного дискриминанта (случай равенства дискриминанта нулю входит сюда же, корней - два, только они одинаковые J).

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

 


Program Sq1;
Var A, B, C, D, X1, X2: Real;
Begin

Writeln ('Введите коэффициенты квадратного уравнения');
Readln (A,B,C);
D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else
Begin

X1:=(-B+SQRT(D))/2/A;
X2:=(-B-SQRT(D))/2/A;
Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)

End

End.

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

Для иллюстрации решим еще одну задачу: "решить уравнение вида A*x^2 + B*x + C = 0". Прошу не путать с квадратным уравнением, для которого нам было известно, что коэффициент А не равен нулю. Здесь же коэффициенты могут быть любыми числами. Исходя из элементарных математических рассуждений, получаем следующий алгоритм:

 

Program Sq2;
Var A, B, C, D, X, X1, X2: Real;
Begin

Writeln ('Введите коэффициенты уравнения (A, B, C) ');
If A=0 Then
If B=0 Then

If C=0 Then Writeln('X - любое число')
Else Writeln('Корней нет! ')

Else Begin X:=-C/B; Writeln('X=',X:8:3) End
Else
Begin

D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else
Begin

X1:=(-B+SQRT(D))/2/A;
X2:=(-B-SQRT(D))/2/A;
Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)

End

End

End.

 




Дата добавления: 2015-01-30; просмотров: 178 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.012 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав