Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Grraf
1 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 32
#1

Как доделать калькулятор на С/С++ ? - C++

14.12.2013, 21:03. Просмотров 360. Ответов 6
Метки нет (Все метки)

Помогите пожалуйста в калькулятором. У меня есть уже скобки и возведение в степень. Мня нужно добавить ещё косинусы, синусы, квадратный корень, и логарифмы. Я не знаю как это сделать.

Вот мой код:

#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define DELIMITER 1
#define VARIABLE 2
#define NUMBER 3

extern char *prog; /* содержит анализируемое выражение */
char token[80];
char tok_type;

void eval_exp(double *answer), eval_exp2(double *answer);
void eval_exp3(double *answer), eval_exp4(double *answer);
void eval_exp5(double *answer), eval_exp6(double *answer);
void atom(double *answer);
void get_token(void), putback(void);
void serror(int error);
int isdelim(char c);

char *prog;
void eval_exp(double *answer);
int main(void)
{
setlocale(LC_ALL, "Rus");
double answer;
char *p;

p = (char *) malloc(100);
if(!p) {
printf("Ошибка при выделении памяти.\n");
exit(1);
}

/* Обработка выражений до ввода пустой строки. */
do {
prog = p;
printf("Введите выражение: ");
gets(prog);
if(!*prog) break;
eval_exp(&answer);
printf("Результат: %.2f\n", answer);
} while(*p);

return 0;
}

/* Точка входа анализатора. */
void eval_exp(double *answer)
{
get_token();
if(!*token) {
serror(2);
return;
}
eval_exp2(answer);

if(*token) serror(0); /* последней лексемой должен быть нуль */
}

/* Сложение или вычитание двух слагаемых. */
void eval_exp2(double *answer)
{
register char op;
double temp;

eval_exp3(answer);
while((op = *token) == '+' || op == '-') {
get_token();
eval_exp3(&temp);
switch(op) {
case '-':
*answer = *answer - temp;
break;
case '+':
*answer = *answer + temp;
break;
}
}
}

/* Умножение или деление двух множителей. */
void eval_exp3(double *answer)
{
register char op;
double temp;

eval_exp4(answer);
while((op = *token) == '*' || op == '/' || op == '%') {
get_token();
eval_exp4(&temp);
switch(op) {
case '*':
*answer = *answer * temp;
break;
case '/':
if(temp == 0.0) {
serror(3); /* деление на нуль */
*answer = 0.0;
} else *answer = *answer / temp;
break;
case '%':
*answer = (int) *answer % (int) temp;
break;
}
}
}

/* Возведение в степень */
void eval_exp4(double *answer)
{
double temp, ex;
register int t;

eval_exp5(answer);

if(*token == '^') {
get_token();
eval_exp4(&temp);
ex = *answer;
if(temp==0.0) {
*answer = 1.0;
return;
}
for(t=temp-1; t>0; --t) *answer = (*answer) * (double)ex;
}
}

/* Умножение унарных операторов + и -. */
void eval_exp5(double *answer)
{
register char op;

op = 0;
if((tok_type == DELIMITER) && *token=='+' || *token == '-') {
op = *token;
get_token();
}
eval_exp6(answer);
if(op == '-') *answer = -(*answer);
}

/* Вычисление выражения в скобках. */
void eval_exp6(double *answer)
{
if((*token == '(')) {
get_token();
eval_exp2(answer);
if(*token != ')')
serror(1);
get_token();
}
else
atom(answer);
}

/* Получение значения в скобках. */
void atom(double *answer)
{
if(tok_type == NUMBER) {
*answer = atof(token);
get_token();
return;
}
serror(0); /* иначе синтаксическая ошибка в выражении */
}

/* Выражение лексемы во входной поток. */
void putback(void)
{
char *t;

t = token;
for(; *t; t++) prog--;
}

/* Отображение сообщения об ошибке. */
void serror(int error)
{
static char *e[]= {
"Синтаксическая ошибка",
"Несбалансированные скобки",
"Нет выражения",
"Деление на нуль"
};
printf("%s\n", e[error]);
}

/* Возврат очередной лексемы. */
void get_token(void)
{
register char *temp;

tok_type = 0;
temp = token;
*temp = '\0';

if(!*prog) return; /* конец выражения */
while(isspace(*prog)) ++prog; /* пропустить пробелы,
символы табуляции и пустой строки */

if(strchr("+-*/%^=()V", *prog)){
tok_type = DELIMITER;
/* перейтик следующему символу */
*temp++ = *prog++;
}
else if(isalpha(*prog)) {
while(!isdelim(*prog)) *temp++ = *prog++;
tok_type = VARIABLE;
}
else if(isdigit(*prog)) {
while(!isdelim(*prog)) *temp++ = *prog++;
tok_type = NUMBER;
}

*temp = '\0';
}

/* Возвращение значения ИСТИНА, если с является разделителем. */
int isdelim(char c)
{

if(strchr(" +-/*%^=()", c) || c==9 || c=='\r' || c==0)
return 1;
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2013, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как доделать калькулятор на С/С++ ? (C++):

Доделать консольный калькулятор - C++
Ребят. Вот есть такой недоделыш. Должно работать следующим способом: вы вводите любое выражение, например 2+70*3+2583/5, а прога понятное...

Как доделать строки - C++
Помогите пожалуйста со строками. Конкретно код написал, но не всегда программа работает правильно. после каждого слова вставить точку,...

подскажите как доделать программу - C++
#include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; using namespace std ; main() { int i=0,j=0; string...

Объясните как доделать программу - C++
Вывести элементы последовательности целых чисел от 1 до 1000 сумма цифр в которых больше заданного значения. Фрагмент кода который удалось...

Застрял.Подскажите как доделать. - C++
Напишите программу на &quot;родном&quot; С++, которая позволит ввести неограниченное количество значений и сохранить их в массив, размещенный в...

Не понимаю как доделать программу - C++
Требования: нужно,организовать массив из тех чисел, которые входят в последовательность более одного раза. Вот я создал 2 массива,...

6
_lunar_
1364 / 1292 / 101
Регистрация: 03.05.2011
Сообщений: 2,972
Завершенные тесты: 1
14.12.2013, 23:58 #2
воспользуйтесь заголовочным файлом cmath (math.h)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    double a;
    cout << "Enter num: ";
    cin >> a;
    cout << "Sin = " << sin(a) << endl;
    cout << "Cos = " << cos(a) << endl;
    cout << "Sqrt = " << sqrt(a) << endl;
    cout << "Log = " << log(a) << "\n" << "Log10 = " << log10(a) << endl;
 
    system("pause");
    return 0;
}
0
Grraf
1 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 32
15.12.2013, 00:38  [ТС] #3
Я знаю как вычислить синус и косинус. Я не знаю как внести это в програму
0
_lunar_
1364 / 1292 / 101
Регистрация: 03.05.2011
Сообщений: 2,972
Завершенные тесты: 1
15.12.2013, 01:25 #4
Цитата Сообщение от Grraf Посмотреть сообщение
Я не знаю как внести это в програму
как же вы другие математические операции сделали?
как считать то, что вам требуется я показал. Неужели так сложно переписать какой-нибудь из ваших методов к примеру /* Возведение в степень */ на /* Квадратный корень */.
0
gazlan
3134 / 1910 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
15.12.2013, 05:29 #5
Цитата Сообщение от _lunar_ Посмотреть сообщение
Неужели так сложно
Сложно :-)

Грамматику надо менять. Добавлять символьные литералы или таблицу имен. Или использовать определенный трюк. Если бы TS не спер этот код, а писал сам, он бы понял о чем речь.
1
ZeR_0
15.12.2013, 05:40
  #6

Не по теме:

Палево. Не люблю людей, которые не хотят думать своими мозгами. Хотя, если посмотреть с другой стороны, чем хуже предложение от массы, тем я больше ценюсь как специалист

0
Grraf
1 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 32
15.12.2013, 18:42  [ТС] #7
я уже сделал. Просто передал отдельные буквы в функцию а там проверял последовательность а там при определьонной последовательности вычислял косинус синус и т.д.
0
15.12.2013, 18:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 18:42
Привет! Вот еще темы с ответами:

Подскажите как доделать прогу - C++
Доброго времени суток) Помогите довести до ума программу, чтобы она работала в рамках одной проги 1) Находила наибольшую нечетную цифру....

Как доделать длинную целочисленную арифметику? - C++
Операторы: сравнения присваивания, сложения, вычитания, левого и правого сдвига, деления, остатка, умножения, приведения к обычному целому,...

генератор псевдослучайных чисел незнаю как доделать... - C++
воть он: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #define RAND_MAX 32767 unsigned long next = 1 ; int rand(void) { ...

Как дальше доделать? Посмотрите. Почему она не работает? - C++
Определить, есть ли в данном массиве строка, состоящая только из отрицательных элементов. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru