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

Написать программу для преобразования строки содержащей некоторые символы. Преобразовать эту строку таким образом, чтобы все буквы от A…I (a…i) заменить на цифры от 1…9. Отсортировать полученную строку по возрастанию и заменить прописные буквы заглавными.

Пример

Исходная строка: ShiFROvka oT SHPioNa

Результат: 1168899(HIFAHIA)

Здесь вроде можно воспользоваться пузырьком

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;
}

И функциями преобразования произвольной строки в строку с заглавными буквами и удаления ненужных символов в строке, т.е. символов j-z (J-Z):

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;
}

char* UpChar(char *s)
{
    for(int i=0;*(s+i);i++)
        if ((*(s+i)<=105)&&(*(s+i)>=97))
             *(s+i)-=32;
    return s;
}

А вот что еще использовать....

Чтобы все буквы от a до i заменить на цифры от 1 до 9, вычитайте из кода текущего символа код символа 'a', и прибавляйте единицу к тому, что получилось. Это и будет порядковый номер буквы в алфавите.

for(int i=0;*(s+i);i++) {
    if (s >= 'a' && s <= 'i') {
        s = s - 'a' + 1;
    }
}

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

Allex, ниже рабочий пример с комментариями. Попробуйте в нем разобраться.

#include <iostream>
#include <string>

using namespace std;

/*
 * Преобразование строчного символа латинского
 * алфавита в его заглавный эквивалент.
 * 
 * Возвращает заглавных эквивалент символа chr
 *
 * Если преобразование невозможно, возвращает
 * исходный символ chr
*/
char uppercase(char chr)
{
    if (chr >= 'a' && chr <= 'z')
        chr -= 32; 
    return chr;
}
/*
 * Поиск в строке s строчных символов латинского алфавита
 * и преобразование их в заглавные эквиваленты. 
 *
 * возвращает строку s после преобразования.
*/
string uppercase(string s)
{
    for (int i = 0; i < s.size(); ++i)
        s[i] = uppercase(s[i]);
    return s;
}
// Сортировка строки "улучшенным" пузырьком по возрастанию
string sort_asc(string s)
{
    char buf;
    for (int j = 0; j < s.size() - 1; ++j)
        for (int i = 0; i < s.size() - j - 1; ++i)
            if (s[i] > s[i + 1])
                swap(s[i], s[i + 1]);
    return s;
}
/*
 * Преобразование латинских символов от begin до end
 * в символьные значение их порядковых номера в алфавите.
 * 
 * begin - начальное значение диапазона поиска
 * end - конечное значение диапазона поиска
 * s - строка, по которой ведется поиск
 * ignore_case - игнорировать регистр символов
 *
 * возвращает преобразованную строку s.
*/
string convert_chars_to_numbers(char begin, char end, string s,
        bool ignore_case=true)
{
    if ((uppercase(begin) < 'A' || uppercase(begin) > 'Z'))
        return s;
    if (uppercase(end) < 'A' || uppercase(end) > 'Z')
        return s;
    if (begin > end)
        swap(begin, end);
    for (int i = 0; i < s.size(); ++i)
    {
        // Если необходимо игнорировать регистр символов
        if (ignore_case && uppercase(s[i]) >= uppercase(begin)
                    && uppercase(s[i]) <= uppercase(end))
            s[i] = '0' + uppercase(s[i]) - uppercase(begin) + 1;
        // Иначе
        else if (!ignore_case && s[i] >= begin && s[i] <= end)
            s[i] = s[i] - begin + 1; 
    }
    return s;
}
int main()
{
    setlocale(LC_ALL, "Russian");
    string str;
    cout << "Enter a latin string: ";
    getline(cin, str);
    str = uppercase(str);
    str = convert_chars_to_numbers('a', 'i', str, true);
    str = sort_asc(str);
    cout << str << endl;
    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.