Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 13.10.2012, 12:04   #1 (permalink)
lenchik1
Новичок
 
Регистрация: 26.09.2012
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Найти ошибку

Код:
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.
зависает при вводе слов
lenchik1 вне форума   Ответить с цитированием

Старый 13.10.2012, 12:04
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

На нашем форуме создается много подобных тем

Не могу найти ошибку
Помогите найти ошибку в программе
Помогите найти ошибку
Помогите найти ошибку
Помогите найти ошибку
Помогите найти ошибку

Старый 13.10.2012, 14:47   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.