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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

Код:
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.






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

hosm

* so what *
18.05.2009
2 442
6
#2
омг... думать не пробовали?
перепишите этот кусок - подумайте, что Вы этим делаете: 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


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

isqoff

#3
написано как всегда в PascalABC... :please:
Код:
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.
 

hosm

* so what *
18.05.2009
2 442
6
#4
ой, и давно это ж было...
там не букву удалить надо, а слова.

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

Добавлено: делай проще) для разминки укоротила почти в 2 раза прогу, которая вычищает всевозможные m
интересно, не напутала ли с индексами - вроде с 1 должно быть?
Код:
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.
теперь еще осталось решить задачу топикстартера - вычистить слова :)
 

hosm

* so what *
18.05.2009
2 442
6
#6
да не за что. мб, потом через недельку-две посмотрю и исходную задачу, заинтересовали. сейчас домой хочу... спать...
тем более, там в описанном посте #2 алгоритме где-то бажка была небольшая вроде, я не помню ее сути, а также поправила ее в сообщении или нет.
 
Статус
Закрыто для дальнейших ответов.