- •Введение
- •1. Общие положения
- •1.1. Понятие алгоритма. Данные в задачах и алгоритмах
- •1.2. Понятие о технологии разработки программ. Принципы и этапы разработки программ
- •1.3. Состав документации по отдельным этапам
- •1. Задача
- •9. Структурные тесты
- •1.4. Нисходящая разработка и нисходящая отладка
- •2. Процесс разработки программы на примере решения типовой задачи
- •2.1. Разработка алгоритма и программы уровня 0 с заглушками
- •2. Входные данные
- •3. Выходные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале. Диалоговый вариант
- •9. Структурные тесты
- •2.2. Отладка программы с заглушкой
- •2.3. Общая схема перехода от метода к алгоритму решения
- •2.4. Разработка алгоритма и программы для примера
- •2. Входные данные
- •5. Функциональные тесты
- •6. Метод
- •7. Алгоритм
- •8. Программа на паскале
- •9. Структурные тесты
- •2.5. Отладка полной программы
- •2.6. Список заданий
- •3. Организация хранения данных с позиций эффективности отладки и использования программы
- •3.1. Как лучше хранить, вводить и выводить данные
- •3.2. Использование текстовых файлов для хранения входных и выходных данных
- •3.3. Использование параметров в Паскаль-программах
- •3.4. Задание
- •4. Некоторые методы решения типовых задач
- •4.1. Поиск экстремальных значений (максимума, минимума) в одномерном массиве
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.2. Поиск элемента, удовлетворяющего заданному условию
- •2. Входные данные
- •6. Метод
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.3. Задача со сложной логикой
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •4.4. Упорядочение одномерного массива
- •3. Выходные данные
- •6_А. Метод включения
- •6_Б. Метод пузырька
- •4.5. Список заданий
- •5. Работа с двумерными массивами (матрицами)
- •5.1. Схема обработки матриц
- •5.2. Ввод и вывод матрицы
- •5.3. Пример решения задачи
- •3. Выходные данные
- •6. Метод
- •5.4. Список заданий
- •6. Оформление алгоритмов в виде процедур
- •6.1. Основные положения
- •6.2. Кодирование процедур на языке Паскаль
- •6.3. Специфика оформления процедур ввода – вывода
- •6.4. Рекомендации по оформлению процедур
- •6.5. Примеры разработки процедур
- •3. Выходные данные
- •6. Метод
- •3 Истина, если все элементы строки больше 1, ложь, в противном случае . Выходные данные
- •7. Описание процедуры
- •8. Кодирование на паскале
- •9. Структурные тесты
- •2. Входные данные
- •3. Выходные данные
- •4. Аномалии не рассматриваем
- •6. Метод
- •7. Алгоритм
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •8. Кодирование на паскале
- •2. Входные данные
- •3. Выходные данные
- •6. Метод
- •7. Описание процедуры
- •8. Кодирование на Паскале
- •6.6. Список заданий
- •7. Внешние модули (unit) в турбо-Паскале
- •7.1. Суть и описание модуля
- •7.2. Связь модуля с другими модулями и главной программой. Область действия описаний объектов
- •7.3. Специфика оформления процедур ввода – вывода в модулях
- •7.4. Примеры оформления процедур во внешних модулях
- •7.5. Задания
- •7.6. Обработка многомодульных программ в среде турбо-Паскаль
- •8. Контрольные вопросы к главе 1
- •К главе 2
- •К главе 3
- •К главе 6
- •К главе 7
- •Заключение
- •Литература
- •Приложение 1. Базовые структуры алгоритмов
- •Приложение 2. Простые типы в Паскале
- •Приложение 3. Структура типов данных в языке Паскаль
- •Содержание
3.2. Использование текстовых файлов для хранения входных и выходных данных
● Символьные и строковые данные(опережающие, но полезные сведения; так, сведения о символах пригодятся в задаче упорядочения).
•• Символьная константа: ‘<символ>’ (например, ‘a’, ’4’).
Описание символьной переменной:
в псевдокоде: симв <имя>;
в Паскале: Var <имя>:char;
Возможное значениесимвольной переменной: любой символ, представленный в таблице символов.
Символы упорядочены согласно таблице кодов. Порядок букв совпадает с алфавитным. Символьные данные можно сравнивать обычным образом.
•• Строковая константа(строка): ‘<последовательность символов>’ (например, ‘Это строка’, ’а = 4’).
Описание строковой переменной:
в псевдокоде: строка <имя>;
в Паскале: Var <имя>:string[<длина>]; <длина> не должна превышать 255 и может быть опущена; в этом случае она принимается равной 255.
Возможное значениестроковой переменной: любая последовательность символов из таблицы символов длины не более 255.
Строки в данном пособии представлены только строковыми константами, используемыми при выводе текстовых сообщений. Так, при разработке внешней спецификации задачи «Точки в круге» в выходной форме предусмотрены такие сообщения, а в тексте программы они внесены в список объектов вывода как строковые (или текстовые) константы (§ 2.1).
Маленький пример:
var
a,b,c:char;
stroka:string[6];
d: integer;
begin
{задание значений переменным}
a:=’m’;
b:=’ ‘; {b присваивается значение пробела}
c:=’p’;
stroka:=’pascal’;
{сравнение символов}
if (a>с) then
d:=0
else
d:=1; {d=1}
{простенький вывод для примера}
writeln(‘Результат сравнения:d=’,d:1,’ Язык:’,b,stroka);
{Выведется строка: Результат сравнения: d=1 Язык: pascal }
…………………
● Определение файла
Файл– это множество данных, объединяемых логическими связями. Т.е. файлом можно назвать любое множество данных, между которыми мы видим связь. При этом в зависимости от точки зрения и целей одни и те же данные могут рассматриваться как один файл или распределиться на множество файлов. Например, сборник лабораторных работ может рассматриваться как один файл (одна книжка) или несколько (много работ) и при создании электронного документа храниться соответственно в одном или нескольких дисковых файлах.
● Логическое и физическое представление файла
При использовании файлов в программе (в качестве источников входных данных или для записи выходных данных) файл представляется в двух аспектах:
физическом; этособственно файлс данными на внешнем носителе (диске); идентифицируется именем согласно правилам операционной системы (MS DOS, Windows и т.д.);
логическом; этопредставление файла в программе, зависящее от правил языка программирования.
В Паскале файл в программе представляется файловой переменной, имя которой строится по обычным правилам Паскаля.
Входной файл создается любым подходящим способом независимо от программы и до ее запуска. Выходной файл формируется программой.
● Связь логического и физического представлений
Соответствие между физической и логической организацией устанавливается специальным оператором языка, связывающим физическое имя файла с файловой переменной. С этого момента программа имеет дело только с файловой переменной, и термин «файл» применительно к операторам обработки файлов относится к файловой переменной(т.е. текст «чтение из файлаf» озачает: «чтение из файла, представленного файловой переменнойf»). Этот оператор:
assign( <ф.п.>,’<имя файла>’);
Здесь и далее ф.п. – сокращение термина «файловая переменная».
● Типы файлов
В языке Паскаль существует три вида файлов: текстовые, типизированные, нетипизированные (бестиповые).
Самый общий и простой в использовании – текстовый тип; именно его и будем чаще всего использовать.
Типизированный и бестиповый файлы используются только целенаправленно и требуют отдельного рассмотрения.
● Структура файла
Бестиповый файл по сути является способом обработки одного из двух других типов файлов и собственной структуры не имеет. Поэтому рассмотрим структуру типизированного и текстового файлов.
Изобразим файл в виде полосы последовательно расположенных байтов. Любой файл заканчивается символом конца файла eof(end of file).
Типизированный файл
Все компоненты (минимальные считываемые или записываемые единицы) такого файла принадлежат к одному типу; тип может быть любым, кроме файлового:
Компоненты размещены непосредственно один за другим.
Файл хранится только на внешнем запоминающем устройстве (в частности, на диске).
Описаниефайловой переменной:
var <ф.п.>:file of <тип компонентов>;
Значениефайловой переменной - файл с компонентами заданного типа.
Здесь информация о типизированных файлах приведена только с целью сравнения с текстовыми – для лучшего понимания последних.
Текстовый файл– совокупность строк (последовательностей символов) переменной длины, заканчивающихся специальным символомeoln(end of line, конец строки; на клавиатуре набирается нажатием клавиши Enter):
Первоначально любой файл данных создается как текстовый. Набранные на клавиатуре данные представляют собой стандартный входной файл. Содержимое дисплея при просмотре любого файла –стандартный выходной файл.Эти файлы используются при задании и просмотре данных.
Для хранения данных последние записываются в файл на внешнем запоминающем устройстве (диске).
Описание файловой переменной:
var
<ф.п.>:text;{text- стандартный тип}
Стандартные файловые переменные – input(по умолчанию связана с клавиатурой) иoutput(по умолчанию связана с дисплеем).
● Специфика текстовых файлов
Компоненты-строки представлены во внешнем (символьном) виде: каждый байт являет собой код согласно таблице кодов.
В программе из текстовых файлов вводятся и выводятся только неструктурированные данные – числа, символы, строки. Структурированные данные (массивы, записи) необходимо вводить по компонентам структуры (элементам, полям).
Числа разделяются пробелами и/или символами eoln.
Символы считываются подряд (eoln– тоже символ!). Строки считываются согласно соответствующим правилам. В данном пособии ввод символов и строк не рассматривается.
Преимущества текстовых файлов:
простота создания (непосредственный набор данных на клавиатуре);
наглядность (непосредственный просмотр средствами текстовых редакторов);
универсальность (можно обойтись только этим видом файлов).
● Основные операторы для работы с файлами
reset ( <ф.п.> )– открытие для чтения файла, связанного с файловой переменной <ф.п.>;
rewrite( <ф.п.> )– создание и открытие нового файла для записи;
close( <ф.п.> )– закрытие открытого файла;
read( <ф.п.>,<список ввода>)– чтение данных; элемент списка ввода для текстового файла – числовая или символьная или строковая переменная;
write( <ф.п.>,<список вывода>)– запись данных согласно списку вывода; элемент списка вывода для текстового файла – числовая или символьная или строковая переменная.
● Особенности ввода-вывода при работе с текстовыми файлами
Вводятся и выводятся: числа, символы, строки. Об этом уже было сказано выше.
Операторы ввода-вывода:
read( <ф.п.>,<список ввода>)– то же, что выше; чтение данных подряд;
readln( <ф.п.>,<список ввода>)– чтение данных согласно списку ввода и переход на следующую строку; если в строке данных остались данные, не вошедшие в список ввода, они игнорируются;
write( <ф.п.>,<список вывода>)- то же, что выше; вывод данных подряд;
writeln( <ф.п.>,<список вывода>) - запись данных в файл согласно списку вывода с добавлением в конце выведенной строки маркера конца строки (переход на следующую строку).
● Пример использования файловв задаче «Точки в круге»
•• Будем вводить данные из файла на диске и выводить в файл на диске. Сразу зададим имена файлов и соответствующих файловых переменных и укажем их рядом со входной и выходной формами. Эти добавления лучше всего сделать непосредственно в тексте уже имеющейся спецификации:
•• Файл task440.datдолжен быть создан согласно входной форме до запуска программы с помощью любого редактора текстов. В данном случае следует набрать только значения входных данных, опустив приглашения.
Так, содержимое файла task440.datдля первого теста будет иметь вид:
•• Файл task440.resбудет создан автоматически. При правильной записи операторов вывода вид содержимого файла должен полностью совпадать с выходной формой.
•• Изменения и добавления в программе отметим в ее тексте, сопроводив пояснениями.
program points (dat,res); {ввод из файла, вывод в файл}
uses crt; {подключение модуля для работы с экраном}
{раздел определения констант}
const
nmax=100; {верхняя граница массива}
{раздел описания типов - пустой}
{раздел описания переменных}
var
n,i:integer;
r,p,sa:real;
x,y:array[1..nmax] of real;
dat,res:text;
{раздел операторов}
begin
clrscr; {очистка экрана}
assign (dat,’points1.dat’); reset (dat);
assign (res,’points1.res’); rewrite (res);
{A0.1 - ввод-вывод входных данных}
{вывод заголовка в выходной документ}
writeln(res,' ':9,'Точки'); {вывод c переходом на следующую строку}
{ввод входных данных}
writeln('Количество
точек n:');readln(dat,n);
{обр1.1,1.2}
writeln('Критическое
удаление r:');readln(dat,r);
{ обр2.1,2.2}
{ввод массивов x и y}
writeln(res,'Абсциссы
и ординаты:'); {обр3}
fori:=1tondo
readln(dat,dat,x[i],y[i]); {обр4: ввод 2 элементов и переход на след. строку}
{вывод входных данных в выходной документ}
{вывод n, r по обр6}
writeln(res,' Количество точек =',n:3);
writeln(res,' Критическое удаление = ',r:4:1);
{вывод массивов x и y}
writeln(res,' Абсциссы и ординаты: '); {обр7}
for i:=1 to n do
writeln(res,' ':5,x[i]:5:1,' ':8,y[i]:5:1); {обр8}
{A0.2. Обработка}
…………………….
{A0.3 - вывод результатов}
writeln(res,' Искомый процент точек = ',p:4:1); {p по обр9}
writeln(res,' Среднее удаление = ',sa:4:1); {sa по обр9}
close(dat); close(res);
end.
Все эти изменения можно (и лучше) аккуратно сделать карандашом или ручкой другого цвета непосредственно в документации уже выполненного примера, так чтобы читались оба варианта – диалоговый и файловый.
Полученная программа будет работать с файлами для первого теста. Чтобы пропустить второй тест, надо изменить имена файлов в операторах assign. Это желательно проделать, но только в целях тренировки.