Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
#1

Строка: вставить пробел перед каждой заглавной буквой - C++

28.06.2012, 12:14. Просмотров 2951. Ответов 15
Метки нет (Все метки)

Вводится строчка, например, HaveaNiceDay.
Нужно чтобы выводилось Havea Nice Day, то есть перед заглавной буквой ставится пробел. Как вставить пробел в принципе понятно, но как сдвинуть вправо на один? Если можно - не кодом, а словами, буду благодарен.

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
#include <iostream>
#include <cstring>
#include <cstdio>
 
 
using namespace std;
 
int main()
{
   int i=15;
   char mass[i];
 
   cin>>mass;
 
 
  for (i=0;i<=15;i++)
   {
 
    if (isupper(mass[i]))
     {
 
           mass[i-1]=' ';
 
     }
 
 
   }
 
   cout<<mass;
     return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 12:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строка: вставить пробел перед каждой заглавной буквой (C++):

Дана строка латинских букв. После заглавной буквы поставить вставить эту же прописную букву и наоборот - C++
Дана строка латинских букв. После заглавной буквы поставить вставить эту же прописную букву и наоборот. Добавлено через 1 час 11 минут...

Проверить, есть ли точка с пробелом перед каждой большой буквой строки - C++
программа которая проверяет есть ли точка с пробелом перед каждой большой буквой строки кроме первой и если нету то вставляет точку с...

Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить - C++
Задание : Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить. Обработку строки реализовать с помощью...

Проверить наличие в тексте одного из знаков разделителей (“.” , ”?”, ”!”) перед каждой большой русской буквой - C++
Помогите пожалуйста. Проверить наличие в тексте одного из знаков разделителей (“.” , ”?”, ”!”) перед каждой большой русской буквой.

Во втором слове после каждой буквы вставить пробел - C++
Задается строка текста, состоящая из нескольких слов. Слова отделяются последовательностью пробелов. Составить программу, которая должна...

Строки. Вставить пробел после каждой нечетной буквы в слове - C++
1) Дано слово, посчитать, сколько раз входит в него сочетание «he» (Уже составил, см.ниже); 2) Нужно вставить в слове после каждой,...

15
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 12:19 #2
Чтобы сильно не "париться" сделай так:

1) заведи второй массив бОльшего размера
2) читаешь символ за символом из исходной строки.
3) если буква строчная - просто кладешь ее во второй массив
4) если заглавная - во второй массив кладешь пробел, а за ним заглавную букву...
5) вытряхиваешь на экран второй массив

Пойдет?
1
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 12:47  [ТС] #3
Где-то неправильно...


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
#include <iostream>
#include <cstring>
#include <cstdio>
 
 
using namespace std;
 
int main()
{
   int i=30;
   int n=90;
   char mass[i];
   char mass1[n];
   cin>>mass;
 
 
  for (i=0,n=0;i<=30,n<=90;i++,n++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n]=mass[i];
 
     }
  if (isupper(mass[i]))
     {
 
 
        mass1[n]=' ';
        mass1[n+1]=mass[i];
     }
 
 
 
   }
 
   cout<<mass1;
     return 0;
}
Добавлено через 10 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Чтобы сильно не "париться" сделай так:

1) заведи второй массив бОльшего размера
2) читаешь символ за символом из исходной строки.
3) если буква строчная - просто кладешь ее во второй массив
4) если заглавная - во второй массив кладешь пробел, а за ним заглавную букву...
5) вытряхиваешь на экран второй массив

Пойдет?
можешь посмотреть, где не так?
0
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 12:52 #4
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
int main()
{
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
  n=0;
  for (i=0;i<30;i++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n++]=mass[i];
 
     }
  if (isupper(mass[i]))
     {
 
        mass1[n++]=' ';
        mass1[n++]=mass[i];
     }
  
   }
 
   cout<<mass1;
 
   return 0;
 
}
1
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
28.06.2012, 12:53 #5
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
#include <iostream>
#include <cstring>
#include <cstdio>
#include <conio.h> 
 
using namespace std;
 
int main()
{
   int i=30;
   int n=90;
   char mass[i];
   char mass1[n];
   cin>>mass;
 
 n=0;
  for (i=0;i<=30;i++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n]=mass[i];      n++;
 
     }
  if (isupper(mass[i]))
     {
 
 
        mass1[n]=' ';
        mass1[n+1]=mass[i];n++;n++;
     }
 
 
 
   }
 
   cout<<mass1;
     getch();
}
0
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 12:59  [ТС] #6
Не понимаю в чем отличие n++ в цикле или там, где вы поставили? Поясните, пожалуйста.
0
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 13:00 #7
Верно и так, и так. Но мой способ быстрее.
0
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 13:03  [ТС] #8
Цитата Сообщение от Catstail Посмотреть сообщение
Верно и так, и так. Но мой способ быстрее.
Дело в том, что у меня, когда написано в цикле - не работает, просто затирает заглавные буквы, но не смещает. И , кстати, когда запускаешь тот код, который работает в конце еще "мусор" какой-то, в виде нескольких символов.
0
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
28.06.2012, 13:07 #9
Цитата Сообщение от eugeneC+ Посмотреть сообщение
Дело в том, что у меня, когда написано в цикле - не работает, просто затирает заглавные буквы, но не смещает. И , кстати, когда запускаешь тот код, который работает в конце еще "мусор" какой-то, в виде нескольких символов.
Потому что, когда ты встречаешь заглавную букву, ты добавляешь в новый массив 2 символа (пробел и саму букву), значит и шаг в этом случае должен быть 2 по n, а у тебя 1. А у тебя получается что ты встречаешь заглавную букву , добавляешь в новый массив пробел и букву, прибавляешь к n 1, а значит в следующем шаге цикла ты затрешь эту же букву.
1
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 13:13 #10
Почему бы и не выводить тупо посимвольно?

C++
1
2
3
4
5
for (int i=0; i<strlen(s); i++)
 if (!isupper(s[i]))
  printf("%c",s[i]);
 else
  printf(" %c",s[i]);
0
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 14:24 #11
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
#include "iostream.h"
#include "string.h"
#include "ctype.h"
 
int main(int argc, char* argv[])
{
 
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
   n=0;
   for (i=0;i<30;i++)
   {
      if (islower(mass[i]))
      {
          mass1[n++]=mass[i];
      }
  if (isupper(mass[i]))
     {
          mass1[n++]=' ';
          mass1[n++]=mass[i];
     }
  
   }
 
   mass1[n]=0; // ÷òîáû Г*ГҐ áûëî ìóñîðГ*
 
   cout << mass1 << endl;
 
    return 0;
}
Все работает... Только нуль-символ надо было вставить.
0
Миниатюры
Строка: вставить пробел перед каждой заглавной буквой  
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 14:53 #12
Catstail, я бы рекомендовал слегка исправить:

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 "iostream.h"
#include "string.h"
#include "ctype.h"
 
int main(int argc, char* argv[])
{
 
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
   n=0;
   i=0;
   
   while (mass[i]) //for (i=0;mass[i]!=0;i++)
   {
      if (islower(mass[i]))
      {
          mass1[n++]=mass[i];
      }
  if (isupper(mass[i]))
     {
          mass1[n++]=' ';
          mass1[n++]=mass[i];
     }
     i++;
   }
 
   mass1[n]=0; // чтобы не было мусора
 
   cout << mass1 << endl;
   system ("pause");
    return 0;
}
Потому как в Вашем случае не совсем корректно работает (по крайней мере у меня):
0
Миниатюры
Строка: вставить пробел перед каждой заглавной буквой  
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 15:10 #13
А буквы русские? Тогда нужно локаль поставить. К алгоритму это не имеет отношения.
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 15:14 #14
Catstail,
А причем тут локаль?
Я к тому, что здесь:
Цитата Сообщение от Catstail Посмотреть сообщение
C++
1
for (i=0;i<30;i++)
нет проверки на нуль-терминатор, который сидит сразу после ввода строчки.
0
Catstail
Модератор
22908 / 11274 / 1832
Регистрация: 12.02.2012
Сообщений: 18,484
28.06.2012, 15:17 #15
Локаль при том, что islower/upper русские буквы просто так обрабатывать не будет.
Что же до анализа на нуль символ - то Вы правы. Просто я хотел сказать автору, что его код вполне работоспособен.
1
28.06.2012, 15:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 15:17
Привет! Вот еще темы с ответами:

Строка вводится с клавиатуры. В данной строке вставить пробел после каждого символа - C++
Строка вводится с клавиатуры. В данной строке вставить пробел после каждого символа

Строка: После каждого символа А вставить пробел, и подсчитать количество символов B, стоящих между + и - - C++
Помогите пожалуйста решить задачу. После каждого символа А вставить пробел, и подсчитать количество символов B, стоящих между + и - ...

Вставить перед каждой серией минимальный элемент массива - C++
Доброго времени суток. Напишите, пожалуйста, прогу для этого задания . ( в коде не должны быть использованы квадратные скобки, т.е без...

Вставить перед каждой серией минимальный элемент массива - C++
Доброго времени суток. Напишите, пожалуйста, прогу для этого задания . ( в коде не должны быть использованы квадратные скобки, т.е без...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.