Expressão matemática em C
Publicado por ??? (última atualização em 07/08/2013)
[ Hits: 5.439 ]
Esse é um simples exemplo de expressão matemática em C.
Operações:
01 - Soma.
02 - Subtração.
03 - Multiplicação.
04 - Divisão.
...
Compilado/testado nos compiladores GCC e Visual C.
//-------------------------------------------------------------------
//
// THANKS TO:
// 01 - The only GOD, creator of heaven and earth, in the name of JESUS CHRIST.
//
// DESCRIPTION:
// Simple Arithmetic Expression Parser:
//
// This program execute in Windows and Linux ...
//
// FILE:
// expression.c
//
//
// EXPRESSION WITH:
// +
// -
// *
// /
//
// COMPILE:
// gcc expression.c -o expression -O2 -Wall
//
// BY: gokernel - gokernel@hotmail.com
//
//-------------------------------------------------------------------
#include <stdio.h>
#include <string.h> // strcmp(), strlen()
#include <stdlib.h> // malloc()
#include <ctype.h> // isalpha (), isdigit ()
#define TYPE_NUMBER 1
#define ARRAY_MAX 100
static int
operation, // 0, +, -, *, /
array_count,
erro
;
static char
*str,
token [1024],
array [ARRAY_MAX][20]
;
//-------------------------------------------------------------------
// prototypes:
//-------------------------------------------------------------------
//
int get_token (void);
void calculate (int op);
void expression (char *s);
int get_token (void)
{
char *temp;
label_top:
// remove_space
//
while (*str && (*str >= 1 && *str <= 32))
str++;
if (*str == 0)
return 0;
temp = token;
*temp = 0;
if (isdigit(*str))
{
while (isdigit(*str) || *str == '.') *temp++ = *str++;
*temp = 0;
return TYPE_NUMBER;
}
else
if (*str == '-' && isdigit(str[1])) // negative
{
*temp++ = *str++;
while (isdigit(*str) || *str == '.') *temp++ = *str++;
*temp = 0;
return TYPE_NUMBER;
}
else
if (*str == '+' || *str == '-' || *str == '*' || *str == '/')
{
operation = *str;
*temp++ = *str++;
*temp = 0;
return operation;
}
if (*str <= 32)
goto label_top;
erro = 1;
printf ("ERRO - Ilegal Char: '%c'\n", *str);
return 0;
}
void calculate (int op)
{
register int i, a;
label_top:
for (i = 0; i < array_count; i++)
if (array[i][0] == op)
{
switch (op) {
case '/':
sprintf (array[i-1], "%f", atof(array[i-1]) / atof(array[i+1]));
break;
case '*':
sprintf (array[i-1], "%f", atof(array[i-1]) * atof(array[i+1]));
break;
case '+':
sprintf (array[i-1], "%f", atof(array[i-1]) + atof(array[i+1]));
break;
case '-':
sprintf (array[i-1], "%f", atof(array[i-1]) - atof(array[i+1]));
break;
}// switch()
array_count -= 2;
// move the list to top
//
for (a = i; a < array_count; a++)
{
strcpy (array[a], array[a+2]);
}
}//if (array[i][0] == op)
// ! if exist: '+', '-', '*', '/'
//
for (i = 0; i < array_count; i++)
if (array[i][0] == op && array[i][1] == 0)
goto label_top;
}
void expression (char *s)
{
str = s;
operation = 0;
erro = 0;
array_count = 0;
// store in array
//
while (get_token() && !erro)
strcpy(array[array_count++], token);
// !get erro
//
if (!isdigit(array[0][0]) && array[0][1] == 0)
{
erro = 1;
printf ("\nPlease, start with NUMBER ...\n");
return;
}
calculate ('/');
calculate ('*');
calculate ('+');
calculate ('-');
if (!erro)
printf ("__________ = %f\n", atof(array[0]) );
else
printf ("\n<<<<<<<<<< ERRO >>>>>>>>>>\n");
}
int main (int argc, char *argv[])
{
char string [1024];
printf (
"_____________________________________________________________________\n\n"
" Glory and honor to the only God, creator of heaven and earth\n"
" in the name of JESUS CHRIST !\n\n"
" Examples:\n"
" 10 + 20 + 30 * 2 * 3\n\n"
" 30 * 2 + 10 + 20\n\n"
" 10 + 20 + 30\n\n"
" 10 + 20 / 3 * 2\n\n"
" 10 + 20 / 3 * 2 * 5\n\n"
" For 'quit' type: q, quit\n\n"
" BY: gokernel - gokernel@hotmail.com\n"
"_____________________________________________________________________\n"
);
for (;;)
{
printf ("expression > ");
gets (string);
if (strlen(string) >= 1)
{
if ( (!strcmp(string, "q")) || (!strcmp(string, "quit")) )
break;
expression (string);
}
}
printf ("Exiting with sucess: %d", 10 * 10 * 3);
return 0;
}
Simples JIT (just in time) em C
"Clear Screen" para Linux 64 bits em Assembly Puro (GNU Assembly)
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assemble
Escrita de um número em decimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly)
Nenhum comentário foi encontrado.
Papagaiando o XFCE com temas e recursos
WhatsApp com Chamadas no Linux via Waydroid
XFCE - quase um Gnome ou Plasma mas muito mais leve
LXQT - funcional para máquinas pererecas e usuários menos exigentes
Removendo entradas de boot UEFI "fantasmas" via terminal
Atualizações de Segurança Automáticas no Debian
Como cortar as partes de um vídeo com passagens de áudio em branco
Tiling automático no KDE Plasma
SNMP Scan no OCS Inventory só funciona com HTTPS corretamente configurado
Tentativa de instalar Linux em um notebook HP 246 G6 (2)
Uma pergunta bem simples mas não achei resposta (ainda) (1)
O que você está ouvindo agora? [2] (228)









