Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Инженерный калькулятор 
:(
    Опции темы
kicylya
Дата 1.3.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2006

Репутация: нет
Всего: нет



надо вычислить значение строки например 1+3*4, программа должна просто вывести 13. строку надо вводить с клавиатуры.
PM MAIL   Вверх
Zyava
Дата 2.3.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.10.2006

Репутация: нет
Всего: нет



Тут пример попроще: http://www.codeproject.com/cpp/rpnexpressionevaluator.asp 
Тут намного серьезнее: http://www.codeproject.com/cpp/MathieuMathParser.asp

Сделать из cpp c несложно  smile 
PM MAIL   Вверх
Oleg_Ci
Дата 4.3.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Мой колькулятор 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);
    }
}

PM MAIL   Вверх
Dov
Дата 4.3.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



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




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Oleg_Ci
Дата 4.3.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Да, ошибочка вышла... smile 
PM MAIL   Вверх
kicylya
Дата 5.3.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2006

Репутация: нет
Всего: нет



а как же тогда??? не могу сделать? помогите!!!
PM MAIL   Вверх
vinter
Дата 5.3.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



google + обратная польская нотация = решение задачи smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
likehood
Дата 5.3.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Вот мой вариант. Для окончания надо ввести 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;
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.