Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Экспериментальный раздел работы.

Введение. | Организация стеков. | Организация очереди | Связанные списки. | Введение |


Читайте также:
  1. I раздел. Общая теория статистики
  2. I. Подведомственность дел о разделе между супругами совместно нажитого имущества.
  3. I. Факт, свидетельствующий о составе имущества, находящегося в общей совместной собственности супругов и подлежащего разделу.
  4. I.Организационно-методический раздел
  5. I55 . ДЕДУКЦИИ ЧИСТЫХ РАССУДОЧНЫХ ПОНЯТИЙ РАЗДЕЛ 2. ОБ АПРИОРНЫХ ОСНОВАНИЯХ ВОЗМОЖНОСТИ ОПЫТА
  6. II. Подсудность дел о разделе между супругами совместно нажитого имущества.
  7. II. Разделы и главы в коллективных трудах

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

mybiblioteka.su - 2015-2024 год. (0.017 сек.)