Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Бизнесмен Василий после прочтения известной книги решил открыть
- // новый бизнес — отгружать апельсины бочками. Партнёрам важно знать,
- // сколько именно бочек апельсинов отгружается каждый день. Мобильный
- // телефон Василия поддерживает только транслит, поэтому он передаёт
- // сообщения вида "n bochek". Например, "3 bochki" или "1 bochka".
- // Напишите программу, которая выбирает правильное слово (из "bochka",
- // "bochek" , "bochki" ) в зависимости от значения n.
- #include <iostream>
- #include <string>
- //-------------------------------------------------------------------
- // класс имени бочки
- class BarrelDescr
- {
- private:
- // Массив строк для конверсии
- static const char* bdescr[];
- // Размер массива строк
- static size_t bsize;
- // Индекс строки
- size_t index;
- public:
- BarrelDescr();
- // Вернуть строку описания для bcount бочек
- const char* descr( size_t bcount );
- };
- //-------------------------------------------------------------------
- // Статические данные
- const char* BarrelDescr::bdescr[] =
- {
- "bochek",
- "bochka",
- "bochki",
- "bochki",
- "bochki",
- };
- size_t BarrelDescr::bsize = 5;
- //-------------------------------------------------------------------
- BarrelDescr::BarrelDescr()
- {
- index = 0;
- }
- //-------------------------------------------------------------------
- // Вернуть строку описания для bcount бочек
- const char* BarrelDescr::descr( size_t bcount )
- {
- size_t bc = bcount;
- // По умолчанию используем нулевой элемент массива строк
- index = 0;
- while( bc > 9 )
- {
- bc = bc % 10;
- }
- if( bc < bsize )
- {
- index = bc;
- }
- return bdescr[ index ];
- }
- //-------------------------------------------------------------------
- int main( int argc, char* argv[] )
- {
- // Количество бочек
- unsigned long n;
- std::string str;
- // Индекс последнего символа
- size_t idx;
- BarrelDescr barrel;
- if( argc > 1 )
- {
- try
- {
- // Обработаем все аргументы командной строки
- for( int i = 1; i < argc; i++ )
- {
- std::cout << argv[i] << " ";
- // Загрузим строку С в строку С++
- str.assign( argv[i] );
- n = std::stoul( str, &idx );
- if( idx < str.length() )
- {
- throw idx;
- }
- // Выведем число бочек с описанием
- std::cout << barrel.descr( n ) << std::endl;
- }
- }
- catch( const std::bad_alloc& ba )
- {
- std::cerr << "Ошибка выделения памяти!" << std::endl;
- }
- catch( const std::out_of_range& oor )
- {
- std::cerr << "Значение вне диапазона!" << std::endl;
- }
- catch( const std::invalid_argument& ia )
- {
- std::cerr << "Неверное значение!" << std::endl;
- }
- catch( size_t index )
- {
- std::cerr << "Мусор по индексу "
- << index << std::endl;
- }
- }
- else
- {
- std::cout << "Использование программы:" << std::endl;
- std::cout << argv[0] << " <количество_бочек> [...]"
- << std::endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement