Top.Mail.Ru
Ответы

Помогите решить задачу на C++!

A. cAPS lOCK
ограничение по времени на тест0.5 second
ограничение по памяти на тест256 megabytes
вводстандартный ввод
выводстандартный вывод
зАЧЕМ НУЖНА КЛАВИША cAPS lOCK?

Caps Lock — клавиша компьютерной клавиатуры, предназначенная для автоматической (постоянной) смены регистра букв со строчных на прописные. Будучи случайно нажатой, она приводит к последствиям вроде первого абзаца в условии этой задачи.

Будем считать, что слово набрано с ошибочно нажатой клавишей Caps Lock, если:

либо оно полностью состоит из прописных букв;
либо прописными являются все его буквы, кроме первой.
В таком случае, нужно автоматически поменять регистр всех букв на противоположный. Например, регистр букв слов «hELLO», «HTTP», «z» должен быть изменен.

Напишите программу, которая применяет описанное выше правило или оставляет слово без изменения, если оно не применимо.

Входные данные
В первой строке входных данных записано слово, состоящее из прописных или строчных букв латинского алфавита. Длина слова — от 1 до 100 символов включительно.

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

Примеры
входные данныеСкопировать
cAPS
выходные данныеСкопировать
Caps
входные данныеСкопировать
Lock
выходные данныеСкопировать
Lock

По дате
По Рейтингу
Аватар пользователя
Новичок
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
 //  слово набрано с ошибочно нажатой клавишей 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; 
}