Помогите решить задачу на C++!
A. cAPS lOCK
ограничение по времени на тест0.5 second
ограничение по памяти на тест256 megabytes
вводстандартный ввод
выводстандартный вывод
зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?
Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.
Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:
либо оно полностью состоит из прописных букв;
либо прописными являются все его буквы, кроме первой.
В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.
Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.
Входные данные
В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.
Выходные данные
Выведите результат обработки данного слова.
Примеры
входные данныеСкопировать
cAPS
выходные данныеСкопировать
Caps
входные данныеСкопировать
Lock
выходные данныеСкопировать
Lock
// слово набрано с ошибочно нажатой клавишей Caps Lock, если:
// 1) либо оно полностью состоит из прописных букв;
// 2) либо прописными являются все его буквы, кроме первой.
#include <iostream>
#include <string>
// Меняет регистр латинской буквы на противоположный
char change_reg( char ch );
// Возвращает true, если в строке in все байты, начиная с индекса
// idx, являются заглавными латинскими буквами либо строка кончилась
bool check_caps( std::string& in, size_t idx );
// Анализирует входящее слово in и, при необходимости, меняет регистр
// его латинских букв
void transform_word( std::string& in, std::string& out );
// Смена регистра латинской буквы на противоположный
char change_reg( char ch )
{
size_t ch_idx = 0;
if( ch >= 'A' && ch <= 'Z' )
{
ch_idx = ch - 'A';
ch = 'a' + ch_idx;
}
else
if( ch >= 'a' && ch <= 'z' )
{
ch_idx = ch - 'a';
ch = 'A' + ch_idx;
}
return ch;
}
// Возвращает true, если в строке in все байты, начиная с индекса
// idx, являются заглавными латинскими буквами
bool check_caps( std::string& in, size_t idx )
{
bool r = true;
while( in[idx] )
{
if( in[idx] < 'A' || in[idx] > 'Z' )
{
r = false;
break;
}
idx++;
}
return r;
}
// Анализирует входящее слово in и, при необходимости, меняет регистр
// его латинских букв
void transform_word( std::string& in, std::string& out )
{
size_t idx = 0;
char ch;
bool flag = false;
// Анализ первой буквы для выбора начального состояния
ch = in[idx];
if( ch >= 'A' && ch <= 'Z' )
{
flag = check_caps( in, idx );
}
else
if( ch >= 'a' && ch <= 'z' )
{
flag = check_caps( in, idx + 1 );
}
if( flag )
{
while( in[idx] )
{
out.push_back( change_reg( in[idx] ) );
idx++;
}
}
else
{
out.assign(in);
}
}
int main( int argc, char* argv[] )
{
std::string word;
std::string out_word;
std::cout << "CAPS модификатор" << std::endl;
std::cout << "Введите слово:" << std::endl;
std::cin >> word;
out_word.reserve( word.length() );
transform_word( word, out_word );
std::cout << out_word << std::endl;
return 0;
}