
- •Часть I. Этапы решения задачи на компьютере 7
- •Часть II. Задачи. Алгоритмизация и программирование 15
- •Часть III. Теоретические положения и примеры программ 188
- •Введение
- •Часть I. Этапы решения задачи на компьютере
- •1.1 Постановка и формализация условий задачи
- •1.2 Алгоритмизация задачи
- •1.2.1 Интерпретация объектов
- •1.2.2 Вычислительная схема
- •1.2.3 Вычислительная схема решаемой задачи
- •1.2.4 Составление блок-схемы
- •1.2.5 Трассировка
- •1.3 Составление программы на языке Паскаль
- •1.4 Подготовка текста программы на машинном носителе
- •1.5 Трансляция (компиляция) программы
- •1.6 Компоновка (редактирование связей)
- •1.7 Запуск программы на исполнение
- •1.8 Анализ результатов
- •Часть II. Задачи. Алгоритмизация и программирование классических вычислительных процессов
- •1 Линейный вычислительный процесс
- •1.1 Программирование формул
- •1.2 Формализация и алгоритмизация задачи
- •2 Разветвляющийся вычислительный процесс
- •2.1 Программирование формул
- •2.2 Формализация и алгоритмизация графических задач
- •2 .3 Параметрические задачи
- •3 Циклические вычислительные процессы
- •3.1 Арифметический цикл
- •Вычисление произведения n сомножителей.
- •Табулирование функции на конечном отрезке.
- •3.2 Итерационный цикл
- •Вычисление предела последовательности с заданной точностью.
- •Вычисление суммы бесконечного ряда с заданной точностью.
- •3.3 Арифметические циклы с рекуррентными соотношениями
- •3.4 Итерационные циклы с рекуррентными соотношениями
- •3.5 Двойной вложенный цикл
- •4. Пользовательские алгебраические функции
- •4.1 Применение функции в линейных и разветвляющихся вычислительных процессах
- •4.2 Использование функции в циклических процессах
- •4.3 Табуляция функции
- •5 Одномерные числовые массивы
- •5.1 Работа с компонентами массива
- •5.2 Работа с векторами
- •6 Двумерные числовые массивы
- •6.1 Работа с элементами массива
- •6.2 Работа с векторами и матрицами
- •6.3 Использование процедур и функций для работы с массивами
- •7 Работа со строками
- •7.1 Анализ и преобразование текста строки
- •7.2 Работа со строковыми функциями и процедурами
- •8 Работа со списками
- •8.1 Стеки
- •8.2 Очереди
- •8.3 Бинарные деревья
- •9 Работа с текстовыми файлами
- •10 Работа с файлами записей
- •11 Компьютерная графика
- •12 Анимация изображений
- •Часть III. Теоретические положения и примеры программ
- •1 Вычисление определителя квадратной матрицы
- •2.2 Использование записей для описания таблиц
- •Работа с полями записи
- •Использование оператора with … do
- •Ввод данных в массив записей с клавиатуры
- •2.3 Вложение записей
- •Присвоение значений полям вложенных записей
- •3 Файлы записей
- •3.1 Структура файла
- •3.2 Встроенные процедуры и функции обработки файлов
- •3.3 Организация последовательного доступа к записям файла
- •3.4 Организация прямого доступа к компонентам файла
- •3.5 Создание индексного файла
- •3.6 Работа с файлом произвольного доступа
- •Просмотр файла
- •Редактирование записей
- •Изменение структуры основного файла
- •Использование клавиш для управления программой
- •Удаление записи из файла
- •Добавление записи в файл
- •3.7 Информационное взаимодействие текстовых файлов и файлов записей
- •Экспорт данных. Копирование информации из файла записей в текстовый файл
- •Импорт данных. Копирование информации из текстового файла в файл записей
- •3.8 Запросы к файлам записей
- •Запрос с группировкой
- •4 Графическое программирование
- •4.1 Управление видеорежимом
- •Инициализация видеорежима. Процедура InitGraph
- •Закрытие видеорежима. Процедура CloseGraph
- •Создание графического окна. Процедура SetViewPort
- •Закрытие графического окна. Процедура ClearDevice
- •4.2 Построение графических фигур
- •Построение прямой линии. Процедуры SetColor, SetLineStyle, Line, LineRel, LineTo
- •Построение прямоугольника. Процедуры Rectangle и Bar
- •Построение окружности. Процедура Circle
- •Построение дуги окружности. Процедура Arc
- •Построение эллипса. Процедуры Ellipse, FillEllipse
- •Построение сектора. Процедуры PieSlice, Sector
- •4.3 Корректировка изображения Процедуры GetAspectRatio, SetAspectRatio
- •4.4 Создание пользовательского шаблона заливки
- •Заливка замкнутой области. Процедура FloodFill
- •Построение и окраска произвольного рисунка на примере замка
- •Построение и заливка правильного многоугольника
- •4.5 Работа с текстом
- •Выбор стандартного шрифта. Процедура SetTextStyle
- •Коррекция стандартного шрифта. Процедура SetUserCharSize
- •Вывод числовых величин на экран
- •5 Анимация изображений
- •5.1 Дублирования спрайта цветом фона
- •5.2 Манипулирование фрагментами изображения
- •5.3 Использование страниц видеопамяти
- •6 Сообщения об ошибках
- •6.1 Ошибки стадии компиляции
- •6.2 Ошибки стадии выполнения
- •Ошибки ввода-вывода
- •Фатальные ошибки
- •Библиографический список
Импорт данных. Копирование информации из текстового файла в файл записей
Пример 12. Информацию из текстового файла Students.txt (см. пример 11) копировать в файл записей Students.dat в том порядке как они присутствуют в текстовом файле.
Алгоритм этой программы весьма прост.
Открываем текстовый файл Students.txt для чтения.
Открываем файл базы данных Students.dat для записи.
Читаем очередную строку текста Strb из файла Students.txt, пока не будет достигнут конец файла.
Из строки Strb выделяем поля S.TAB, S.FIO, S.Data, S.Grup, S.STEPA.
Сохраняем текущую запись S в файле Students.dat.
Когда достигнут конец файла Students.txt, закрываем файлы Students.txt и Students.dat.
PROGRAM PR12;
{Создание основного файла, содержащего все записи текстового
файла упорядоченные в соответствии с текстовым файлом
с именем текстового файла и расширением .dat.
Копируются только поля TAB, FIO, DATA, GRUP, STEPA}
Type Student = record
Tab : Longint;
Fio : String[15];
Data : String[8];
Grup : String[7];
Stepa: Real;
DEL: BYTE;
DATE: STRING[8]
End;
Var S:Student; St, Stx, Strb, Strс: String; N: Integer;
S_STEPA, S_TAB: String;
Fs: File of Student; FTXT: TEXT;
Begin
Writeln('Введите имя текстового файла: '); Readln(St);
Assign (FTXT, St); Reset(FTXT);
Stx:=COPY(ST,1,POS('.',ST)-1)+'.dat'; {ПУТЬ И ИМЯ ОСНОВНОГО ФАЙЛА}
Assign (Fs, Stx); Rewrite(Fs);
While Not Eof(FTXT) {ПРОСМОТР ТЕКСТОВОГО ФАЙЛА}
Do begin
Readln(FTXT, Strb); {ЧТЕНИЕ СТРОКИ ИЗ ТЕКСТОВОГО ФАЙЛА}
Strс:=COPY(Strb,1,POS(',',Strb)-1);
DELETE(Strb,1,POS(',',Strb));
VAL(Strс, S.TAB, N);
S.FIO:=COPY(Strb,1,POS(',',Strb)-1);
DELETE(Strb,1,POS(',',Strb));
S.Data:=COPY(Strb,1,POS(',',Strb)-1);
DELETE(Strb,1,POS(',', Strb));
S.Grup:=COPY(Strb,1,POS(',',Strb)-1);
DELETE(Strb,1,POS(',',Strb));
Strb := COPY(Strb,1,POS(';',Strb)-1); VAL(Strb,S.STEPA,N);
WRITE(Fs, S); { ЗАПИСЬ В ОСНОВНОЙ ФАЙЛ }
WRITELN(S.TAB:9, S.FIO:15, S.Data:10, S.Grup:9, S.STEPA:9:2)
end;
Close(Fs); Close(FTXT)
End.
3.8 Запросы к файлам записей
Одним из важнейших вычислительных процессов является формирование запросов к данным, хранимым в файлах записей. Собственно ради таких запросов и создают файлы записей. Запрос представляет собой программу, которая выбирает из одного или нескольких файлов записей данные и выдает их в виде таблицы на экран монитора, или в текстовый файл. При этом происходит фильтрация записей, то есть отбор только тех записей, которые удовлетворяют определенным, заранее известным условиям. Запросы к базам данных представляют самостоятельный предмет исследования. Очень широко запросы используются в языках программирования, использующих SQL (Structured English Query Language). В языке SQL имеется целый спектр запросов различных назначений. Мы остановимся только на двух из них: запрос - выборка, запрос с группировкой.
Запрос - выборка
Запрос этого вида не изменяет информацию в исходных файлах. Этот запрос отбирает из всех записей только те, которые удовлетворяют условиям отбора. В выходную таблицу могут помещаться только необходимые поля из исходной базы. Помимо этих полей могут для каждой записи формироваться новые данные (расчетные поля) путем простых арифметических преобразований данных из исходных полей.
Пример 13. Разработать запрос к файлу Students.dat, обеспечивающий выборку студентов, указанной с клавиатуры группы. В выходную таблицу поместить четыре поля: табельный номер, фамилию и инициалы студента, возраст (полное количество лет на указанную дату), стипендия. Результаты вывести в текстовый файл OUTPUT.TXT.
Алгоритм запроса содержит следующие позиции:
Открываем файл базы данных Students.dat для чтения.
Открываем текстовый файл Output.txt для записи.
С клавиатуры вводим код группы StGR и дату StDT на которую мы хотим сформировать список студентов.
Выводим заголовок в текстовый файл Output.txt.
Читаем очередную запись S из файла Students.dat, пока не будет достигнут конец файла.
Если студент принадлежит интересующей нас группе (S.Grup = StGR), то преобразуем числовые поля в текстовые (S.TAB → S_TAB, S.STEPA→ S_ STEPA). Формируем строку текста из реквизитов: S_TAB, S.FIO, FTXT, DATEDIFF(S.Data, StDT), S_STEP. Выводим эту строку в текстовый файл Output.txt.
Когда достигнут конец файла Students.dat, закрываем файлы Students.dat и Output.txt.
Наибольший интерес в предлагаемой программе представляет способ вычисления возраста студентов. Для работы с полями типа дата в языке Паскаль нет встроенных функций. Поэтому пришлось в программе разработать пользовательскую функцию DATEDIFF(DT1, DT2), которая возвращает разность между двумя датами DT1 и DT2. Разность между двумя датами измеряется разными единицами измерения: дни, месяцы, годы. В нашем случае это годы. Для сравнения двух дат их следует разложить на компоненты: количество дней, месяцев, лет. Для этих целей используются функции DAY, MONTH, YEAR, соответственно.
Функция DATEDIFF(DT1, DT2) Структурограмма
Y1 = YEAR(DT1); M1 = MONTH(DT1); D1 = DAY(DT1); {Компоненты первой даты} |
Y2 = YEAR(DT2); M2 = MONTH(DT2); D2 = DAY(DT2); {Компоненты второй даты} |
R = Y2 - Y1; {Разность лет} |
Анализ месяцев и дней да |
R = R-1; {Коррекция R, так как последний год - неполный} |
DATEDIFF := R. |
PROGRAM PR130;
Type Student = record
tab : Longint;
Fio : String[15];
Data : String[8];
Grup : String[7];
Stepa: Real;
DEL: BYTE;
DATE: STRING[8]
end;
Var S: Student; St: String;
StGR: String[7]; StDT: String[8];
S_STEPA, S_TAB: String;
Fs: File of Student; FTXT: TEXT;
FUNCTION DATEDIFF(DT1,DT2:String):Integer; {Число полных лет между DT2 и DT1}
VAR Y1,Y2,M1,M2,D1,D2:Integer; R: Integer;
FUNCTION DAY(DT: String): Integer; {Вычисляет день по дате}
VAR T: STRING; S, N: Integer;
Begin
T:= COPY(DT,1,2); VAL(T, S, N); Day :=S
End;
FUNCTION MONTH(DT: String):Integer; {Вычисляет месяц по дате}
VAR T: STRING; S, N: Integer;
Begin
T:= COPY(DT,4,2); VAL(T, S, N); MONTH :=S
End;
FUNCTION YEAR(DT: String):Integer; {Вычисляет год по дате}
VAR T: STRING; S, N: Integer;
Begin
T:= COPY(DT,7,2); VAL(T, S, N);
IF S<11 {Программа верна до 2010 года}
THEN S:=S+2000 ELSE S:=S+1900;
YEAR := S
End;
BEGIN
Y1:= YEAR(DT1);M1:= MONTH(DT1);D1:= DAY(DT1);
Y2:= YEAR(DT2);M2:= MONTH(DT2);D2:= DAY(DT2);
R:=Y2-Y1;
IF (M2 < M1) or ((M2 = M1) and (D2<D1)) THEN R:=R-1;
DATEDIFF := R
End;
Begin
Writeln('Введите имя основного файла: ');Readln(St);
Assign (Fs,St); Reset(Fs);
Writeln('Введите код группы: ');Readln(StGR);
Writeln('Укажите дату: ');Readln(StDT);
Assign (FTXT,'Output.txt'); Rewrite(FTXT);
WRITELN(FTXT, ' Список студентов группы ',StGR);
WRITELN(FTXT, 'с указанием возраста (полных лет) на ',StDT);
WRITELN(FTXT, 'Таб.номер Фамилия И.О. Возраст Стипендия, руб.');
While Not Eof(Fs) {Просмотр индексного файла}
Do begin
Read(Fs, S); {Чтение очередной записи из основного файла}
IF S.Grup = StGR
THEN BEGIN
STR(S.TAB, S_TAB); {Перевод числа в строку текста}
STR(S.STEPA:4:2,S_STEPA);
WRITELN(FTXT, S_TAB:7, S.FIO:15, DATEDIFF(S.Data, StDT):7, S_STEPA:12);
END
END;
Close(Fs); Close(FTXT)
End.
Результаты работы программы содержатся в текстовом файле Output.txt:
Список студентов группы ИС-11
с указанием возраста (полных лет) на 19.02.07
Таб.номер Фамилия И.О. Возраст Стипендия, руб.
100010 АНИСИМОВ 17 500.00
100012 БУНАКОВ 18 850.00
100016 ВАХРУШЕВА 18 350.00
100017 ВЫСОЦКИЙ 18 850.00
100019 ГОРОХОВ 18 500.00
100009 ЗИБЕРМАН 17 0.00
100020 НЕКРАСОВА 17 350.00
100011 ПЕТРОВ 17 350.00
100014 СЕМЕНОВ 18 500.00
100018 СЕРЕГИНА 17 500.00
100013 ФАДЕЕВ 18 350.00
100023 ФОМИН 19 850.00
100015 ЩУКИНА 17 0.00