Помощь - Поиск - Пользователи - Календарь
Полная версия: подсчитать количество строк в файле, содержащий заданный символ более одного раза
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
kill94
нужно подсчитать количество строк в файле, содержащий заданный символ более одного раза
@nto$ka
Считываешь строку, ищешь там твой символ. На его место ставишь кракозябру, затем ищешь второй раз. Если нашел, то инкременируешь некоторую целую переменную, которая хранит число строк. Повторить процедуру до окончания файла

В чем трудности?
kill94
проблема в том что то там неправильно пишу и у меня программа зацикливается ...
не можешь написать программу?
@nto$ka
Вслепую сказать ничего не могу. Выкладывайте-с код
kill94
ну типа таак

program ololo;
uses crt;
var f1,f2:text;
Name1,Name2,str:string;
i,q,j:integer;
c,sim,p:char;
begin
clrscr;
q:=0;
j:=0;
writeln ('Ведите символ'); readln(sim);
Writeln ('Входной файл');
readln (Name1);
Assign (f1, Name1);
writeln('Выходной файл');
readln(Name2);
assign(f2, Name2);
p:=' ';
{$I-}
reset(f1); rewrite(f2);
if IOResult<>0 then
begin
Write ('Файл <', Name1, '>не найден'); c:=readkey;
end;

{$I+}
Writeln;

Writeln ('<<<<Входной файл>>>>');
while not eof(f1) do begin
while not eoln(f1) do begin
read(f1,c); Write©;
if c=sim then j:=j+1;
end;
readln(f1);
if (c=sim) and (j=2) then
begin j:=j+1; q:=q+1
end;
end;
write(f2,q);
writeln;
writeln;
writeln ('<<<<Выходной файл>>>>');
reset(f2);
while not eof(f2) do
begin
read(f2,c); write©;
end;
c:=readkey;
Close(f1);
Close(f2);
end.

@nto$ka
Во-первых, мой компилятор сразу же заругался, т.к. Вы не открываете файл f1 на чтение
Чтобы открыть файл на чтение нужно использовать процедуру Reset(f1); После чтения не забудьте обязательно ее закрыть.

Во-вторых, зачем считывать файл посимвольно blink.gif ????? Читайте сразу строку!

Считав строку, ищите в ней нужный символ. Затем, если такой символ нашелся, то заменяем его на другой (проще всего заменить его на chr(256-ord(sim)) Тогда вы гарантированно получите другой символ ). Наконец, смотрим, есть ли в строке этот символ еще раз. И только тогда увеличиваем число строк q

Про файл вывода:

Лучше всего открыть f2 процедурой reset(f2); Он создает и открывает НОВЫЙ файл.
Кстати вместо
Цитата
while not eof(f2) do
begin
read(f2,c); write©;
end;
лучше написать просто writeln(q);

Ну как-то так smile.gif
kill94
можно подробней что сдесь писать?
 while not eof(f1) do begin
while not eoln(f1) do begin
read(f1,c); Write©;
if c=sim then j:=j+1;
end;
readln(f1);
if (c=sim) and (j=2) then
begin j:=j+1; q:=q+1
end;
@nto$ka
Код

var
    s:string;
    i :integer;
...

while not eof(f1) do
begin
    readln(f1,s);//Читай сразу [b]строку[/b]
    i:=pos(sim, s); //В строке ищем символ
    if i>0 then //И если он есть
    begin
          s[i]:=chr(256-ord(sim)); //Заменим символ на кракозябру
          if pos(sim, s)> 0 then  //И если он встретился во второй раз
            inc(q); //увеличим число строк
    end;
end;



ЗЫ Код не проверял. Писано на коленке wink.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.