подправил, как я это вижу. Без особой отладки
Код:
#include <iostream>
#include <array>
#include <unordered_map>
#include <vector>
void AdjustCoding()
{
setlocale(LC_ALL, "Russian");//для документа в кодировке 1251
}
using std::cout;
using std::cin;
using letterArr_t=std::array<uint8_t, 5> ; // тип переменной содержащей закодированный символ из нескольких строк
using td_letters_map=std::unordered_map<char,letterArr_t>;
static const td_letters_map m_letters_map=
{
{' ' ,{ 0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000, }},
{'A' ,{ 0b00110000,
0b01001000,
0b10000100,
0b11111100,
0b10000100, }},
//далее можно так же в двоичном виде разрисовать, но мне лень
{'B' ,{ 0xFC,
0x8C,
0xF8,
0x8C,
0xFC }},
{'C' ,{ 0x7C, 0x84, 0x80, 0x84, 0x7C }},
{'D' ,{ 0xF8, 0x84, 0x84, 0x84, 0xF8 }},
{'E' ,{ 0xFC, 0x80, 0xFC, 0x80, 0xFC }},
{'F' ,{ 0xFC, 0x80, 0xFC, 0x80, 0x80 }},
{'G' ,{ 0xFC, 0x80, 0x9C, 0x84, 0xFC }},
{'H' ,{ 0x84, 0x84, 0xFC, 0x84, 0x84 }},
{'I' ,{ 0xFC, 0x30, 0x30, 0x30, 0xFC }},
{'J' ,{ 0xFC, 0x18, 0x18, 0x98, 0x60 }},
{'K' ,{ 0x84, 0x88, 0xF0, 0x90, 0x8C }},
{'L' ,{ 0x80, 0x80, 0x80, 0x80, 0xFC }},
{'M' ,{ 0x84, 0xCC, 0xB4, 0x84, 0x84 }},
{'N' ,{ 0xC4, 0xA4, 0x94, 0x8C, 0x84 }},
{'O' ,{ 0x30, 0x48, 0x84, 0x48, 0x30 }},
{'P' ,{ 0xFC, 0x84, 0xFC, 0x80, 0x80 }},
{'Q' ,{ 0x30, 0x48, 0x84, 0x48, 0x34 }},
{'R' ,{ 0xFC, 0x84, 0xFC, 0x88, 0x84 }},
{'S' ,{ 0x7C, 0x80, 0x78, 0x04, 0xF8 }},
{'T' ,{ 0xFC, 0x30, 0x30, 0x30, 0x30 }},
{'U' ,{ 0x84, 0x84, 0x84, 0x84, 0xFC }},
{'V' ,{ 0x84, 0x84, 0x84, 0x48, 0x30 }},
{'W' ,{ 0x84, 0x84, 0xB4, 0xCC, 0xCC }},
{'X' ,{ 0x84, 0x48, 0x30, 0x48, 0x84 }},
{'Y' ,{ 0x84, 0x48, 0x30, 0x30, 0x30 }},
{'Z' ,{ 0xFC, 0x08, 0x30, 0xC0, 0xFC }},
};
static const letterArr_t m_NaN=
{
0b01111000,
0b10000100,
0b00011000,
0b00000000,
0b00011000,
};
enum class Error { // сообщения об ошибках
mainMenu, // ошибка в главном меню
mainProgramMenu, // ошибка в меню основной функции
};
void startInfo() { // выводим стартовую информацию
std::cout << "" ".............."
"\n" "...111...111.."
"\n" "..1.....1....."
"\n" "..1.11..1.11.."
"\n" ".............."
"\n" "...111111111.."
"\n" ".............."
"\n" "Программа визуализации введенной фразы."
"\n" ""
;
}
void getInfo() { // выводим информацию о программе
cout << "" ".............."
"\n" "Программа визуализации введенной фразы:"
"\n" "\t- Версия 0.2 beta"
"\n" "\t\t- Ограниченный набор символов (EN CAPS)"
"\n" "\t\t- Добавлена обработка неверного ввода"
"\n" "\t- (c) 09.2020 ****"
"\n" ".............."
;
}
void mainProgram()
{
while(1)
{
cout << '\n';
cout << "Ваша фраза: ";
std::string words; std::getline(cin,words); cin.sync();
cout << '\n';
std::vector<letterArr_t> arrayLetter;
for(auto& c:words)
{
if(auto it=m_letters_map.find(c); it!=m_letters_map.end())
{
arrayLetter.emplace_back(it->second);
}
else
{
arrayLetter.emplace_back(m_NaN);
}
}
for(const auto& letter:arrayLetter)
{
using type=letterArr_t::value_type;
for(const type& line_of_letter:letter)
{
constexpr type full_mask=~type(0);//==0b11111111
constexpr type elder_bit_mask=(full_mask^(full_mask>>1));//==0b1000000
type value_to_scan=line_of_letter;
type mask=elder_bit_mask;
for(;mask;mask>>=1)
{
cout << ((value_to_scan&mask)?'1':' ');
}
cout << '\n';
}
cout << '\n';
}
enum class choose{none,cont,ret,};
//показываем меню
cout << "Продолжить("+std::to_string((int)choose::cont)
+")/Вернуться("+std::to_string((int)choose::ret)+
") в меню ?" << "\nВВОД:";
const choose menu_x=[]
{
int val=0; cin >> val; cin.sync();
return choose(val);
}();
//выполняем
switch(menu_x)
{
case choose::cont:{}break; // к запросу фразы
case choose::ret:{return;}break;
default:{cout << "Ошибка: " << static_cast<int>(Error::mainProgramMenu) << '\n';}break;
}
}
}
int main()
{
AdjustCoding();
startInfo();
do
{
//показываем меню
enum class choose{none,run,help,close,};
cout << '\n';
cout << '\n';
cout << "ВВОД "+std::to_string((int)choose::run)+" - ЗАПУСТИТЬ ПРОГРАММУ;" << '\n';
cout << "ВВОД "+std::to_string((int)choose::help)+" - СПРАВКА;" << '\n';
cout << "ВВОД "+std::to_string((int)choose::close)+" - ЗАКРЫТЬ ПРОГРАММУ;" << '\n';
const choose menu_x=[]
{
int val=0; cin >> val; cin.sync();
return choose(val);
}();
//выполняем
switch (menu_x)
{
case choose::run:{mainProgram();}break;
case choose::help:{getInfo();}break;
case choose::close:{ return 0;}break;
default:{cout << "Ошибка: " << static_cast<int>(Error::mainMenu) << '\n';}
}
} while (true);
return 0;
}