Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ подсчитать количество строк в файле, содержащий заданный символ более одного раза

Автор: kill94 9.12.2012 17:20

нужно подсчитать количество строк в файле, содержащий заданный символ более одного раза

Автор: @nto$ka 11.12.2012 9:51

Считываешь строку, ищешь там твой символ. На его место ставишь кракозябру, затем ищешь второй раз. Если нашел, то инкременируешь некоторую целую переменную, которая хранит число строк. Повторить процедуру до окончания файла

В чем трудности?

Автор: kill94 11.12.2012 12:49

проблема в том что то там неправильно пишу и у меня программа зацикливается ...
не можешь написать программу?

Автор: @nto$ka 11.12.2012 17:41

Вслепую сказать ничего не могу. Выкладывайте-с код

Автор: kill94 11.12.2012 18:24

ну типа таак

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 12.12.2012 15:43

Во-первых, мой компилятор сразу же заругался, т.к. Вы не открываете файл 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 12.12.2012 16:14

можно подробней что сдесь писать?

 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 13.12.2012 6:01

Код

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