Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Инженерный калькулятор


Автор: kicylya 1.3.2007, 19:47
надо вычислить значение строки например 1+3*4, программа должна просто вывести 13. строку надо вводить с клавиатуры.

Автор: Zyava 2.3.2007, 22:21
Тут пример попроще: http://www.codeproject.com/cpp/rpnexpressionevaluator.asp 
Тут намного серьезнее: http://www.codeproject.com/cpp/MathieuMathParser.asp

Сделать из cpp c несложно  smile 

Автор: Oleg_Ci 4.3.2007, 09:20
Мой колькулятор smile 
Вводить надо строки с знаком равенства в конце
Цитата
2+3=
4/5+6-3=
...
Код

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

float fun( char op, float num1, float num2 );

//////////////////// MAIN /////////////////////////////
int main()    
{
    setlocale(LC_CTYPE, "Russian"); // для русских букв
    puts("Введите строку:");
    float res=0, num=0;
    char op;
    scanf("%f", &res);
    while( scanf("%c", &op) >0 ){
        if( op == '=' ) break;
        scanf("%f", &num);
        res = fun( op, res, num );
    }
    printf(" = %f", res );
    puts("\n\n\nPause ...");
    fflush(stdin);
    getchar(); // пауза
    return 0;
}
/////////// END MAIN //////////////////////////

float fun( char op, float num1, float num2 ){
    switch (op){
        case '+': return num1 +num2;
        case '-': return num1 - num2;
        case '*': return num1 * num2;
        case '/': 
            if( num2 == 0 ){
                puts("Ошибка, деление на ноль !");
                fflush(stdin);
                getchar();
                exit(1);
            }    
            return num1 / num2;
        default:
            printf("Ошибка, неизвестный оператор:  \'%c\'", op );
            fflush(stdin);
            getchar();
            exit(1);
    }
}

Автор: Dov 4.3.2007, 13:14
Oleg_Ci, а разве твой калькулятор сделает такое  smile 
Цитата(kicylya @  1.3.2007,  18:47 Найти цитируемый пост)
например 1+3*4, программа должна просто вывести 13


Автор: Oleg_Ci 4.3.2007, 18:20
Да, ошибочка вышла... smile 

Автор: kicylya 5.3.2007, 20:37
а как же тогда??? не могу сделать? помогите!!!

Автор: vinter 5.3.2007, 23:00
google + обратная польская нотация = решение задачи smile 

Автор: likehood 5.3.2007, 23:49
Вот мой вариант. Для окончания надо ввести exit.
Код

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

const char *p;

void  skip_space(void) {
    while (*p==' ') ++p;
}


double level1(void);
double level2(void);
double level3(void);

double level1(void) {
    double op1 = level2();
    char oper;
    skip_space();
    oper = *p++;
    switch (oper) {
        case '+': return op1 + level1();
        case '-': return op1 - level1();
        default: --p;
    }
    return op1;
}

double level2(void) {
    double op1 = level3();
    char oper;
    skip_space();
    oper = *p++;
    switch (oper) {
        case '*': return op1 * level2();
        case '/': return op1 / level2();
        default: --p;
    }
    return op1;
}

double level3(void) {
    char number[20], *p1 = number;
    double result;
    skip_space();
    if (*p == '(') {
        ++p;
        result = level1();
        if (*p++ != ')') {
            puts("Bracket balance error");
            exit(1);
        }
        return result;
    } else if (*p == '-') {
        ++p;
        return -level3();
    }
    skip_space();
    while (isdigit(*p) || *p=='.') *p1++ = *p++;
    *p1 = '\0';
    skip_space();
    return atof(number);
}

int main()
{
    char str[80];
    while(1) {
       gets(str);
       if (!strcmp(str, "exit")) break;
       p = str;
       printf("%f\n", level1());
    }
    return 0;
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)