Вопрос о применении указателей, и это делает цикл бесконечным - PullRequest
0 голосов
/ 18 января 2019

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

Я пытался применить некоторые указатели и управление памятью, но это просто делает первый цикл for бесконечным циклом. Но если я уберу указатели, программа будет в порядке, но ранее вычисленные значения будут добавлены к новому вычисленному значению.

#include <iostream>
#include <cstdlib>
using namespace std;

int main(){

    //variables
    float a[1000],c;
    char d,e;
    int f = 1,g;

    //pointers
    float *b;

    do{
        system("CLS");

        cout << endl;
        cout << "  Welcome!!!" << endl;
        cout << endl;
        cout << "  This is a calculator (obviously)" << endl;
        cout << endl;
        cout << "  Please input how many entities to be calculated: ";
        cin >> g;
        cout << endl;
        cout << endl;

        for(int h = 0;h < g; h++){
            cout << "  Input numbers: ";
            cin >> a[1000];
        }

        cout << endl;
        cout << "  Choose the LETTER corresponding to the operation below" << endl << endl;
        cout << "   A - Addition" << endl;
        cout << "   S - subtraction" << endl;
        cout << "   M - Multiplication" << endl;
        cout << "   D - Divison" << endl << endl;

        cout << "  Choose operation to be used: ";
        cin >> d;
        d = toupper(d);

        if((d != 'A') && (d != 'S') && (d != 'M') && (d != 'D')){
            do {
            cout << "  Choose operation from [A - S - M - D] respectively: ";
            cin >> d;
            d = toupper(d);
            }while((d != 'A') && (d != 'S') && (d != 'M') && (d != 'D'));
        }

        switch (d){
            case 'A':
                for(int h = 0;h < g; h++){
                    c +=a[1000];
                }
                cout << "  sum is " << c << endl;
                break;
            case 'S':
                for(int h = 0;h < g; h++){
                    c -=a[1000];
                }
                cout << "  difference is " << c << endl;
                break;
            case 'M':
                for(int h = 0;h < g; h++){
                    c *=a[1000];
                }
                cout << "  product is " << c << endl;
                break;
            case 'D':
                for(int h = 0;h < g; h++){
                    c /=a[1000];
                }
                cout << "  quotient is " << c << endl;
                break;
        }

        do{
            cout << endl;
            cout << "  Would you like to calculate again? [Y/N] ";
            cin >> e;
            e = toupper(e);
        }while ((e !='N') && (e != 'Y'));

        if (e == 'Y'){
            // Announce pointer and deletion of values ; also to clear memory on new start.
            //
        }
        else{
            f = 0;
        }
    }while (f == 1);

return 0;
}

1 Ответ

0 голосов
/ 18 января 2019

Я не совсем понимаю, к каким указателям или управлению памятью вы обращаетесь. Тем не менее, это

cin >> a[1000];

неправильно. Массив с 1000 элементами имеет последний действительный индекс как 999. Вы получаете доступ к массиву за пределами, что вызывает неопределенное поведение. Может случиться что угодно (ну, не совсем, но лучше так об этом думать).

Правильный цикл должен быть («правильный» как в «минимальных изменениях, чтобы избежать уб»):

for(int h = 0;h < g; h++){
    cout << "  Input number: ";
    cin >> a[h];
}

Однако это также вызовет проблемы, когда пользователь вводит число, большее 1000 для g. Что вы действительно должны использовать, так это std::vector, который позволяет вам выдвигать элементы сколько угодно, без указания их размера во время компиляции.

PS: Если ваш код работает без указателей или ручного управления памятью, то нет причин добавлять его. Указатели и (ручное) управление памятью сложны, обучение тому, как с ними обращаться, в основном сводится к тому, как их избежать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...