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

doojkee

New member
08.04.2012
3
0
#1
1ый курс одного электротехнического вуза!

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

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

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

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

Whatka

#2
вот думаю тебе поможет
на С++,подчсёт введённого выражения через обратную польскую запись
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";
}
//
 

doojkee

New member
08.04.2012
3
0
#3
вот думаю тебе поможет
на С++,подчсёт введённого выражения через обратную польскую запись
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";
}
//
Спасибо, хоть что-то, жаль, что не на Си