Добавлен: 06.04.2023
Просмотров: 256
Скачиваний: 2
СОДЕРЖАНИЕ
Глава 1. ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПАСКАЛЬ
1.1 Описание языка Object Pascal
1.2 Работа со строками в Object Pascal
1.3 Работа с файлами в Object Pascal
ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ ПОДСЧЕТА СЛОВ В ТЕКСТОВОМ ФАЙЛЕ
2.1 Описание постановки задачи
2.2 Разработка алгоритма реализации задачи
2.3 Разработка исходного кода программы
Глава 3. СИСТЕМА АВТОМАТИЧЕСКОГО ТЕСТИРОВАНИЯ ПРОГРАММ, НАПИСАННЫХ НА ЯЗЫКЕ ПАСКАЛЬ
3. Конец файла: ЕOF(<имя файловой переменной>).
Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF, которая проверяет достигнут ли конец, и если это так, то принимает значение True, иначе – False. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF.
4. Режим записи: Rewrite(<имя файловой переменной>).
Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(<файловая переменная>, <элемент>).
5. Закрытие файла: Close(<имя файловой переменной>).
Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.
6. Удаление файла: Erase(<имя файловой переменной>).
При помощи процедуры Erase, можно удалить с внешнего носителя, заранее закрытый файл.
7. Изменение имени файла: Rеnаmе(<имя файловой переменной>, ‘<новое имя файла>’).
Rеnаmе переименовывает физический файл, который перед этим следует закрыть процедурой Close.
8. Смещение указателя файла: Sееk(<имя файловой переменной>, <номер элемента>).
Процедура Sееk устанавливает позицию указателя в файле на необходимый элемент (нумерация элементов начинается с нуля).
9. Определение положения указателя: FilePos(<имя файловой
переменной>).
Функция FilePos принимает значение порядкового номера элемента, над которым в момент вызова находиться указатель.
10. Определение количества элементов: FileSize(<имя файловой переменной>).
Функция FileSize определяет количество всех имеющихся в файле
элементов.
Текстовые файлы могут состоять из элементов символьного (char) и строкового (string) типа данных. Ключевое слово Text указывает, что файловая переменная создается для работы именно с текстовым файлом:
Var <идентификатор>: Text;
Структура текстового файла представляет собой последовательность строк, которые в свою очередь состоят из символов. Любая строка оканчивается признаком «конца строки», а сам файл признаком «конца файла». Для определения конца файла в Паскаль есть функция EOF, а для конца строки – EOLn:
EOLn(<имя файловой переменной>)
В случае достижения конца строки она (функция EOLn) принимает значение True, в противном случае False.
Под текстовым файлом понимается последовательность строк, которые отделяются друг от друга метками конца строки. А сам же файл заканчивается с использованием уже метки конца файла. Обратиться к каждой строке файла возможно постепенно, начиная с первой строки. Запрещено единовременно производить чтение и запись в файле.
Для текстовых файлов в Паскале определены следующие процедуры и функции:
- Append(<имя файловой переменной>)
Процедура Append открывает существующий файл в режиме дозаписи. После чего в его конец можно добавить какую либо информацию.
- SeekEOLn(<имя файловой переменной>)
Если до конца строки остались пробелы/знаки табуляции, то функция SeekEOLn возвращает значение True, иначе False.
- SeekEOF(<имя файловой переменной>)
Если до конца файла остались лишь строки с пробелами/знаками табуляции, то функция SeekEOF возвращает значение True, иначе False.
Процедуры при работе с текстовыми файлами Паскаль:
1) Чтение текстового файла обеспечивают процедуры:
- read(f,перечень переменных);
- readln(f,перечень переменных);
Эти процедуры обеспечивают чтение информации из файла f в переменные. В зависимости от типа переменных, помещенных в перечень, выбирается способ чтения из файла.
В переменную типа char располагают символы из файла. В переменную числового типа — в этом случае осуществляется пропуск символов-разделителей, начальных пробелов и считывание значения числа до того момента, как появится следующий разделитель. В строковую переменную можно поместить число символов, которое равно длине строки, но лишь в случае, если ранее не встречались символы конца строки, либо символы конца файла.
Readln отличается от read тем, что при завершении прочтения
данных происходит пропуск всех оставшихся символов в данной строке,
принимая во внимание метку конца строки. В случае, когда перечень переменных опущен, процедура readln(f) осуществляет пропуск строки при чтении файла текстового типа.
2) Чтобы записать в текстовый файл, используют процедуры:
write(f, перечень переменных);
writeln(f, перечень переменных);
Как и в случае вывода на экран, вариант записи в текстовый файл зависит от типа переменных, помещенных в перечень. При этом следует учитывать
формат вывода. Отличие writeln от write состоит в том, что при завершении
записи всех значений из перечня переменных процедура writeln осуществляет запись и метки конца строки (т.е. происходит формирование законченной строки файла).
3) Для добавления информации в конец файла используют процедуру append(f). Рекомендуется использовать данную процедуру заместо процедуры rewrite.
ГЛАВА 2. РАЗРАБОТКА ПРОГРАММЫ ПОДСЧЕТА СЛОВ В ТЕКСТОВОМ ФАЙЛЕ
2.1 Описание постановки задачи
Разработать программу «Список слов». Файл содержит текст на русском языке.
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов
2.2 Разработка алгоритма реализации задачи
Наиболее главным и основополагающим термином информатики
является алгоритм. Его происхождение связывают с именем выдающего математика среднего востока Мухаммедом аль-Хорезми, описавшем в своей книге «Об индийском счете» правила, по которым осуществляется запись натуральных чисел с использованием арабских цифр и выполняются действиями над ними в столбик. На латыни его имя записывается как «Algorithmi», отсюда и происходит термин «Алгоритм».
Под алгоритмом, как правило, понимается указание человеку или автомату выполнить и реализовать определенную последовательность действий, в результате чего будет достигнута поставленная цель. Последовательность этих действий, позволяющих получить желаемый результат, называют алгоритмическим процессом.
Но указанное выше определение можно отнести к любому набору инструкций, поэтому обычно для выделения алгоритма от другого вида инструкций, выделяют его основные свойства. К таким свойствам относится:
- Дискретность – представление алгоритма в виде непрерывной последовательности действий. Каждое действие должно выполняться только после полного завершения предшествующего ему.
- Определенность – каждое выполняемое действие должно быть четко и однозначно определено. Исполнитель должен понять что ему необходимо выполнить только указанные инструкции, без какого-либо отклонения на произвольные действия. За счет данного свойства процесс выполнения алгоритма называют механическим, не требующим никаких дополнительных предписаний или данных о решаемой задаче.
- Результативность – алгоритм должен помочь исполнителю достигнуть решения задачи с определенным количеством шагов.
- Массовость – алгоритм выполнения задачи создается в обобщенном виде, т.е. для одной задачи с различными исходными данными может быть применен один и тот же алгоритм её решения.
Для реализуемой задачи внешний вид алгоритма представлен на рисунке 2.1.
Рисунок 2.1 – Алгоритм решения задачи
2.3 Разработка исходного кода программы
На основании построенного алгоритма был реализован программный
код:
Program 1;
var s,sub:string;
i,j,n:integer;
a:array[1..100] of string;
q:set of char;
F : Text;
begin
Assign(F, 'D:\1.txt');
Reset(F);
i:=0;n:=0;
q:=[' ' , ',' , '-' , '!' , '?' , ';' , ':' , '.'];
While not EoF(F) do
begin
Readln(F,s);
repeat
inc(i);
if s[i] in q then begin
inc(n);
a[n]:=sub;
sub:='';
end
else if not (s[i] in q) then
sub:=sub+s[i];
until i=length(s);
end;
Close(F);
if sub <> ' ' then begin
inc(n);
a[n]:=sub;
end;
writeln;
for i:=1 to n-1 do
for j:=n-1 downto i do
if a[j]>a[j+1] then begin
sub:=a[j+1];
a[j+1]:=a[j];
a[j]:=sub;
end;
for i:=1 to n do
writeln(a[i]);
Writeln;
Write('Количество слов: ',n);
end.
Глава 3. СИСТЕМА АВТОМАТИЧЕСКОГО ТЕСТИРОВАНИЯ ПРОГРАММ, НАПИСАННЫХ НА ЯЗЫКЕ ПАСКАЛЬ
Каждую программу, написанную на некотором языке программирования, необходимо проверить на правильность перед ее использованием, т.е. удостовериться, что она выдает верный результат для любых допустимых наборов исходных данных. Наиболее распространенным способом проверки правильности работы программы является ее тестирование, т.е. задание ей некоторых наборов исходных данных и сверка выдаваемых программой результатов с ответами, заранее вычисленными для этих наборов. Проверить правильность работы программы, задавая ей все множество допустимых наборов исходных данных, обычно бывает невозможно, так как это множество оказывается слишком велико. Поэтому необходимо выделить такое сравнительно небольшое множество исходных данных, чтобы по правильности работы программы на этих данных можно было сделать вывод о правильности ее работы на любых других допустимых исходных данных. Это бывает непросто, и часто программа, правильно работающая на некотором множестве данных, работает неправильно для каких-либо других данных. Поэтому необходим тщательный подбор данных для тестирования с учетом особенностей конкретной задачи. Проблемой при тестировании программ вручную является также сложность вычисления результатов для того или иного множества исходных данных.
Классификация типичных ошибок в программах
1. При составлении программы для какой-либо задачи часто игнорируются (остаются не рассмотренными) некоторые специальные, т.е. частные наборы исходных данных, которые являются допустимыми для данной задачи, и на которых программа должна выдавать верный результат. Это может быть, например, пустая строка в задаче на обработку строк, пустое множество чисел в задаче на обработку числовой последовательности, число 0 или отрицательное число в задаче на обработку или преобразование числа и т.п.
2. Программы часто выдают неверный результат на исходных данных, которые являются «критическими» для данной задачи. Это такие исходные данные, минимальное изменение которых приводит к изменению результата. В качестве примера можно привести задачу вычисления наименьшего числа Фибоначчи, большего (большего или равного) заданного значения. Ошибка в неравенстве, т.е. использование знака «>» вместо «?», или наоборот, приводит к неверному результату для любого числа, совпадающего с каким-либо числом Фибоначчи.
3. При обработке последовательности чисел зачастую неверно обрабатывается первый или последний член этой последовательности. Нередко происходит выход за границы допустимых индексов.
4. Часто не учитывается весь возможный диапазон исходных данных. Такие ошибки возникают, например, в задаче поиска максимума или минимума, определения позиции первого или последнего элемента с заданным значением и т.п.
5. При ручном тестировании иногда бывает трудно подсчитать (на калькуляторе) результат для какоголибо набора исходных данных, требующего громоздких вычислений. Поэтому при тестировании студенты и преподаватели часто ограничиваются заданием лишь сравнительно простых множеств исходных данных, не требующих сложных вычислений. Этого бывает недостаточно, так как программа может содержать ошибки, обнаруживаемые только на нетривиальных исходных данных.
6. Частой ошибкой студентов является использование в программах типа данных integer вместо real.
Такие ошибки выявляются только при задании программе исходных данных с ненулевой дробной частью, что обычно требует более сложных вычислений, чем для целых исходных данных. Поэтому нецелые исходные данные зачастую не используются при ручном тестировании, и ошибки остаются незамеченными.
7. Нередко не продумывается, какой тип цикла должен быть использован: пошаговый (for), с проверкой условия до цикла (while) или с проверкой условия после цикла (repeat). Для большинства задач это не имеет