- •Долинер л.И., Данилина и.И., Пашкова р.Р., Емельянов д.А. Языки и системы программирования
- •Содержание
- •Теоретическая работа а. Что такое «программирование»
- •1. Что такое «программа» и как ее исполняет компьютер
- •2. Что такое “Среда программирования Turbo Pascal”
- •Вопросы для контроля
- •Лабораторная работа 1. Знакомство со средой turbo pascal
- •1. Как начать работу со средой Turbo Pascal
- •1.1. Структура каталогов среды Turbo Pascal
- •1.2. Запуск среды программирования Turbo Pascal
- •1.3. Структура экрана после запуска среды
- •1.4. Вход в меню
- •1.5. Среда Turbo Pascal как рабочий стол программиста
- •1.6. Работа со страницами
- •1.7. Компиляция и исполнение программ
- •2. Резюме
- •Вопросы для контроля
- •Лабораторная работа 2. Простейшие программы на языке pascal, или как это делается...
- •1. Структура программы на языке Pascal
- •2. Простейшие операторы
- •2.1. Резервирование памяти для работы
- •2.2. Запись данных в память, или оператор присваивания
- •2.3. Вывод данных на экран дисплея
- •2.4. Форматированный вывод информации
- •Теоретическая работа б. Введеhие в язык пpогpаммиpоваhия pascal
- •1. Алфавит языка
- •1.1. Символы, используемые в идентификаторах
- •1.2. Разделители
- •1.3. Специальные символы
- •1.4. Неиспользуемые символы
- •2. Структура программы
- •3. Типы данных
- •3.1. Целый тип
- •3.2. Вещественный тип
- •3.3. Символьный тип
- •3.4. Логический тип
- •3.5. Строковый тип данных
- •3.5. Пример описания данных
- •4. Команда присваивания
- •4.1. Операции
- •4.2. Стандартные функции
- •4.3. Запись выражений
- •5. Простейшие команды ввода и вывода информации
- •5.1. Вывод информации
- •5.2. Ввод информации
- •Вопросы для контроля
- •Лабораторная работа 3. Как организовать диалог
- •1. Команда ввода данных
- •2. Библиотека Crt
- •2.1. Определение цвета символов
- •2.2. Определение цвета фона
- •2.3. Очистка экрана
- •Вопросы для контроля
- •Лабораторная работа 4. Графика в языке pascal (первое знакомство)
- •1. Включение графического режима
- •2. Библиотека Graph
- •Задачи для самостоятельной работы. Линейные алгоритмы
- •Лабораторная работа 5. Операции с целыми и вещественными числами
- •Теоретическая работа в. Алгоритмические конструкции: условный оператор
- •4.1. Составной оператор
- •4.2. Условные операторы
- •4.2.1. Команда ветвления
- •5. Сложные условия
- •5.1. Что такое True и False
- •5.2. Логический тип данных
- •5.3. Сложные условия
- •6. Оператор выбора case
- •Лабораторная работа 6. Операторы ветвления и выбора
- •1. Что такое ветвление и как оно организуется в языке Pascal?
- •2. Условный оператор if
- •2.1. Теория
- •2.2. Практика
- •Контрольное задание
- •3. Оператор выбора case
- •3.1. Теория
- •3.2. Практика
- •Теоретическая работа г. Введение в систему типов языка pascal
- •1. Стандартные типы данных
- •2. Перечислимый тип
- •3. Ограниченный тип данных
- •4. Множества
- •5. Вопросы для самоконтроля
- •Теоретическая работа д. Циклы с параметром: быстрое начало
- •1. Когда используется цикл с параметром
- •2. Форма записи цикла с параметром
- •3. Вычисление сумм
- •4. Выборки
- •5. Максимумы и минимумы
- •Лабораторная работа 7. Циклы с параметром
- •Лабораторная работа 8. Как нарисовать забор
- •Лабораторная работа 9. Звездное небо и прочие странности
- •1. Получение случайного числа
- •2. Рисование точек в графическом режиме
- •Лабораторная работа 10. Проектирование программ и процедуры
- •1. Зачем нужна технология программирования
- •2. Знакомство с технологией проектирования “сверху вниз”
- •Решение Часть 1. Уточнение постановки задачи (эскиз)
- •Часть 2. Первый вариант решения
- •Часть 3. Уточнение решения
- •Часть 4. Уточнение решения
- •Часть 5. Уточнение решения
- •Часть 6. Уточнение решения
- •Это вам пригодится
- •Теоретическая работа е. Конструкции цикла в языке pascal
- •Оператор цикла с параметром
- •2. Цикл с предусловием while
- •3. Цикл с постусловием repeat
- •4. Вопросы для самоконтроля
- •Лабораторная работа 11. Разные конструкции цикла
- •1. Теория
- •1.1. Цикл со счетчиком (for)
- •1.2. Цикл с предусловием (while)
- •1.3. Цикл с постусловием (repeat)
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 12. Как управлять движением на экране дисплея, или след слона
- •Теоретическая работа ж. Построение графиков функций
- •Лабораторная работа 13. Построение графиков функций
- •Лабораторная работа 14. Дополнительные возможности при работе с графикой
- •Теоретическая работа г. Динамические объекты: считывание картинок в память и вывод их на экран
- •Лабораторная работа 15. Как делается движущееся изображение
- •Теоретическая работа д. Использование страниц памяти для организации движения объектов по экрану
- •Как рисовать сложные картинки
- •Лабораторная работа 16. Мультипликация с использованием страниц видеопамяти
- •Лабораторная работа 17. Технология представления картинок в виде числового массива
- •Лабораторная работа 18. Движение объектов по многоцветному фону
- •1. Как вывести на экран картинку формата pcx
- •2. Технология движения объектов по многоцветному фону
- •Лабораторная работа 19. Мыши и модули
- •I. Как работать с мышью
- •1.1. Как работает манипулятор "мышь"
- •1.2. Начинаем программировать управление мышью
- •2. Модули
- •Implementation {начало раздела реализации}
- •Лабораторная работа 20. Работа со строковыми переменными
- •1. Теория
- •1.1. Описание строковых переменных
- •1.2. Сравнение строк
- •1.3. Операции со строками
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 21. Работа с символьными переменными -1
- •Лабораторная работа 22. Работа с символьными переменными - 2
- •Лабораторная работа 23. Процедуры - 1
- •1. Теория
- •2. Практика
- •Лабораторная работа 24. Процедуры - 2
- •Лабораторная работа 25. Строковый редактор
- •1. Что такое «строковый редактор»
- •2. Зачем писать строковый редактор
- •3. Несколько вспомогательных задач
- •4. Постановка задачи на разработку
- •5. Необходимая информация для написания процедуры
- •6. Подсказка: алгоритм работы строкового редактора
- •Лабораторная работа 26. Поиск среднего и другие неожиданности
- •Лабораторная работа 27. Как работать с массивами: первые шаги
- •1. Теория
- •2. Практика
- •Вопросы для контроля
- •Лабораторная работа 28. Массивы и деловая графика
- •Теоретическая работа е. Строковые массивы. Алгоритмы поиска
- •Лабораторная работа 29. Строковые массивы. Алгоритмы поиска
- •Лабораторная работа 30. Нечисловые индексы в массиве
- •Теоретическая работа ж. Сортировка массивов
- •Лабораторная работа 31. Сортировка массивов
- •Лабораторная работа 32. Программа обслуживания конькобежных соревнований
- •Теоретическая работа з. Двумерные и многомерные массивы
- •Вопросы для контроля
- •Лабораторная работа 33. Шахматный турнир
- •Лабораторная работа 34. Подпрограммы - функции
- •1. Теория
- •2. Практика
- •Лабораторная работа 35. Работа с текстовыми файлами -1
- •1. Теория
- •1.1. Что такое текстовый файл
- •1.2. Принцип работы с текстовыми файлами
- •2. Практика
- •Лабораторная работа 36. Работа с текстовыми файлами - 2
- •Вопросы для контроля
- •Лабораторная работа 37. Работа с типизированными файлами - 1
- •1. Теория
- •2. Практика
- •Лабораторная работа 38. Работа с типизированными файлами - 2
- •1. Теория : тип данных «запись»
- •2. Практика
- •Лабораторная работа 39. Работа с типизированными файлами как с файлами прямого доступа
- •1. Теория
- •2. Практика
- •Лабораторная работа 40. Дополнительные возможности, или что можно еще натворить...
- •1. Что можно делать с файлами и каталогами
- •2. Процедуры и функции библиотеки dos
- •2.1. Работа с часами и календарем
- •2.2. Работа с каталогами и файлами
- •2.3. Типы и константы модуля dos для работы с файлами
- •3. Практика
- •Приложение 1 Зарезервированные слова Turbo Pascal
- •Приложение 2 Знаки пунктуации в языке Pascal
- •Приложение 3 Операции в языке Pascal
- •3.1. Арифметические операции
- •3.2. Логические операции
- •3.3. Операции отношения
- •Приложение 4 Стандартные функции языка Pascal
- •4.1. Арифметические функции
- •4.2.Функции преобразования типов
- •4.3. Функции для величин порядкового типа
- •Приложение 5 Команды pедактоpа сpеды Turbo Pascal 7.0
- •5.1. Команды перемещения курсора
- •5.2. Команды поиска фрагментов
- •5.3. Команды вставки и удаления информации
- •5.4. Команды работы с блоками информации
- •5.5. Клавиши быстрого управления средой Turbo Pascal 7.0
- •Список рекомендуемой литературы
Лабораторная работа 28. Массивы и деловая графика
Задание 1. Гистограммы
Для иллюстрации дискретных динамических процессов довольно часто используются столбиковые диаграммы (гистограммы) (рис. 7).
Рис. 7. Пример столбиковой диаграммы (гистограммы)
Составьте программу, которая по введенным данным строила бы такую гистограмму на экране. Сделайте 2 варианта программы: из 2-мерных столбиков и 3-мерных параллелепипедов (см. рис. 8).
Уточнение
Программа будет универсальной только в том случае, если она будет работать для "произвольного" (например, от 1 до 100) набора чисел и для любых значений этих чисел. Чтобы столбики были пропорциональны и помещались на экране, требуется пропорционально увеличивать размеры столбиков, если значение чисел малы, и уменьшать, если они слишком велики (этот процесс назовем масштабированием).
Цвета каждого из столбиков и подписи под ними также следует вводить.
Рис. 8. Пример трехмерной гистограммы
Задание 2. Круговая диаграмма
Наряду с гистограммами широкое распространение получили круговые диаграммы (см. рис. 9). Круговая диаграмма - это, как правило, круг, составленный из разноцветных секторов, угловые размеры которых пропорциональны числовым значениям, которые они интерпретируют.
Для рисования закрашенных секторов применяется процедура PieSlice, имеющая следующие параметры:
PieSlice(X, Y : integer; StAngle, EndAngle, Radius : word);
Эта процедура позволяет рисовать закрашенный текущим цветом сектор круга с центром в точке (X,Y) радиуса Radius и начальным и конечным углом Stangle и EndAngle.
Рис. 9. Пример круговой диаграммы
Для того чтобы решить задачу 2, решите вспомогательные задачи 2.1 - 2.5.
Задание 2.1
Составьте программу рисования закрашенного сектора окружности. Цвет закраски и значения углов вводятся в диалоге в алфавитно-цифровом режиме.
Задание 2.2
Нарисуйте окружность из 8 закрашенных секторов. Сектора должны иметь разные цвета закраски.
Задание 2.3
Пусть есть 3 заданных числа. Нарисуйте окружность из 3 разноцветных секторов. Величины углов секторов должны быть пропорциональны данным трем числам.
Задание 2.4
Решите задачу 2.3 для случая 7 чисел.
Задание 2.5*
Решите задачу 2.3 для N чисел (от 1 до 100).
Теперь наконец реализуйте задачу 2.
Теоретическая работа е. Строковые массивы. Алгоритмы поиска
Массивы могут состоять не только из чисел, но и из символьных строк. Разберем несколько типичных задач, связанных с обработкой строковых массивов.
Описание такого массива в программе строится по общим правилам:
<Имя_массива> : array[<n1>..<n2>] of string[<длина>]
Всякая задача обработки информации начинается с того, что эту информацию нужно ввести в память компьютера.
Пусть, например, наша программа обслуживает регистратуру поликлиники. О каждом пациенте нам требуется хранить следующую информацию: фамилия, год рождения и диагноз. Проще всего хранить эти данные в трех различных массивах Fam, God и Diag. Под одинаковыми номерами будут храниться данные об одном пациенте, то есть элементы Fam[i], God[i] и Diag[i] будут содержать соответственно фамилию, год рождения и диагноз пациента с номером i.
Размеры массивов удобно предусмотреть достаточно большими - "с запасом", а сколько будет введено пациентов, каждый раз будет определяться в процессе работы: как только все данные исчерпаны, вместо ввода фамилии мы будем просто нажимать клавишу <Enter>.
Ввод данных можно оформить в виде самостоятельной процедуры без параметров:
Program Hospital;
Const N = 100;
Var Fam : array[1..N] of String[20]; {фамилии}
God : array[1..N] of Integer; {год рождения}
Diag : array[1..N] of String[20]; {диагноз}
Procedure WwodMas;
Var F : String[20];
i,k : Integer;
begin
i := 0; { номер вводимой записи }
writeln('Вводите данные: ' );
write('Фамилия : ');
readln(F); {ввод первой фамилии (для входа в цикл)} while F <> '' do
begin
i := i+1; { номер вводимой записи }
Fam[i] := F; {занесение фамилии в массив}
Write('Год рождения: '); readln(God[i]); { ввод года рождения }
Write('Диагноз : '); readln(Diag[i]); { ввод диагноза }
write('Фамилия : '); readln(F); { ввод следующей фамилии }
end;
end;
begin
{ тело программы}
end.
Следующая задача: среди имеющихся данных отыскать пациента с заданной фамилией и вывести на экран его диагноз. Идея решения заключается в том, чтобы просмотреть последовательно весь массив фамилий и, отыскав нужную (совпадающую с введенной), напечатать элемент массива диагнозов, имеющий тот же номер.
Решение этой задачи можно также оформить в виде отдельной процедуры, которую также следует поместить в описательную часть программы Hospital:
Procedure Poisk;
Var F : String[20];
i : Integer;
begin
write('Введите фамилию: ' );
readln(F);
i:=1;
while (i<N) and (Fam[i]<>F) do i:=i+1; {поиск номера фамилии}
if i<N then
WriteLn('Пациент ',Fam[i],'. Его диагноз: ',Diag[i])
else
WriteLn('Такого пациента в имеющемся списке нет.');
end;
Пока список небольшой, такой алгоритм поиска вполне устраивает. Однако если данных очень много, то поиск будет длиться слишком долго. Ускорить дело мог бы список, в котором фамилии расположены в алфавитном порядке. Тогда бы мы начали поиск с середины массива и, проверяя, в какой половине находится интересующая нас фамилия, сокращали бы область поиска вдвое на каждом шаге цикла. Такой способ называется двоичным поиском.
Процедура двоичного поиска будет выглядеть таким образом16:
Procedure Poisk2;
Var F : String[20];
i1,i2,k,pr : Integer;
begin
pr := 0;
writeln('Введите фамилию' );
readln(F);
i1 := 1; { начало }
i2 := N; { и конец участка поиска }
while i1 < i2 do
{пока начало и конец участка поиска не слились}
begin
k := trunc((i1+i2)/2); {середина участка поиска}
if Fam[k] = F { пациент найден } then
begin
writeln(Diag[k]); { вывод диагноза }
pr := 1;
{установка признака того, что пациент найден}
end
else
if F < Fam[k]
{если нужная фамилия находится в первой половине списка,}
then i2 := k-1
{то отбрасывается вторая половина,}
else i1 := k+1;
{в противном случае отбрасывается первая.}
end;
if pr = 0 {ни разу не выполнилось условие Fam[i] = F}
then writeln('Такой пациент отсутствует');
end;