Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
1

Оставить в слове только первое и последнее вхождение каждой буквы

19.12.2017, 17:19. Показов 2274. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами - запятая или не менее одного пробела, за последним словом - точка.
Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству:
оставить в слове только первое и последнее вхождение каждой буквы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2017, 17:19
Ответы с готовыми решениями:

Найти первое и последнее вхождение заданной буквы в слове
Дана строка. Если в этой строке буква f встречается только один раз, выведите её индекс. Индексы...

Оставить в строке только первое и последнее вхождение цифр каждого слова
Дана строка s, оставить в ней только первое и последнее вхождение цифр каждого слова, распечатать...

Оставить в слове только первые вхождения каждой буквы
Дана последовательность слов. Напечатать все слова, предварительно преобразовав каждое из них по...

Оставить в слове только первые вхождения каждой буквы
Дан текст, состоящий из латинских букв. Между соседними словами – не менее одного пробела; за...

14
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
19.12.2017, 17:29 2
Очень похожая тема Некорректно работает программа
0
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
19.12.2017, 19:15  [ТС] 3
Цитата Сообщение от Matan! Посмотреть сообщение
Очень похожая тема Некорректно работает программа
да,спасибо) только теперь бы разобраться,как оставить первые и последние вхождения
вот если что-то одно,то понятно
на форуме есть похожее,только там с процедурами(
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
19.12.2017, 20:54 4
Цитата Сообщение от Лена Кот Посмотреть сообщение
вот если что-то одно,то понятно
Да? Как?
0
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
20.12.2017, 17:52  [ТС] 5
Цитата Сообщение от Matan! Посмотреть сообщение
Да? Как?
каждую букву слова проверять на повтор, если есть, то удалять этот повтор
получается, что остаётся только первая буква. Так?
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
20.12.2017, 17:55 6
Вот есть слово "молоко". Как Вы действовать будете?
0
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
20.12.2017, 18:49  [ТС] 7
Delphi
1
2
for k:=length(slovo) downto 1 do
  if pos(slovo[k],slovo)<k then delete(slovo,k,1);
здесь останется только первое вхождение буквы- молк
а как сделать так, чтобы осталось - молко?
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
20.12.2017, 21:33 8
Цитата Сообщение от Лена Кот Посмотреть сообщение
а как сделать так, чтобы осталось - молко?
Пропустить последнюю итерацию.
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
20.12.2017, 22:49 9
Муторный алгоритм получается.
1. Находим все не повторяющиеся символы.
2. Для каждого найденного символа:
2.1. Проходим по слову и помечаем индексами первый и последний элементы.
2.2. Ещё один проход - меняем на что-нибудь (например на 0) найденные символы, если их место не совпадает с найденными индексами.
3. Убираем все удаленные символы (удобнее создать новую строку).
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
21.12.2017, 00:06 10
Ну вот так, примерно.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button1Click(Sender: TObject);
var s,ss:string;i,j,j1,j2:integer;
begin
s:=Trim(Edit1.Text);
ss:='';
for i:=1 to Length(s) do if Pos(s[i],ss)<=0 then ss:=ss+s[i];
for i:=1 to Length(ss) do
   begin
   j1:=0;j2:=0;
   for j:=1 to Length(s) do
      begin
      if ss[i]=s[j] then if j1=0 then j1:=j else j2:=j;
      end;
   if (j1<>0) and (j2<>0) then
      begin
      for j:=1 to Length(s) do
         begin
         if (ss[i]<>s[j]) then continue;
         if (j=j1) or (j=j2) then continue;
         s[j]:=#1;
         end;
      end;
   end;
ss:='';
for i:=1 to Length(s) do if s[i]<>#1 then ss:=ss+s[i];
Edit2.Text:=ss;
end;
Миниатюры
Оставить в слове только первое и последнее вхождение каждой буквы   Оставить в слове только первое и последнее вхождение каждой буквы  
1
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
21.12.2017, 14:23  [ТС] 11
а можно ли цикл с continue заменить на while? я попробовала,он неправильно выводит результат(
Delphi
1
2
3
4
5
6
7
        j:= 1;
        while j<= Length(s) do
        begin
          if (ss[i]<>s[j]) then j:=j+1;
          if (j=j1) or (j=j2) then j:=j+1;
          s[j]:=#1;
        end;
и можете объяснить, пожалуйста, что такое #1? и можно ли без него?
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
21.12.2017, 14:48 12
Если не ошибся, то так:
Delphi
1
2
3
4
5
6
j:=1;
while (j<=Length(s)) do
   begin
   if (ss[i]=s[j]) and (j<>j1) and (j<>j2) then s[j]:=#1;
   inc(j);
   end;
---------------------------------------
#1 - это символ с кодом 1.
Вместо него можно применить любой символ, которого заведомо нет в строке.
1
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
21.12.2017, 17:33  [ТС] 13
получается, #1 нельзя заменить какой-нибудь переменной?
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
21.12.2017, 17:37 14
Цитата Сообщение от Лена Кот Посмотреть сообщение
получается, #1 нельзя заменить какой-нибудь переменной?
Можно..А смысл? Читай выше:
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вместо него можно применить любой символ, которого заведомо нет в строке.
0
0 / 0 / 0
Регистрация: 03.11.2017
Сообщений: 20
22.12.2017, 16:34  [ТС] 15
получилось вот это. и оно не работает(
первое нормально выводит, а на втором зацикливается
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
var s,s1,sp, ss:string;
    m:set of char;
    n,i,j,k,q,j1,j2:byte;
begin
  writeln('Введите последовательность слов, разделенных пробелами');
  readln(s);
  n:=length(s);
  i:=1;
  while i<=n do{выделяю слова из строки}
  begin
    if((s[i]<>' ') or (s[i]<>','))and((i=1)or(s[i-1]=' ')) then
    begin
      j:=i;
      s1:='';
      while(j<=n)and(s[j]<>' ') do
      begin
        s1:=s1+s[j];
        j:=j+1
      end;
      ss:='';
      for i:=1 to Length(s1) do if Pos(s1[i],ss)<=0 then ss:=ss+s1[i];
      for i:=1 to Length(ss) do
      begin
        j1:=0;
        j2:=0;
        for j:=1 to Length(s1) do
        begin
          if ss[i]=s1[j] then if j1=0 then j1:=j else j2:=j;
        end;
       if (j1<>0) and (j2<>0) then
       begin
         j:=1;
         while (j<=Length(s1)) do
         begin
           if (ss[i]=s1[j]) and (j<>j1) and (j<>j2) then s1[j]:=#1;
           inc(j);
         end;
       end;
      end;
      ss:='';
      for i:=1 to Length(s1) do if s1[i]<>#1 then ss:=ss+s1[i];
      writeln('преобразованные по правилу слова: ',ss);
    end
    else i:=i+1;{пропускаем пробелы}
  end;
 
 
  sp:='';{собираю последнее слово}
  i:=n;
  while(i>0)and((s[i]<>' ') or (s[i]<>',')) do
  begin
    sp:=s[i]+sp;
    i:=i-1
  end;
  n:=i;{длина строки без последнего слова}
  writeln('Слова, отличные от последнего и не содержащие повторяющихся букв');
  q:=0;
  i:=1;
  while i<=n do{выделяю другие слова}
  if((s[i]<>' ') or (s[i]<>','))and((i=1)or(s[i-1]=' ')) then
  begin
    j:=i;
    s1:='';
    while(j<=n)and(s[j]<>' ') do
    begin
      s1:=s1+s[j];
      j:=j+1
    end;
    q:=0;
    if s1<>sp then{если не равно последнему}
    begin
      q:=q+1;
      writeln('ответ: ',s1);
    end;
    i:=i+length(s1){перешагиваю через это слово}
  end
  else i:=i+1;{пропускаем пробелы и запятые}
  if q=0 then write('Таких слов нет.');
  readln
end.
Добавлено через 22 часа 34 минуты
помогите найти ошибку, пожалуйста
0
22.12.2017, 16:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2017, 16:34
Помогаю со студенческими работами здесь

Оставить в слове только первые вхождения каждой буквы
оставить в слове только первые вхождения каждой буквы.

Оставить в слове только первые вхождения каждой буквы
Дана последовательность слов. Вывести все слова, предварительно преобразовав каждое из них по...

Оставить в слове только первые вхождения каждой буквы
Задав с клавиатуры последовательность символов, реализовать обработку ее.Исходные данные задать...

Оставить в слове только первые вхождения каждой буквы
2)Дана последовательность слов. Напечатеть все слова, предворительно преобразовав каждое слово по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru