IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> вычислить хэш для каждого слова
*оля*
сообщение 1.05.2010 15:22
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


что-то не правильно:
 

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.
.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 1.05.2010 15:36
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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

Сообщение отредактировано: Client - 1.05.2010 15:37
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.05.2010 15:43
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(Client @ 1.05.2010 15:36) *

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


нужно, чтобы читал символы пока он не равен пробелу, потом считал для полученнго слова хэш, а после, нужно, чтобы он начинал читать с символа после пробела. Как правильно организовать цикл?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.05.2010 17:45
Сообщение #4


Гость






  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? Все, выходим...



Так?
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.05.2010 18:09
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 1.05.2010 17:45) *

Так?


yes2.gif , да, если вводить с клавиатуры, то работает, как надо! спасибо!
а вот если дан файл, то работает для первой строчки только, возможно, потому что в описании написано file of char; а у меня file of string; тогда как поступить? можно его предварительно из file of string; преобразовать в file of char;? или тут вообще причина не в этом?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.05.2010 18:23
Сообщение #6


Гость






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

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


Не заморачивайся с этими file of char/file of string. У тебя файл текстовый? Вот и пиши: Text.
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.05.2010 19:05
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 1.05.2010 18:23) *

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

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


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


сделала еще один цикл, так-то работает, но, если в файле, допутим, написано слово, потом нажат энтер и следующее слово, то считается, как-будто это одно слово, возможно как-то это исправить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 1.05.2010 19:18
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


while not eof(f) do begin
readln(f,s);
// работа со строкой, перебирать всю посимвольно, как в коде выше.
..
end;


Сообщение отредактировано: Client - 1.05.2010 19:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.05.2010 19:54
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


что-то не могу найти ошибки, но они есть...

 
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;
.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 1.05.2010 20:03
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


вечный цикл, однако 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.05.2010 20:51
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.04.2024 3:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"