C/C++

Ввести с клавиатуры символ и преобразовать его в символ верхнего регистра. Как сделать без библиотеки string?

Ввести с клавиатуры символ и преобразовать его в символ верхнего регистра. Как сделать без библиотеки string?
#include <iostream>
using namespace std;
char tolower(char ch) {
static char len[] = "etaoinshrdlcumwfgypbvkxjqz";
static char uen[] = "ETAOINSHRDLCUMWFGYPBVKXJQZ";
static char lru[] = "оеаинтсрвлкмдпуяыьгзбчйхжшюцщэфъё";
static char uru[] = "ОЕАИНТСРВЛКМДПУЯЫЬГЗБЧЙХЖШЮЦЩЭФЪЁ";
for (int i = 0; i < 26; ++i) {
if (uen[i] == ch) return len[i];
if (uru[i] == ch) return lru[i];
}
for (int i = 26; i < 33; ++i) {
if (uru[i] == ch) return lru[i];
}
return ch;
}
char toupper(char ch) {
static char len[] = "etaoinshrdlcumwfgypbvkxjqz";
static char uen[] = "ETAOINSHRDLCUMWFGYPBVKXJQZ";
static char lru[] = "оеаинтсрвлкмдпуяыьгзбчйхжшюцщэфъё";
static char uru[] = "ОЕАИНТСРВЛКМДПУЯЫЬГЗБЧЙХЖШЮЦЩЭФЪЁ";
for (int i = 0; i < 26; ++i) {
if (len[i] == ch) return uen[i];
if (lru[i] == ch) return uru[i];
}
for (int i = 26; i < 33; ++i) {
if (lru[i] == ch) return uru[i];
}
return ch;
}
int main() {
system("chcp 1251 > nul");
while (true) {
cout << "Символ в нижнем регистре: ";
char ch = cin.get();
ch = toupper(ch);
cout << "Символ в верхнем регистре: " << ch << '\n';
cin.ignore(cin.rdbuf()->in_avail());
}
system("pause > nul");
}
Anton Loshkaryov
Anton Loshkaryov
51 269
Лучший ответ
Артем Мустаев Николай, неужто Вы решили подурачиться???

Тогда использовали бы <map> для перекодировки.

А вообще-то почему бы не отметить тот факт, что буквы верхнего регистра и буквы нижнего регистра следуют друг за другом в одинаковом порядке? Это справедливо для любой локали. Значит, достаточно вычислить разность между первой заглавной и первой строчной букв, к чему же большее?
Антон Пашаев Ну я верю что вы умный человек, может даже умнее остальных тут из за этого не стал вас исправлять, оказалось не зря хахаха.
Всё верно. За исключением того, что в Linux по умолчанию всё выводится в UTF-8. Соответственно русские (и многие другие) буковки будут занимать 2 char-а и с ними будет факап. Так что, самый реальный вариант - это ограничиться латинскими буквами.
Денис Байдосов
Денис Байдосов
26 551
Денис Байдосов Проблема не такая простая, как кажется, т. к. блокнот будет сохранять исходники (и ресурсные файлы) тоже в UTF-8 и это нужно будет указать компилятору... и т. д. и т. п.
Антон Пашаев хочется взять и бросить это программировании, я вижу эти студии разработки sdk или как их зовут.

Короче студии для написания кода, все готовое библиотеки всякие функции, остается писать только свой код.

А тут бац еще оказывается такие тонкости всякие, кодировка 2 байта что что то или 2 char.

Целая наука какая то.

Правда мне нравится это все один хрен.
Но я реально жалею что мне все понравилось.
Жалко проводить сутками на пролет за компом и проблемка еще в том что я оторваться от него не могу, если пишу программку какую то, думаю так каждый, а так может кто то избавился от такой привычки уже.
Всё намного проще если простой С
char smb; char smb2;
while (smb!=(' '+32) )
{
printf("\nВведите символ "); scanf("%c", &smb);

scanf("%c", &smb2); //Удаляем символ ENTER

if ( (smb>='A' || smb<='Z') || (smb>='А' || smb<='Я') || (smb=='Ё') )
{
smb+=32;
putchar('\n');
putchar(smb);
}
else printf("Символ в нижнем регистре\n");
}
Роман Проклов
Роман Проклов
21 700
Артем Мустаев Да и на C++ код недалеко ушёл от этого. Принцип тот же, библиотеки свои.
   Что с того, что без библиотеки string? Ведь методы get и peek не из класса string, а из класса istream; достаточно библиотеки iostream. А тип char вообще стандартный, независимо от библиотек.

   Способы преобразования символа предложили другие. Лично мне более по нраву XOR-преобразование.
Азамат Ескатов
Азамат Ескатов
16 172
Роман Проклов а смысл такой сложности? проверять маской или что-то обнулять трудоёмко
// For english symbols:
Char character;
Cin > > character;
If(character >= 97 && character <= 122) character - 32;
Cout < < character;