Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.08.2016
Сообщений: 18

Модифицируйте мини калькулятор

16.08.2016, 19:08. Показов 4662. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обьясните, как сделать из обычного калькулятора такой, чтобы на входе он принимал и цифры и строки (например seven+seven = 14) и.т.п.

Обычный калькулятор я сделал, создал вектор из 10 строк, а далеше что делать не пойму.



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
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
 
using namespace std;
 
int main()
 
{
    double first,second,result;
    char operat;
    vector <string> chis;
    
    chis[0] = "zero";
    chis[1] = "one";
    chis[2] = "two";
    chis[3] = "three";
    chis[4] = "for";
    chis[5] = "five";
    chis[6] = "six";
    chis[7] = "seven";
    chis[8] = "eight";
    chis[9] = "nine";
    
    
 
   cout<<"Введите первое число, второе число,  оператор :"<<endl;
 
cin>>first>>second>>operat;
 
switch (operat)
{
  case '+' :
result=first+second;
cout<<first<<'+'<<second<<'='<<result<<endl;
break;
 
case '-' :
result=first-second;
cout<<first<<'-'<<second<<'='<<result<<endl;
break;
 
case '*' :
result=first*second;
cout<<first<<'*'<<second<<'='<<result<<endl;
break;
 
case '/' :
result=first/second;
cout<<first<<'/'<<second<<'='<<result<<endl;
break;
 
}
 
 
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2016, 19:08
Ответы с готовыми решениями:

Мини калькулятор или деление на ноль
Привет форумчани. Написал я программу что-то на подобия калькулятора который работает с математическими выражениями. Все отлично работает...

Привет всем. Прога-мини калькулятор. С++
Вводим с клавиатуры в строчку пример, состоящий из 6 цифр, ну и 5 знаков(знаки только + и *). Необходимо, чтоб действия выполнялись по...

Упражнение из книги Страуструпа. Программа мини-калькулятор. Цифры записанные в строковом формате
Привет всем. Не могу понять, как необходимо изменить программу исходя из условия упражнения. Упражнение сформулировано так: ...

7
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
16.08.2016, 19:25
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
#include <iostream>
#include <string>
#include <map>
using namespace std;
 
void main()
{
    map<string, unsigned> digits
    {
        { "zero", 0 },
        { "one", 1 },
        { "two", 2 },
        { "three", 3 },
        { "four", 4 },
        { "five", 5 },
        { "six", 6 },
        { "seven", 7 },
        { "eight", 8 },
        { "nine", 9 }
    };
 
    string first, second;
    char operat;
 
    cin >> first >> operat >> second;
 
    switch (operat)
    {
    case '+':
        cout << first << '+' << second << '='
            << digits[first] + digits[second] << endl;
        break;
 
    case '-':
        cout << first << '-' << second << '='
            << digits[first] - digits[second] << endl;
        break;
 
    case '*':
        cout << first << '*' << second << '='
            << digits[first] * digits[second] << endl;
        break;
 
    case '/':
        cout << first << '/' << second << '='
            << digits[first] / digits[second] << endl;
        break;
    }
 
    system("pause");
}
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
17.08.2016, 13:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Example program
#include <iostream>
#include <string>
 
int main()
{
    std::string numbers[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    std::string enteredNumber1 = "five";
    std::string enteredNumber2 = "seven";
    int a = -1;
    int b = -1;
    for(int i = 0; i < 10; i++)
    {
        if (enteredNumber1 == numbers[i]) a = i;
        if (enteredNumber2 == numbers[i]) b = i;
    }
    std::cout << "a = " << a << std::endl
              << "b = " << b << std::endl;
              
    return 0;
}
a = 5
b = 7
0
2 / 2 / 0
Регистрация: 06.09.2014
Сообщений: 28
19.08.2017, 16:56
Мой вариант. Если числа записываются строками, то можно от 0 до 9 вводить число, а если записываются цифрами - то любые
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
80
81
82
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
 
using namespace std;
 
//калькулятор, работающий и для строкового представления чисел 0-9
int main()
{
    std::cout << "Please, enter 2 numbers and operation (+, -, *, /)."
        << "\nYou can also use string representation for numbers from 0 to 9\n";
    string str_a = "", str_b = "";
    double a = 0, b = 0;
    char op = 0;
 
    //считываем два числа и операцию
    cin >> str_a >> str_b >> op;
 
    //преобразуем стокорое число в цифру
    bool flag1 = false, flag2 = false;  //отвечают за то, преобразовано ли числа или нет
    vector <string> str_number = { "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine" };
    //преобразовываем первый операнд
    if (a = atoi(str_a.c_str()))    //если в число присвоилось значение успешно
        flag1 = true;   //то отмечаем это
    else //а иначе число записано скорее всего строкой
        for (int i = 0; i < str_number.size(); ++i)
            if (str_a == str_number[i])
            {
                a = i;  //преобразуем строковую запись в число
                flag1 = true;   //и отмечаем это
            }
    //также преобразуем второй операнд
    if (b = atoi(str_b.c_str()))
        flag2 = true;
    else
        for (int i = 0; i < str_number.size(); ++i)
            if (str_b == str_number[i] || str_b == to_string(i))    //если число записано строкой или цифрой
            {
                b = i;
                flag2 = true;
            }
 
    //если какое-то из чисел не преобразовалось верно
    if (flag1 == false)
    {
        std::cout << "The first number was entered incorrect."
            << "\nSo, this number equals 0";
        a = 0;
    }
    if (flag2 == false)
    {
        std::cout << "The second number was entered incorrect."
            << "\nSo, this number equals 0";
        b = 0;
    }
 
    //исходя из арифметической операции выполняем действия
    switch (op)
    {
    case '+':
        std::cout << "\nSum of " << a << " and " << b << " is " << a + b;
        break;
    case '-':
        std::cout << "\nDifference of " << a << " and " << b << " is " << a - b;
        break;
    case '*':
        std::cout << "\nProduct of " << a << " and " << b << " is " << a * b;
        break;
    case '/':
        std::cout << "\nDivision of " << a << " and " << b << " is " << a / b;
        break;
    default:
        std::cout << "\nPlease, enter 2 numbers and operation (+, -, *, /)";
        break;
    }
    std::cout << '\n';
    system("pause");
    return 0;
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.08.2017, 18:04
Цитата Сообщение от Karst Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
vector <string> chis;
chis[0] = "zero";
* * chis[1] = "one";
* * chis[2] = "two";
* * chis[3] = "three";
* * chis[4] = "for";
* * chis[5] = "five";
* * chis[6] = "six";
* * chis[7] = "seven";
* * chis[8] = "eight";
* * chis[9] = "nine";
это - UB.
вы обращаетесь к элементам вектора, под которые не выделена память.
для добавления в вектор значения используйте push_back/emplace_back/etc.
1
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
19.08.2017, 21:00
Цитата Сообщение от Krekcer Посмотреть сообщение
Мой вариант. Если числа записываются строками, то можно от 0 до 9 вводить число, а если записываются цифрами - то любые
пасиб, год ждали и всё-таки дождались
0
 Аватар для Kaptn
1 / 1 / 0
Регистрация: 28.12.2018
Сообщений: 4
02.01.2019, 14:30
Давайте учитывать, что задачу нужно решать исходя из полученных знаний в книге. Тогда такие функции как 'atoi' новичкам не известны.

Однако с самого начала книги говориться, что если что-то не понятно то следует обратиться к более опытному програмисту, чтобы тот разъяснил, отсюда в решении задачи я позволил себе такие примитивные конструкции как 'target.data()[0]' - которая извлекает массив символов ('string::data()') из строкового значения и обращается к первому символу массива ('[0]').
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
#include"std_lib_facilities.h"
 
using namespace std; // опускать указание пространства имет std::cout и тд
 
// Функция, которая извлекает численое значение из строкового. Применяя знания полученные до текущей главы книги.
int AssociateNumber(string target, vector<string> from)
{
    int _Num; // Возвращаемое значение
 
    if(target.size() == 1) // Если длина передаваемой строки равно 1-му символу то переводим его в тип int посредством простой ассоциации через конструкцию string;
        // Иначе - пропускаем ассоциативную подборку для численных литералов и переходим к стоковым
    {
        char ch = target.data()[0]; // извлекает массив символов ('string::data()') строки и обращается к первому символу
        if(ch < '0' || ch > '9') // Является ли символ цифрой?
        {
            cout << "Incorrect number: " << target;
            return -1; // Если это не так, то выходим из функции возвращая несогласованное значение -1;
        }
 
        switch(ch)
        {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        }
    }
 
    for(_Num = 0; _Num < from.size(); ++_Num)
        if(from[_Num] == target)
            return _Num;
 
    cout << "Incorrect number (0-9 only): " << target;
    return -1;
}
 
int main()
{
    vector<string> _Words{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
    string _First, _Second; // Операнды
    char _Operation;     // Операция
 
    int a; // Числовое значение левого операнда
    int b; // Числовое значение правого операнда
    double _Result; // Результат вычисления
 
    cout << "Type primitive values of string or digit value and type of operation (+,-,*,/), or 'exit' for end\n";
    while(cin >> _First >> _Operation >> _Second && _First != "exit")
    {
        a = AssociateNumber(_First, _Words);
        b = AssociateNumber(_Second, _Words);
 
        if(a >= 0 && b >= 0)
        {
            switch(_Operation)
            {
            case '+': _Result = a + b; break;
            case '-': _Result = a - b; break;
            case '*': _Result = a * b; break;
            case '/': _Result = a / b; break;
            default: _Result = -99999e9;
            }
 
            cout << _First << " " << _Operation << " " << _Second << " = " << _Result;
        }
    }
    
    keep_window_open();
    return EXIT_SUCCESS;
}
0
0 / 0 / 0
Регистрация: 25.02.2021
Сообщений: 2
30.05.2021, 17:47
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
#include "C:\Users\Sunrise\source\repos\std_lib_facilities.h"
 
int main()
{
    vector<string> numbers = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
    vector<string> Str_Numbers = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    const char sum = '+', substitute = '-', multiply = '*', divide = '/', exit = 'e';
    string firstN = "0", secondN = "0";
    double firstN_I = 0, secondN_I = 0;
    char operation = ' ';
    cout << "Enter \n|First number| \t\t |Second number| \t\t |Operation| \n [Any single-digit number] [Any single-digit number] [Char: '+' '-' '*' '/' 'e' ]\n";
    for (operation, firstN, secondN; cin >> firstN, cin >> secondN, cin >> operation; ) // for exit from a programm, enter any string symbols or CTRL + Z
    {
        for (int i = 0; i < Str_Numbers.size(); i++)
        {
            if (firstN == numbers[i]) // if inputs are words
                firstN_I = i;
            if (firstN == Str_Numbers[i]) // if inputs are digits
                firstN_I = i;
            if (secondN == numbers[i]) // if inputs are words
                secondN_I = i;
            if (secondN == Str_Numbers[i]) // if inputs are digits
                secondN_I = i;
        }
        switch (operation)
        {
        case sum:
            cout << "Sum of " << firstN_I << " and " << secondN_I << " equals " << firstN_I + secondN_I << '.';
            break;
        case substitute:
            cout << "Subtitute of " << firstN_I << " from " << secondN_I << " equals " << firstN_I - secondN_I << '.';
            break;
        case multiply:
            cout << "Multiply of " << firstN_I << " by " << secondN_I << " equals " << firstN_I * secondN_I << '.';
            break;
        case divide:
            cout << "Divide of " << firstN_I << " by " << secondN_I << " equals " << firstN_I / secondN_I << '.';
            break;
        case exit:
            goto exit_calc;
            break;
        default:
            cout << "Warning: expression sign " << operation << " didn't match with current possible choices!";
            break;
        }
        cout << '\n' << "|First number| |Second number| |Operation| or |Exit| \n";
    }
    exit_calc:
    cout << '\n' << "Proceeding to the exit...";
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2021, 17:47
Помогаю со студенческими работами здесь

Модифицируйте класс fraction
Модифицируйте класс fraction в четыре функциональном дробном калькуляторе, чтобы он использовал перегруженные операции сложения, вычитания,...

Модифицируйте эмулятор с целью моделирования случайных сбоев ОЗУ
Эмулятор IA-32 Bochs осуществляет запись данных в память с помощью функции BX_MEM_C::writePhysicalPage, которая реализована в...

Модифицируйте, пожалуйста, программу так, чтобы вместо 0 выводилось “false”, а вместо 1 – ”true”
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() { bool y, x; bool sq={ {0,0}, {0,1}, ...

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include &lt;iostream&gt; int main(){ int a = 0; int b = 0; char operation; std::cout &lt;&lt; &quot;Enter first number: &quot;; ...

Мини калькулятор
Доброго времени суток! Я вот по такому вопросу: в универе делал калькулятор, используя цикл do-while, в принципе все сделано, но только при...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru