// USO DE APUNTADORES, CADENAS, VECTORES
/*
DADA UNA OPERACION COMO CADENA DE TEXTO
(1) SE REALICE LA OPERACION Y MUESTRE EL RESULTADO
(a) # + # ó #+#
(b) # - # ó #-#
(2) O BIEN OPERE CON SUB CADENAS DE LA CADENA DE ENTRADA
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int EsMas(char Letra) { return Letra=='+'; }
int EsMenos(char Letra) { return Letra=='-'; }
int EsEspacio(char Letra) { return Letra==' '; }
int EsOperador(char Letra)
{ return EsMas(Letra) || EsMenos(Letra); }
void leenumero(char *N, char *CAD)
{
char *Num = malloc(10);
char *A = malloc(10);
strcpy(A, CAD);
strcpy(Num, "");
//A= "23 + 56"
while( A[0] ) // se ejecuta hasta encontra el '3'
{
if ( isdigit(A[0]) ) sprintf(Num, "%s%c", Num, A[0]); // Num= "23"
if ( EsOperador(A[0]) || EsEspacio(A[0]) )
{ if ( EsEspacio(A[0]) ) A++; break; }
A++;
}
strcpy(CAD,A);
strcpy(N,Num);
}
int leeOperador(char *CAD)
{
char Opr;
char *A = malloc(10);
strcpy(A, CAD);
while( A[0] )
{
if ( EsOperador(A[0]) ) { Opr = A[0]; A++; break; }
A++;
}
strcpy(CAD, A);
return Opr;
}
int operacion(int n1, char opr, int n2)
{
switch (opr)
{
case '+': return n1+n2; break;
case '-': return n1-n2; break;
}
}
void parser(char *A)
{
char *num1,*num2, Opr;
num1 = malloc(10); num2=malloc(10);
leenumero(num1, A);
Opr = leeOperador(A);
printf("Num1= %s\n", num1);
printf("Opr = %c\n", Opr);
printf("A= %s\n", A);
strcpy(num2, A);
printf("Num2= %i\n", atoi(num2));
printf("%s %c %s = %i\n", num1, Opr, num2, operacion(atoi(num1), Opr, atoi(num2)));
}
int main(int a, char **A) { if ( a==2 ) parser(A[1]); else printf("debe ser un argumento ...\n"); }