- •Введение в конструирование программ
- •Пенза 2006 г.
- •Предисловие
- •1 Обработка информации на компьютере
- •1.1 Модель обработки информации на компьютере
- •1.2 Основные объекты языка программирования
- •1.2.1 Синтаксические элементы языка программирования
- •1.2.2. Значения и типы
- •1.2.3. Константы и переменные
- •1.2.4. Выражения
- •1.2.5. Операторы
- •1.3 Лабораторные задания
- •1.3.1 Логическая разминка
- •1.3.2 Реализовать схемы программ на языке Object Pascal
- •2 Структурное конструирование программ
- •2.1 Простая программа
- •2.2 Консольное приложение
- •2.2.1 Создание, сохранение и загрузка программы
- •2.2.2 Компиляция и выполнение программы
- •2.3 Лабораторные задания
- •2.3.1 Составление простых программ
- •2.3.2 Выполните трассировку и определите результаты работы программы
- •2.3.3 Программирование с использованием управляющих структур
- •2.4 Подпрограммы
- •2.4.1 Глобальные данные
- •2.4.2 Способы передачи параметров
- •2.4.3 Функции
- •2.4.4 Процедуры
- •2.4.5 Значения параметров по умолчанию
- •2.4.6 Перегрузка функций
- •2.4.7. Рекурсивные подпрограммы
- •2.4.8. Передача наименования подпрограммы как параметра
- •2.5 Отладка программ
- •2.6 Лабораторные задания. Подпрограммы
- •2.6.1 Конструирование подпрограмм
- •2.6.2 Разработка рекурсивных подпрограмм
- •2.7. Модули
- •Interface {интерфейс модуля}
- •Implementation {реализация}
- •Initialization {инициализация}
- •3. Структуры данных
- •3.1. Массивы
- •3.1.1. Действия над массивами
- •I, j : byte; { индексы элементов массивов }
- •3.1.2 Передача массивов в качестве параметров
- •3.1.2.1. Формальные параметры как массивы с фиксированными размерами
- •3.1.2.2. Формальные параметры как массивы со «свободными» размерами
- •3.1.2.3. Определение наименьшего/наибольшего значения массива
- •3.1.3 Лабораторные задания
- •3.1.3.1 Одномерные массивы
- •3.1.3.2. Двумерные массивы
- •3.2. Строки
- •3.2.1 Лабораторные задания
- •3.3. Записи
- •3.3.1 Лабораторные задания
- •3.4 Файлы.
- •3.4.1 Основные понятия и операции
- •3.4.2 Типизированные файлы
- •3.4.3 Текстовые файлы
- •3.4.4 Лабораторные задания
- •3.5 Динамические структуры данных. Указатели
- •3.5.1 Основные понятия и определения
- •3.5.2 Процедуры выделения и освобождения памяти
- •3.5.3 Односвязный список
- •3.5.4 Лабораторные задания. Указатели, список
- •3.5.5 Динамические массивы
- •4. Введение в объектно-ориентированное конструирование программ
- •4.1 Основные понятия и определения
- •4.2 Классы и объекты
- •4.2.1 Структура класса
- •4.2.2 Создание и уничтожение объектов
- •4.2.3 Пример. Класс – динамический массив
- •4.2.5 Операции с объектами
- •4.2.5.1 Оператор is
- •4.2.5.2 Оператор as
- •4.2.5.3 Копирование объектов одного класса
- •4.2.6 Свойства
- •4.2.7 Наследование и полиморфизм
- •4.2.8 События
- •4.2.9 Исключительные ситуации
- •4.2.9.1 Операторы try…except
- •4.2.9.2 Операторы try…finally
- •5. Визуальная разработка программ в delphi
- •5.1. Интегрированная среда разработки программ
- •5.1.1 Проект
- •5.2 Конструирование простого приложения
- •5.2.1 Интерфейс Пользователя
- •5.2.2 Визуальное конструирование
- •5.2.3 Реализация методов
- •5.2.4 Обработка исключительных ситуаций
- •5.2.5 Файлы приложения Калькулятор
- •5.3 Компоненты ввода/вывода данных StringGrid и Memo
- •5.3.1 Компонент StringGrid – таблица строк
- •5.3.1 Ввод массива. Компонент StringGrid
- •5.3.3 Компонент Memo – многострочное окно редактирования
- •5.3.4 Ввод массива. Компонент Memo
- •5.4 Немного о графике
- •5.4.1 Свойство Canvas. Построение графика функции
- •5.4.2 Событие OnPaint
- •Список литературы
- •Приложение а. Кратко о Delphi а.1 Свойства проекта
- •А.2 Программный код пустой формы
- •А.3 Главная форма
- •А.3.1 Свойства главной формы
- •А.3.2 События главной формы
- •А.4 Компоненты Delphi
- •Приложение b. Приложение «Калькулятор»
2.3.2 Выполните трассировку и определите результаты работы программы
1. Пользователь ввел с клавиатуры значения 3 и 5. Определите, какое значение выведет компьютер на дисплей.
program exam2_1;
var
f, x, y : integer;
max, min: integer;
begin
readln(x,y);
if x>=y then begin
max:= x;
min:= y;
end
else begin
max:= y;
min:= x;
end;
if xy>0 then
f:=max
else
f:=min;
writeln(f);
end.
2. Нарисуйте область на плоскости, при попадании в которую точки с координатами x, y программа выводит значение True.
program exam2_2;
var
x, y : integer;
b:boolean;
begin
readln(x,y);
b:= (abs(x-y)<=1) and (abs(x+y)<=1);
writeln(b);
end.
3. Определите, в какие интервалы должно «попасть» значение х, чтобы программа выводила значение 0.
program exam2_3;
var
f, x : integer;
begin
readln(x);
if (x>=-1) and (x<=4) or (x>=5) and (x<=10) then
f:= 1
else
f:= 0;
writeln(f);
end.
4. Пользователь ввел с клавиатуры значение переменной х. Определите, какое значение выведет компьютер на дисплей, если х равно: 3; 4; -2; -4; 15.
program exam2_4;
var
f, x: integer;
begin
readln(x);
case x of
1, 3, 5, 7, 9 : f:=2x+1;
2, 4, 6, 8 : f:=2x;
10..100 : f:=x10;
-3..-1 : f:=-1;
else
f:=0;
end;
writeln(f);
end.
5.Выполните трассировку программы и определите результат.
program exam2_5;
var
s, i, k: integer;
begin
s:= 0;
k:= 1;
for i:=1 to 5 do begin
s:=s+i;
k:=k*i;
end;
writeln(s+k);
end.
6.Выполните трассировку программы и определите результат.
program exam2_6;
var
s, i, k: integer;
begin
s:= 0;
k:= 1;
for i:=1 to 5 do begin
s:=s+i;
k:=ki;
if s+k>25 then
break;
end;
writeln(s:5, k:5);
end.
7. Выполните трассировку программы и определите результат, если пользователь ввел с клавиатуры значения: 1, 7, 2.
Дайте геометрическую интерпретацию работы программы, если значение переменной s рассматривать, как площадь геометрической фигуры.
program exam2_7;
var
s, x, x0, x1, d: integer;
n : integer;
begin
readln(x0, x1, d);
n:= (x1-x0) div d;
x:= x0;
s:= 0;
while n>0 do begin
s:=s+dx;
x:=x+d;
n:=n-1;
end;
writeln(s:5);
end.
8. Пользователь ввел с клавиатуры значение переменной х. Выполните трассировку программы и определите результат, если х равно: 5; 8.
Можно ли использовать программу для определения, простое число или нет?
program exam2_8;
var
n, f, i: integer;
begin
readln(n);
i:=2;
f:=1;
while i<=sqrt(n) do begin
if n mod i = 0 then begin
f:=0;
break;
end;
i:=i+1;
end;
writeln(f);
end.
9. Программа должна вычислять значение наибольшего общего делителя.
Выполните трассировку и проверьте работу программы для значений m и n: 4, 2; 12, 8.
program exam2_9;
var
m, n, p: integer;
begin
readln(m, n); {m>n}
repeat
p:= m mod n;
if p<>0 then begin
m:= n;
n:= p;
end;
until p=0;
writeln(n);
end.
10. Выполните трассировку и определите вид арифметического выражения, значение которого (переменная р) вычисляет программа.
program exam2_10;
var
s, i, k, n, p: integer;
begin
p:= 1;
k:= 1;
n:= 1;
for i:=1 to 4 do begin
s:=0;
while k<=n do begin
s:= s+k;
k:= k+1;
end;
n:=i+k;
p:=p*s;
end;
writeln(p);
end.
Советы профессионала
Упрощайте логические выражения в операторах if
Избегайте вызова «лишних» функций и сравнений
Вместо (not(x>x_left)) or (not(x<x_right)) следует написать выражение:
(x<=x_left) or (x>=x_right)
Если Вы хотите выяснить, равно ли значение логической переменной b истина – НЕ пишите в операторе if: not(Ord(b)=0) или Ord(b)=1 или b=True. Напишите просто: if b then …
Используйте дополнительные логические переменные для понимания и упрощения кода
Например, оператор if имеет вид:
If (elementIndex<0) or (elementIndex>MAX_ELEMENT) or
(elementIndex = LAST_ELEVENT) then…
Добавим в программу две логических переменных violation (нарушение), и completion (завершение) и определим их следующим образом:
violation := (elementIndex<0) or (elementIndex>MAX_ELEMENT);
completion:= (elementIndex = LAST_ELEVENT);
Тогда оператор if можно записать так:
If violation or completion then…
Упрощайте структуру цикла
Используйте оператор цикла for, если известно число повторений, и оператор while в других случаях
Не изменяйте в «теле» цикла for значение показателя цикла!
Вычисления, не изменяемые в цикле, следует вынести за его пределы
Например, переменная value вычисляется следующим образом:
for i:=0 to Count-1 do begin
value:= (i+1) BaseValue DELTA;
. . .
end;
Видно, что значение произведения BaseValueDELTA не зависит от показателя цикла (переменная i) и не изменяется в цикле. Добавим в код переменную increment (приращение) и перепишем цикл следующим образом:
increment:= BaseValue DELTA;
for i:=0 to Count-1 do begin
value:= (i+1) increment;
. . .
end;
Заменяйте умножение сложением
В рассмотренном выше примере переменная value на каждом шаге цикла увеличивается на значение переменной increment, поэтому цикл можно организовать так:
increment:= BaseValue DELTA;
value:=0;
for i:=0 to Count-1 do begin
value:= value + increment; //Сравните с первоначальным вариантом!
. . .
end;
Используйте «размыкание» цикла
Вам необходимо выполнять в цикле похожие действия, которые отличаются небольшой частью, которая выполняется только один раз в начале цикла:
for i:=1 to Count do begin
if i = 1 then begin
{операторы 1}
end
else begin
{операторы 2}
end; . . .
end;
«Размыкание» цикла заключается в том, что действия, выполняемые в цикле один раз (в примере это {операторы 1}), следует выполнить за его пределами перед началом цикла:
i:= 1;//если это необходимо!
{операторы 1}
for i:= 2 to Count do begin
{операторы 2}
end;
Тщательно анализируйте задание перед конструированием цикла
Рассмотрим вычисление ex с заданной точностью tolerance по формуле:
При решении «в лоб» в цикле придется выполнять не только вычисление суммы слагаемых, но и возведение x в целую степень, а также вычисление факториала (2!, 3!, …).
Однако при выполнении простого анализа исходной формулы (разделите последующее слагаемое на предыдущее!) можно определить, что каждое слагаемое, начиная с x, может быть получено умножением предыдущего слагаемого на коэффициент x / i, где i = 1, 2,… – номер слагаемого в исходном выражении (слагаемое x имеет номер 1). Тогда вычисление ex можно сконструировать так:
i:=1; // номер слагаемого
summa:=1; // значение суммы
increment:=1; // значение слагаемого
while increment > tolerance do begin
increment:= incrementx/i;
summa:= summa + increment;
i:= i + 1;
end;