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

Преобразование чисел в строки и наоборот

28.12.2014, 20:58. Показов 2393. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Я только начинаю осваивать С++, поэтому очень нужна помощь.
Имеется строка, содержащая некоторые символы. Преобразовать эту строку таким образом, чтобы все буквы от А до I (от a до i)заменить на цифры 1…9. Отсортировать полученную строку по возрастанию и заменить прописные буквы заклавными.
Был написан вот такой код, но компилятор выдает ошибку. Правда, ее можно проигнорировать, но программа все равно преобразует неправильно. Можете объяснить в чем дело?
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
#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++);
} 
/* 
 * Преобразование строчного символа латинского 
 * алфавита в его заглавный эквивалент
*/ 
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; 
 
// Удаление ненужных символов в строке 
char* Delete(char* str,int r)
{ char Del;
while (str[r]!='\0')
     {
        Del=str[r];
        str[r]=str[r+1];
        str[r+1]=Del;
        r++;
     }
 return str;
}
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--; 
       } 
   } 
 return s; 
}
/* 
 * Преобразование латинских символов 
 * в символьные значение их порядковых номера в алфавите.
 * возвращает преобразованную строку s.
*/
int Zamena( char s[])
{
    int i;
    for( i=0; s[i]!='\0'; i++)
    {
        if (s[i]>='A' && s[i]<='I')
        s[i]=s[i]-'A'+'1';
        if(s[i]>='a' && s[i]<='i')
        s[i]=s[i]-'a'+'1';
    }
return 0;
}
int main()
{ 
    setlocale(LC_ALL, "rus"); 
    char *s;
    cout<<"Введите строку: ";
    s=Del_useless(s);
    s=Sorting(s);
    s=UpChar(s);
    s=Zamena(s);
    cout<<s<<endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2014, 20:58
Ответы с готовыми решениями:

Преобразование строки в число и наоборот
Привет. Пишу проект в Win32 Console Aplication, столкнулся с проблемой преобразования чисел в...

Преобразование из чисел в строки
Прошу помощи с программой в windowsformsapplication Нужно вывести в listview...№ Элемента в...

Преобразование чисел в строки
Помогите, пожалуйста, с задачей: &quot;Вводится массив из вещественных чисел. Необходимо каждое число...

Преобразование чисел из строки
Вот код #include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cstdlib&gt; #include&lt;cmath&gt; int...

10
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
28.12.2014, 21:03 2
Какая ошибка, в какой строке?
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
28.12.2014, 22:02  [ТС] 3
Ошибка в строке 102: невозможно преобразовать "int" в "char*".

Добавлено через 4 минуты
И программа неправильно переводит.
Например, если вводишь строку ShiFROvka oT SHPioNa, то результат вместо 1168899(HIFAHIA) получается такой: S896ROvk1 oT S8P9oN1
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
28.12.2014, 23:40 4
Вот. Для шпиона самое то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
void fun(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++;
    }
}
int main()
{
    char s[] = "afctbmnjhouplkADCDEFghiklmnfg32654@!#@#@$#@";
    cout << s << endl;
     fun(s);
cout << s << endl;
system("pause");
    return 0; 
}
1
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
29.12.2014, 00:28  [ТС] 5
Большое спасибо!)

Добавлено через 8 минут
Однако здесь все равно получается не то, что должно.
Когдда я ввожу ShiFROvka oT SHPioNa, то получается S896ROvk1 oT S8P9oN1, а должно быть вот это: 1168899(HIFAHIA)

Добавлено через 25 минут
В этой программе еще и должны удаляться символы от J до Z (j-z). Там такая функция есть. Может надо ее как-то включить в main? Она, вроде бы, написана правильно (Del_useless), а Delete - это удаление всех остальных букв, которые прошли проверку на удаление в функции Del_useless.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
29.12.2014, 01:53 6
Цитата Сообщение от Водяной Посмотреть сообщение
а должно быть вот это
Почему? Вы что-то скрываете?
Смотрите, S не входит ни в один из интервалов: [a,i] [A, I] но Вы считаете что его нужно менять на единицу. А на единицу нужно менять A или a и больше ничего. Если судить по тому, что сказано в условии. Недоговариваете Вы что-то. Как пить дать.
А и правда. Вот вычитал:
Цитата Сообщение от Водяной Посмотреть сообщение
В этой программе еще и должны удаляться символы от J до Z (j-z). Там такая функция есть. Может надо ее как-то включить в main?
Что же тут скажешь. Напишите всё что наболело, сразу и полностью, а мы посмотрим.
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
29.12.2014, 11:16  [ТС] 7
В этой программе должны меняться буквы A…I (a…i) на цифры 1…9, а остальные буквы, т.е. J…Z(j-z) удаляться. А еще все она должна менять прописные буквы на заглавные, а затем полученную строку отсортировать по возрастанию методом пузырек. Но она не хочет этого делать! И я уже не знаю, что в этой программе надо изменить, чтобы она заработала правильно.
Наверное, у меня все же неправильная функция удаления.
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
12.01.2015, 09:45  [ТС] 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
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
#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; 
}
// Удаление ненужных символов в строке 
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; 
}
/* 
 * Преобразование латинских символов 
 * в символьные значение их порядковых номера в алфавите. 
 * возвращает преобразованную строку 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;
}
Ошибка опять в функции Delete или еще где-то?

Добавлено через 16 часов 16 минут
А Вы не могли бы подсказать, как действует эта строка? Я понимаю, что она заменяет букву на цифру, но не понимаю, как именно она это делает.
if(*s >= 'A' && *s <= 'I') *s = *s-'A' + 1 + '0';
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
12.01.2015, 10:17 9
Цитата Сообщение от Водяной Посмотреть сообщение
Отсортировать полученную строку по возрастанию и заменить прописные буквы заклавными.
Цитата Сообщение от Водяной Посмотреть сообщение
В этой программе должны меняться буквы A…I (a…i) на цифры 1…9, а остальные буквы, т.е. J…Z(j-z) удаляться.
Нафига к верхнему регистру приводить если удаляешь? Вот тебе подсказка - приводи к верхнему регистру, удаляй разницу между '1' и 'A'.
Цитата Сообщение от Водяной Посмотреть сообщение
методом пузырек
Заменяй удаляемые символы большими значениями (больше чем '9') и сортируй. В отсортированном массиве первый "большой элемент" заменяешь на '\0' и готова строка из цифр по возрастанию. Вообще можно было бы просто посчитать количество A и других, а потом подряд столько же единиц, двоек и т.д.
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
12.01.2015, 10:42  [ТС] 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
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
#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;
}
// Удаление ненужных символов в строке
//ничего не возвращаем (возвращаем void), string передаётся по указателю, так проще
 
 void FuncDel( char * str)
    {   
        char * i;
         for ( i = str; *i != '\0'; i++)
           if(  *i < 'J' ||  *i > 'Z'  &&
                *i < 'j' ||  *i > 'z' )
               {
                  *str =  *i;
                  str++;
               }
        *str = '\0';
    }
 char* Zamena( char *s)
{
//*** запомнить указатель на первый символ
char * first = 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 first;
}
 
 
int main()
    {
         setlocale(LC_ALL, "rus");
         char str[256];
    cout <<"Введите строку:" << endl; 
    cin.getline(str,256);
    FuncDel( str);
    UpChar (str);
    Zamena(str);
    Sorting (str);
    cout <<  str  << "\n";
     
    return 0;
}
Я просто не совсем понимаю, как вот это работает
*s = *s-'A' + 1 + '0';
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
12.01.2015, 11:12 11
Цитата Сообщение от Водяной Посмотреть сообщение
if ((*(s+i)<=105)&&(*(s+i)>=97))
Вместо *(s+i) можно было написать s[i].
Цитата Сообщение от Водяной Посмотреть сообщение
*str = *i; str++;
Присваиваешь *str к *str. Дальше не читал.
0
12.01.2015, 11:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2015, 11:12
Помогаю со студенческими работами здесь

Преобразование строки чисел в дату
Доброго времени суток, прошу помощи в решении одной проблемы. Сразу говорю, вопрос будет поставлен...

Преобразование строки в список чисел
Добрый день, форумчане! ruSO окончательно развалился, поэтому решил задать свой вопрос здесь. Есть...

Преобразование строки в массив чисел
Всем, привет. Понимаю тема битая я гуглил пробовал но, что то c# на winформе не пускает ни один...

Преобразование целых чисел из текстовой строки
Вопрос: как с помощью операции : и функции str2num из текстовой строки str сделать целые чила?? ...


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

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