• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Найти ошибку

lenchik1

Ученик
Регистрация
26 Сен 2012
Сообщения
7
Реакции
0
Баллы
0
Найти ошибку

Код:
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.
зависает при вводе слов
 
зависает при вводе слов
Что вполне естественно. Потому что Вы не разобрались в разнице между 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.
Вот Вам для начала. Размышляйте, исправляйте.
 
Назад
Сверху