Ryan Thomsen Ответов: 4

Как сделать персонажа в C++, равной его сместили значение для увеличения


Прошу прощения за загадочные вопросы. Я имею в виду, что если вы используете toupper (), то в конечном итоге " а "становится " А", как бы вы сделали такой символ, как"] "становится"} " при увеличении символа в коде.

Вот мой текущий код для справки:
// This file contains the function main, which lists lines of characters
// in the format 'UppercaseChar' --> 'lowercaseChar' 
// starting with 'A', incrementing
// by one until the number of lines desired by the inputter is reached.

#include <iostream>
#include <cstdlib>
using std::cin;
using std::cout;

int main()
{
    int inputvalue;
    int incrementalvar = 0;
    int letterlow = 'a';
    int letterhigh = 'A';
    //promtps for user input
    cout << "Please enter any positive decimal integer value.!\n";
    cin >> inputvalue;
    //loop that prints characters a through the character whose value is
    //equal to input value in the desired format.
    while (incrementalvar < inputvalue)
    {
        cout << "'" << (char)(letterhigh) << "' --> '" 
             << (char)letterlow << "'\n";
        incrementalvar++;
        letterlow++;
        letterhigh++;
    }
    return EXIT_SUCCESS;
}


Что я уже пробовал:

Я попытался увеличить как набор символов до " A "изначально, так и использовать toupper() для символа, первоначально установленного на "a". оба результата, когда в код вводится такое значение, как 30, просто печатают символ дважды, а не эквивалентно при удерживании shift.

4 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Если вы проверяете, что символ является Альфа-символом, то вы можете & символ с 11011111 (xCF). Вот в чем разница между UC и LC в наборе символов ASCII. Это никак не влияет на символы UC.

Ретро-процесс, UC - >LC может быть выполнен с помощью | с помощью 00100000 (x20). Так уж случилось, что это тоже космический персонаж.

Переключение между ними (UC <-> LC) происходит ^ с помощью x20

Будьте осторожны, что вы применяете это только к соответствующим символам, чтобы случайно не создать странные результаты и даже символы ctrl.


Stefan_Lang

Он специально спросил о не буквенно-цифровых символах, таких как " [ " . x20 здесь не поможет.

Рейтинг:
1

Richard MacCutchan

Non-alphabetic characters do not have direct mappings in their character codes, so you will need to create your own translate table. The simplest way would be to use the 'lower' case character as an index into a table which contains the 'upper' case version, and vice versa. If you look at the Windows Character Map application you can see the actual numerical values for all the characters. The only reason you have two such characters on the keycaps of the keyboard is to reduce the number of keys required, but there is no direct relationship between the two symbols. And different keyboards have different mappings (qwerty vs azerty etc.).


Рейтинг:
1

Stefan_Lang

Это преобразование зависит от конкретной раскладки клавиатуры, поэтому вам нужно запросить необработанный код клавиши и применить нужные квалификаторы (в данном случае shift), чтобы перевести ваш необработанный код в реальный символ.

Для первой части, получения необработанного кода ключа, я предлагаю посмотреть пример кода здесь: Используя необработанный ввод - Win32-приложений, Майкрософт документы[^]

Для второй части, я думаю Функция MapVirtualKeyA (winuser.ч) - Win32-приложений, Майкрософт документы[^] может сделать трюк.

Обратите внимание, что существует два виртуальных кода клавиш для shift: VK_LSHIFT и VK_RSHIFT. Однако я не знаю ни одной раскладки клавиатуры, которая действительно использует это. Использование любого из них должно быть в порядке.


Рейтинг:
0

Garth J Lancaster

Я могу думать только о двух способах обработки случаев, когда isalpha() ie for ['a'..'z'] является false .. a customized 'toupper', где используется

1) словарь/хэш-таблица эквивалента 'char' - > 'toupper', то есть '[' -> '{' или,

2) словарь/хэш-таблица 'char' - > целочисленное смещение к эквиваленту ... '[' -> '{' И ']' -> '}' оба имеют смещение 32

. будет интересно посмотреть и другие предложения


Ryan Thomsen

Это уже вторая неделя занятий по введению в C++, и я думаю, что должен быть более простой способ сделать это. Есть ли способ сделать это вообще без использования to_upper?

Garth J Lancaster

затем имейте в виду, что поведение toupper определяется как "если переданный аргумент отличается от строчного алфавита, он возвращает тот же символ, переданный функции" .. на самом деле я никогда не видел необходимости в "верхнем регистре" или сдвиге " ["на" { " , например, так что, возможно, все, что я предложил, слишком продвинуто для вашего класса и вашего учителя или лектора или ?? только означает, что вы можете использовать стандартный топпер()

Ryan Thomsen

У него есть базовая проверка присваиваний, и она помечает мой вывод как неправильный при вводе значения 30, поскольку его ожидаемое значение равно " { ", в то время как он получает" [". Однако вполне возможно, что он вовсе не имел в виду, что мы будем использовать toupper, если существует простая функция для увеличения с помощью преобразования ascii или чего-то подобного.

Garth J Lancaster

хммм, не уверен, что он ищет, может быть, для вас, чтобы написать свой собственный "toupper ()" .. предполагая ASCII, если у вас есть

char ch;
cin>>ch;
ch=ch-32;
фактически у вас есть "прописная" версия ch