Russian Qt Forum
Ноябрь 23, 2024, 20:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Консольный калькулятор  (Прочитано 8332 раз)
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


Подскажите пожалуйста, что не так.
З.Ы. Нуб Улыбающийся
З.З.Ы. Прога чисто учебная, так что на сложность решений "через зад" внимания прошу не обращать Улыбающийся
« Последнее редактирование: Ноябрь 17, 2011, 13:54 от Vyshkant » Записан
Anchorite
Гость
« Ответ #1 : Ноябрь 18, 2011, 09:14 »

По-моему '*' разворачивается в список имен файлов в текущей папке. Поэтому ты и получаешь эту ошибку. Проверь, что реально приходит в argv у main.
Записан
iroln
Гость
« Ответ #2 : Ноябрь 18, 2011, 10:15 »

У Страуструпа в книжке разбирается консольный калькулятор. Не смотрели чисто ради интереса?
Записан
andrew.k
Гость
« Ответ #3 : Ноябрь 18, 2011, 12:26 »

По-моему '*' разворачивается в список имен файлов в текущей папке. Поэтому ты и получаешь эту ошибку. Проверь, что реально приходит в argv у main.

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

./calc "2*5+4"
« Последнее редактирование: Ноябрь 18, 2011, 12:29 от andrew.k » Записан
Vyshkant
Гость
« Ответ #4 : Ноябрь 18, 2011, 20:20 »

Реально ли сделать, чтобы * понималась именно как *, а не как список файлов из текущей директории, не используя кавычки?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Ноябрь 18, 2011, 20:20 »

\*
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vyshkant
Гость
« Ответ #6 : Ноябрь 18, 2011, 20:39 »

Можно ли это обусловить в коде? Т.е. чтобы не требовалось вводить \* в консоли ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Ноябрь 18, 2011, 20:40 »

Нет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 18, 2011, 21:22 »

Упражнение прекрасное, ну реализация пока не очень Улыбающийся Сделайте с учетом кавычек, приоритета операций, скобок, добавьте парочку ф-ций (напр sin и cos), отловите деление на ноль. Так Вы научитесь гораздо большему чем ставя убунту, "собирая" и тупенько заучивая классы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 23.