Russian Qt Forum

Программирование => С/C++ => Тема начата: Vyshkant от Ноябрь 17, 2011, 13:46



Название: Консольный калькулятор
Отправлено: Vyshkant от Ноябрь 17, 2011, 13:46
Здравствуйте! Задался целью (при выполнении одной из лаб) написать консольный калькулятор на С++, который бы считал подряд, т.е. не учитывая приоритетов знаков умножения и деления, беря данные для подсчёта из аргументов. Собственно говоря, с горем пополам, написал. Изначально писал под Microsoft Visual Studio, но затем снёс венду и поставил Ubuntu 10.04 LTS, на коей установил qt-sdk.
Естественно, заголовки сменил на qt-шные. И всё, собственно говоря, работало, как и на венде. Но, всё да не всё :) А именно: знак умножения (" * ") не распознаётся как таковой: все операции кроме умножения идут нормально, на умножении выдаёт ошибку, типа "не предусмотренный символ".

Вот код:
Код:
#include <QtCore>
int StringToInt(char * str, bool & err)
{
        char * pLastChar = NULL;
        int param = strtol(str, &pLastChar, 10);
        err = ((*str == '\0') || (*pLastChar != '\0'));
        return param;
}
int main(int argc, char * argv[])
{
        if (argc <= 1)
        {
                printf("Program calculates result of elementary mathematical operations with its command line arguments.\n");
                return 0;
        }
        const char * operation = "+";
        double sum = 0;
        for (int i = 1; i < argc; ++i)
        {
                bool err;
                int param = StringToInt(argv[i], err);
                if (i % 2 != 0)
                {
                        if (err == true)
                        {
                                printf("Error in the argument #%d: the numbers should alternate with the operators +, -, *, /.\n", i);
                                return 1;
                        }
                        if (err == false)
                        {
                                if (strcmp(operation, "+") == 0)
                                {
                                        sum += (double) param;
                                }
                                if (strcmp(operation, "-") == 0)
                                {
                                        sum -= (double) param;
                                }
                                if (strcmp(operation, "*") == 0)
                                {
                                        sum *= (double) param;
                                }
                                if (strcmp(operation, "/") == 0)
                                {
                                        if (param == 0)
                                        {
                                                printf("Error in the argument #%d: division by zero.\n", i);
                                        }
                                        else
                                        {
                                                sum /= param;
                                        }
                                }
                        }
                }
                if (i % 2 == 0)
                {
                    if (err == false)
                    {
                            printf("11Error in the argument #%d: the numbers should alternate with the operators +, -, *, /.\n", i);
                            return 1;
                    }
                    if (err == true)
                        {
                                if ((strcmp(argv[i], "+") == 0) || (strcmp(argv[i], "-") == 0) || (strcmp(argv[i], "*") == 0) || (strcmp(argv[i], "/") == 0))
                                {
                                        operation = argv[i];
                                }
                                else
                                {
                                        printf("22Error in the argument #%d: the numbers should alternate with the operators +, -, *, /.\n", i);
                                        return 1;
                                }
                        }
                }
        }
        for (int i = 1; i < argc; ++i)
        {
                printf("%s ", argv[i]);
        }
        printf("= %.3f", sum);
        printf("\n");
        return 0;
}

Вот как реагирует на аргументы:
Код:
anton@laptop:~$ '/home/anton/prog/cpp/laba1-2/laba1-2' 2 + 2
2 + 2 = 4.000
anton@laptop:~$ '/home/anton/prog/cpp/laba1-2/laba1-2' 2 - 2
2 - 2 = 0.000
anton@laptop:~$ '/home/anton/prog/cpp/laba1-2/laba1-2' 2 / 2
2 / 2 = 1.000
anton@laptop:~$ '/home/anton/prog/cpp/laba1-2/laba1-2' 2 * 2
22Error in the argument #2: the numbers should alternate with the operators +, -, *, /.
anton@laptop:~$ ^C


Подскажите пожалуйста, что не так.
З.Ы. Нуб :)
З.З.Ы. Прога чисто учебная, так что на сложность решений "через зад" внимания прошу не обращать :)


Название: Re: Консольный калькулятор
Отправлено: Anchorite от Ноябрь 18, 2011, 09:14
По-моему '*' разворачивается в список имен файлов в текущей папке. Поэтому ты и получаешь эту ошибку. Проверь, что реально приходит в argv у main.


Название: Re: Консольный калькулятор
Отправлено: iroln от Ноябрь 18, 2011, 10:15
У Страуструпа в книжке разбирается консольный калькулятор. Не смотрели чисто ради интереса?


Название: Re: Консольный калькулятор
Отправлено: andrew.k от Ноябрь 18, 2011, 12:26
По-моему '*' разворачивается в список имен файлов в текущей папке. Поэтому ты и получаешь эту ошибку. Проверь, что реально приходит в argv у main.

Конечно, интерпретатор символ * заменяет на список файлов из текущей директории.
Передавай свою строчку для рассчета в двойных кавычках.

./calc "2*5+4"


Название: Re: Консольный калькулятор
Отправлено: Vyshkant от Ноябрь 18, 2011, 20:20
Реально ли сделать, чтобы * понималась именно как *, а не как список файлов из текущей директории, не используя кавычки?


Название: Re: Консольный калькулятор
Отправлено: Пантер от Ноябрь 18, 2011, 20:20
\*


Название: Re: Консольный калькулятор
Отправлено: Vyshkant от Ноябрь 18, 2011, 20:39
Можно ли это обусловить в коде? Т.е. чтобы не требовалось вводить \* в консоли ?


Название: Re: Консольный калькулятор
Отправлено: Пантер от Ноябрь 18, 2011, 20:40
Нет.


Название: Re: Консольный калькулятор
Отправлено: Igors от Ноябрь 18, 2011, 21:22
Упражнение прекрасное, ну реализация пока не очень :) Сделайте с учетом кавычек, приоритета операций, скобок, добавьте парочку ф-ций (напр sin и cos), отловите деление на ноль. Так Вы научитесь гораздо большему чем ставя убунту, "собирая" и тупенько заучивая классы.