- •1. Структура (состав) языка
- •2. Алфавит
- •3. Лексическая структура языка
- •4. Структура программной единицы
- •5. Стиль записи программ на языке Паскаль
- •6. Типы данных в Паскале
- •6.3 Классификация типов данных в Турбо Паскале
- •6.4 Порядковые типы
- •6.4.2 Булевский (логический) тип
- •Repeat тело_цикла until (логическое_выражение);
- •6.4.3 Целые типы Выделяют целые типы ------------- со знаком – shortint, integer, longint)
- •1 Группа функций:
- •2 Группа функций:
- •3 Группа функций:
- •6.4.4 Перечисляемый тип.
- •6.4.6 Символьный тип
- •6.5 Вещественные типы.
- •7. Выражения в языке Паскаль.
- •10. Вычисление по формулам.
- •10.1 Оператор присваивания .
- •10.2 Характер использования переменных в математике и в программах.
- •10.3 Бесконечности
- •10.4 Нестандартные операции
- •6.6 Строки
- •1) Операции присваивания и сравнения.
- •3) Заполнение строки одним символом
- •4) Стандартные функции и процедуры для работы со строками:
- •5) Подпрограммы преобразования из строкового представления в числовое и наоборот:
- •8. Совместимость и преобразование типов.
- •Совместимость типов
- •8.2 Тип результата арифметических выражений.
- •8.3 Преобразование (приведение) типов и значений.
- •8.3.1 Явное преобразование (приведение) типов.
- •8.3.2 Неявное преобразование или приведение типов.
- •9. Простейший ввод-вывод на Паскале
- •Стандартные файлы Input и Output
- •9.2 Процедуры ввода информации (с клавиатуры.
- •9.3 Процедуры вывода в тр.
- •10. Вычисление по формулам (продолжение)
- •10.6. Уточнение многоместных (n - арных) операций
- •11. Средства языка Паскаль для циклов с известным числом повторений.
- •12. Табулирование функций
- •13. Разветвляющиеся алгоритмы
- •13.1 Таблица ситуаций и команда выбора.
- •13.2 Средства языка Паскаль для программирования разветствляющихся алгоритмов
- •13.4 Описание ситуаций
- •13.5 Запись команды выбора (case) (уточнение таблицы ситуаций) с помощью набора команд ветвления
- •13.6 Запись последовательных команд ветвления в случае, когда соседние зависимые ситуации имеют общие признаки.
- •13.6.1 Восходящий подход
- •13.6.2 Нисходящий подход
- •14. Циклы с неизвестным числом повторений
- •15. Структурированные типы данных. Массивы
- •15.1 Классификация (особенности) структурированных типов данных
- •15. 2. Определение массива
- •15.3 Объявление массива на Турбо Паскале
- •15.4 Хранение элементов массива. Доступ к элементам и частям массива
- •15.5 Уточнение команд обработки массива
- •16. Правила разработки цикла
- •15. 6 Действия над массивами
- •17. Множества.
- •17.1 Множества в Паскале и в математике. Сходства и различия между ними.
- •17.2 Объявление множества на Паскале
- •17.3 Присваивание значений множествам. Конструктор множества
- •17.4 Операции над множествами.
- •17.5 Сравнение множеств.
- •17.6 Применение множеств.
- •18. Вспомогательные алгоритмы (подпрограммы).
- •18.1 Три способа записи повторяющихся команд
- •18.2 Понятие блока
- •18.3 Объекты подпрограммы (то, над чем выполняются действия).
- •18.4 Свойства локальных и глобальных объектов
- •Свойства глобальных объектов:
- •18.5 Выделение памяти под локальные и глобальные переменные
- •18.6 Передача параметров в подпрограммы.
- •Фактические параметры
- •18.7 Подпрограммы, возвращающие значение (функции)
- •18.8 Особенности использования процедур и функций в Турбо Паскале
- •18.9. Побочный эффект (side effect)
- •18.10 Опережающее определение процедур и функций.
- •18.11 Рекурсия и итерация.
- •18.12 Процедуры и функции как параметры.
- •18.13 Директивы подпрограмм
- •Директива forward
- •Директивы far и near
- •Директива external
- •Директива assembler
- •Директива inline
- •Директива interrupt
- •Отладка и тестирование программ, содержащих подпрограммы
- •18.14.1 Нисходящее тестирование и подпрограммы-заглушки
- •18.14.2 Восходящее тестирование и программы-тестеры
- •18.14.3 Рекомендации по отладке программ, содержащих подпрограммы
- •18.14.4 Использование отладчика для трассировки процедур
- •18.14.5 Область действия идентификаторов и переменные в окне Watch
- •18.15. Получение доступа а параметрам командной строки, запуск внешних программ.
- •19. Записи.
- •19.1 Понятие записи. Объявление записи в программе.
- •19.2 Доступ к полям записи.
- •19.3 Оператор with
- •19.4 Действия над записями
- •19.5 Записи с вариантами
- •Замечание1:Порядок частей – именно такой, как показано: фиксированная часть всегда первая (или единственная)
- •19.6 Типизированные константы - записи
- •20. Модули (Unit)
- •20.1 Что такое модуль?
- •20.2 Зачем нужны модули и какие есть средства, аналогтчные (в какой-то мере) модулям
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Подключение других модулей к данному (модулю)
- •20.4 Ссылки на описания модуля
- •Пример создания модуля
- •Использование модулей. Режимы Compile, Build и Make при компиляции модулей
- •Косвенные и перекрестные ссылки на модули
- •Пример модуля (стек)
- •Модули и большие программы
10. Вычисление по формулам.
Часто при программировании вычислений, которые записываются в математической форме, возникают некоторые сложности. Некоторые из этих сложностей мы и рассмотрим.
10.1 Оператор присваивания .
Левая часть
Правая часть
Все вычисления по формулам основываются на использовании операторов присваивания, в котором выделяют правую часть и левую часть:
:= :=
l-value
В левой части может находиться то, подо что компилятор выделил память. Эта конструкция должна иметь адрес или имя (имя как синоним адреса переменной). В левой части оператора присваивания не могут находиться константы, потому что имена констант в процессе компиляции заменяются на соответствующие значения.
Const Var
A=2; B: byte;
begin
B:=2;
end.
А - имя константы, 2 - это его значение. На этапе компиляции имя константы будет заменено на ее значение так, что к моменту выполнения в программе от имени А не останется и следа.
Имя B является синонимом начала адреса этой области памяти, выделенной компилятором для переменной B, 2 - значение, размещаемое при выполнении оператора присваивания по адресу переменной B.
Read(A);
A:=B;
Нельзя писать в программах:
Write(A);
B:=А;
Read(В);
Можно писать в программах:
Выполнение оператора присваивания подчиняется следующим правилам:
В:=В+А
1) вначале вычисляются значения выражения в правой части с использованием текущих значений переменных, которые в нем встречаются (в том числе возможно и той переменной, которая находится и в левой части и в правой):
2) Вычисленное (в правой части0 значение пересылается в ту область памяти, которая выделена (компилятором) под переменную, находящуюся в левой части оператора присваивания (при этом старое значение этой переменной будет потеряно - оно будет заменено новым).
Для примера : пусть В равно 2; А равно 3; надо вычислить В:=В+А;
10.2 Характер использования переменных в математике и в программах.
В математике переменные имеют статический характер, т.е. за каждой переменной формулой закрепляется только одно значение. Так происходит потому, что переменные в математике памяти не имеют. Поэтому в математике под каждое значение выделяется отдельное имя. А в программах переменные имеют память, содержимое этой памяти может изменяться, и одна и та же (каждая) переменная в ходе (течении) выполнения программы может принимать разные значения (в разные моменты выполнения программы).
Поэтому в программах вместо
c := a + b;
можно писать
a := a + b;
если значение переменной a дальше хранить не нужно.
10.3 Бесконечности
При записи (вычислении) выражений надо учитывать точность (разрядность) результата и возможность получения бесконечностей.
Поэтому
- перед выполнением деления надо проверить знаменатель на ноль
- вычисление n! при n=100 скорее всего вызовет переполнение разрядной сетки для целочисленной переменной n.
10.4 Нестандартные операции
Иногда оказывается, что не все операции реализованы в выбранном языке программирования. В этих случаях их надо реализовывать самим (через другие операции):
ctg(x) --- 1/tg(x)
ax --- как? ----------a = elna -- ax = (elna)x = elna*x = exp(ln(a)*x). Эта формула может без ошибок применяться не во всех ситуациях:
a>0, x>0 – приведенная формула соответствует (применима) только (к) этой ситуации
a>0, x<0 необдуманное применение формулы в этих ситуациях приведет к ошибке
a<0, x>0 (при x<0 ax ≡ 1/ax, при a<0 логарифм от a не определен)
a<0, x<0
Если x > 0 и x - целое, то для вычисления ax можно поступить так:
var
s: longint; //результат ax
a: integer;
x: word;
i: word; //счетчик циклов
begin
s := 1; //инициализация результата ax
for i := 1 to x do
s := s*a;
......... a*a*a*a...*a
x раз
10.5 Индексы в математике и в программах.
В математике индексы обычно используются в одном из трех случаев:
для обозначения номеров элементов вектора:
Х1 Х2 Х3
Если вектор имеет имя Х, то под одним именем объединяются несколько значений
вектор с именем Х (на Паскале Var
x: array[1..10] of integer;
begin
Х1 - 1-й элемент вектора X x[1] := 5;
для обозначения номеров элементов последовательности промежуточных значений некоторой переменной. Например, пусть S1,S2,S3 промежуточные стадии переменной S (в которой в конце концов мы должны получить сумму элементов вектора Х)
n
S=
Xi
i=1
S1=X1
S2=S1+X2
S3=S2+X3
………….
когда индексы используются для комментария. Так в формуле для вычисления скорости
V := V0 + at
индекс 0 при переменной V0 означает общепринятое обозначение начального значения скорости. В этом смысле ноль является комментарием (символом начального значения).
Из трех выше рассмотренных случаев использования индексов необходимо два исключать (убирать индексы) при переводе программы с языка математики на язык алгоритма.
1) S = Xi
В данном случае если вспомнить правило выполнения оператора присваивания, то можно переписать выражение без лишних индексов, например, S2:=S1+X2 --> значение S1 нам дальше не потребуется --> S:=S+X2
Таким образом, надо будет заменить
S1=X1---------> S = X1
S2=S1+X2----> S = S + X2
S3=S2+X3----> S = S + X3
………….
Замечание: Индексы Х нужно использовать только если x – именно вектор. Если же Х1, Х2, ... – это разные значения одной и той же переменной (последовательности), то индексы у Х можно так же убрать, но на каждом шаге надо выполнять не одно, а два действия:
а) получение нового значения Х ------------- Х := Х + h; или Readln(x);
б) S := S + X
2) В случае использования индексов в качестве комментариев, их так же можно исключить благодаря дискретному характеру вычислений (в пределах одного и того же шага выполнения программы никогда V0 и V встретиться не могут, т.е. Vконечное и Vначальное – это разные значения одной и той же переменной V) можно заменить:
V=V0+AT V=V+AT
Вывод: при переводе программы алгоритмов с языка математики из трех случаев используемых индексов оставить только один, когда индекс используется в качестве элемента вектора.
