- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования Pascal
- •Основные элементы языка
- •Переменные. Стандартные типы.
- •Операции отношения
- •Раздел описаний переменных
- •Выражения. Порядок выполнения операций.
- •Константы
- •Комментарии в программе
- •Операторы
- •2.1.7.1. Оператор присваивания
- •2.1.7.2. Операторы ввода/вывода
- •2.1.7.3. Операторы инкремента и декремента
- •Среда разработки Lazarus
- •Русский язык в консольных приложениях
- •Первая программа
- •Открытие существующего проекта
- •Другие способы создания консольных приложений
- •Типовой пустой проект
- •Операции с целыми числами
- •Вместо лирического отступления 2
- •Стандартные функции с целыми аргументами
- •Операции с вещественными числами (тип real).
- •Форматирование вывода
- •Одновременное использование вещественных и целых чисел.
- •Другие стандартные функции с вещественными аргументами
- •Булевы переменные
- •Условные операторы.
- •2.1.22.1 Оператор if …. then
- •2.1.22.2. Оператор if …then ... else
- •Операторы цикла
- •2.1.23.1. Оператор цикла с предусловием
- •2.1.23.2. Оператор цикла с постусловием
- •2.1.23.3. Оператор цикла с параметром.
- •2.1.23.4. Второй вариант оператора цикла с параметром
- •Оператор выбора case
- •Организация простейшего контроля ввода данных.
- •Вычисление сумм сходящихся рядов
- •Реализация некоторых алгоритмов главы 1.
- •Программа решения задачи о поездах и мухе
- •Программа вычисления определенного интеграла
- •Более сложные элементы языка
- •Общая структура Паскаль – программы
- •Процедуры и функции
- •3.1.1.1 Структура процедуры
- •3.1.1.2. Структура функции
- •3.1.1.3 Глобальные и локальные переменные
- •3.1.1.4 Способы передачи параметров
- •3.1.1.5 Процедуры завершения
- •Еще раз о типах данных
- •Классификация типов данных
- •3.2.1.1 Целый тип
- •3.2.1.2. Интервальный тип
- •3.2.1.3. Перечислимый тип
- •3.2.1.4. Множества
- •3.2.1.5. Логический тип
- •3.2.1.6. Вещественный тип
- •3.2.1.7. Указатели
- •Обработка символьной информации в Паскале
- •Символьные и строковые типы данных.
- •3.3.1.1. Тип Char
- •3.3.1.2. Функции для работы с символами
- •3.3.1.3. Тип String
- •3.3.1.4. Строковые процедуры и функции
- •Массивы
- •Динамические массивы
- •Программа решения системы линейных алгебраических уравнений методом Гаусса
- •3.4.1.1. Вариант 1 – с goto
- •3.4.1.2. Вариант 2 – без goto
- •3.4.1.3. Вариант 3 – наилучшая реализация
- •Модули в Паскале
- •Структура модуля
- •Системные модули
- •3.5.2.1. Модуль CRT
- •Файлы
- •Тип данных – запись
- •Файловые типы
- •Процедуры для работы с файлами
- •3.6.3.1. Общие процедуры для работы с файлами всех типов
- •3.6.3.2. Процедуры для работы с текстовыми файлами
- •3.6.3.3. Процедуры для работы с типизированными файлами
- •3.6.3.4. Процедуры для работы с нетипизированными файлами
- •3.6.3.5. Организация контроля ввода/вывода при работе файлами
- •3.6.3.6. Создание простой базы данных с типизированными файлами.
- •Алгоритмы сортировки
- •Обменная сортировка (метод "пузырька")
- •Сортировка выбором
- •Сортировка вставками
- •Метод быстрой сортировки
- •Алгоритмы поиска
- •Поиск в массивах
- •Вставка и удаление элементов в упорядоченном массиве
- •Динамические структуры данных
- •Представление в памяти компьютера динамических структур.
- •Реализация стека с помощью массивов
- •Указатели
- •Стандартные операции с линейными списками
- •Реализация динамических структур линейными списками
- •4.3.6.1. Реализация стека
- •4.3.6.2. Реализация очереди с помощью линейного списка
- •4.3.6.3. Реализация двоичного дерева с помощью линейного списка
- •Сортировка и поиск с помощью двоичного дерева
- •Три источника и три составные части ООП.
- •Классы и объекты.
- •Обращение к членам класса.
- •Инкапсуляция
- •Спецификаторы доступа.
- •Свойства.
- •Наследование
- •Полиморфизм
- •Раннее связывание.
- •Позднее связывание.
- •Конструкторы и деструкторы.
- •Элементы графического интерфейса
- •Различия между консольными и графическими приложениями
- •Визуальное программирование в среде Lazarus
- •Создание графического приложения
- •Форма и ее основные свойства
- •Компоненты
- •Обработчики событий
- •Простейшие компоненты
- •6.3.5.1. Компонент TLabel
- •6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton
- •6.3.6.1. Компонент TEdit
- •6.3.6.2. Компонент TLabeledEdit
- •6.3.7.1. Компонент TMaskEdit
- •Специальные компоненты для ввода чисел
- •Тестирование и отладка программы
- •Компоненты отображения и выбора данных
- •6.3.10.1. Компонент TMemo
- •6.3.10.2. Компонент TStringGrid
- •6.3.10.3. Компоненты выбора
- •Компонент TListBox
- •Компонент TComboBox
- •Компоненты выбора – переключатели
- •6.3.10.4. Компоненты отображения структурированных данных
- •Компонент TTreeView
- •Компонент TListView
- •Организация меню. Механизм действий - Actions
- •6.3.11.1. Компонент TMainMenu
- •6.3.11.2. Компонент TToolBar
- •6.3.11.3. Компонент TActionList
- •6.3.11.4. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
рых мы будем говорить в главе 6, частности в разделе, посвященном исключе-
ниям.
2.1.26 Вычисление сумм сходящихся рядов
Вычислить сумму ряда |
S |
1 |
1 |
1 |
.... |
1 |
... , |
||
|
|
|
|
|
|
||||
x |
|
x2 |
|
x3 |
xn |
||||
|
|
|
|
|
|
х [1.5, 2] с шагом h=0.5, точность =10 –5
Составим блок-схему алгоритма:
начало
x=1.5; h=0.5; ε =10-5
нет
x<2
да
s=0; t=1;
t=t∙1/x;
s=s+t;
t< ε |
нет |
конец |
да
x, s
x=x + h;
Рис. 2.57. Алгоритм вычисления суммы ряда
Из этой блок-схемы мы видим, что циклы могут быть вложены друг в дру-
га, так называемый цикл в цикле. Внутренний цикл вычисляет сумму ряда для текущего значения переменной x. Внешний цикл меняет значение x, после этого снова начинает свою работу внутренний цикл, который вычисляет сумму ряда уже для другого значения x. Так происходит до тех пор, пока не будут перебра-
ны все значения x.
131
2.1 Основные элементы языка
____________________________________________________________________
Запись s=s+t следует рассматривать в "динамике", т.е. к текущему значе-
нию суммы s прибавляется очередной член ряда t и полученное значение снова запоминается в переменной s. Таким образом в переменной s накапливается сумма ряда.
Теперь, что означает вычислить сумму ряда с точностью ε. Это значит, что мы округляем вычисленную сумму ряда с числом знаков после запятой указан-
ной в ε. То есть, если очередной член ряда окажется меньше ε (вообще говоря,
по абсолютной величине), то добавление этого члена в сумму не окажет влия-
ния на результат и не скажется на итоговой сумме, поскольку мы его округля-
ем с заданной точностью ε.
Все эти рассуждения верны для сходящихся рядов, вычисление суммы рас-
ходящегося ряда не имеет смысла.
Рассмотрим в блок-схеме фрагмент, где вычисляется очередной член ряда t. Многие здесь допускают типичную ошибку. Для вычисления xn используют формулу xn . Так можно вычислять степень, но при таком способе ваша программа будет выполняться по времени на порядок дольше, чем при способе,
примененном нами. Ведь используя вышеприведенную формулу, вы заставляе-
те компьютер вычислять xn при каждом новом n как бы заново, с нуля. Но при-
смотритесь внимательно к ряду. Чтобы вычислить очередной член ряда надо
предыдущий член ряда умножить на 1x . И все!
Хотя на современных компьютерах разница во времени выполнения для таких простых программ практически не заметна, приучайтесь писать програм-
мы с оптимальным кодом! В данном случае оптимальность заключается в уменьшении количества арифметических операций для вычисления очередного члена ряда, а значит выигрыш во времени выполнения программы.
program summ;
{$mode objfpc}{$H+}
uses
132
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
CRT, FileUtil; var
x, s, h, eps, t: real; begin
x:= 1.5; h:= 0.5;
eps:= 0.0000000001; while x <= 2 do begin
s:= 0; t:= 1; repeat
t:= t * 1/x; s:= s + t; until t <= eps;
writeln('X= ', X:0:2, ' S= ', S:0:5); x:= x + h;
end;
writeln(UTF8ToConsole('Нажмите любую клавишу')); readkey;
end.
Вычислить значения функции sinx |
используя его разложение в ряд |
||||||
Тейлора: |
|
|
|
|
|
|
|
|
x3 |
|
x5 |
|
x7 |
|
|
sin x x |
|
|
|
|
|
.... |
|
3! |
5! |
7! |
|
||||
|
|
|
х [0,1], значения x заданы в радианах, h=0.2, точность =10 –7
Вывести также "точное" значение функции, вычисленное с помощью стандартной встроенной функции Паскаля sin(x)
Составление блок-схемы алгоритма предоставляется самому читателю.
133
2.1 Основные элементы языка
____________________________________________________________________
Здесь сложности может вызвать только процесс организации вычислений для определения очередного члена ряда по уже вычисленному предыдущему члену.
Внимательно проанализируйте ряд, включите "соображалку" и вы без труда придумаете, как это сделать. Рекомендую также не спешить смотреть програм-
му, а попытаться самому написать и отладить ее!
program sinus; {$mode objfpc}{$H+} uses
CRT, FileUtil; var
x, y, s, h, eps, t: real; n: integer;
begin x:= 0;
h:= 0.2; eps:= 1e-7;
while x <= 1 do begin
s:= x; t:= x; n:= 2; repeat
t:=-t * sqr(x)/(n * (n + 1)); s:= s + t;
n:= n + 2;
until abs(t) < eps; y:= sin(x); writeln('x= ', x:0:2,
134
Глава 2 Введение в язык программирования Pascal
____________________________________________________________________
UTF8ToConsole('Приближенное значение синуса = '), s:0:7, UTF8ToConsole('Точное значение синуса = '),
y:0:7);
x:= x + h;
end;
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Как проверить, правильные результаты выдает программа или нет? Можно использовать так называемые модельные исходные данные, при которых априо-
ри известно, какими должны быть результаты. Для синуса, например, известно,
что sin 0 0 , sin |
|
1 |
. Если в этих точках ваша программа выдает правильные |
|
2 |
||||
|
|
|
результаты, можно с определенной долей уверенности считать, что ваша про-
грамма работает правильно.
Есть и другой способ – сравнить результаты, выдаваемые вашей програм-
мой с другой программой, которая решает ту же задачу.
В нашем случае мы использовали встроенную функцию sin(x). Важно пони-
мать, что эту функцию писали тоже люди, программисты, разработавшие Free Pascal. Скорее всего, они тоже использовали разложение функции sinx в
ряд. И у нас нет никаких оснований не доверять им! Поэтому будем считать,
что встроенная функция sin(x) "точная" и если наша программа выдает те же результаты, то, можно считать, что программа работает правильно.
135