Помощь - Поиск - Пользователи - Календарь
Полная версия: Одномерные структуры(строковые параметры=))
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Needhelp
Задание: Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении заданное число раз.
Здесь на форуме было такое задание: "Отредактировать заданное предложение, удаляя из него слова, которые уже встречались в предложении", а такого еще не было, в общем, уже голова кругом. wacko.gif Нужна помощь unsure.gif !!
volvo
Небольшое усовершенствование вот этой программы:
Разбиение на слова. Все способы.

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
Проблемка...

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
Тебе надо удалить слова из строки, а не просто очистить определенные слова. Ты же не хочешь потерять разделители между словами?

Вот так перепиши основную программу:
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
Ммм..вот все как хитро... blink.gif
Спасибо большущее! good.gif
Needhelp

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
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
НУ СУПЕР!!! То, что надо!!! good.gif

(Скрин как подтв-е!)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.