Свернуть C ++ для ASCII - PullRequest
       9

Свернуть C ++ для ASCII

0 голосов
/ 14 октября 2018

Я Мэтт, впервые пишу.Сейчас я учусь в школе и изучаю с ++, и я застрял в этой проблеме.Кажется, я не могу найти решение, поэтому я ищу помощь.

#include <iostream>

using namespace std;

int main()
{
    char ch;

    cin >> ch;

    if(ch <= 122){
        cout << ++ch;
        cout << ++ch;
    }else if (ch > 122){
        cout << static_cast<char>(97)++ch;
        cout << static_cast<char>(97)++ch;
    }
}

Программа очень проста.Все, что для этого нужно - это ввести строчную букву, а программе просто нужно выплеснуть следующие два символа.Моя проблема в том, что после «я» я не знаю, как вернуться к «а».Я попытался static_cast, но там написано, что могу ».Я попытался переназначить переменную, и он говорит, что не могу.Я пробовал несколько других базовых вещей, но ни одна из них не работает.

Заранее спасибо за помощь!

Ответы [ 4 ]

0 голосов
/ 14 октября 2018

Попробуйте использовать следующий код для вашей проблемы.

#include <iostream>
using namespace std;

int main()
{
    char ch = '\0';

    cin >> ch; // "fed a lowercase letter"

    char c_next;
    c_next = (ch-'a'+1)%26+'a';
    cout <<c_next;
    c_next = (ch-'a'+2)%26+'a'; 
    cout << c_next;

    return 0;
}
0 голосов
/ 14 октября 2018

Во-первых, не используйте магические числа, такие как 122 и 97. Используйте фактическое значение символа.

Во-вторых, просто объявите строку abcdefghijklmnopqrstuvwxyz и внесите в нее указатель.Это устраняет необходимость в 122, 97 или любом другом номере.Мало того, вы, вероятно, можете увидеть, как решить задачу намного проще, когда работаете с индексами, такими как 0, 1, 25 и т. Д. Вместо 122, 97 и т. Д.

Как только вы это сделаете, немногонемного понимания показывает, что следующие два символа будут в позиции (если позиции начинаются с 0), (index + 1) % 26 и (index + 2) % 26.% является оператором модуля и возвращает остаток после деления.

Например, если текущий символ y, y находится в позиции 24 строки,Итак,

(24 + 1) % 26 = 25 % 26 = 25 и (24 + 2) % 26 = 26 % 26 = 0

Итак, следующие два символа расположены в позиции 25 и позиции 0, которые являются z и a.

Возьмем другой пример: z:

(25 + 1) % 26 = 26 % 26 = 0 и (25 + 2) % 26 = 27 % 26 = 1

Так что следующие символы после z - a и b.

Как правило, когда вы получаете назначение, в котором данные «оборачиваются» в 0, тогда сразу же приходит на ум слово «остаток» или «арифметика по модулю».


конечная программа будет выглядеть так:

#include <iostream>
int main()
{
    char ch;
    const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
    std::cin >> ch;
    int position1 = ch - 'a';  // get position of input character
    int position2 = (position1 + 1) % 26;  // get position of next character
    int position3 = (position1 + 2) % 26;  // get position of next next character

    // output results  
    std::cout << ch << alphabet[position2] << alphabet[position3];
}

Live Example

0 голосов
/ 14 октября 2018

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

#include <iostream>
#include <ccytpe>    // needed for ::tolower

int main() {
    // ascii a-z [97,122]

    char alphabet[26] = {}; // 0 initizlize this will be a look up table
    int i = 97;
    for( auto & c : alphabet ) {
        c = static_cast<char>( i );
        i++;
    }
    // check to see if our table is correct
    for( auto & c : alphabet ) {
        std::cout << c << " ";
        std::cout << '\n';
    }
    std::cout << '\n';    
    // Alphabet Seems to be fine.

    char c = {};
    std::cout << "Please enter a lower case character: ";
    std::cin >> c;

    if( c >= 'A' && c <= 'Z' ) {
        ::tolower( c ); // make sure that it's not in caps
    } else if( c >= 'a' && c <= 'z' ) {
        // nothing to do
    } else {
        std::cout << "Error: input value\n";
        return -1;
    }

    // Now that we have the correct inputs we can show your next two characters.
    // Since we know that the ascii table has a range of [97,122] for 
    // lower case letters and that our array index starts at 0; what we can do
    // is a little bit of arithmetic to take the input character and set that
    // to the index value of the array above. Then use the array indexing to 
    // output the next 2 characters. To do this we simply just need to subtract 97 or 'a'
    c = c - 'a';

    // Now we can print the two lines using the adjusted c value with
    // a little bit of modulo arithmetic using the stride, size, or 
    // length of the alphabet.
    int stride = 26;
    std::cout << alphabet[++c % stride] << '\n';
    std::cout << alphabet[++c % stride] << '\n';

    // And we are done!

    return 0;
} 

Вот как будет выглядеть код без комментариев и кода для печати всего алфавита:

#include <iostream>
#include <cctype>

int main() {
    char alphabet[26] = {};
    int i = 97;
    for( auto & c : alphabet ) {
        c = static_cast<char>( i );
        i++;
    }   

    char c = {};
    std::cout << "Please enter a lower case character: ";
    std::cin >> c;

    if( c >= 'A' && c <= 'Z' ) {
        ::tolower( c ); 
    } else if( c >= 'a' && c <= 'z' ) {
        // nothing to do
    } else {
        std::cout << "Error: input value\n";
        return -1;
    }

    c = c - 'a';

    int stride = 26;
    std::cout << alphabet[++c % stride] << '\n';
    std::cout << alphabet[++c % stride] << '\n';

    return 0;
}
0 голосов
/ 14 октября 2018

(при условии, что ввод: 'a' - 'z')

Keep It Simple

Решение 1:

#include <iostream>

int main()
{
    char ch = 0;

    std::cin >> ch; // "fed a lowercase letter"

    // "spit out the next two characters"
    if (ch < 'y')
        std::cout << ++ch << ++ch;
    else if (ch == 'y')
        std::cout << "za";
    else // (ch=='z')
        std::cout << "ab";
}

Решение 2:

#include <iostream>

int main()
{
    const char * lut = "abcdefghijklmnopqrstuvwxyzab";
    char ch = 0;

    std::cin >> ch; // "fed a lowercase letter"
    ch -= 'a'; // lowercase letter to index

    // "spit out the next two characters"
    std::cout << lut[++ch] << lut[++ch];
}
...