Prioridad y asociatividad de los operadores en C. (Programa propio)

Iniciado por NOB2014, 6 Abril 2014, 21:16 PM

0 Miembros y 1 Visitante están viendo este tema.

Eternal Idol

Cita de: NOB2014 en  8 Abril 2014, 20:36 PM
Hola a todos.-
Leo, espero que no me hayas mal interpretado, lo mío era tan solo una sugerencia y te tomé como  referencia porqué fue una idea del momento, lo que decís Eternal es muy cierto pero a alguien como Uds. que hacen una tarea tan loable e impagable disponiendo tanto tiempo al servicio de los demás sin más no creo que se les cruce por la cabeza el hecho  de mentir, no por lo menos en este ámbito.-      

Saludos.
Daniel


No, seguro, pero los mismos usuarios pueden editar sus mensajes, por cierto ahora que lo veo no hay una opcion de mensaje o me confundi con otro foro o no existe, de ser lo ultimo te invito a que hagas la sugerencia en el subforo correspondiente, es buena.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

NOB2014

Hola a todos.
rir3760, espero me puedas explicar lo de la foto, no puedo encontrar la teoría suficiente y me parece de suma importancia aprender este trozo de sintaxis.-



Saludos.
Daniel   
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

#12
Cita de: NOB2014 en  9 Abril 2014, 16:55 PM
Hola a todos.
rir3760, espero me puedas explicar lo de la foto, no puedo encontrar la teoría suficiente y me parece de suma importancia aprender este trozo de sintaxis.-

...........................................


No soy rir pero intentaré hacerlo lo mejor posible. ;)

La ini del final del sprintf indica desde que posición se van a incorporar los caracteres a la variable aux, mientras que (int) (fin - ini +1) da el total de caracteres que, a partir de la posición mencionada por ini, se añaden a aux.

Por ejemplo, para tener la salida:



Citar
9 - 2

usaría:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int main(void){
 char *s = "3 * 5 + (9 - 2) + 5",aux[10]={'\0'};
 char *ini,*fin;
 if ((ini = strchr(s, '(')) && (fin = strchr(ini, ')')))
   sprintf(aux,"\n%.*s\n", (int) (fin - (ini +1)), ini+1);
 printf("%s",aux);
 return 0;
}


¡¡¡¡ Saluditos! ..... !!!!







NOB2014

Hola a todos.-
Leo, en primer lugar agradecerte por la explicación, de esa manera lo entendí perfectamente.-
Lo que me trae ahora es: cómo puedo hacer  para que la variable op se comporte como la macro  MAS algo como.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAS +

int main(void){
char *cadena = "3 * 5 + (9 - 2) + 5", auxiliar[100]={'\0'}, aux[10][10], *inicio=NULL, *final=NULL, op;
int i=0, longitud=0, j=0, resultado=0, k=0;

if ((inicio = strchr(cadena, '(')) && (final = strchr(inicio, ')'))){
longitud = sprintf(auxiliar,"%.*s", (int) (final - (inicio +1)), inicio+1);
for(; i<longitud; i++){
if (auxiliar[i]!=' '){
auxiliar[j] = auxiliar[i];
j++;
}
}
auxiliar[j] = '\0';

}

i=0;
for (j=0,k=0;auxiliar[j];j++){
if (isdigit(auxiliar[j])){
aux[k][i]=auxiliar[j];
i++;
}
if (!isdigit(auxiliar[j])){
op=auxiliar[j];
aux[k][i]='\0';
i=0,k++;
}
}
aux[k][i]='\0';

switch(op){
case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
break;
case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
break;
case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
break;
case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
break;
case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
break;
}
printf("\n resultado = %d", resultado);

i = k = -5;
i = i MAS k;
printf("\n resultado = %d", i);

printf("\n\n");
return 0;
}


resultado = atoi(aux[0]) MAS atoi(aux[1]);   

Espero que Uds. tengan alguna manera porque practiqué y busque en google y no puedo hallar la solución.-


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan


Te funciona sin problemas:

Código (cpp) [Seleccionar]
i = k = -5;
i = i MAS k;


seria:-5+(-5)=-10  O.K


En tu código y con macros sería:

Código (cpp) [Seleccionar]
case'+':resultado = atoi(aux[0]) MAS atoi(aux[1]);
  break;
case'-':resultado = atoi(aux[0]) MENOS atoi(aux[1]);
................................................


¡¡¡¡ Saluditos! ..... !!!!




NOB2014

Hola a todos.
Leo no me interpretaste correctamente, lo que quiero hacer es reemplazar esta parte de tú código:

switch(op){
case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
break;
case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
break;
case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
break;
case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
break;
case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
break;
}


Por algo como lo que pongo a continuación, voy a poner un ejemplo sólo como referencia (por supuesto no es la correcta).-

int operador[]={+,-,*,/,%};
Y llamarlo desde op

Espero que haya quedado más claro.-

Saludos y un abrazo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: NOB2014 en 11 Abril 2014, 15:57 PMlo que quiero hacer es reemplazar esta parte de tú código:

switch(op){
case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
break;
case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
break;
case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
break;
case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
break;
case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
break;
}


Por algo como lo que pongo a continuación, voy a poner un ejemplo sólo como referencia (por supuesto no es la correcta).-

int operador[]={+,-,*,/,%};
Y llamarlo desde op
Si entiendo correctamente lo que buscas es una función similar a eval de javascript para evaluar una expresión almacenada en una cadena.

En C no existe tal función, debes implementarla de forma manual con una sentencia por cada operador como vienes haciendo y para el caso puedes revisar los temas sobre evaluación de expresiones sencillas (hay varios temas relacionados en la base de datos de los foros, solo es cuestión de utilizar el motor de búsqueda).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language