Форум программистов, компьютерный форум CyberForum.ru

Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
25.02.2013, 21:24     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #1
Доброго времени суток.
По заданию необходимо:Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием(т. е. тремя точками)

Пример,вводимая строка: ппп вававав ппппп ывыва 2222
А на выходе получаем : ... вававав ... ывыва ...

C++
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
  char str[255]="/0";
  char ch;
  char end_str[255]="/0";
  printf("Введите строку:");
  gets(str);
    int i=0;
    while(str[i]!='\0')
  {
    ch=str[i];
    if (ch==str[i+1] && ch==str[i+2])
   { while(ch==str[i])
    {
      end_str[i]='.';
     i++ ;
    } }
    else
    {
            end_str[i]=str[i];
      i++;
    }
    
    }
  i=0;
  printf("\n");
  while(end_str[i]!='\0')
  {
    printf("%c",end_str[i]);
    i++;
  }
  printf("\n");
  getch();
}
Написал код,но получается что каждый одинаковый символ символ заменятся ".", а нужно что бы вся группа одинаковых символов заменилась "..."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 21:24     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием)
Посмотрите здесь:

C++ Дана строка. Подсчитать, сколько различных символов встречается в ней. Вывести их на экран.
Дана строка текста.Определить сколько в ней символов больше . а или о C++
C++ Дана строка символов, заменить в ней все многоточия на плюсы
C++ заменить каждую точку многоточием
Дана строка символов. Выделить в ней цветом все символы C++
C++ Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов
В предложении заменить каждую букву многоточием. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
25.02.2013, 21:50     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #2
C++
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
#include <stdio.h>
#include <iostream.h>
#include <string.h>
//using std namespase;
int main()   
{
     char text[100],*p, *razd=" .,";
  int dlina;
  puts ("Vvedi stroku\n ");
  gets(text);
  p=strtok(text,razd); 
  while (p)
  {  
    dlina=strlen(p);
    int povt=1;
    for(int i=0;i<dlina-1;i++)
        for(int j=i+1;j<dlina;j++)
            if(p[i]==p[j]) povt++;
 
    if (povt>3) cout<< "... ";
    else 
 
 
    cout << p << " " ;
    p=strtok(NULL,razd); 
   
  } 
 
return 1;
}
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
25.02.2013, 21:51  [ТС]     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #3
olya7,
Ох да,забыл добавить,нельзя использовать библиотеку string(с ним написал уже)
gazlan
2903 / 1851 / 277
Регистрация: 27.08.2010
Сообщений: 4,992
Записей в блоге: 1
25.02.2013, 22:07     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #4
Проще всего это сделать, используя два буфера - входной и выходной.

1. Сканируем строку посимвольно
2. Пока первый и второй символы различны, копируем текущий в выходной буфер
3. Если первый и второй совпали, проверяем, совпадают ли они с третьим. Если да, копируем в выходной буфер многоточие, поднимаем флаг группы и продвигаемся на два символа вперед. Пока установлен флаг группы, продвигаемся на символ
4. Если текущий и следующий НЕ совпали, сбрасываем флаг группы и переходим к п. 2

В варианте с одним буфером, запоминаем текущий символ, 3-символьная группа заменяется многоточием, запоминаем позицию за многоточием, пока очередной символ совпадает с запомненным, ничего не делаем, по окнчанию группы начинаем копирование очередных символов начиная с ранее запомненной позиции.

Иными словами, если вы редактируете строку на лету, необходимо помнить позиции редактирования, при двух буферах просто переключаете вывод между текущий символ/ничего/многоточие.
NinGAZ
13 / 13 / 1
Регистрация: 27.07.2011
Сообщений: 162
25.02.2013, 22:11     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #5
вместо strtok используй

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* sub(char* str,char* sub)//делит строку,забивая в sub слово
{                             //из str(опеределитель конца слова - пробел)
    int i=0,j=0;
    while(str[i]==' ')i++;//если в начале строки есть пробелы - прокручиваем
    while(str[i]!='\0')
    {//пока не настигли пробела,забиваем строку
        if(str[i] == ' ' || str[i] == '\n')
        {//как встретили,вернем указатель на начало следующего слова
            while(str[i]==' ' || str[i]=='\n')i++;//в str
            return &str[i];
        }
        else
        {
            sub[j]=str[i];
            j++;
        }
        i++;
    }
}
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
25.02.2013, 22:15     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #6
C++
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
#include <stdio.h>
#include <iostream.h>
 
int main()   
{
    char st[100], sl[100],s[20][20]={'\0'};
int k=0, i,t=0;
 gets(st);
 
   sl[0]='\0';
   i=-1;
  do
  {++i;
       if (st[i] != ' ' && st[i]!='\0') 
       {
           sl[k]=st[i];
           sl[k+1]='\0';
           k++;
       }
       else
       {  if (k<3) cout<< sl<<" ";
             else
             {
           int povt=0;
        for(int i=0;i<k-2;i++)
        
            if((sl[i]==sl[i+1])&&(sl[i]==sl[i+2])) {povt++;break;}
 
    if (povt>0) cout<< "... ";
    else cout<< sl<<" ";}
    
        
    sl[0]='\0'; 
           
           k=0;
       }
       
  }while(st[i]!='\0');
       
           
 
return 1;
}
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
25.02.2013, 22:26  [ТС]     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #7
Всем большое спасибо за помощь!

olya7, если не сложно,добавить коментарии к коду.
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
25.02.2013, 22:31     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #8
C++
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
#include <stdio.h>
#include <iostream.h>
 
int main()   
{
    char st[100], sl[100],s[20][20]={'\0'};
int k=0, i,t=0;
 gets(st);
 
   sl[0]='\0';
   i=-1;
  do// идем по строке до нуль терминанта
  {++i;
       if (st[i] != ' ' && st[i]!='\0') // если текущий символ не пробел, нультерминант, сюда можно добавить точки, запятые
       {
           sl[k]=st[i];// в буфер sl помещаем текущее слово
           sl[k+1]='\0';
           k++;
       }
       else// как только дошли до разделителя начинаем анализировать буфер
       {  if (k<3) cout<< sl<<" ";// если слово из менее 2 букв то просто его выводим
             else
             {
           int povt=0;// счетчик повтора букв
        for(int i=0;i<k-2;i++)// проверяем группу из 3 букв слова
        
            if((sl[i]==sl[i+1])&&(sl[i]==sl[i+2])) {povt++;break;}
 
    if (povt>0) cout<< "... ";
    else cout<< sl<<" ";}
    
        
    sl[0]='\0'; 
           
           k=0;
       }
       
  }while(st[i]!='\0');
       
           
 
return 1;
}
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
26.02.2013, 01:14  [ТС]     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #9
olya7, ещё раз,большое спасибо.

Добавлено через 2 часа 40 минут
Все таки передела свой вариант кода,до рабочего состояния,теперь всё выводит как надо
C++
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
  char str[255]="/0";
    char ch;
  char end_str[255]="/0";
  int pos=0;
  printf("Ââåäèòå ñòðîêó:");
  gets(str);
    int i=0;
    int j=0;
    while(str[i]!='\0')
  {
    ch=str[i];
    if (ch==str[i+1] && ch==str[i+2])
    { 
        end_str[j]='.';
      end_str[j+1]='.';
      end_str[j+2]='.';
      j=j+3;
        while(ch==str[i])
    {
     i++ ;
    }
    }
    else
    {
            end_str[j]=str[i];
      i++;j++;
    }
    
    }
  j=0;
  printf("\n");
  while(end_str[j]!='\0')
  {
    printf("%c",end_str[j]);
    j++;
  }
  printf("\n");
  getch();
}
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
26.02.2013, 01:37     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #10
строка:vv dvvvvvk ddd
Результат Вашей программы
vv d...k ...
так должно было быть?
Вебер
0 / 0 / 0
Регистрация: 05.01.2011
Сообщений: 25
26.02.2013, 13:36  [ТС]     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #11
olya7,
Именно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 14:08     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием)
Еще ссылки по теме:

C++ Дана строка символов. Заменить в ней все пробелы на табуляции
Дана строка. Определить, сколько в ней символов *, ;, : [Есть код на Pascal] C++
C++ Преобразовать последовательность символов заменив в ней каждую из групп стоящих рядом точек одной точкой
Заменить каждую точку в последовательности многоточием C++

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

Или воспользуйтесь поиском по форуму:
olya7
476 / 293 / 91
Регистрация: 18.02.2013
Сообщений: 684
26.02.2013, 14:08     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием) #12
мне из задания показалось, что если в слове есть группа из одинаковых рядомстоящих символов длинной свыше 3, то необходимо все слово заменить на ...
Yandex
Объявления
26.02.2013, 14:08     Помощь в работе со строками (Дана строка. Заменить в ней каждую из групп, содержащих 3 или более одинаковых символов многоточием)
Ответ Создать тему
Опции темы

Текущее время: 04:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru