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

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

Форум «Всё о Паскале» _ Задачи _ Текстовый файл

Автор: D1ma 6.05.2009 23:47

Код
USES CRT;
VAR
F:TEXT;
I:WORD;
S,C:CHAR;
N:WORD;
BEGIN
CLRSCR;
     ASSIGN(F,'C:\F1.TXT');
     RESET(F);
     I:=0;
     N:=60000;
     WHILE NOT EOF(F) DO
     BEGIN
          IF EOLN(F) THEN
          BEGIN
               IF I<N THEN N:=I;
               I:=0;
               READ(F,C);
               READ(F,C);
          END;
          READ(F,C);
          I:=I+1;
     END;
     IF I<N THEN N:=I;
     IF N=60000 THEN I:=0 ELSE I:=N;
     WRITE('MIN = ');
     WRITELN(I);

END.

Необходимо написать программу, выводящую длину короткой строки. Работает немного неправильно, в чем ошибка?
p.s. +как осуществить посимвольный ввод, используя char? -)
пробывал сделать, вводить по 1 символу ток smile.gif

Автор: amega 7.05.2009 1:12


var
s:string;
...
min:=-1;
while not eof(f) do
begin
readln(s);
if min=-1 then min:=lengs(s);
if lengs(s)<min then min:=lengs(s);
end;
writeln('min =',min);
....


Автор: D1ma 7.05.2009 10:47

Цитата(amega @ 6.05.2009 22:12) *


var
s:string;
...
min:=-1;
while not eof(f) do
begin
readln(s);
if min=-1 then min:=lengs(s);
if lengs(s)<min then min:=lengs(s);
end;
writeln('min =',min);
....



Нужно без использования string....

Автор: volvo 7.05.2009 11:57

Проблема твоей программы - в том, что если будет пустая строка, то все летит, ты читаешь не те символы #13#10, которые надо читать, а пропуская #13, читаешь #10 и затем - первый символ следующей строки. И еще одно совсем непонятное место - это пляски вокруг I и N перед выводом результата. Не проще выводить N, чем делать то, что ты делаешь? В общем как-то вот так:

USES CRT;
VAR
F:TEXT;
I:WORD;
C:CHAR;
N:WORD;
BEGIN
CLRSCR;
ASSIGN(F,'F1.TXT');
RESET(F);
I:=0;
N:=60000;
WHILE NOT EOF(F) DO
BEGIN
IF EOLN(F) THEN
BEGIN
IF (i > 0) and (I<N) THEN N:=I;
I:=0;
READ(F,C);
READ(F,C);
END;

if not eoln(f) then begin { <--- Это НЕ ветка Else предыдущего условия !!! }
READ(F,C);
I:=I+1;
end;
END;
WRITE('MIN = ');
WRITELN(N);

END.