Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Упражнения. 1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения.
1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения. #include < iostream.h> class OutOfMemory {}; int main() { try { int *myInt = new int; if (myInt == 0) throw OutOfMemory(); } catch (OutOfMemory) { cout < < " Unable to allocate memory! \n"; } return 0; } 2. Добавьте в исключение, полученное в упражнении 1, переменную-член и метод доступа и используйте их в блоке оператора catch. #include < iostream.h> #include < stdio.h> #include < string.h> class OutOfMemory; { public: OutOfMemory(char *): char> > GetString() { return itsString; } private: char> > itsString; }; OutOfMemory:: OutOfMemory(char * theType) { itsString = new char[80]; char warning[] = " Out Of Memory! Can't allocate room for: "; strncpy(itsString, warning, 60); strncat(itsString, theType, 19); } int main() { try { int *myInt = new int; if (myInt == 0) throw OutOfMemory(" int"); } catch (OutOfMemory& t: heException) { cout < < theException.GetString(); } return 0; } 3. Унаследуйте новое исключение от исключения, полученного в упражнении 2. Измените блок оператора catch таким образом, чтобы в нем происходила обработка как производного, так и базового исключений. 1: #include < iostream.h> 2: 3: // Абстрактный тип исключений 4: class Exception 5: { 6: public: 7: Exception(){} 8: virtual ~Exceptiori(){} 9: virtual void PrintError() = 0; 10: }; 11: 12: // Производный класс для обработки проблем памяти 13: // Обратите внимание: в этом классе не производится выделение памяти 14: class OutOfMemory: public Exception 15: { 16: public: 17: OutOfMemory(){} 18: ~OutOfMemory(){} 19: virtual void PrintError(); 20: private: 21: }; 22: 23: void OutOfMemory:: PrintError() 24: { 25: cout < < " Нет памяти!! \n"; 26: } 27: 28: // Производный класс для обработки ввода неверных чисел 29: class RangeError: public Exception 30: { 31: public: 32: RangeError(unsigned long number){badNumber = number: } 33: ~RangeError(){} 34: virtual void PrintError(); 35: virtual unsigned long GetNumber() { return badNumber; } 36: virtual void SetNumber(unsigned long number) {badNumber = number; } 37: private: 38: unsigned long badNumber; 39: }; 40: 41: void RangeError:: PrintError() 42: { 43: cout < < " Number out of range. You used " < < GetNumber() < < " N\n"; 44: } 45: 46: void MyFunction(); // прототип функции 47: 48: int main() 49: { 50: try 51: { 52: MyFunction(); 53: } 54: // Чтобы использовать только один оператор catch, 55: // примените для этого виртуальные функции 56: catch (Exceptions theException) 57: { 58: theException.PrintError(); 59: } 60: return 0; 61: } 62: 63: void MyFunction() 64: { 65: unsigned int *myInt = new unsigned int; 66: long testNumber; 67: if (myInt == 0) 68: throw 0ut0fMemory(); 69: cout < < " Enter an int: "; 70: cin > > testNumber; 71: // эту проверку лучше заменить серией 72: // проверок, чтобы выявить неверные данные, введенные пользователем 73: if (testNumber > 3768 || testNumber < 0) 74: throw RangeError(testNumber); 75: 76: *mylnt = testNumber; 77: cout < < " Ok. myInt: " < < *myInt; 78: delete myInt; 79: } 4. Измените код из упражнения 3, чтобы получить трехуровневый вызов функции. 1: #include < iostream.h> 2: 3: // Абстрактный тип исключений 4: class Exception 5: { 6: public:; 7: Exception(){ } 8: virtual ~Exception(){} 9: virtual void PrintError() = 0; 10: }; 11: 12: // Производный класс для обработки проблем памяти 13: // Обратите внимание: в этом классе не производится выделение памяти! 14: class OutOfMemory: public Exception 15: { 16: public: 17: OutOfMemory(){} 18: ~OutOfMemory(){} 19: virtual void PrintError(); 20: private: 21: }; 22: 23: void OutOfMemory:: PrintError() 24: { 25: cout < < " Нет памяти!! \n"; 26: } 27: 28: // Производный класс для обработки ввода неверных чисел 29: class RangeError: public Exception 30: { 31: public: 32: RangeError(unsigned long number){badNumber = number; } 33: ~RangeError(){ } 34: virtual void PrintError(); 35: virtual unsigned long GetNumber() { return badNumber; } 36: virtual void SetNumber(unsigned long number) {badNumber = number; } 37: private: 38: unsigned long badNumber; 39: }; 40: 41: void RangeError:: PrintError() 42: { 43: cout < < " Number out of range. You used " < < GetNumber() < < "!! \n"; 44: } 45: 46: // прототипы функций 47: void MyFunction(); 46: unsigned int * FunctionTwo(); 49: void FunctionThree(unsigned int *); 50: 51: int main() 52: { 53: try 54: { 55: MyFunction(); 56: } 57: // Чтобы использовать только один оператор catch, 58: // примените для этого виртуальные функции. 59: catch (Exception& theException) 60: { 61: theException.PrintError(); 62: } 63: return 0; 64: } 65: 66: unsigned int > > FunctionTwo() 67: { 68: unsigned int < < royInt = new unsigned int; 69: if (myInt == 0) 70: throw OutOfMemory(); 71: return myInt; 72: } 73: 74: void MyFunction() 75: { 76: unsigned int *myInt = FunctionTwo{ }; 77: 78: FunctionThree(myInt); 79: cout < < " 0k. myInt: " < < *myInt; 80: delete myInt; 81: } 82: 83: void FunctionThree(unsigned int *ptr) 84: { 85: long testNumber; 86: cout < < " Enter an int: "; 87: cin > > testNumber; 88: // эту проверку лучше заменить серией 89: // проверок, чтобы выявить неверные данные, введенные пользователем 90: if (testNumber > 3768 || testNumber < 0) 91: throw RangeError(testNumber); 92: *ptr = testNumber; 93: } 5. Жучки: что неправильно в следуюшем коде? #include " string.h" // класс строк class xOutOfMemory { public: xOutOfMemory(const String& where): location(where){ } ~xOutOfMemory(){ } virtual String where(){ return location }; private: String location; } main() { try { char *var = new char; if (var == 0) throw xOutOfMemory(); } catch(xOutOfMemory& theException) { cout < < " Out of memory at " < < theException.location() < < " \n"; } } В процессе обработки ситуации нехватки памяти конструктором класса xOutOfMemory в области свободной памяти создается объект типа string. Это исключение может возникнуть только в том случае, когда программе не хватает памяти, поэтому попытка нового выделения памяти будет тем более неудачной. Возможно, что попытка создать эту строку послужит причиной возникновения такого же исключения, что приведет к образованию бесконечного цикла, который будет выполняться до тех пор, пока компьютер не зависнет. Если эта строка все же нужна, можно выделить для нее память в статическом буфере до начала работы программы, а затем использовать ее rio необходимости, т.е. при возникновении исключения.
|