Задание: Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении заданное число раз. Здесь на форуме было такое задание: "Отредактировать заданное предложение, удаляя из него слова, которые уже встречались в предложении", а такого еще не было, в общем, уже голова кругом. Нужна помощь !!
const delimiter = [#32, ',', '.', '!', ':']; type wrd_info = record start, len: byte; amount: integer; end;
function get_words(s: string; var words: array of wrd_info): integer; var count, prev: integer;
i, j, curr_len: byte;
begin count := -1; i := 1; while i <= length(s) do begin
while (s[i] in delimiter) and (i <= length(s)) do inc(i);
curr_len := 0; while not (s[i] in delimiter) and (i <= length(s)) do begin inc(i); inc(curr_len); end;
if curr_len > 0 then begin inc(count); with words[count] do begin start := i - curr_len; len := curr_len; amount := 1; end;
prev := 0; for j := 1 to count - 1 do begin if copy(s, words[j].start, words[j].len) = copy(s, words[count].start, words[count].len) then begin inc(words[j].amount); inc(prev); end; end; inc(words[count].amount, prev);
end;
end; get_words := count + 1; end;
const max_word = 255; var words: array[1 .. max_word] of wrd_info; i, n: integer;
const s: string = 'thats,,, all :: folks all bye bye !!! bye !!! bye...';
begin n := get_words(s, words); writeln('words:'); for i := 1 to n do writeln(copy(s, words[i].start, words[i].len), ' : ', words[i].amount, ' times ... '); end.
Теперь она выдает, сколько раз встречается каждое слово в предложении... просто проходи по массиву Words (от конца к началу), и удаляй слова, у которых поле amount равняется нужному числу...
Попробуй сделать это сам... Не получится - скажи, я помогу...
Needhelp
4.04.2007 4:01
Проблемка...
begin for i:= max_word downto 1 do if words[i].amount=g then s[i]:=''; n := get_words(s, words); writeln('words:'); for i := 1 to n do writeln(copy(s, words[i].start, words[i].len), ' : ', words[i].amount, ' times ... '); ReadLn;
end.
s[i]:='';??? - тут ему не нравит-ся(((*походу s[i] не туда У меня у самого вопрос. Какой параметр тут "обнуляем"(s[i]:='';) ???
volvo
4.04.2007 4:16
Тебе надо удалить слова из строки, а не просто очистить определенные слова. Ты же не хочешь потерять разделители между словами?
Вот так перепиши основную программу:
const max_word = 255; delete_it = 2; var words: array[1 .. max_word] of wrd_info; i, n: integer;
const s: string = 'thats,,, all :: folks all bye bye !!! bye !!! bye...';
begin n := get_words(s, words); for i := n downto 1 do if words[i].amount = delete_it then delete(s, words[i].start, words[i].len);
writeln(s); end.
(delete_it - это и есть число раз, о котором говорится в условии.)
Needhelp
4.04.2007 4:31
Ммм..вот все как хитро... Спасибо большущее!
Needhelp
6.04.2007 1:17
const max_word = 255; delete_it = 4; var words: array[1 .. max_word] of wrd_info; i, n: integer;
const s: string = 'hop cop hop cop hop hop';
begin n := get_words(s, words); for i := n downto 1 do if words[i].amount = delete_it then delete(s, words[i].start, words[i].len);
writeln(s); end.
Сегодня начал проверять, заметил "косяк". Если написать 'hop cop hop cop hop hop' и в const внести delete_it =2, то он выведет все как надо, то есть 'hop hop hop hop', а вот если внести 4, то он просто выдает 'hop cop hop cop hop hop' ... ...Просмотрел эту строчку в немодифицированном варианте этой проги (взял из раздела "Разбиение на слова. Все способы") и вот что увидел (см. скрин) Даже не знаю, что в таком случае делать???... Нажмите для просмотра прикрепленного файла
volvo
6.04.2007 1:32
2 маленькие поправки к первоначальной программе: 1)
var count, prev: integer;
i, j, curr_len: INTEGER; { <--- Здесь }
2)
prev := 0; for j := 0 to count - 1 do begin { <--- Смотрим на стартовое значение !!! } if copy(s, words[j].start, words[j].len) = copy(s, words[count].start, words[count].len) then begin inc(words[j].amount); inc(prev); end; end;
Проверь сейчас...
Needhelp
6.04.2007 1:48
НУ СУПЕР!!! То, что надо!!!
(Скрин как подтв-е!)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.