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

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

Форум «Всё о Паскале» _ Задачи _ Одномерные структуры(строковые параметры=))

Автор: Needhelp 4.04.2007 2:36

Задание: Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении заданное число раз.
Здесь на форуме было такое задание: "Отредактировать заданное предложение, удаляя из него слова, которые уже встречались в предложении", а такого еще не было, в общем, уже голова кругом. wacko.gif Нужна помощь unsure.gif !!

Автор: volvo 4.04.2007 3:02

Небольшое усовершенствование вот этой программы:
http://forum.pascal.net.ru/index.php?s=&showtopic=6972&view=findpost&p=50581

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

Ммм..вот все как хитро... blink.gif
Спасибо большущее! good.gif

Автор: 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' ...
...Просмотрел эту строчку в немодифицированном варианте этой проги (взял из раздела "Разбиение на слова. Все способы") и вот что увидел (см. скрин)
Даже не знаю, что в таком случае делать???... unsure.gif Прикрепленное изображение

Автор: 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

НУ СУПЕР!!! То, что надо!!! good.gif

(Скрин как подтв-е!)


Эскизы прикрепленных изображений
Прикрепленное изображение