Advertisement
Guest User

barrel_description_in_ru_translit

a guest
Dec 2nd, 2021
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.56 KB | None | 0 0
  1. //  Бизнесмен Василий после прочтения известной книги решил открыть
  2. //  новый бизнес — отгружать апельсины бочками. Партнёрам важно знать,
  3. //  сколько именно бочек апельсинов отгружается каждый день. Мобильный
  4. //  телефон Василия поддерживает только транслит, поэтому он передаёт
  5. //  сообщения вида "n bochek". Например, "3 bochki" или "1 bochka".
  6. //  Напишите программу, которая выбирает правильное слово (из "bochka",
  7. //  "bochek" , "bochki" ) в зависимости от значения n.
  8. #include <iostream>
  9. #include <string>
  10.  
  11. //-------------------------------------------------------------------
  12. //  класс имени бочки
  13. class   BarrelDescr
  14. {
  15.     private:
  16.         //  Массив строк для конверсии
  17.         static const char* bdescr[];
  18.         //  Размер массива строк
  19.         static size_t bsize;
  20.         //  Индекс строки
  21.         size_t  index;
  22.     public:
  23.         BarrelDescr();
  24.         //  Вернуть строку описания для bcount бочек
  25.         const char* descr( size_t bcount );
  26. };
  27. //-------------------------------------------------------------------
  28. //  Статические данные
  29. const char* BarrelDescr::bdescr[] =
  30. {
  31.     "bochek",
  32.     "bochka",
  33.     "bochki",
  34.     "bochki",
  35.     "bochki",
  36. };
  37. size_t  BarrelDescr::bsize = 5;
  38. //-------------------------------------------------------------------
  39. BarrelDescr::BarrelDescr()
  40. {
  41.     index = 0;
  42. }
  43. //-------------------------------------------------------------------
  44. //  Вернуть строку описания для bcount бочек
  45. const char* BarrelDescr::descr( size_t bcount )
  46. {
  47.     size_t  bc = bcount;
  48.    
  49.     //  По умолчанию используем нулевой элемент массива строк
  50.     index = 0;
  51.  
  52.     while( bc > 9 )
  53.     {
  54.         bc = bc % 10;
  55.     }
  56.     if( bc < bsize )
  57.     {
  58.         index = bc;
  59.     }
  60.     return  bdescr[ index ];
  61. }
  62. //-------------------------------------------------------------------
  63.  
  64. int main( int argc, char* argv[] )
  65. {
  66.     //  Количество бочек
  67.     unsigned long   n;
  68.     std::string str;
  69.     //  Индекс последнего символа
  70.     size_t  idx;
  71.     BarrelDescr barrel;
  72.  
  73.     if( argc > 1 )
  74.     {
  75.         try
  76.         {
  77.             //  Обработаем все аргументы командной строки
  78.             for( int i = 1; i < argc; i++ )
  79.             {
  80.                 std::cout << argv[i] << " ";
  81.                 //  Загрузим строку С в строку С++
  82.                 str.assign( argv[i] );
  83.                 n = std::stoul( str, &idx );
  84.                 if( idx < str.length() )
  85.                 {
  86.                     throw idx;
  87.                 }
  88.                 //  Выведем число бочек с описанием
  89.                 std::cout << barrel.descr( n ) << std::endl;
  90.             }
  91.         }
  92.         catch( const std::bad_alloc& ba )
  93.         {
  94.             std::cerr << "Ошибка выделения памяти!" << std::endl;
  95.         }
  96.         catch( const std::out_of_range& oor )
  97.         {
  98.             std::cerr << "Значение вне диапазона!" << std::endl;
  99.         }
  100.         catch( const std::invalid_argument& ia )
  101.         {
  102.             std::cerr << "Неверное значение!" << std::endl;
  103.         }
  104.         catch( size_t index )
  105.         {
  106.             std::cerr << "Мусор по индексу "
  107.                    << index << std::endl;
  108.         }
  109.     }
  110.     else
  111.     {
  112.         std::cout << "Использование программы:" << std::endl;
  113.         std::cout << argv[0] << " <количество_бочек> [...]"
  114.             << std::endl;
  115.     }
  116.  
  117.     return  0;
  118. }
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement