Читайте также:
|
|
1. Введем строки из файла и выведем их на экран:
var f: text; s: string;
Begin
Assign (f, ‘Input.txt’);
Reset (f);
while not Eof (f) do begin
readln (f, s); writeln (s)
end;
Close (f)
End.
При запуске программы возникает ошибка Еrror 2: File not found. Файла с именем Input.txt нет на диске, его необходимо создать. Выбираем в текстовом редакторе Турбо Паскаля пункт меню "File\New" и записшем несколько строк. Затем сохраним файл на диск с именем Input.txt. После запуска мы увидим на экране ожидаемый результат, но только при условии, что и программа, и файл Input.txt находятся в одной и той же директории (каталоге).
Давайте немного поэкспериментируем. Измените текущий каталог — пункт меню "File\Change Dir" — и выберите другой каталог. Запустите программу. Опять знакомая ошибка — Еrror 2: File not found.
Перепишите файл Input.txt в тот каталог, который вы сделали текущим. Запустите программу, она должна заработать.
Измените программу. Вместо Readln (f, s) напишите Read (f, s). Теперь программа зацикливается, и приходится использовать Ctrl+Break, чтобы прервать ее работу. Причина — программа не может найти признак конца файла. Откройте окно "Debug\Watch", введите имя переменной s и выполните программу в пошаговом режиме. Первую строку мы благополучно вводим и распечатываем, а затем идут пустые строки. Попробуйте дать объяснение происходящему. Измените размеры окон и переместите их так, чтобы они не накладывались друг на друга.
А можно ли читать файл посимвольно? Изменим программу.
var f: text; ch: Char;
Begin
Assign (f, ‘Input.txt’);
Reset (f);
while not Eof (f) do begin
read (f, s); write (ch)
end;
Close (f)
End.
Она выдает правильный результат. Но если вы измените Read (f, ch); Write (ch) на Read (f, s); Write (s), где s имеет тип String, то программа снова зацикливается. Объясните, почему. Найдите еще варианты, при которых программа будет зацикливаться.
Измените программу еще раз:
var f: text; ch: char;
Begin
Assign (Input, ‘Input.txt’);
Reset (Input);
while not Eof (f) do begin
read (ch); write (ch)
end;
Close (Input)
End.
Запуск этой программы не приводит к каким-либо ошибкам или зацикливаниям. Что мы сделали? Просто переопределили стандартный ввод с клавиатуры на ввод из нашего файла на диске. В этом случае в операторах Read и Write можно не указывать файловую переменную.
Теперь добавьте после оператора Close (Input) операторы Readln(s); Writeln (s),где sимеет строковый тип данных. Запуск программы приводит к ошибке Error 104: File not open for input(файл не открыт для ввода).
Вставим после Close (Input) оператор Reset (Input). Программа заработала. Однаковместо ввода с клавиатуры строки s мы вводимпервую строку из файла Input.txt. Как же вернуться к вводу с клавиатуры?
Продолжим рассмотрение примеров. Запустите следующую программу.
uses Crt;
const maxN=100;
type MyArray[1..maxN] of integer;
var a: MyArray; i, j: integer;
Begin
ClrScr;
Assign (Input, ‘Input.txt’); Reset (Input);
i:=0;
while not Eof do begin
Inc (i); read (a[i])
end; Close (Input);
for j:=1 to i do write (a[j]:2)
End.
Результат – ошибка Еrror 106: Invalid numeric format (неправильный числовой формат). Мы заполняем данными из файла массив целых чисел А, система пытается преобразовать получаемые символы в числа, но содержимое файла – вовсе не числа. Как следствие – возникает ошибка. Изменим файл Input.txt на следующий:
2 2
3 3 3
4 4 4 4
5 5 5 5 5
Вот теперь программа работает без ошибок. В массиве а оказались числа из файла. Изменим файл Input.txt.
2 22
3 3 333
4 4 4 4444
5 5 5 5 55555
Все почти правильно, кроме последнего числа 55555. Вместо него почему-то выводится нечто странное – 9981. Если вы хорошо усвоили материал предыдущих занятий, то суть ошибки очевидна. Если нет, то перед программой вставьте директиву компилятора ($Q+) и проанализируйте ошибку.
Вернемся, однако, к посимвольному вводу из файла.
uses Crt;
const maxN=100;
type MyArray[1..maxN] of integer;
var A: MyArray; i, j, k: integer; ch: char;
Begin ClrScr;
Assign (Input, ‘Input.txt’); Reset (Input);
i:=0;
while not Eof do begin
read (ch); { Val (ch, j, k); }
{ if k=0
then begin} Inc (i);
a[i]:= Ord(ch)-Ord(‘0’) {End}
end; Close (Input);
for j:=1 to i do write (a[j]:6);
read (a[i])
End.
Результат работы — странная последовательность:
1 – 35 – 38 2 –16 2 2 – 35 – 38 3....,
в которой, однако, есть определенная закономерность. Найдитеее.
Уберите фигурные скобки и вновь запустите программу. Результат: 1 2 2 2 3 3 3 3 3... Измените программу так, чтобы результат все же соответствовал входному файлу: 1 2 22 3 3 333..., но ввод осуществлялся посимвольно.
uses Crt;
var ch: char;
Begin ClrScr;
Assign (Input, ‘Input.txt’); Reset (Input);
Assign (Output, ‘Output.txt’); ReWrite (Output);
while not Eof do begin
read (ch); write (ch)
end;
Close (Input); Close (Output)
End.
Послестроки с операторами Close (Input); Close (Output);вставьте следующие операторы:
Assign (Input, ‘Con’); Assign (Output, ‘Con’);
Reset (Input); ReWrite (Output);
Readln (s); Writeln (s);
Когда программа остановится в ожидании ввода данных, наберите произвольный текст на клавиатуре и нажмите клавишу Enter. Итак, мы научились возвращаться к стандартному вводу и выводу данных.
2. Известно, что в файле записаны целые числа, лежащие в диапазоне от 100 до 10000. Необходимо подсчитать, сколько раз каждое число встречается в файле.
Для решения задачи требуется создать файл с целыми числами. Сделаем это с помощью следующей программы:
сonst MaxN=10000; a=100; b=201; c=15;
var i, j, k: integer;
Begin
Randomize;
Assign (Output, ‘Number.txt’); Rewrite (Output);
i:=0; k=0;
while i<MaxN do begin
j:=Integer(Random(b))-a;
Inc(i); Inc(k);
write(j); write(‘ ‘);
if k=c
then begin writeln; k:=0 end
end; Close (Output);
End.
После ее работы в файле Number.txt, созданном текущем каталоге, содержится МахN целых чисел, разбитых на строки по с чисел в каждой строке.
Можно ли записать в файл 100 000 чисел? Просто изменение константы МахN приводит к зацикливанию. Причина проста: мы забыли изменить тип данных переменной i на LongInt.
Далее. После каждого числа в файл записывается символ пробела и после с чисел осуществляется переход на новую строку. А нельзя ли обойтись без этого?
Изменим программу, взяв в фигурные скобки следующие операторы:
{write (‘‘);
if k=c
then begin writeln; k:=0; end }
На стадии выполнения программы будут выданы два сообщения. Первое сообщение: Error. Line too long, truncated (строка очень длинная, она обрезается); второе сообщение представляет собой предупреждение Warning. Error encountered reading file Numder.txt (ожидается ошибка при чтении файла).
Вернитесь к исходному тексту программы и в качестве дополнительного упражнения попробуйте сформировать файл, в котором и количество чисел в строке формируется случайным образом.
Настала пора подсчитать, сколько раз каждое из чисел встречается в файле. Вторая часть задачи решается помощью следующей программы.
uses Crt;
const MaxN=100; c=20;
type MyArray=array[-MaxN..MaxN] of integer;
var a: MyArray; i, j: integer;
Begin ClrScr;
FillChar (A, SizeOf (A), 0);
{Подсчитываем, сколько раз каждое число встречается в файле. Число используется как индекс элементов массива a. Обратите на этот факт особое внимание. Это "принцип косвенной адресации" - одна из ключевых идей информатики, - реализованный как на уровне аппаратуры компьютера, так и во всех системах программирования.}
Assign (input, ‘Number.txt’); Reset (Input);
while not Eof do begin
read (i); Inc(a[i])
end; Close (Input);
Assign (Output, ‘Count.txt’);
{ Записываем результат в файл Count.txt, не разбивая на строки }
ReWrite (Output);
for i:=-MaxN to MaxN do write (a[i]. ‘ ‘);
Close (Output);
Assign (input, ‘Count.txt’);
{ Открываем файл Count.txt для чтения.}
Reset (Input);
Assign (Output, ‘Con’);
{ Результат выводим на экран.}
Rewrite (Output);
j:=0;
while not Eof do begin
read (i); Inc (j); write (i, ‘ ‘);
if j=c
then begin writeln; j:=0 end
{ Разбиваем на строки, иначе результат трудно просмотреть }
End
End.
3. Дан текстовый файл, содержащий программу на языке Турбо Паскаль. Проверить правильность расстановки скобок (круглых, квадратных, фигурных) в тексте этой программы.
Приведем простые примеры для пояснения сути задачи:
• (()) — скобки в строке расставлены правильно;
• {(] } — скобки в строке расставлены неправильно;
• ({[}) — скобки в строке расставлены неправильно.
Между скобками могут встречаться любые символы. Очевидно, что основным критерием правильности расстановки скобок является следующий: если встречается закрывающая скобка, то последняя открывающая должна быть точно такого же типа.
В качестве теста будущего решения будем использовать следующую простенькую программу:
Begin
writeln (‘{* 9 ((())) [ [ [ [ ] ] ] ] * }’)
Для начала выясним АSCII-коды рассматриваемых в задаче скобок. Это можно сделать, например, с помощью программы:
uses Crt;
Begin ClrScr;
writeln (Ord(‘(‘)); writeln (Ord(‘)‘)); {Ответ: 40, 41.}
writeln (Ord(‘[‘)); writeln (Ord(‘]‘)); {Ответ: 91, 93.}
writeln (Ord(‘{‘)); writeln (Ord(‘}‘)); {Ответ: 123, 125.}
readln
End.
Как видно, разность кодов для соответствующих друг другу скобок не превышает значения 2. Заметим, что хранить весь текст программы ни к чему. Достаточно оставить от него только открывающие скобки. Для этой цели будемиспользовать массив с типом элементов Сhar. Предположим, что уровень вложенности скобок не превышает 100.
Если очередной считанный из файла символ — открывающая скобка, то она записывается в массив. При обнаружении закрывающей скобки сравним ее код с кодом последней скобки, записанной в массив. Если значение разности больше 2 ("парные" символы для скобок в кодовой таблице находятся либо рядом, либо через один символ друг от друга), то выдадим сообщение об ошибке в расстановке скобок, иначе скобка удаляется из массива, и просмотр текста продолжается.
{$R+}
const MaxN=100;
type MyArray=array[1..MaxN] of char;
var A: MyArray: ch: char; yk: integer; ff: Boolean;
Begin
FillChar (A, SizeOf(A), 0); yk:=0; ff:=True;
Assign (Input, ‚My16_sk.pas‘); Reset(Input);
while (not Eof) and ff do begin read (ch);
if (ch=‘(‘) or (ch=‘[‘) or (ch=‘{‘)
then begin Inc(yk); a[yk]:=ch end
else
if (ch=‘)‘) or (ch=‘]‘) or (ch=‘}‘)
then
if Ord (ch) – Ord(A[yk]<=2
then Dec(yk)
else ff:=false
end; Close (Input);
If ff
then writeln (‘Скобки расставлены правильно ‘)
else writeln (‘В тексте программы есть ошибка в расстановке скобок’)
End.
Измените программу так, чтобы, например, проверялась правильность записи слова writeln в тексте программы.
Дата добавления: 2015-07-19; просмотров: 65 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Текстовые файлы | | | MMCIS Partners➡ место для Index TOP 20-FOREX MMCIS group |