Не работает калькулятор

Всем привет. Как мне говорили, и я решил попробовать использовать
«switch» на калькуляторе. Но калькулятор не показывает ответ, а программа сразу закрывается.

#include <conio.h>
#include <iostream>
#include <cstring>
#include <istream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    setlocale(0, "");
    char nikname[80];
    int rool, passpord;
    float a, b, RES;
    cout << "Пожалуйста представьтесь." << endl;
    cin.getline(nikname, 80);
    cout << "Очень приятно " << nikname << ". Меня зовут Никита. Теперь вам нужно понять, для чего вам нужна эта программа. Чтобы начать использователь, вам нужно ввести пароль. При неверном пароле, вам выкинет из программы. Удачного дня. (Пароль 12345)" << endl;
    cout << "Введите пароль: " << endl;
    cin >> passpord;
    if (passpord == 12345)
    {
        system("cls");
        cout << "Пароль верный. ";
        cout << "Выберите действие: " << endl;
        cout << "101 - Калькулятор" << endl;
        cin >> rool;

        if (rool == 101) // Что тут идет сразу сложения я знаю. Смогу исправить.
        {
            cout << "Введите первое число" << endl;
            cin >> a;
            cout << "Введите второе число" << endl;
            cin >> b;

            switch (rool){
            case  '+':    // если пользователь выбрал сложение      
                RES = a + b;
                cout << "\nanswer: " << RES << "\n";
                break; // остановка switch
            case  '-':     // если пользователь выбрал вычитание
                RES = a - b;
                cout << "\nanswer: " << RES << "\n";
                break; // остановка switch
            case  '*':    // если пользователь выбрал умножение
                RES = a*b;
                cout << "\nanswer: " << RES << "\n";
                break;
            }
        }
    }
    else {
        cout << "Пароль не правильный!!!" << endl;
    }
    _getch();
    return 0;
}

Ну как-то так.
Еще будет прикольно, если сделаешь консоль на весь экран.
Login: Admin;
Password: 12345;

#include <iostream>
#include <locale>
#include <conio.h>
#include <string>
#include <iomanip>
#include <Windows.h>

using namespace std;

int main()
{
    setlocale(LC_CTYPE, "Russian");
    string NickName = "Admin", NotNickName; 
    string Password = "12345", NotPassword;
    char SizeNickName[256];
    int Number=0;
    double a,b,c;   
    do
    {
    system("cls");  
    wcout<<setw(605)<<L"Введите ваш логин: ";
    cin>>NotNickName;
    cin.clear();
    cin.sync();
    wcout<<setw(46)<<L"Введите ваш пароль: ";
    cin>>NotPassword;   
    cin.clear();
    cin.sync();
    system("cls");
    if(NotNickName==NickName && NotPassword==Password)
    {
        wcout<<setw(605)<<L"Доступ разрешен!";
    }
    else
    {   
        wcout<<setw(615)<<L"Введен неверный пароль или логин."<<setw(47)<<endl<<L"Повторите попытку!";
    }
    _getch();
    }while(NotNickName!=NickName || NotPassword!=Password);
    system("cls");
    wcout<<L"Укажите ваше имя: ";
    cin.getline(nickname,256);  
    do
    {   
        system("cls");  
    wcout<<L"Добро пожаловать, "<<SizeNickName
        <<L". Это тестовая программа калькулятора."<<endl
        <<L"Доступные функции:"<<endl
            <<L"1. Сложение."<<endl
            <<L"2. Вычитание."<<endl
            <<L"3. Деление."<<endl
            <<L"4. Умножение."<<endl
            <<L"0. Выход."<<endl<<endl;

    wcout<<L"Введите номер действия которое хотите совершить: ";    
    cin>>Number;
    switch(Number)
    {
    case 0:
        system("color 0c");
        wcout<<endl<<L"Сохранение данных, программа закроется через 5 секунд..."<<endl<<endl;
        wcout<<L"Отчет времени: ";
        wcout<<L"5\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b4\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b3\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b2\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b1\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\tВыход выполнен!\a\a";
        return EXIT_SUCCESS;
    case 1:
        {       
        wcout<<endl<<L"Введите первое число: ";
        cin>>a;
        wcout<<endl;
        wcout<<L"Введите второе число: ";
        cin>>b;
        wcout<<endl;
        c=a+b;
        wcout<<L"Сумма: "<<c;
        _getch();
        }
        break;
    case 2:
        {
        wcout<<endl<<L"Введите первое число: ";
        cin>>a;
        wcout<<endl;
        wcout<<L"Введите второе число: ";
        cin>>b;
        wcout<<endl;
        c=a-b;
        wcout<<L"Сумма: "<<c;
        _getch();
        }
        break;
    case 3:
        {
        wcout<<endl<<L"Введите первое число: ";
        cin>>a;
        wcout<<endl;
        wcout<<L"Введите второе число: ";
        cin>>b;
        wcout<<endl;
        c=a/b;
        wcout<<L"Сумма: "<<c;
        _getch();
        }
        break;
    case 4:
        {
        wcout<<endl<<L"Введите первое число: ";
        cin>>a;
        wcout<<endl;
        wcout<<L"Введите второе число: ";
        cin>>b;
        wcout<<endl;
        c=a*b;
        wcout<<L"Сумма: "<<c;
        _getch();
        }
        break;
    default:
        {
        wcout<<L"Вы указали неверный номер команды. Повторите попытку.";
        _getch();
        }
        break;
    }
    }while(Number!=false);
}

NumberSeven, несколько слов по поводу кода.

(1) Оно не компилируется. cin.getline(nickname, 256); — нет такой переменной. Должно быть cin.getline(SizeNickName, 256);.

(2) В коде чувствуется большой замах на поддержку юникода вообще и кириллицы в частности. Ввод имени с использованием кириллицы приводит программу в ступор (буквально). Оно конечно можно поковырять под отладчиком и выяснить, что там происходит. Но лень...

(3) «Защиты от дурака» практически нет (за исключением ввода логина/пароля). Ввод любого некорректного значения приводит к весьма неожиданному поведению программы (поэкспериментируй сам — познавательно!).

(4) Дублирование кода в различных видах.

Случай 1.

        if(NotNickName==NickName && NotPassword==Password)
        {
            wcout<<setw(605)<<L"Доступ разрешен!";
        }
        else
        {   
            wcout<<setw(615)<<L"Введен неверный пароль или логин."<<setw(47)<<endl<<L"Повторите попытку!";
        }
        _getch();
    }while(NotNickName!=NickName || NotPassword!=Password);

Дублирование условия в if и while. Лучше так:

    bool ok;
    do
    {
        // ...
        ok = NotNickName == NickName && NotPassword == Password;
        if (ok)
        {
            wcout<<setw(605)<<L"Доступ разрешен!";
        }
        else
        {   
            wcout<<setw(615)<<L"Введен неверный пароль или логин."<<setw(47)<<endl<<L"Повторите попытку!";
        }
        _getch();
    } while (!ok);

Случай 2.

        {       
        wcout<<endl<<L"Введите первое число: ";
        cin>>a;
        wcout<<endl;
        wcout<<L"Введите второе число: ";
        cin>>b;
        wcout<<endl;
        c=a+b;
        wcout<<L"Сумма: "<<c;
        _getch();
        }

Код повторяется для всех case. Отличие только в выражении вычисления переменной c. Сделано явно копипастой. Вплоть до того, что при выводе результата везде выводится строка Сумма: . Из-за этого оператор switch стал безобразно длинным. А если в этот фрагмент ещё вставить проверку корректности введённых данных...

Однозначно, ввод двух чисел нужно делать функцией. А проверку корректности ввода выносить в отдельную функцию (кое-что по этому поводу можно почерпнуть здесь).

Переменную c можно вообще не вводить, а обойтись

        wcout << L"Сумма: " << a + b;

Вызов _getch() из case'ов убрать и поставить после switch.

Случай 3.

        wcout<<L"Отчет времени: ";
        wcout<<L"5\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b4\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b3\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b2\a"<<endl;
        Sleep(1000);
        wcout<<L"\t\t\b1\a"<<endl;
        Sleep(1000);

А если понадобится отсчитать 100 секундный таймаут? Такие вещи делаются в цикле.

(5) Делить на 0 нельзя. Пользователя надо об этом проинформировать, а не выдавать на экран загадочный результат 1.INF.

(6) while(Number!=false) — оно конечно работает, но чисто стилистически выглядит ужасно. Проще и логичнее написать while (Number != 0);, поскольку Number типа int.

(7) return, тем более из main() лучше делать в конце функции. Я бы весь фрагмент из case 0 (с учётом п.4.3) вынес за цикл do {} while.

(8) Ну и в довесок неаккуратное форматирование кода ((

Nikitaz58, я сделал минимальные правки по твоему коду (отметил циферками в комментариях). Теперь работает.

#include <conio.h>
#include <iostream>
#include <cstring>
#include <istream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    setlocale(0, "");
    char op;              // 1
    char nikname[80];
    int rool, passpord;
    float a, b, RES;
    cout << "Пожалуйста представьтесь." << endl;
    cin.getline(nikname, 80);
    cout << "Очень приятно " << nikname << ". Меня зовут Никита. Теперь вам нужно понять, для чего вам нужна эта программа. Чтобы начать использователь, вам нужно ввести пароль. При неверном пароле, вам выкинет из программы. Удачного дня. (Пароль 12345)" << endl;
    cout << "Введите пароль: " << endl;
    cin >> passpord;
    if (passpord == 12345)
    {
        system("cls");
        cout << "Пароль верный. ";
        cout << "Выберите действие: " << endl;
        cout << "101 - Калькулятор" << endl;
        cin >> rool;

        if (rool == 101) // Что тут идет сразу сложения я знаю. Смогу исправить.
        {
            cout << "Введите первое число" << endl;
            cin >> a;
            cout << "Введите второе число" << endl;
            cin >> b;

            cout << "Введите знак операции (+-*): ";    // 2
            cin >> op;


            switch (op){                               // 3
            case  '+':    // если пользователь выбрал сложение      
                RES = a + b;
                cout << "\nanswer: " << RES << "\n";
                break; // остановка switch
            case  '-':     // если пользователь выбрал вычитание
                RES = a - b;
                cout << "\nanswer: " << RES << "\n";
                break; // остановка switch
            case  '*':    // если пользователь выбрал умножение
                RES = a*b;
                cout << "\nanswer: " << RES << "\n";
                break;
            }
        }
    }
    else {
        cout << "Пароль не правильный!!!" << endl;
    }
    _getch();
    return 0;
}

И прочитай выше пост от Черепа — там есть замечания, которые относятся и к твоему коду.

NumberSeven, я же тебе говорил не суй в swith блоки с кодом, а вынеси все в подпрограммы, о чем и говорят братья наши старшие :).

А как сделать, чтоб после выполнения программы, она не закрывалась, а возвратилась в меню. И как сделать, чтоб например написать 100, и она закрылась

Добавь switch 100 для выхода и там пропиши return EXIT_SUCCESS;
Я бы сделал через цикл
do{
}while();
Но думаю будет правильней через рекурсию.
Сам еще учусь)

Ребят я начинающи и мне немного сложновато))))вобщем я смастерил самый просто калькулятор и все работает,выскакивает консоль просит первое число за тем второе,все отлично но вот я не пойму я хочу чтоб программа показала мне ответ но не показывает а закрываеться когда я жму энтер

Славик что т у меня не выходит

include <iostream>

using namespace std;

int main()
{
setlocale(0, «»);
/7/ int a, b;
cout << «Введите первое число: »;
cin >> a;
cout << «Введите второе число: »;
cin >> b;
/12/ int c = a + b;
cout << «Сумма чисел = » << c << endl;
return 0;
system(«pause»);
}
что не так?

простите исправил ошибку но консоль всеравно исчезает

Я исправил просто я олух)))но консоль всеравно исчезает

Вот. В комментариях я написал ошибки

#include <iostream> // должна стоять #  Я поставил
using std::cout;
using std::cin; // using namespace std; не работает. Теперь для всех пиши как я сделал.
using std::endl;

int main()
{
    setlocale(0, "");
    int a, b; // зачем тут / 7 /. Я убрал
    cout << "Введите первое число: ";
    cin >> a;
    cout << "Введите второе число: ";
    cin >> b;
    int c = a + b; // и тут зачем? откуда / / ?
    cout << "Сумма чисел = " << c << endl;
    system("pause");
    return 0;
}

А тебе сколько лет, если не секрет? Просто с такими простыми ошибками...

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.