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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
#1

Удаление определенных букв из строки - C++

11.01.2015, 15:24. Просмотров 3755. Ответов 35
Метки нет (Все метки)

Доброго времени суток!
Помогите, пожалуйста, с заданием! Буду очень благодарен!
Дано задание: написать функцию, чтобы из строки, которую мы введем, удалялись все буквы J…Z(j…z).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* Delete(char *s1,int i)
    {
        for(i=0; s1[i]!='\0' ;i++);
        s1[i--]='\0';
        return s1;
}
char* Del_useless(char *s) 
{
 for(int k=0;*(s+k);k++)
   { 
     if(((*(s+k)<65)||(*(s+k)>73))&& 
       ((*(s+k)<97)||(*(s+k)>105))) 
       { 
         s=Delete(s,k); 
     k--; 
       } 
   } 
 return s;
}
Здесь ошибка в функции Delete, но как ее исправить, я не понимаю. Пробовал разные варианты и это один из них, но функция все равно не работает.
Я так понял, что есть какое-то слово, внутри него есть буква, которую мы должны удалить. Мы ее удаляем и сдвигаем все оставшиеся буквы. Звучит, вроде, просто, но написать не получается.

Помогите, пожалуйста! Очень надо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2015, 15:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление определенных букв из строки (C++):

Удаление определенных цифр из строки - C++
Всем привет. Интересная задачка попалась, сижу, думаю. Пользователь вводит цифровой набор, к примеру, 565471236109. Из этой строчки...

Удаление из строки определенных символов - C++
Подскажите плиз функцию которая удаляет с строки символы. Например ввели символ А и с строки str удалилися все символы А... Если...

Удаление заглавных букв из строки - C++
Помогите, пожалуйста, написать программу: &quot;Удалить из введенной пользователем строки все заглавные буквы.&quot; Заранее большое...

Удаление букв из строки с буквами и цифрами - C++
как удалить букву из ряда цифр например: 1123123ы84750щ13498м93 =&gt; 1123123847501349893

Удаление из строки s все последовательности трёх букв ABC - C++
Только начал освоивать язык С и не могу выполнить задачу Нужно удалить из строки символов s все последователности трёх латинских букв ABC...

Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки - C++
Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки

35
DiffEreD
1432 / 769 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.01.2015, 15:40 #2
del
0
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 15:59  [ТС] #3
Пробовал поменять, но он пишет, что есть необработанные исключения: "Ссылка на объект не указывает на экземпляр объекта".
0
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
11.01.2015, 16:01 #4
Для начала, точка с запятой в конце третьей строки что делает?
1
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 16:30  [ТС] #5
Ничего, это моя ошибка, которую я не заметил.
Но без нее функция все равно не работает.

Добавлено через 25 минут
Есть еще такой вариант.
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* Delete(char *s,int k)
{
    int i=0,j=0;
    while(s[i]!='\0')
{
    if(s[i]!=k)  
        s[j++]=s[i];  
    i++;
}
s[j]='\0'; 
return s;
}
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
11.01.2015, 16:45 #6
Водяной,

Пример кода удаляющего из строки все вхождения заданного символа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <algorithm>
 
void RemoveCharacterFromString(char character_for_remove, std::string &string) {
  auto it = std::remove_if(std::begin(string), std::end(string),
                           [=](char c) { return c == character_for_remove; });
  string.erase(it, std::end(string));
}
 
int main() {
  std::string string = "aaa bbb ccc ddd ccc fff";
  RemoveCharacterFromString('c', string);
  std::cout << "after remove: " << string << '\n';
}
Пруф работоспобности:
http://ideone.com/WouZ0r
0
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 16:50  [ТС] #7
По заданию надо использовать именно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* Del_useless(char *s) 
{ 
 for(int k=0;*(s+k);k++) 
   { 
     if(((*(s+k)<65)||(*(s+k)>73))&& 
       ((*(s+k)<97)||(*(s+k)>105))) 
 
       { 
         s=Delete(s,k); 
     k--; 
       } 
   } 
 return s; 
}
И здесь прописать функцию Delete, без string, к сожалению.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
11.01.2015, 16:52 #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
#include <iostream>
#include <string>
#include <algorithm>
#include <assert.h>
 
void RemoveCharacterFromString(char character_for_remove, std::string &string) {
  auto it = std::remove_if(std::begin(string), std::end(string),
                           [=](char c) { return c == character_for_remove; });
  string.erase(it, std::end(string));
}
 
void RemoveAllCharactersInRangeFromString(char from, char to,
                                          std::string &string) {
  assert(from <= to);
  for (auto curr_character = from; curr_character <= to; ++curr_character) {
    RemoveCharacterFromString(curr_character, string);
  }
}
 
int main() {
  std::string string = "aaa bbb ccc ddd ccc fff eee ggg fff";
  RemoveAllCharactersInRangeFromString('c', 'f', string);
  std::cout << "after remove: " << string << '\n';
}
Пруф работоспособности:
http://ideone.com/fzAy1S
1
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 16:55  [ТС] #9
А вы не могли бы объяснить, что здесь происходит? Просто не очень понимаю.
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
11.01.2015, 17:12 #10
Вот итоговая версия, с теми условиями, которые Вы поставили:

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
#include <iostream>
#include <string>
#include <algorithm>
#include <assert.h>
 
void RemoveCharacterFromString(char character_for_remove, std::string &string) {
  auto it = std::remove_if(std::begin(string), std::end(string),
                           [=](char c) { return c == character_for_remove; });
  string.erase(it, std::end(string));
}
 
void RemoveAllCharactersInRangeFromString(char from, char to,
                                          std::string &string) {
  assert(from <= to);
  for (auto curr_character = from; curr_character <= to; ++curr_character) {
    RemoveCharacterFromString(curr_character, string);
  }
}
 
char *StringToCharArray(const std::string &str, char *s) {
  std::copy(std::begin(str), std::end(str), s);
  s[str.size()] = '\0';
  return s;
}
 
char *Del_Useless(char *s) {
  std::string string(s);
  RemoveAllCharactersInRangeFromString('j', 'z', string);
  RemoveAllCharactersInRangeFromString('J', 'Z', string);
  return StringToCharArray(string, s);
}
 
int main() {
  char raw_str[100] = "aaa bbb ccc ddd ccc fff eee ggg fff jj asdf  z asdf";
  std::cout << "Raw string  : " << raw_str << '\n';
  auto cleaned_string = Del_Useless(raw_str);
  std::cout << "after remove: " << cleaned_string << '\n';
  std::cout << "Raw string :  " << raw_str << '\n';
}
Пруф работоспособности:
http://ideone.com/rVHLmi

По последнему коду - прокомментируйте те места, которые Вам не понятны, я их объясню. (Что конкретно не ясно, в чем есть сомнения)

Добавлено через 5 минут
Тот же код, без использования с++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
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
#include <algorithm>
#include <assert.h>
 
struct SameCharacter {
  SameCharacter(char character) : character(character) {}
  bool operator()(char c) { return c == character; }
 
  const char character;
};
 
void RemoveCharacterFromString(char character_for_remove, std::string &string) {
  std::string::iterator it = std::remove_if(
      string.begin(), string.end(), SameCharacter(character_for_remove));
  string.erase(it, string.end());
}
 
void RemoveAllCharactersInRangeFromString(char from, char to,
                                          std::string &string) {
  assert(from <= to);
  for (char curr_character = from; curr_character <= to; ++curr_character) {
    RemoveCharacterFromString(curr_character, string);
  }
}
 
char *StringToCharArray(const std::string &str, char *s) {
  std::copy(str.begin(), str.end(), s);
  s[str.size()] = '\0';
  return s;
}
 
char *Del_Useless(char *s) {
  std::string string(s);
  RemoveAllCharactersInRangeFromString('j', 'z', string);
  RemoveAllCharactersInRangeFromString('J', 'Z', string);
  return StringToCharArray(string, s);
}
 
int main() {
  char raw_str[100] = "aaa bbb ccc ddd ccc fff eee ggg fff jj asdf  z asdf";
  std::cout << "Raw string  : " << raw_str << '\n';
  char *cleaned_string = Del_Useless(raw_str);
  std::cout << "after remove: " << cleaned_string << '\n';
  std::cout << "Raw string :  " << raw_str << '\n';
}
Пруф работоспособности:
http://ideone.com/hGvCuZ
0
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 17:24  [ТС] #11
Цитата Сообщение от Melg Посмотреть сообщение
#include <iostream>
#include <string>
#include <algorithm>
#include <assert.h>
void RemoveCharacterFromString(char character_for_remove, std::string &string) //зачем нам это?
{
* auto it = std::remove_if(std::begin(string), std::end(string),
* * * * * * * * * * * * * *[=](char c) { return c == character_for_remove; });
* string.erase(it, std::end(string));
}
void RemoveAllCharactersInRangeFromString(char from, char to,
* * * * * * * * * * * * * * * * * * * * * std::string &string) // и для чего нам эта функция?
{
* assert(from <= to);
* for (auto curr_character = from; curr_character <= to; ++curr_character) {
* * RemoveCharacterFromString(curr_character, string);
* }
}
char *StringToCharArray(const std::string &str, char *s)// для чего переводить в Юникод и зачем нам ссылка?
{
* std::copy(std::begin(str), std::end(str), s);
* s[str.size()] = '\0';
* return s;
}
char *Del_Useless(char *s) {
* std::string string(s);
* RemoveAllCharactersInRangeFromString('j', 'z', string);
* RemoveAllCharactersInRangeFromString('J', 'Z', string);
* return StringToCharArray(string, s);
}
int main() {
* char raw_str[100] = "aaa bbb ccc ddd ccc fff eee ggg fff jj asdf *z asdf";
* std::cout << "Raw string *: " << raw_str << '\n';
* auto cleaned_string = Del_Useless(raw_str);
* std::cout << "after remove: " << cleaned_string << '\n';
* std::cout << "Raw string : *" << raw_str << '\n';
}
Прости за вопрос, но это нельзя написать проще?
0
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
11.01.2015, 17:25 #12
Оформление кода важно.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//-------------------------------------------------------------------------------------------------------------
 
//ничего не возвращаем (возвращаем void), string передаётся по указателю, так проще
void Delete(char *string, int deleteIndex)
{
//для удобочитаемости
const char END = '\0';
 
//переменная для текущего значения индекса инициируется значением с которого начинается смещение
int currentIndex = deleteIndex;
 
        //пока текущий символ не есть символом окончания строки...
        while( string[ currentIndex ] != END )
        {
            //переместить следущее значение в текущее, начиная с указанного к удалению
            string[ currentIndex ] = string[ currentIndex+1 ];
                        //переход к следующему элементу
            currentIndex ++;
        }
}
//-------------------------------------------------------------------------------------------------------------
 
//вынести в отдельную ф-ю опеределения является ли символ буквой
bool isAlpha(char testChar )
{
        //если символ является буквой
    if ( ( (testChar > 65) || (testChar < 73) )
    &&
         ( (testChar > 97) || (testChar > 105) ) )
    {
        return true;
    } else {
        return false;
    }
}
 
//-------------------------------------------------------------------------------------------------------------
 
char* Del_useless(char *string)
{
const char END = '\0';
int index = 0;
 
    //до тех пор пока не наткнёмся на символ окончания строки
    while( string[ index ] != END )
    {
         if ( isAlpha(string[index]) )
         {
            //удалить символ с указанной строки. Так как строка передаётся по указателю
            //все действия для этой переменной (string) будут производится напрямую
            //с переменной через указатель, а не с внутренней копией функции.
             Delete(string, index);
            //если мы удалим символ, его мето займёт следующий, не надо инкрементировать индекс
         }else
         {
            //иначе прирастить индекс, (пропустить этот символ без изменений)
            index ++;
         }
    }
    return string;
}
Можно короче, но так нагляднее.
На каком то этапе обучения пригодится книжка
0
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 17:45  [ТС] #13
Большое спасибо! Этот код я понимаю лучше.
Однако, я не знаю, почему, но все равно не работает.
Наверное все таки ошибка еще и в самом главном коде программы.
Основное задание: создать программу для преобразовать строки, которую мы зададим, таким образом, чтобы все буквы от А до I (от a до i)заменить на цифры 1…9, а буквы J..Z (j…z) удалить. Отсортировать полученную строку по возрастанию и заменить прописные буквы заклавными.
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
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <iostream>
#include <string>
#include <locale.h>
using namespace std;
//Функция нахождения длины строки 
int length(char *s)
{
 char *temp=s;
 while(*temp++);
 return temp-s;
}
//Функция копирования строк
void Copy(char *s1, char *s2)
{
  do
   *s2++=*s1;
  while (*s1++);
} 
/* 19
 * Преобразование строчного символа латинского 
 * алфавита в его заглавный эквивалент. 
 * 22
 * Возвращает заглавных эквивалент символа chr 
 *24
 * Если преобразование невозможно, возвращает 
 * исходный символ chr 
*/ 
char* UpChar(char *s) 
{ 
 for(int i=0;*(s+i);i++) 
   if ((*(s+i)<=105)&&(*(s+i)>=97)) *(s+i)-=32; 
 return s; 
} 
// Сортировка строки пузырьком по возрастанию 
char* Sorting(char *s) 
{ 
        int flag;
 char r; 
 do 
 { flag=0;
   for(int k=0;*(s+k);k++) 
   { 
     if (*(s+k+1)) 
       { 
         if (*(s+k)>*(s+k+1)) 
         { 
           r=*(s+k); 
           *(s+k)=*(s+k+1); 
           *(s+k+1)=r; 
           flag++; 
         } 
       } 
   } 
 } 
 while(flag!=0); 
 return s; 
}
// Удаление ненужных символов в строке 
//ничего не возвращаем (возвращаем void), string передаётся по указателю, так проще
void Delete(char *string, int deleteIndex)
{
//для удобочитаемости
const char END = '\0';
 
//переменная для текущего значения индекса инициируется значением с которого начинается смещение
int currentIndex = deleteIndex;
 
        //пока текущий символ не есть символом окончания строки...
        while( string[ currentIndex ] != END )
        {
            //переместить следущее значение в текущее, начиная с указанного к удалению
            string[ currentIndex ] = string[ currentIndex+1 ];
                        //переход к следующему элементу
            currentIndex ++;
        }
}
//-------------------------------------------------------------------------------------------------------------
 
//вынести в отдельную ф-ю опеределения является ли символ буквой
bool isAlpha(char testChar )
{
        //если символ является буквой
    if ( ( (testChar > 65) || (testChar < 73) )
    &&
         ( (testChar > 97) || (testChar > 105) ) )
    {
        return true;
    } else {
        return false;
    }
}
 
//-------------------------------------------------------------------------------------------------------------
 
char* Del_useless(char *string)
{
const char END = '\0';
int index = 0;
 
    //до тех пор пока не наткнёмся на символ окончания строки
    while( string[ index ] != END )
    {
         if ( isAlpha(string[index]) )
         {
            //удалить символ с указанной строки. Так как строка передаётся по указателю
            //все действия для этой переменной (string) будут производится напрямую
            //с переменной через указатель, а не с внутренней копией функции.
             Delete(string, index);
            //если мы удалим символ, его мето займёт следующий, не надо инкрементировать индекс
         }else
         {
            //иначе прирастить индекс, (пропустить этот символ без изменений)
            index ++;
         }
    }
    return string;
}
 
/* 
 * Преобразование латинских символов 
 * в символьные значение их порядковых номера в алфавите. 
 * возвращает преобразованную строку s. 
*/
char* Zamena( char *s)
{
    while(*s)
    {
        if(*s >= 'A' && *s <= 'I') *s = *s-'A' + 1 + '0';
        else
            if(*s >= 'a' && *s <= 'i') *s = *s-'a' + 1 + '0';
        s++;
    }
    return s;
}
int main()
{ 
    setlocale(LC_ALL, "rus"); 
    char *s;
    cout<<"Введите строку:";
    cin>>s;
    Del_useless(s);
    s=UpChar (s);
    s=Zamena(s);
    s=Sorting (s);
    cout<<s;
    return 0;
}
0
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
11.01.2015, 17:57 #14
Водяной,

C++
1
void RemoveCharacterFromString(char character_for_remove, std::string &string) //зачем нам это?
Данная функция принимает на вход строку и символ для удаления, после чего изменяет полученную строку таким образом, что в ней перестает присутствовать символ для удаления.

C++
1
void RemoveAllCharactersInRangeFromString(char from, char to, std::string &string) // и для чего нам эта функция?
Поскольку в Вашем задании присутствовали диапазоны символов, которые нужно удалить (удалялись все буквы J…Z(j…z).) - я посчитал логичным создать функцию, которая удаляет из строки последовательный диапазон символов включая указанные символы.

C++
1
char *StringToCharArray(const std::string &str, char *s)// для чего переводить в Юникод и зачем нам ссылка?
Данная функция нужна, для того чтобы из класса строки извлечь символы в виде char и скопировать их в массив, который был указан( char *s), она возвращает указатель на измененный массив. Появилась вследствие Вашего комментария, что нужны именно char* - массивы, а не работа со строками.
C++
1
const std::string &str
- константная ссылка на строку, которую мы хотим с копировать в массив char *s. Передача аргумента по ссылке вызвана желанием сэкономить память - избежать копирования строки. Константность свидетельствует о том, что внутри функции эта строка не будет видоизменяться.

Прости за вопрос, но это нельзя написать проще?
Смотря что считать критерием простоты. Берусь утверждать, что мой код проще для чтения, поддержки, изменения, достаточно структурирован, практически не содержит избыточности и повторений. Теоретически можно было бы заменить работу std::string на работу с сырым массивом - просто Вы дали это условие после того, как мной была написана версия через строки. В остальном - ненужные циклы и ручная работа заменена вызовом функций стандартной библиотеки. Люди часто видя незнакомый стиль кодирования считают его сложным. Но это далеко не всегда верно.

Добавлено через 5 минут
Версия на чистых указателях char* может быть она будет проще:

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
#include <iostream>
#include <cstring>
#include <algorithm>
#include <assert.h>
 
struct SameCharacter {
  SameCharacter(char character) : character(character) {}
  bool operator()(char c) { return c == character; }
 
  const char character;
};
 
void RemoveCharacterFromString(char character_for_remove, char *string) {
  char *end = string + strlen(string);
  char *it = std::remove_if(string, end, SameCharacter(character_for_remove));
  std::fill(it, end, '\0');
}
 
void RemoveAllCharactersInRangeFromString(char from, char to, char *string) {
  assert(from <= to);
  for (char curr_character = from; curr_character <= to; ++curr_character) {
    RemoveCharacterFromString(curr_character, string);
  }
}
 
char *Del_Useless(char *s) {
  RemoveAllCharactersInRangeFromString('j', 'z', s);
  RemoveAllCharactersInRangeFromString('J', 'Z', s);
  return s;
}
 
int main() {
  char raw_str[100] = "aaa bbb ccc ddd ccc fff eee ggg fff jj asdf  z asdf";
  std::cout << "Raw string  : " << raw_str << '\n';
  char *cleaned_string = Del_Useless(raw_str);
  std::cout << "after remove: " << cleaned_string << '\n';
  std::cout << "Raw string :  " << raw_str << '\n';
}
Пруф работоспособности:
http://ideone.com/blzYlF

Добавлено через 5 минут
Ваш кусок кода опасен:
C++
1
2
3
    char *s;
    cout<<"Введите строку:";
    cin>>s;
s не инициализирован никаким значением - не ссылается на валидную память.
После чего из потока ввода вы по этому не пойми какому адресу пишите некоторый набор байт - это не есть хорошо.
1
Водяной
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 18:13  [ТС] #15
Спасибо! Оно заработало!!!
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
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <string>
#include <locale.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <assert.h>
using namespace std;
//Функция нахождения длины строки 
int length(char *s)
{
 char *temp=s;
 while(*temp++);
 return temp-s;
}
//Функция копирования строк
void Copy(char *s1, char *s2)
{
  do
   *s2++=*s1;
  while (*s1++);
} 
/* 19
 * Преобразование строчного символа латинского 
 * алфавита в его заглавный эквивалент. 
 * 22
 * Возвращает заглавных эквивалент символа chr 
 *24
 * Если преобразование невозможно, возвращает 
 * исходный символ chr 
*/ 
char* UpChar(char *s) 
{ 
 for(int i=0;*(s+i);i++) 
   if ((*(s+i)<=105)&&(*(s+i)>=97)) *(s+i)-=32; 
 return s; 
} 
// Сортировка строки пузырьком по возрастанию 
char* Sorting(char *s) 
{ 
        int flag;
 char r; 
 do 
 { flag=0;
   for(int k=0;*(s+k);k++) 
   { 
     if (*(s+k+1)) 
       { 
         if (*(s+k)>*(s+k+1)) 
         { 
           r=*(s+k); 
           *(s+k)=*(s+k+1); 
           *(s+k+1)=r; 
           flag++; 
         } 
       } 
   } 
 } 
 while(flag!=0); 
 return s; 
}
// Удаление ненужных символов в строке 
struct SameCharacter
{
  SameCharacter(char character) : character(character) {}
  bool operator()(char c) { return c == character; }
 
  const char character;
};
 
void RemoveCharacterFromString(char character_for_remove, char *string) {
  char *end = string + strlen(string);
  char *it = remove_if(string, end, SameCharacter(character_for_remove));
  fill(it, end, '\0');
}
 
void RemoveAllCharactersInRangeFromString(char from, char to, char *string) {
  assert(from <= to);
  for (char curr_character = from; curr_character <= to; ++curr_character) {
    RemoveCharacterFromString(curr_character, string);
  }
}
 
char *Del_Useless(char *s) {
  RemoveAllCharactersInRangeFromString('j', 'z', s);
  RemoveAllCharactersInRangeFromString('J', 'Z', s);
  return s;
}
 
 
/* 
 * Преобразование латинских символов 
 * в символьные значение их порядковых номера в алфавите. 
 * возвращает преобразованную строку s. 
*/
char* Zamena( char *s)
{
    while(*s)
    {
        if(*s >= 'A' && *s <= 'I') *s = *s-'A' + 1 + '0';
        else
            if(*s >= 'a' && *s <= 'i') *s = *s-'a' + 1 + '0';
        s++;
    }
    return s;
}
int main()
{ 
    char raw_str[100] = "ShiFROvka oT SHPioNa";
  cout << "Raw string  : " << raw_str << '\n';
  char *cleaned_string = Del_Useless(raw_str);
    UpChar (raw_str);
    Zamena(raw_str);
    Sorting (raw_str);
  cout << "after remove: " << cleaned_string << '\n';
  cout << "Raw string :  " << raw_str << '\n';
  return 0;
}
Пристите, я, наверное, слишком многое прошу, но вы не могли бы написать, что делает каждая строчка? У тех функций, которые вы написали?
А еще вопрос: по заданию должны выводиться сначала цифры, а потом буквы , которые остались после удаления и преобразования. Сейчас выводятся только цифры. Как сделать так, чтобы были и буквы, например, так: 1168899(HIFAHIA)?
0
11.01.2015, 18:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2015, 18:13
Привет! Вот еще темы с ответами:

Посчитать количество определенных букв в двумерном динамическом массиве - C++
Дана символьная квадратная матрица порядка n. Посчитать количество букв &quot;а&quot; надо главной диагональю и количество букв &quot;b&quot; под боковой...

Как организовать проверку на ввод определенных букв переменной string? - C++
Добрый день, не могу организовать проверку на ввод определенных букв переменной string. Необходимо, чтобы в переменную temp записывались...

Здесь есть удаление столбца, как добавить удаление строки - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int n; do {cout &lt;&lt; &quot;Razmer massiva: &quot;; cin &gt;&gt; n;...

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


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

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

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