Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Найти ошибку (http://www.tehnari.ru/f41/t79305/)

lenchik1 13.10.2012 12:04

Найти ошибку
 
Код:

rogram Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,windows;
var s:string;
    i,n,k:Integer;
    f:TextFile;
begin
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  Writeln('введи кол-во слов в кодировочной книге');
  read(n);
//---------------------------------------------
 Assign(f,'Кодировочная книга.txt');
 Rewrite(f);
 write('введи ',n,' слов');
 k:=0;
 repeat
  Readln(s);
  Write(f,s);
  k:=k+1;
 until k=n;
 writeln('Исходный файл:');
 reset(f);
while not eof(f) do
 begin
  read(f,s);
  write(s,' ');
 end;
 Close(f);
//-------------------------------------------
writeln('Для выхода нажмите enter')
readln
end.

зависает при вводе слов

Vladimir_S 13.10.2012 14:47

Цитата:

Сообщение от lenchik1 (Сообщение 804458)
зависает при вводе слов

Что вполне естественно. Потому что Вы не разобрались в разнице между read и readln, а также write и writeln, и ставите эти операторы, как ни попадя. Конкретно:
1. У Вас:
Код:

    Writeln('введи кол-во слов в кодировочной книге');
    read(n);

Так нельзя. При вводе с консоли одиночного числа, строки или символа следует использовать ТОЛЬКО readln. Это - некая тонкость, которую просто необходимо знать. Я бы предложил так:
Код:

  Write('введи кол-во слов в кодировочной книге ');
  readln(n);

2. Аналогично, вместо
Код:

write('введи ',n,' слов');
следует написать
Код:

writeln('введи ',n,' слов');
Зачем же прилеплять первое вводимое слово к выведенному на экран указанию?
3. Но это всё "цветочки", а вот дальше пошли "ягодки".
Код:

k:=0;
 repeat
  Readln(s);
  Write(f,s);
  k:=k+1;
 until k=n;

Сразу возникает вопрос - зачем тут вообще цикл repeat-until, почему не обойтись обычным for k:=1 to n do? Впрочем, это не главное. При такой записи в файл все вводимые слова сольются воедино, без пробелов между ними. А потому нужно либо писать Writeln(f,s); (тогда каждое слово займет свою отдельную строку), либо Write(f,s+' '); (тогда слова разделятся пробелами).
4.
Код:

reset(f);
Не пойдёт! Для того, чтобы ранее открытый на запись файл открыть на чтение, его необходимо предварительно закрыть. То есть так:
Код:

close(f);
reset(f);

5. Продолжение - в том же духе.
Код:

while not eof(f) do
 begin
  read(f,s);
  write(s,' ');
 end;
 Close(f);

Так можно, если
а) Каждое слово в файле располагается на своей отдельной строке.
б) Вместо read(f,s); поставить readln(f,s);
Если же слова в файле идут просто через пробел, то нужно организовывать довольно сложную процедуру посимвольного считывания до пробела - пропуск пробела - следующее считывание и т.д. Между прочим, использование оператора read для считывания строковой переменной вообще недопустимо. Никогда и нигде. Только readln.
Вот Вам для начала. Размышляйте, исправляйте.


Часовой пояс GMT +4, время: 16:59.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.