Решить задачу

Тема в разделе "Pascal and Delphi", создана пользователем -, 22 янв 2010.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. Гость

    Дана строка состоящая из слов разделенных одним или несколькими пробелами. Удолить из строки слова содержащие букву М
    Сколько раз пробовал писать или дописывать программу всё время зависает.

    Код (Delphi):
    program ZADANIE5;
    uses crt;
    var a,b,g,j,i,v:integer;
    st: string;
    begin clrscr;
    writeln ('введите строку');
    read (st);
    v:=length (st);
    for i:=1 to v do
    if st[i]='m' then
    while st[i]=' ' do delete (st,i,i);


    writeln (st);
    readkey;
    end.






    Добавлено: Прошу помочь решить. :(
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    омг... думать не пробовали?
    перепишите этот кусок - подумайте, что Вы этим делаете: while st=' ' do delete (st,i,i);

    Корректней просматривать строку с конца, раз вы удаляете символы - возможно, что-то типа такого... for i:=v downto 1 do

    Добавлено: <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Хотя бы примерный алгоритм:</div></div><div class="sp-body"><div class="sp-content">Вам нужно описать флаг, что в слове бьіл символ m (boolean) и инициализировать в false.
    Вам нужно находить и запоминать конец слова (индекс символа) в какую-то переменную - благо, их у вас описано много...
    В начале работы, до цикла - проинициализировать ее позицией последнего символа строки, т.е. длиной строки,
    и в ходе работы программы менять значение на позицию последнего символа слова.
    Т.е. просмотр строки с конца в цикле:
    1. проверка i-го символа строки на пробел, т.е. если пробел
    1.1) если в текущем слове был найден символ m:
    1.1.1) удалять символы с текущего (пробела) до конца слова
    1.1.2) сбрасывать флаг того, что в слове бьіл символ m
    1.2) если i>1, то сохранять позицию символа перед пробелом, т.е. i-1 (как конец слова, в соотвестствующую переменную)
    2. иначе если не установлен флаг, что в слове бьіл символ m, то
    2.1. проверка i-го символа на m, если символ m, то
    2.1.1 ставить флаг, что в слове бьіл символ m


    код написать - раз плюнуть, за Вас это делать не буду, ибо если я буду писать - могу ошибиться, у меня нет среды под рукой уже довольно много времени )))
     
  3. isqoff

    isqoff Гость

    написано как всегда в PascalABC... :please:
    Код (Text):
    uses crt;
    const M = [#77,#109,#204,#236]; //здесь англ и рус буквы "м" (заглавные и строчные)по кодам ,проверь у себя их правильность
    var s:string;
    i,buf:integer;

    BEGIN
    write('Введите любую строку :');
    readln(s);

    buf := 0;

    for i := 1 to length(s) do       // считаем сколько у нас букв "м"
    if s[i] in M then buf := buf+1;

    repeat                               //избавляемся от букв "м"
    for i := 1 to length(s) do
    if s[i] in M
    then begin
    Delete(s,pos(s[i],s),1);
    dec(buf);
    end;
    until buf = 0;

    write(s);
    END.
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    ой, и давно это ж было...
    там не букву удалить надо, а слова.

    Добавлено: думаю, автору задача уже не актуальна, но для тренировки решить можно было бы.
    isqoff а вы проверяли код, кстати?
    если рассмотреть задачу - удалять только символы всяких m, а не слова с этими буквами:
    А вот такая штука как
    Delete(s,pos(s,s),1);
    не пропустит ли случай строки "mM"? должно быть "" на выходе.
    P.S. я не проверяла. похоже, тут 2 прохода строки cделается в repeat и за счет этого работает...
    я не тестер, я просто придираюсь :please:

    Добавлено: делай проще) для разминки укоротила почти в 2 раза прогу, которая вычищает всевозможные m
    интересно, не напутала ли с индексами - вроде с 1 должно быть?
    Код (Text):
    uses crt;
    const M = [#77,#109,#204,#236]; //здесь англ и рус буквы "м" (заглавные и строчные)по кодам ,проверь у себя их правильность
    var s:string;
    i, lens:integer;

    BEGIN
    write('Введите любую строку :');
    readln(s);

    lens :=length(s);
    if lens >0 then // если не пустая строка
    for i := lens downto 1 do // смотрим с конца - экономим вызов pos
    if s[i] in M then Delete(s,i,1); //избавляемся от букв "м"

    write(s);
    END.
    теперь еще осталось решить задачу топикстартера - вычистить слова :)
     
  5. isqoff

    isqoff Гость

    век живи век учись ... :please: Спасибо за урок!
     
  6. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    да не за что. мб, потом через недельку-две посмотрю и исходную задачу, заинтересовали. сейчас домой хочу... спать...
    тем более, там в описанном посте #2 алгоритме где-то бажка была небольшая вроде, я не помню ее сути, а также поправила ее в сообщении или нет.
     
Загрузка...
Похожие Темы - Решить задачу
  1. GREED
    Ответов:
    5
    Просмотров:
    662
  2. vovanabali
    Ответов:
    0
    Просмотров:
    570
  3. zolotco
    Ответов:
    0
    Просмотров:
    995
  4. merrs
    Ответов:
    1
    Просмотров:
    1.319
  5. Kugotovr23
    Ответов:
    1
    Просмотров:
    1.298
Статус темы:
Закрыта.

Поделиться этой страницей