Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 10:01   #1
dcLout
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 19
По умолчанию Задача со строковым типом

Даны символы S1,... Sn. Известно, что символ S1 отличен от пробела и что среди S1, S2,... имеется хотя один пробел. Рассматриваются S1,... Sn - символы, предшествующие первому пробелу (n заранее неизвестно). Преобразовать последовательность.
- Удалить из нее все символы, не являющиеся буквами (латинскими).
dcLout вне форума Ответить с цитированием
Старый 11.01.2012, 10:23   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

какой язык программирования?
Какие трудности?

можно первую часть написать так:
Код:
Delete(S, 1, Pos(' ',S)-1);
или так:
Код:
i:=1;
while s[i]<>' ' do inc(i);
Delete(S, 1, i-1);
вариантов, короче - вагон и маленькая тележка!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2012, 10:33   #3
dcLout
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 19
По умолчанию

Язык паскаль!
Вот код который я написал,но он не доделан

Код:
Program z9;
const
A : set of char = ['a'..'z','A'..'Z'];
var
S : string;
i,c,h :integer;
begin
WRiteln('Vvedite stroku simvolov : ');
Readln(S);
 While S[1] ='' do
  begin
   Writeln('Ne pravilno vvedena stroka,vvedite druguy');
   Readln(S);
  end;
h := pos('',S);
c := h+length(S)+1;
delete(S,h,c);
   For i := 1 to h-1 do
     begin
       If  Then
        begin
         S :=S[i];
        end;
     end;
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 11.01.2012 в 10:48.
dcLout вне форума Ответить с цитированием
Старый 11.01.2012, 10:48   #4
Sna1L
Форумчанин
 
Аватар для Sna1L
 
Регистрация: 15.03.2011
Сообщений: 272
По умолчанию

для начала:
'' - не является пробелом.

Цикл for тут не прокатит, поскольку при удалении символов длина строки будет меняться.
Напишите примерно как указал человек во втором сообщени:
Код:
while s[i]<>' ' do
    begin
    if not ( s[i] in ['a'..'z','A'..'Z'] ) then 
           delete(s,i,1)
    else //обязательно из-за смещения
           inc(i);
    end;
А дальше просто удалите все после i
Sna1L вне форума Ответить с цитированием
Старый 11.01.2012, 10:52   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

удаление написано НЕПРАВИЛЬНО! Вы удаляете ПОСЛЕ пробела, а надо - ДО!

дальше, если Вы уже делаете проверку на корректность введённой строки, так сделайте её законченной - проверяйте не только, что первый символ - не пробел, но и то, что пробел в строке имеется!

а в целом - нормально. вполне нормально мыслите!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2012, 11:00   #6
dcLout
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 19
По умолчанию

О спасибо друзья,сейчас попробую!
dcLout вне форума Ответить с цитированием
Старый 11.01.2012, 11:07   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, и чтобы было интереснее. после того, как закончите свой вариант
можете посмотреть на один из вариантов решения (я набросал свой, на основе вашего кода):

Код:
Program z9;
const
A : set of char = ['a'..'z','A'..'Z'];
var
S : string;
i,h :integer;
begin
  WriteLn;
  repeat
    Write('Vvedite stroku simvolov : ');
    Readln(S);
    h := Pos(' ', S);
    if (Length(S)<1) then 
        Writeln('Ne pravilno vvedena stroka: ona ne dolgna byt` pustoy! Poprobyyte eshe raz!')
    else
      if (S[1]=' ') or ( h=0 ) then begin
        h:=0;
        Writeln('Ne pravilno vvedena stroka: pervyi symvol doljen byt` ne probel, no probel v stroke dolgen byt`! '); 
        Writeln('Poprobyyte eshe raz!');
      end;
  until (Length(S)>0) and (h>0);

  {удалим из строки все символы, предшествующие первому пробелу }
  delete(S,1,h-1);


  {Удалить из нее все символы, не являющиеся буквами (латинскими). }
  for i:=Length(S) downto 1 do
    if Not (S[i] in A) then Delete(S, i, 1);

  WriteLn('Resultat: ',S);

  Readln;
end.

p.s.
Цитата:
Сообщение от Sna1L
Цикл for тут не прокатит, поскольку при удалении символов длина строки будет меняться.
Sna1L прав. Но я показал, как можно обойти эту проблему, использовав цикл FOR ("трюк" в том, что движемся от конца строки к началу. Поэтому удаляемые символы (изменяющаяся длина строки) не оказывают влияние на цикл.. но можно и через while/Repeat решить эту же задачу. Любой вариант подойдёт ( если он корректный, конечно )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с типом данных Nicko_mt Помощь студентам 6 17.09.2011 00:42
задача по строковым величинам tatka1 Помощь студентам 2 26.05.2011 20:47
Проблемы со строковым типом; задание со словами. oksanaBM Помощь студентам 1 02.12.2010 11:33
проблема с типом? OLEG'arh Помощь студентам 4 03.03.2009 16:02
простая задача по строковым переменным STEEL-F Помощь студентам 6 21.01.2008 22:32