Created
May 31, 2011 01:28
-
-
Save guilherme/999733 to your computer and use it in GitHub Desktop.
parser de calculadora simples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
int main() { | |
// inicializacao das variavieis | |
char string[100]; | |
char numero_char[6]; | |
int numero = 0; | |
int i = 0; // utilizado para andar pela string digitada pelo usuario | |
int j = 0; // utilizado para andar pelo numero capturado dentro da string | |
int soma = 0; | |
int sinal = 1; | |
scanf("%s",string); // funcao para capturar a string digitada pelo usuario | |
// contando numero de operandos | |
int num_operandos = 0; | |
int cadeia_invalida = 0; | |
// validacao da cadeia | |
// cadeia invalida | |
// se for 0 eh porque a cadeia eh valida | |
// se for 1 eh porque a cadeia eh invalida pois tem operandos consecutivos | |
// se for 2 eh porque a cadeia eh invalida pois tem caracteres nao numericos ou nao sao operadores validos(*,/) | |
for(i = 0; string[i] != 0 && cadeia_invalida == 0; i++) { | |
if(string[i] == '+' || string[i] == '-') { | |
if(string[i+1] == '+' || string[i+1] == '-') { | |
cadeia_invalida = 1; | |
} else { | |
num_operandos++; | |
} | |
} else { | |
if(string[i] < '0' || string[i] > '9') { | |
cadeia_invalida = 2; | |
} | |
} | |
} | |
if(cadeia_invalida == 1) { | |
printf("A cadeia e invalida pois contem dois operandos consecutivos\n"); | |
} else if(cadeia_invalida == 2) { | |
printf("A cadeia e invalida pois contem caracteres que nao sao numeros ou operador invalidos\n"); | |
} else if(num_operandos > 5) { | |
printf("O numero de operandos e maior do que 5\n"); | |
} else { | |
// aqui passou no teste se a cadeia eh valida e comeca-se a fazer a somas ou subtracoes | |
i = 0; | |
while(string[i] != '\0') { | |
// este loop joga o conteudo antes de um operador(+ ou -) para um char chamado numero_char | |
// este char sera convertido em numero logo apos ter sido lido por inteiro. | |
for(j = 0;string[i] != '+' && string[i] != '-' && string[i] != '\0';i++,j++) { | |
numero_char[j] = string[i]; | |
} | |
numero_char[j] = '\0'; // isto daqui eh para caracterizar o fim do numero_char como uma string. (Regra: toda string tem um '\0' no final) | |
numero = atoi(numero_char); // esta funcao aqui eh para converter string em tipo inteiro | |
numero_char[0] = '\0'; // isto daqui eh para zerar o conteudo do char, dado que '\0' significa fim da string. | |
soma += sinal*numero; // aqui faz uma soma de acordo com o ultimo operador capturado. | |
// verificacao do sinal do operador | |
// se o sinal for + entao deve-se multiplicar o proximo numero por 1 antes de somar. | |
// se o sinal for - entao deve-se multiplicar o numero por -1 antes de somar( subtracao eh a mesma coisa que somar um numero negativo) | |
if(string[i] == '+') { | |
sinal = 1; | |
i++; | |
} else if(string[i] == '-') { | |
sinal = -1; | |
i++; | |
} | |
} | |
// TADA! Mostra o resultado | |
printf("O resultado da operacao eh: %d\n",soma); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment