Калькулятор Логических/арифметических Операций

Тема в разделе "C/C++/C#", создана пользователем doojkee, 8 апр 2012.

  1. doojkee

    doojkee New Member

    Регистрация:
    8 апр 2012
    Сообщения:
    3
    Симпатии:
    0
    1ый курс одного электротехнического вуза!

    Суть программы, которую нужно написать:

    Написать нужно на чистом Си

    Написать программу калькулятор, вычисляющая значения арифметичекого или логического выражения.
    - допуская неограниченное количество вложенных скобок.
    - должны полностью соблюдаться приоритеты логич. Арифм. Операций.
    - необходимо, чтобы программа умела вычислять значение как введеного с клавиатура и как загруженного с файла.
    - вывод как на экран так и в файл.
    - дружественное меню для пользователя и интерфейс. (GUI не нужен, все в консоле.)
    - возможность задавать параметры командной строки. (понятия не имею, что это.)
    - Рекомендуется преобразовывать формулу в обратную польскую запись, но вводить формулу в норм вид.
    -сделать автоматическое распознование формулы(логич. & арифметическая) .

    Очень прошу помощи в реализации этой программы, буду благодарен за любую помощь, советы, примеры кода, ссылки на статьи, книги и т.д.
    Заранее спасибо!
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    вот думаю тебе поможет
    на С++,подчсёт введённого выражения через обратную польскую запись
    Код (C++):
    //
    #include <iostream>
    #include <stack>
    using namespace std;
    bool delim (char c)
    {
    return c == ' ';
    }
    bool is_op (char c)
    {
    return c=='+' || c=='-' || c=='*' || c=='/' || c=='%';
    }
    int priority (char op)
    {
    return
    op == '+' || op == '-' ? 1 :
    op == '*' || op == '/' || op == '%' ? 2 :
    -1;
    }
    void process_op (stack<int>& st, char op)
    {
    int r = st.top();
    st.pop();
    int l = st.top();
    st.pop();
    switch (op)
    {
    case '+': st.push(l + r); break;
    case '-': st.push(l - r); break;
    case '*': st.push(l * r); break;
    case '/': st.push(l / r); break;
    case '%': st.push(l % r); break;
    }
    }
    int calc (char *s)
    {
    stack <int> Int;
    stack <char> Char;
    for (int i=0; i<strlen(s);i++)
    {
    if (!delim (s[i]))
    if (s[i] == '(')
    Char.push('(');
    else if (s[i] == ')')
    {
    while (Char.top() != '(')
    process_op (Int, Char.top()), Char.pop();
    Char.pop();
    }
    else if (is_op (s[i]))
    {
    char curop = s[i];
    while (!Char.empty() && priority(Char.top()) >= priority(s[i]))
    process_op (Int, Char.top()), Char.pop();
    Char.push(curop);
    }
    else
    {
    string operand;
    while (s[i]>='a'&&s[i]<='z'||isdigit(s[i]))
    operand += s[i++];
    --i;
    if (isdigit (operand[0]))
    Int.push(atoi(operand.c_str()));
    else
    {
    char* str_ptr=new char[operand.length()+1]();
    strcpy(str_ptr,operand.c_str());
    Int.push(atoi(str_ptr));
    }
    }
    }
    while (!Char.empty())
    process_op (Int, Char.top()),Char.pop();
    return Int.top();
    }

    void main()
    {
    setlocale(LC_ALL,"RUS");
    char s[100];
    cout<<"Введите выражение:";
    cin>>s;
    int rez=calc(s);
    cout<<"Результат:"<<rez;
    cout<<"\n";
    }
    //
     
  3. doojkee

    doojkee New Member

    Регистрация:
    8 апр 2012
    Сообщения:
    3
    Симпатии:
    0
    Спасибо, хоть что-то, жаль, что не на Си
     
Загрузка...
Похожие Темы - Калькулятор Логических арифметических
  1. DreamForse
    Ответов:
    0
    Просмотров:
    2.220
  2. users574
    Ответов:
    0
    Просмотров:
    2.006
  3. Bonuse
    Ответов:
    1
    Просмотров:
    1.697
  4. Powinteh
    Ответов:
    0
    Просмотров:
    1.087
  5. Powinteh
    Ответов:
    1
    Просмотров:
    1.078

Поделиться этой страницей