Помощь - Поиск - Пользователи - Календарь
Полная версия: вычислить хэш для каждого слова
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
*оля*
что-то не правильно:
 

var
st: string;
line: string;
F: file of char;
f_name: string;
s: string;
ch: char;
i: integer;


function h(st: string): integer;
Var
I,sum: integer;
Begin
For i:=0 to length(st) do
Sum := sum + ord(st[i]);
H:=sum mod 256;
end;

begin
writeln('введите имя файла');
readln(f_name);
assign(f,f_name);
reset(f);
s:='';

while (not eof(f)) do begin
read(f, ch);
repeat
s:=s+ch; //здесь выдает ошибку
until (ch=' ');
st:=s;
h(s);
writeln (h(s));
s:='';
end;
close(f);
end. 
.
Client
read(f, ch);
repeat
s:=s+ch; //здесь выдает ошибку
until (ch=' ');
Читаешь символ и получается вечный цикл (если только ch <> ' ')
*оля*
Цитата(Client @ 1.05.2010 15:36) *

read(f, ch);
repeat
s:=s+ch; //здесь выдает ошибку
until (ch=' ');
Читаешь символ и получается вечный цикл (если только ch <> ' ')


нужно, чтобы читал символы пока он не равен пробелу, потом считал для полученнго слова хэш, а после, нужно, чтобы он начинал читать с символа после пробела. Как правильно организовать цикл?
volvo
  ch := ' '; // это текущий символ, сначала равен пробелу...
  w := ''; // "а сюда мы будем бросать кости", т.е., здесь будет храниться слово...

  repeat
    while ch = ' ' do read(ch); // пропускаем все пробелы

    // пока не встретится пробел (конец слова) или #13 (конец ввода)
    while (ch <> ' ') and (ch <> #13) do
    begin
      w := w + ch; // "приклеиваем" прочитанный символ к строке
      read(ch); // и читаем следующий символ
    end;

    if w <> '' then // слово - не пустое? Делаем с ним все, что хочется
    begin
      // ... тут можно вычислять хеши, запоминать слова
      // в массив, все зависит только от твоей фантазии
    end;

    w := ''; // главное - не забыть перед продолжением, но после обработки слова, его очистить

  until ch = #13; // был нажат enter? Все, выходим...



Так?
*оля*
Цитата(volvo @ 1.05.2010 17:45) *

Так?


yes2.gif , да, если вводить с клавиатуры, то работает, как надо! спасибо!
а вот если дан файл, то работает для первой строчки только, возможно, потому что в описании написано file of char; а у меня file of string; тогда как поступить? можно его предварительно из file of string; преобразовать в file of char;? или тут вообще причина не в этом?
volvo
Но для первой строчки работает правильно? Тогда просто "оберни все это еще и циклом

while not eof(f) do
begin
  // тут - то, что показано выше
end;


Не заморачивайся с этими file of char/file of string. У тебя файл текстовый? Вот и пиши: Text.
*оля*
Цитата(volvo @ 1.05.2010 18:23) *

Но для первой строчки работает правильно? Тогда просто "оберни все это еще и циклом

while not eof(f) do
begin
  // тут - то, что показано выше
end;


Не заморачивайся с этими file of char/file of string. У тебя файл текстовый? Вот и пиши: Text.


сделала еще один цикл, так-то работает, но, если в файле, допутим, написано слово, потом нажат энтер и следующее слово, то считается, как-будто это одно слово, возможно как-то это исправить?
Client
while not eof(f) do begin
  readln(f,s);
  // работа со строкой, перебирать всю посимвольно, как в коде выше.
  ..
end;
*оля*
что-то не могу найти ошибки, но они есть...

 
  w := ''; 
  while not eof(f) do begin
  readln(f,line);
  for i:=1 to length(line)do
    while line[i] = ' ' do  read(f,line[i+1]); // пропускаем все пробелы
    // пока не встретится пробел (конец слова) или конец строки
    while ((line[i+1] <> ' ') and (not eoln(f)) )do
    begin
      w := w + line[i]; // "приклеиваем" прочитанный символ к строке
      read(f,line[i+1]); // и читаем следующий символ
    end;

    if w <> '' then // слово - не пустое? Делаем с ним все, что хочется
    begin
    ...
    end;
    w := ''; // главное - не забыть перед продолжением, но после обработки слова, его очистить

  end;  
.
Client
вечный цикл, однако smile.gif
w := ''; 
  while not eof(f) do begin
  readln(f,line);
  for i:=1 to length(line)do    // Замени на while
    while line[i] = ' ' do  read(f,line[i+1]);  // вечный цикл
  
    while ((line[i+1] <> ' ') and (not eoln(f)) )do // тут тоже. Зачем опять читать с файла? работа со строкой
    begin
      w := w + line[i]; 
      read(f,line[i+1]); 
    end;

    if w <> '' then
    begin
    ...
    end;
    w := '':

  end;
Попробуй выполнить покомандно (F7), увидишь что да как smile.gif
*оля*
Цитата(Client @ 1.05.2010 20:03) *

вечный цикл, однако smile.gif
w := ''; 
  while not eof(f) do begin
  readln(f,line);
  for i:=1 to length(line)do    // Замени на while
    while line[i] = ' ' do  read(f,line[i+1]);  // вечный цикл
  
    while ((line[i+1] <> ' ') and (not eoln(f)) )do // тут тоже. Зачем опять читать с файла? работа со строкой
    begin
      w := w + line[i]; 
      read(f,line[i+1]); 
    end;

    if w <> '' then
    begin
    ...
    end;
    w := '':

  end;
Попробуй выполнить покомандно (F7), увидишь что да как smile.gif


спасибо, F7 оказалась очень полезной))
правда с программой так и не разобралась, оставила первоначальную, просто до этого в каждой строчке дописала по пробелу smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.