Упорядочить символы A в порядке, обратном к алфавитному c++

126
28 сентября 2019, 18:50

Само задание полностью выглядит так : "через одну пустую строку предлагает ввести строку A (ввод осуществляется нажатием клавиши Enter), а затем строку В. После этого необходимо вывести обработанные строки. Если строки состоят из одних и тех же символов, то удалить из B латинские и русские буквы; в остальных случаях упорядочить символы A в порядке, обратном к алфавитному". У меня остались проблемы лишь с упорядочиванием символов A в порядке, обратном к алфавитному c++ P.S подключение других библиотек не рассматривается

#include <iostream>
#include <windows.h>
#include <string>

using namespace std;

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    string a,b;
    cout << "Введите строку А : ";
    getline(cin,a);
    cout << "Введите строку B : ";
    getline(cin,b);
    int j = a.size();
    char * writable = new char[a.size() + 1];
    cout << "А : " << a << endl;
    cout << "B : " << b << endl;
    const char*str1 = a.c_str();
    const char*str2 = b.c_str();
    int count1[256] = { 0 };
    int count2[256] = { 0 };
    for (const char*pos = str1;*pos;++pos)
        ++count1[(unsigned char)*pos];
    for (const char*pos = str2;*pos;++pos)
        ++count2[(unsigned char)*pos];
    bool res = true;
    for (int i = 0;i < 256;++i)
        res = res && count1[i] == count2[i];

    if (res == true) 
    {
        for (int unsigned i = 0; i < b.size();i++) 
        {
            char ch = b[i];
            if ((((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) || (((ch >= 'а') && (ch <= 'я')) || ((ch >= 'А') && (ch <= 'Я'))))
            {
                b.erase(i, 1);
                --i;
            }
        }
        cout << "B : " << b << endl;
        res = false;
    }
    else 
    {
        /*Тут как раз не могу реализовать сортировку символов строки А в 
     обратном алфавитному порядке*/
         for (int i = 0; i < sizeof(writable) - 2;i++) 
      {
        for (int j = 0; j < sizeof(writable) - 2 ;j++) 
        {
            if (writable[j] < writable[j + 1]) 
            {
                tmp = writable[j];
                writable[j] = writable[j + 1];
                writable[j + 1] = tmp;
            }
        }
      }
        cout << "A : " << writable;
    }
    system("pause");
    return 0;
}
Answer 1

Весь ваш код:

std::string a,b;    
getline(std::cin,a);   
getline(std::cin,b);
// если в строке `a` не нашли символ, который нет в строке `b`
if (a.find_first_not_of(b) == std::string::npos) {
    for (size_t i = 0; i < b.length(); ++i)
        //проверяем является ли символ буквой
        if(isalpha(b[i])) //функцию можете писать сами
            b.erase(i--, 1);
    std::cout << a << std::endl << b;
}
else {     //сортируем в обратном порядке
    sort(a.rbegin(), a.rend()); // функцию сортировки можете написать сами
    std::cout << a;
}

P.S. как сортировать последовательность, есть многочисленные способы, примеры которых вы найдете в инете и в SO. И, еще: когда работаете с std::string, не пытайтесь переходить на С_строку, если в этом нет необходимости. А то вы сразу переходите работать с массивом, игнорируя преимущества и возможности std::string

Пример сортировки символьной строки(если пробелы не учитывются). Каждый сивол помещаем в последовательность по индексу своего int_type потом, начиная с конца, присваиваем елементам исходной строки все непробелы:

std::string  t(255, ' ');
const size_t sz = a.length();
for(size_t i = 0; i < sz; ++i)
    t[+a[i]] = a[i];    // +a[i] то же, что int(a[i]) 
//теперь в t элементы распологаются в возрастающем порядке
//не считая пробелы  вытаскиваем с конца
for(size_t i = 254, j = 0;  j < sz; --i) {
    if(t[i] != ' ')
        a[j++] = t[i];
}

который можете написать вместо sort(a.rbegin(), a.rend());

READ ALSO
HANDLE h: переопределение [закрыт]

HANDLE h: переопределение [закрыт]

Разбираюсь с примером, но даже его скомпилировать не могу из-за того вылазит ошибка

104
Почему такой результат?

Почему такой результат?

Пишу универсальный тип данных(мини-версию) Проблема возникла при вызове getInside();

128
-nan(ind) и nan

-nan(ind) и nan

Написал некий фрагмент кода (вообще пишу решение СЛАУ методом Гаусса), при данных значениях а и b, когда k >= 2 возникает ошибка -nan(ind) и nan (когда...

131
C++ захват переменной из лямбда функции

C++ захват переменной из лямбда функции

есть такая функция, которая принимает другую функцию:

123