Форум программистов, компьютерный форум CyberForum.ru

Обработка исключительных ситуаций. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Giggs131
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 19
16.09.2010, 19:31     Обработка исключительных ситуаций. #1
Пожалуйста,помогите решить..В субботу экзамен,а я физически не успеваю написать 6 программок..(


Написать функцию вычисления значения по заданной строке символов, являющихся записью этого числа в десятичной системе счисления. Предусмотреть случай выхода за границы диапазона определяемого типом int. Используйте механизм исключений.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
16.09.2010, 20:44     Обработка исключительных ситуаций. #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//////////////////////////////////////////////////////////////////////////////////////
//  Написать функцию вычисления значения по заданной строке символов, 
//  являющихся записью этого числа в десятичной системе счисления. 
//  Предусмотреть случай выхода за границы диапазона определяемого типом int. 
//  Используйте механизм исключений.
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
 
typedef std::string  T_str;
//////////////////////////////////////////////////////////////////////////////////////
class bad_int : public std::out_of_range
{
public:     
    bad_int() : std::out_of_range("Ну какое же это целое число!")
    {}
};
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    T_str  num_str;
    int    n;
    for(;;)
    {
        std::cout << std::endl
                  << std::endl
                  << "Введите целое число: ";
        std::cin >> num_str;
        std::istringstream sin(num_str);    
        
        try
        {        
            if(!(sin >> n))
            {
                throw bad_int();
            }
            std::cout << n
                      << std::endl; 
        }
        catch(bad_int& e)
        {
            std::cout << e.what()
                      << std::endl;
        }      
    }  
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
17.09.2010, 01:13     Обработка исключительных ситуаций. #3
Mr.X, что-то я не вижу функцию вычисляющую значение. или я не правильно понял задачу?

Добавлено через 42 минуты
вот мой вариант
хз, правильно ли я понял задачу, но давно хотел написать гиперкрутой каркулятор
up.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <sstream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <stdexcept>
#include <functional>
 
/***************************************************************************/
 
typedef std::function<int(int, int)> func_t;
typedef std::pair<char, func_t> pair_t;
 
/***************************************************************************/
 
template<typename To, typename From>
To cast_to(const From& v) {
    To result;
    std::stringstream ss;
    ss << v;
    ss >> result;
    return result;
}
 
/***************************************************************************/
 
struct operation_t {
   enum {add = '+', sub = '-', mul = '*', div = '/'};
   operation_t(int a, int b):v1(a),v2(b) {}
   int v1, v2;
};
 
operation_t separate(const std::string& exp, std::vector<pair_t>::const_iterator i) {
   std::string::const_iterator it = std::find(exp.begin(), exp.end(), i->first);
   return operation_t(
      cast_to<int>(std::string(exp.begin(), it)),
      cast_to<int>(std::string(it+1, exp.end()))
   );
}
 
/***************************************************************************/
 
int calculate(const std::string& exp) {
   static std::vector<pair_t> pairs = {
      {operation_t::add, [](int a, int b) {return a+b;} },
      {operation_t::sub, [](int a, int b) {return a-b;} },
      {operation_t::mul, [](int a, int b) {return a*b;} },
      {operation_t::div, [](int a, int b) {return a/b;} }
   };
   static std::map<char, func_t> map(pairs.begin(), pairs.end());
   /** remove all spaces */
   std::string correctexp;
   std::remove_copy(exp.begin(), exp.end(), std::back_inserter(correctexp), ' ');
   /** find op`s symbol */
   std::vector<pair_t>::const_iterator it = std::find_if(pairs.begin(), pairs.end(),
      [&](const pair_t& p) {
         return std::find(correctexp.begin(), correctexp.end(), p.first) != correctexp.end();
      }
   );
   if ( it == pairs.end() ) { throw std::runtime_error("error in expression: \"" + correctexp + "\""); }
   /** separate expression into pieces */
   operation_t op = separate(correctexp, it);
   /** evaluate */
   return map[it->first](op.v1, op.v2);
}
 
/***************************************************************************/
 
int main() {
   std::cout<< "1+2=" << calculate("1+2") << std::endl
            << "4-2=" << calculate("4-2") << std::endl
            << "2*2=" << calculate("2*2") << std::endl
            << "4/2=" << calculate("4/2") << std::endl;
   
   return 0;
}
 
/***************************************************************************/
потыкать можно тут: http://liveworkspace.org/code/8d2202...e6265b8bc5689a
расширяется очень просто.
доработки приветствуются.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
17.09.2010, 17:17     Обработка исключительных ситуаций. #4
Цитата Сообщение от Giggs131 Посмотреть сообщение
по заданной строке символов, являющихся записью этого числа в десятичной системе счисления.
Цитата Сообщение от niXman Посмотреть сообщение
Mr.X, что-то я не вижу функцию вычисляющую значение. или я не правильно понял задачу?
Похоже что так.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
17.09.2010, 17:19     Обработка исключительных ситуаций. #5
Цитата Сообщение от Mr.X Посмотреть сообщение
Похоже что так.
"так" это как? надо вычислять, или нет?
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,670
17.09.2010, 17:26     Обработка исключительных ситуаций. #6
Цитата Сообщение от niXman Посмотреть сообщение
"так" это как? надо вычислять, или нет?
Я в том смысле, что это не калькулятор, как вы это вначале восприняли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2010, 17:33     Обработка исключительных ситуаций.
Еще ссылки по теме:

C++ Придумать 10 задач на обработку исключительных ситуаций
C++ Обработка исключительных ситуаций!
Обработка исключительных ситуаций C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
17.09.2010, 17:33     Обработка исключительных ситуаций. #7
Цитата Сообщение от Mr.X Посмотреть сообщение
это не калькулятор, как вы это вначале восприняли.
гм... что-то я вижу в описании другое:
Цитата Сообщение от Giggs131 Посмотреть сообщение
вычисления значения
Yandex
Объявления
17.09.2010, 17:33     Обработка исключительных ситуаций.
Ответ Создать тему
Опции темы

Текущее время: 03:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru