PDA

Ver la versión completa : Duda con ejercicio en C



IEEE
04-05-2008, 20:15
Estimados,

Tengo este ejercicio que no puedo resolver. Supuestamente el programa tiene que tomar 2 numeros y 1 caracter. Si ese caracter es * - / + debe hacer la operacion que corresponde. Funciona entre tyodo bien, pero cuando hago las cuentas de * + / me duplica el resultado (ej: si el resultado es 4 me pone 44). Desde ya muchisimas gracias a quien pueda ayudarme por que me rompo la cabeza copn esto jejeje.
NOTA: en el ejercicio estaba especificado que no se podia usar switch, solo if-else.

MUCHAS GRACIAS!!

#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
int a,b,r;
char c;

printf("Ingrese los numeros a,b: \n");
fflush(stdin);
scanf("%d%d",&a,&b); //nuneros a y b ingresados

printf("Ingrese el caracter: \n");
fflush(stdin);
scanf("%c",&c); //caracter ingresado
if(c=='*' || c=='+' || c=='-' || c=='/') {
if(c=='*') {
r=a*b;
printf("%d",r);
} else
if(c=='+') {
r=a+b;
printf("%d",r);
} else
if(c=='/') {
r=a/b;
printf("%d",r);

} else
r=a-b;
printf("%d",r);

else
printf("Error");

getch();
}

hystd
05-05-2008, 00:10
No se como has podido compilarlo... porque tal y como está escrito ahí, el ultimo else no pertenece a ningun if. Dicho de otro modo, el penultimo else (cuando es la resta "a-b"), deberias encerrarla en un bloque con llaves, ya que si no lo pones, el compilador interpreta que solo pertenece al else la primera instrucción (r=a-b), y siempre, independientemente de la condición ejecutará el printf("%d2, r), es por eso la causa de que imprima dos veces el resultado.

Aquí te dejo la corrección:

#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
int a,b,r;
char c;

printf("Ingrese los numeros a,b: \n");
fflush(stdin);
scanf("%d%d",&a,&b); //nuneros a y b ingresados
printf("Ingrese el caracter: \n");
fflush(stdin);
scanf("%c",&c); //caracter ingresado
if(c=='*' || c=='+' || c=='-' || c=='/') {
if(c=='*') {
r=a*b;
printf("%d",r);
}
else
if(c=='+') {
r=a+b;
printf("%d",r);
}
else
if(c=='/') {
r=a/b;
printf("%d",r);
}
else
{
r=a-b;
printf("%d",r);
}
}else{
printf("Error");
getch();
}
}

Haz la prueba (no he tenido ocasión de comprobarlo), y me cuentas.

Un saludo.

smaug_
05-05-2008, 00:12
lo raro que no te de fallo de compilacion. Te comento, justo en el penultimo else, no has puesto las llaves, porlo que el printf correspondiente a la resta se imprime siempre. Como un apunte mas, yo cambiaria todos esos printf por uno final que imprima el resultado, independientemente de la operacion.
Quedaria algo asi:


#include <stdio.h>
#include <conio.h>
#include <math.h>

void main()
{
int a,b,r;
char c;

printf("Ingrese los numeros a,b: \n");
fflush(stdin);
scanf("%d%d",&a,&b); //nuneros a y b ingresados

printf("Ingrese el caracter: \n");
fflush(stdin);
scanf("%c",&c); //caracter ingresado
if(c=='*' || c=='+' || c=='-' || c=='/') {
// Comprobamos el tipo de operacion y la realizamos
if(c=='*') r=a*b;
else if(c=='+') r=a+b;
else if(c=='/') r=a/b;
else r=a-b;
// Imprimimos una sola vez el resultado
printf("%d",r);
}
else
printf("Error");

getch();
}

j8k6f4v9j
05-05-2008, 00:13
Me he permitido hacerle unos pequeños cambios ;)



#include <stdio.h>
#include <string.h>
// #include <conio.h>
// #include <math.h>
#define EOL '\n'
#define TAM_CAD 50

void lee_cad (char *cadena) {
fgets(cadena,TAM_CAD,stdin);
cadena[(strlen(cadena))-1] = '\0';
}

long lee_int () {
long int i;
char cadena[TAM_CAD],sobra[TAM_CAD];

lee_cad(cadena);
i=strtol(cadena, (char **)sobra, 10);
return i;
}

int lee_char ()
{
int letra ;
int buffer ;

letra = getchar () ;
buffer = letra ;

while ( buffer != EOF && buffer != EOL )
buffer = getchar () ;
return ( ( buffer != EOF ) ? letra : EOF ) ;
}



int main()
{
int n1, n2, a, b, r, c ;
int basura ;

printf("Ingrese los numeros a,b: \n");
a = lee_int() ;
b = lee_int() ;
//nuneros a y b ingresados

printf("Ingrese el caracter: \n");
c = lee_char() ;

switch (c) {
case '*' :
r=a*b;
break ;
case '+' :
r=a+b;
break ;
case '/' :
r=a/b;
break ;
case '-' :
r=a-b;
break ;
default :
break;
printf("Error\n");
return 1 ;
}
printf("Resultado: %i\n",r);
getchar();
return 0 ;
}




Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

hystd
05-05-2008, 00:18
que tiemblen los programadores que llega j8 pegando fuerte!!! xD

hystd
05-05-2008, 00:25
NOTICIA: "j8 vs CRC" en la detección de errores... (nuevas caracterísitcas: "corrección de errores"). El nuevo algoritmo, llamado j8, convierte un 2-PDU en un 3-SDU libre de errores, añadiendo unas cabeceras PCI muy sofisticadas xD

Saludos

j8k6f4v9j
05-05-2008, 00:33
juas xD

No seas cruel xD

Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

smaug_
05-05-2008, 01:13
jajajja, como se nota la experiencia del programador. Aunque se te ha olvidado una pega, no se puede hacer con switch :P

j8k6f4v9j
05-05-2008, 01:25
jajajja, como se nota la experiencia del programador.
es verdad, a hystd se le nota experiencia ;)


Aunque se te ha olvidado una pega, no se puede hacer con switch :P
¿por qué??

Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

smaug_
05-05-2008, 01:40
...el resultado (ej: si el resultado es 4 me pone 44). Desde ya muchisimas gracias a quien pueda ayudarme por que me rompo la cabeza copn esto jejeje.
NOTA: en el ejercicio estaba especificado que no se podia usar switch, solo if-else.



}
Por eso :P Aunque la diferencia es minima.

hystd
05-05-2008, 01:49
[...]Aunque la diferencia es minima.

Pues no recuerdo en qué documento de Microsoft decia que un switch-case era menos eficiente que una secuencia de if's... yo pienso que depende del compilador, no obstante creo que era para Visual Studio, todo es cuestion de desensamblar y ver qué instrucciones en ensamblador genera el compilador para ambos casos y para un compilador en concreto... desconozco si gcc y Visual Studio generan las mismas instrucciones x86, para un mismo programa. Habrá que hacer las pruebas...

Un saludo

j8k6f4v9j
05-05-2008, 01:49
Aaaaaahhhhhhh ese pequeño detalle xD

Salu2



http://img359.imageshack.us/img359/6631/celliigy4.pngKeep on Rollin' :mad:

smaug_
05-05-2008, 02:00
Pues no recuerdo en qué documento de Microsoft decia que un switch-case era menos eficiente que una secuencia de if's... yo pienso que depende del compilador, no obstante creo que era para Visual Studio, todo es cuestion de desensamblar y ver qué instrucciones en ensamblador genera el compilador para ambos casos y para un compilador en concreto... desconozco si gcc y Visual Studio generan las mismas instrucciones x86, para un mismo programa. Habrá que hacer las pruebas...

Un saludo

Por ahi lei que en php, tambien es mas eficiente usar la secuencia de ifs, que un switch.