0 / 0 / 2
Регистрация: 06.02.2016
Сообщений: 133
1

Оставить в строке только первое вхождение каждого символа. Взаимный порядок оставленных символов сохранить

22.02.2016, 17:06. Показов 3312. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил данную задачу так:

Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Оставить в строке только первое вхождение каждого символа. Взаимный порядок оставленных символов сохранить
Procedure write_in_set(var str_IN, str_OUT : string);
Var
    i : integer;
    position : set of integer;
begin
    position := [];
    for i:=1 to length(str_IN) do //Цикл для перебора каждого символа
        if not (Pos(str_IN[i],str_IN) in position) then // Если символ новый, то записываем в строку
        begin   
            position := position + [Pos(str_IN[i],str_IN)]; // Записываем позицию во множество позиций
            str_OUT := str_OUT + Copy (str_IN, Pos(str_IN[i],str_IN), 1); // В итоговую строку копируем новый символ
    end;
end;
Var
    str_IN, str_OUT : string;
BEGIN
    str_OUT := '';
    write('Введите строку: ');
    readln(str_IN);
    write_in_set(str_IN, str_OUT);
    writeln(str_OUT); // Вывод строки состоящей из символов, входящих в исходную строку
    readln();
END.

Она работает и работает правильно, но хотелось бы обойтись только одной строкой, которую вводит пользователь. И удалить из неё лишние символы встроеной функцией delete.
Как ни бился, так ничего и не получилось. То выход за границу цикла, то удаление всех символов из строки получалось...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2016, 17:06
Ответы с готовыми решениями:

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

В каждой строке для всех слов, которые встречаются в строке больше одного раза, оставить только первое вхождение
Народ, помогите Нужно в каждой строке для всех слов, которые встречаются в строке больше одного...

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

Строки: Дана последовательность символов(строка). Если какой-то элемент встречается в ней более одного раза, оставить только первое вхождение
помогите решить.. Дана последовательность символов(строка). Если какой-то элемент встречается в ней...

3
5059 / 2633 / 2346
Регистрация: 10.12.2014
Сообщений: 9,996
24.02.2016, 10:32 2
Лучший ответ Сообщение было отмечено Александр Летов как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
begin
  var S := ReadLnString('Введите строку:');
  var i := 1;
  while i <= S.Length do
    begin
      var p := S.LastIndexOf(S[i]);
      if p >= i then
        Delete(S, p+1, 1)
      else
        i += 1;
    end;
  WriteLn(S);
end.
Т.к. функция Delete в модуле PABCSystem определена вот так:
Pascal
1
2
3
4
5
6
7
8
9
procedure Delete(var s: string; index, count: integer);
// Delete никогда не возвращает исключения
begin
  if (index < 1) or (index > s.Length) or (count <= 0) then
    Exit;
  if index + count - 1 > s.Length then
    count := s.Length - index + 1;
  s := s.Remove(index - 1, count);
end;
То программу можно переписать вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
begin
  var S := ReadLnString('Введите строку:');
  var i := 1;
  while i <= S.Length do
    begin
      var p := S.LastIndexOf(S[i]);
      if p >= i then
        S := S.Remove(p, 1)
      else
        i += 1;
    end;
  WriteLn(S);
end.
1
0 / 0 / 2
Регистрация: 06.02.2016
Сообщений: 133
24.02.2016, 10:49  [ТС] 3
Пришлось немного переделать ибо:
Ошибка компилятора ABC.NET:
Вторая строка - нельзя преобразовать тип string к text.

Но теперь работает так как мне хотелось. СПАСИБО!

P.S мы не изучали не все функции классов или как это называется. Поэтому про LastIndexOf я попросту не знал.

Только я кое-что не понял - почему p+1 я догадался, просмотрев прогу пошагово. Но ведь в описании LastIndexOf сказано, что она возвращает индекс последнего вхождения символа. А запустив прогу с выводом p после каждого прохода цикла, я увидел, что получается, что она возвращает индекс предыдущего символа... почему так?
В строке "оалдфвыоалджвфыолдажфвы" символ "о" стоит на 16-м месте, а p = 15

Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Var
    s : string;
    i, p  : integer;
begin
    write('Введите строку: ');
    readln(S);
    i:=1;
    while i <= Length(s) do
        begin
            p := S.LastIndexOf(S[i]);
            if p >= i then
            begin
                Delete(S, p+1, 1);
            {   
                writeln(s);
                writeln(p); // вывод последнего вхождения i-того символа 
                readln();
            }   
            end
            else
                inc(i);
    end;
  writeln(s);
end.
0
5059 / 2633 / 2346
Регистрация: 10.12.2014
Сообщений: 9,996
24.02.2016, 11:06 4
Лучший ответ Сообщение было отмечено Александр Летов как решение

Решение

Цитата Сообщение от Александр Летов Посмотреть сообщение
Пришлось немного переделать ибо:
Ошибка компилятора ABC.NET:
Попробуйте обновить PABC.NET. (На оффсайте уже версия 3.1… У меня самого пока 3.0 ;–)
Цитата Сообщение от Александр Летов Посмотреть сообщение
мы не изучали не все функции классов или как это называется
LastIndexOf — это метод.
Если переменная уже определена, то после неё достаточно поставить точку и выскочит контекстная подсказка, в которой можно найти и выбрать необходимый метод…
А ещё есть MSDN…
К примеру, тип String (lда простят меня модераторы) вот здесь: String - класс

Ещё, чтобы посмотреть как реализована та или иная подпрограмма в PABC.NET, достаточно на имени подпрограммы нажать ПКМ и выбрать «Перейти к реализации»…
К примеру: вот так работает процедура Read для строки
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure read(var x: string);
begin
  if input.sr <> nil then
    read(input, x)
  else 
    try
      CurrentIOSystem.read(x)
    except
      on e: Exception do
        raise e;
    end;
end;
… а вот так функция ReadLnString :
Pascal
1
2
3
4
5
function ReadlnString(prompt: string): string;
begin
  Print(prompt);
  Result := ReadlnString;
end;
Где, в свою очередь, ReadString :
Pascal
1
2
3
4
5
6
7
function ReadString: string;
begin
  var x: string;
  read(x);
  readln();
  Result := x;
end;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2016, 11:06
Помогаю со студенческими работами здесь

Оставить в строке только по одному экземпляру каждого символа
Задание: нужно оставить в строке только по одному экземпляру каждого символа (повторения учитывать...

Оставить в строке только один экземпляр каждого встречающегося символа
С клавиатуры вводится строка. Оставить в строке только один экземпляр каждого встречающегося...

Оставить в строке только один экземпляр каждого встречающегося символа
Задачка такова: Вводиться с клавиатуры предложение. Оставить в строке только один экземпляр...

Оставить в строке только один экземпляр каждого встречающегося символа
Оставить в строке только один экземпляр каждого встречающегося символа.

Оставить в строке только один экземпляр каждого встречающегося символа.
оставить в строке только один экземпляр каждого встреяающегося символа.

Оставить в строке только один экземпляр каждого встречающегося символа
Не понимаю почему выдаёт ошибку. #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru