Skip to content

Instantly share code, notes, and snippets.

@guilherme
Created May 31, 2011 01:28
Show Gist options
  • Save guilherme/999733 to your computer and use it in GitHub Desktop.
Save guilherme/999733 to your computer and use it in GitHub Desktop.
parser de calculadora simples
#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