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

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

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

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

Программа выдает ошибку: file not open

Anytocccchka

Новые
Регистрация
19 Дек 2010
Сообщения
18
Реакции
0
Баллы
0
Программа выдает ошибку: file not open

У меня задача:
В текстовом файле book.txt посчитать количество слов,в которых согласных букв больше чем глассных. Все найденные слова записать отдельными строками в файл words.txt


program qwerty;
uses crt;
var i,m,n,j:integer;
f,f1:text;
st,word:string;
kolg,kols,kol:byte;
const glas=[перечисление глассных];
soglas=[перечисление согласных];
begin
clrscr;
kol:=0;
kolg:=0;
kols:=0;
assign(f,'book.txt');
reset(f);
assign(f1,'words.txt');
rewrite(fi);
while not Eof(f) do begin
while (st=' ') and (i<=length(st)) do
inc(i);
m:=i;
while (st<>' ') and (i<=length(st)) do
inc(i);
n:=i;
word:=copy(st,m,n-m);

for j:=1 to length(word) do begin
if (word[j] in glas) then begin
kolg:=kolg+1;
if (word in soglas) then kols:=kols+1;
if kols>kolg then begin
kol:=kol+1;
end;
write(f1,word);
close(f);
close(f1);
readln;
end;
end;
end;
end;
end.




Прога сначала выдает количество = 1,а потом выдает file not open :tehnari_ru_093:
Уже замучалась с задачей:tehnari_ru_148: Помогите пожалуйста в чем здесь проблема:tehnari_ru_837:
 
Нет,в программе у меня все правильно,это я тут видимо ошиблась...:tehnari_ru_093:
 
Нет,в программе у меня все правильно,это я тут видимо ошиблась...:tehnari_ru_093:
Хорошо. На самом деле, в программе имеется и куда более существенная ошибка.
Рассмотрим первую часть - выделение слов. Вы открыли два файла на чтение и запись, а потом начинаете анализировать символы строки St, при этом абсолютно никак не связав саму строку с содержимым файла f! Или опять "в программе всё правильно"? Если так, то выложите, пожалуйста, РАБОЧИЙ листинг программы.
P.S. Кстати, слово "гласная" (как и "согласная") пишется с одним "с".
 
Ну не ругайтесь на меня=) А как исправить мою ошибку?=)
 
Так, пока - отбой, заметил еще ошибки.
 
Ну не ругайтесь на меня=) А как исправить мою ошибку?=)
Вот - вроде исправил кучу ошибок. В частности, убрал CRT и readln: ведь Вы работаете с файлами, так зачем Вам экран?
Код:
program qwerty;
var
 i,m,n,j:integer;
 f,f1:text;
 st,word:string;
 kolg,kols,kol:byte;
const
 glas=[перечисление гласных];
 soglas=[перечисление согласных];
begin
 kol:=0;
 assign(f,'book.txt');
 reset(f);
 assign(f1,'words.txt');
 rewrite(f1);
 while not Eof(f) do
  begin
   readln(f,st);
   i:=1;
   while i<=length(st) do
    begin
     while st[i]=' ' do inc(i);
     m:=i;
     while (st[i]<>' ') do inc(i);
     n:=i;
     word:=copy(st,m,n-m);

     kolg:=0;
     kols:=0;
     for j:=1 to length(word) do
      begin
       if (word[j] in glas) then kolg:=kolg+1;
       if (word[j] in soglas) then kols:=kols+1;
      end;
     if kols>kolg then
      begin
       kol:=kol+1;
       write(f1,word,' ');
      end;
    end;
  end;
 close(f);
 close(f1);
end.
 
Еще ошибку заметил:
в строке
if (word in soglas) then kols:=kols+1;
нужно i заменить на j.
В листинге поправлено.
 
а если количество выводить на экран,то в каком месте писать writeln?
 
а если количество выводить на экран,то в каком месте писать writeln?
А перед самым конечным "end." Тогда пишем
Код:
 writeln('количество слов ',kol);
 readln;
end.
Ну для этого можно и CRT-шные прибамбасы восстановить, как было. Всякую там чистку экрана.
 
Назад
Сверху