Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Igor1984
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 2
#1

Задача из книги Страуструпа - C++

03.01.2016, 18:38. Просмотров 546. Ответов 3
Метки нет (Все метки)

Нужна ваша помощь или хотя бы подсказка, в одном из упражнений в книге Страуструпа " Программирование. Принципы и практика с использованием с++", нужно было написать простейший калькулятор который принимает на вход цифровое значение типа double и символ операции и выводит результат на экран. Вот код:
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
#include <cstdlib>
#include <std_lib_facilities.h>
using namespace std;
int main(int argc, char** argv) {
    cout << "Available characters: \n"
            " + "
            " - "
            " * "
            " / \n";
            
    double a, b;
    char character;
    cin >> a >> b >> character; 
    switch (character) { 
        case '+':
            cout << "Sum " << a << " and " << b << " = " << a+b<< "\n";
            break;
        case '-':
            cout << "Difference " << a << " and " << b << " = " << a-b<< "\n";
            break;
        case '*':
            cout << "Product " << a << " and " << b << " = " << a*b<< "\n";
            break;
        case '/':
            cout << "Division " << a << " and " << b << " = " << a/b<< "\n";
            break;
        default:
            error("Unavailable character, start programm again!!\n");
            break;
    }      
    return 0;
}
Теперь нужно модифицировать эту программу так чтобы на вход принимались цифры как в строковом ("seven" "five" и т.д.) так и в цифровом (12.5, 10) формате. Главный вопрос, как научить распознавать программу какой тип данных введён пользователем? Буду очень благодарен за подсказку.
http://www.cyberforum.ru/cpp-beginners/thread1678272.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 18:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Задача из книги Страуструпа (C++):

Задача из книги Страуструпа
Меня настораживает несколько странная формулировка, я не понимаю зачем так...

Задача из книги Страуструпа 4 глава векторы
Задача: Напишите программу, заглушающую нежелательные слова; иначе говоря,...

Задачка из книги Страуструпа...
Доброго времени суток всем! Заранее благодарен за ответы и, возможные, пути...

пример из книги страуструпа
struct pair { char* name; // ñòðîêà int val; //...

Задание из книги Страуструпа
Здравствуйте! Я решил начать изучать программирование, конкретнее - язык C++....

3
Mq35
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 6
03.01.2016, 22:07 #2
у этого автора есть пример (мощный) про калькулятор с графами... но это так, к слову

как я понял, что Вам нужно сделать синтаксический разборщик.
я бы делал эту задачу в лоб.
1) читаем введенное в строку
2) триммим строку справа и слева
3) режем строку на слова, по пробелам
4) пробуем первое слово преобразовать к числу дабл (по формату)
если получился ноль, то _возможно_ цифра записана буквами
5) далее второе слово, по идее должен быть знак и длинной в один символ
6) тоже что и п 4. но для третьего слова
7) вычислить результат

для правильности нужно еще реализовать защиту от ошибок
и реализовать случай чисел из "цифр прописью"
0
Igor1984
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 2
05.01.2016, 17:59  [ТС] #3
Нужно сделать так, чтобы воспринимались и вычислялись как цифровой ввод данных, так и строковый.
0
Venom3333
0 / 0 / 1
Регистрация: 03.07.2015
Сообщений: 23
03.03.2016, 16:13 #4
Это задание 7 из главы 4? Будет спойлер, но, если еще актуально, я решал это в свое время вот так:
C++ (Qt)
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
80
81
82
// Ex4.7
#include "std_lib_facilities.h"
using namespace std;
int main()
{
    char sx[256],sy[256]; // строковые операнды
    double x,y; // операнды
    vector<string> str = {"ноль","один","два","три","четыре",
                          "пять","шесть","семь","восемь","девять"
                         };
    char op = 0;    // Оператор
    while(true)
    {
        // Вводим данные
        cout << "Введите данные вида '|1й операнд| |оператор| |2й операнд|' (CTRL+C - выход): " << endl;
        // Ввод x
        cin >> sx;
        if(isdigit(sx[0]))   // Если первый символ строки - цифра
        {
            x = strtod(sx,0); //strtod() - преобразование char[] в double
        }
        else
        {
            vector<string>::iterator iter = find(str,sx); // Находим индекс "строковой цифры"
            if (iter==str.end())                                  // Если не найдено
            {
                cout << endl << "Первый операнд. Не знаю такой цифры!" << endl;
                cin.clear();
                continue;
            }
            else                                         // Если найдено
                x = (str.begin()-iter)*(-1); // Вычитаем индекс найденного и т.к. отрицательное будет число умнжаем на -1
        }
        cin.clear();
        // Ввод оператора
        cin >> op;
        cin.clear();
        // Ввод y
        cin >> sy;
        if(isdigit(sy[0]))   // Если первый символ строки - цифра
        {
            y = strtod(sy,0); //strtod() - преобразование char[] в double
        }
        else
        {
            vector<string>::iterator iter = find(str,sy); // Находим индекс "строковой цифры"
            if (iter==str.end())                                  // Если не найдено
            {
                cout << "Второй операнд. Не знаю такой цифры!" << endl;
                cin.clear();
                continue;
            }
            else                                         // Если найдено
                y = (str.begin()-iter)*(-1); // Вычитаем индекс найденного и т.к. отрицательное будет число умнжаем на -1
        }
        cin.clear();
        // Выбираем операцию и выводим результат
        switch(op)
        {
        case '+':
            cout << x << " плюс " << y << " равно " << x+y << endl;
            break;
        case '-':
            cout << x << " минус " << y << " равно " << x-y << endl;
            break;
        case '*':
            cout << x << " умножить на " << y << " равно " << x*y << endl;
            break;
        case '/':
            cout << x << " разделить на " << y << " равно " << x/y << endl;
            break;
        case '%':
            cout << "Остаток от деления " << x << " на " << y << " равно " << fmod(x,y) << endl;
            break;
        default:
            cout << "Ошибка! Не распознан оператор." << endl;
            break;
        }
        cin.clear();
    }
    return 0;
}
Уверен что существует более элегантное решение, но тогда я не задумывался (какая задача, такое и решение так сказать).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2016, 16:13
Привет! Вот еще темы с решениями:

Достаточно ли книги Страуструпа?
В общем, учу с++ по страуструпу и думаю: &quot; а хватит ли этого???&quot; . Подскажите...

Библиотеки для книги Страуструпа
Доброго времени суток! Дядя Бьярне использует библиотеки в своей книге...

Упражнение №8 глава 5 из книги Страуструпа
Здравствуйте. Помогите решить задание. Напишите программу,считывающую ряд...

Объяснить код из книги Страуструпа
Здравствуйте форумчане, помогите пожалуйста со строуструповским калькулятором....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru