Dev - C++ - Socorro...No veo el error..!!

   
Vista:

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 06/12/2014 18:18:43
Hola chicos, soy nuevo por aquí...vereir, he escrito un programa de prueba para pasar Fahrenheit a Celsius y al revés...pero me da un error que no consigo arreglar....por favor, alguien me puede ayudar...??....Muchas gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
int main (){
 
	float temperatura, resultado;
	char x;
 
	printf ("Teclea F si quieres Fahrenheit o teclea C si quieres Celsius\n\n");
	scanf ("%c",&x);
 
	if (x != 'F' || x != 'C'){
		printf ("Error, no has seleccionado ni F ni C (en mayusculas)\n\n");
	}
	else {
		if (x == 'F'){
	printf ("Introduce una temperatura en Celsius y te la dare en Fahrenheit\n\n");
	scanf ("%f", &temperatura);
	}
	else{
	printf ("Introduce una temperatura en Fahrenheit y te la dare en Celsius\n\n");
	scanf ("%f", &temperatura);
	}
 
 
	if (x == 'F'){
		resultado = (temperatura*9)/5+32;
		printf("La temperatura introducida son %0.2f Fahrenheit\n\n", resultado);
	}
	else if(x == 'C'){
		resultado = (temperatura-32)*(0.555);
		printf("La temperatura introducida son %0.2f Celsius\n\n", resultado);
	}
	else {
 
	}
 
	}
 
	system("pause");
	return 0;
 }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Socorro...No veo el error..!!

Publicado por vangodp (287 intervenciones) el 06/12/2014 19:59:10
bueno.. te voy explicar lo primero que vi. luego intentas apañar el resto XDD

esto: if (x != 'F' || x != 'C')

que cres que va pasar si x es 'F'.

eso: x != 'F' || x != 'C' es equivalente a: si x es diferente de la letra 'F' o x es diferente de la letra 'C'. Pero como dije si x es 'F' , x es diferente de 'C' y si x es 'C' es deiferente de 'F'. preguntas en todo caso si x es diferente de una o de otra y es obvio que va ser diferente de una o de otra ya que asumimos que nunca x va tomar 2 valores XDD

o x es 'F' y es diferente de 'C' o x es 'C' y es diferente de 'F'

use switch que va como anillo al dedo para esas cosas XD

char x;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
printf ( "Teclea F si quieres Fahrenheit o teclea C si quieres Celsius\n\n" );
    scanf ( "%c%*c", &x );
 
    switch (x) {
        case 'F':
            //poner aqui codigo para F
            break;
        case 'C':
            //poner aqui codigo para F
            break;
        default:
            //Si no has elejido F o C vienes a parar aqui. Mostrar un mensaje
            break;
    }
Espero haber sido de ayuda XD

Lo mismo se puede hacer con if, else, if else. ya que por lo general tanto if como switch brindan la misma funcionalidad.
Ademas siempre puedes imprimir un resultado para saber que es lo que da mal. si a tu if (x != 'F' || x != 'C') le imprime asi printf ("%d", (x != 'F' || x != 'C') ); veras lo que te dice y por que te metes en ese if primario segun cambie el valor a x.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 06/12/2014 23:55:30
Anda pues claro...!!!....me he pasado media mañana y media tarde....y no lo veia...!!...bueno pues muchisimas gracias por ayudarme tan rapido y tan desinteresadamente....Gracias..!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 08/12/2014 11:21:19
Hola vangodp,...!! es que ahora estoy atascado en un bucle while, no se porqué repite dos veces lo que está dentro del while y no hace caso a scanf...es un programilla para ir probando cosas, pero no doy resuelto esto...Muchas gracias y disculpas por molestar con algo tan "tonto"...pero me trae de cabeza porque es mucha mi ignorancia..!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main (){
 
	char x;
 
	printf ("Introduce R o S para seguir\n\n");
	scanf ("%c", &x);
 
	while (x != 'R' && x != 'S'){
 
		printf ("La letra introducida no fue R ni S\n");
		scanf ("%c", &x);
	}
 
	switch (x){
		case 'R': printf ("Lunes\n\n"); break;
		case 'S': printf ("Martes\n\n"); break;
		}
 
	system ("pause");
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 08/12/2014 12:47:11
Hola, lo he arreglado así, pero no se porqué funciona....si alguien se anima a explicarme.....Gracias..!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main (){
 
	char x;
 
	printf ("Introduce R o S para seguir\n\n");
	scanf ("%c", &x);
 
	while (x != 'R' && x != 'S'){
		scanf ("%c", &x);
		printf ("La letra introducida no fue R ni S\n");
		scanf ("%c", &x);
	}
 
	switch (x){
		case 'R': printf ("Lunes\n\n"); break;
		case 'S': printf ("Martes\n\n"); break;
		}
 
	system ("pause");
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Socorro...No veo el error..!!

Publicado por vangodp (287 intervenciones) el 08/12/2014 23:12:29
justo has logrado hacer funcionar como pones en el seguiente ejemplo por que pones que c guarde el enter antes de hacer la lectura dentro de while. Es lioso el tema. te explico paso a paso.

char x; //El char XD
printf ("Introduce R o S para seguir\n\n"); //pedimos el char
scanf ("%c", &x); //Aqui nos trolea al elejir una letra y pulsar enter...2 por el precio de una. la primera letra se mete en el x pero enter sigue en el buffer.
while (x != 'R' && x != 'S'){ //si logramos pasar por aqui
scanf ("%c", &x); //la segunda letra sustituye la primera
printf ("La letra introducida no fue R ni S\n"); //aqui pedimos nueva letra.
scanf ("%c", &x); } // si no tuviera el scanf anterior la segunda se meteria aqui y saltaria hasta el seguiente scanf que es cuando el buffer estaria libre, pero entonces elijirias otra letra y pulsarias enter nuevamente y eso nunca dejaria de dar problemas.
switch (x){
case 'R': printf ("Lunes\n\n"); break;
case 'S': printf ("Martes\n\n"); break;
}

Solucion...
http://codepad.org/pjELo4bE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
int main () {
    char x;
    printf ( "Introduce R o S para seguir\n\n" );
    scanf ( "%c%*c", &x );
 
    while ( x != 'R' && x != 'S' ) {
        //scanf ( "%c", &x ); Al poner %*c ya no necesitamos esto por que enter no estara en el buffer
        printf ( "La letra introducida no fue R ni S\n" );
        scanf ( "%c%*c", &x ); //aqui hacemos lo mismo... Ponemos el %*c
    }
 
    switch ( x ) {
        case 'R': printf ( "Lunes\n\n" ); break;
 
        case 'S': printf ( "Martes\n\n" ); break;
    }
    system ( "pause" );
 
    return 0;
}
La mejor solucion para vaciar el buffer es esta de lejos: http://codepad.org/Vj7m1Wkv
Pero existe muchas formas de hacerlo. te aconsejo que busques por internet para saber mas sobre el buffer de entrada y salida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Socorro...No veo el error..!!

Publicado por vangodp (287 intervenciones) el 08/12/2014 22:35:55
El problema se debe al leer multiples chars seguidos. Recuerde que al pulsar enter, enter a la vez que tambien es un caracter, sirve para dar la orden digamos, para "soltar" la la letra hacia la variable.
A ver si me explico mejor. Cuando escribes algo en el teclado como bien puede ser una letra 'z' y pulsas enter, en el buffer queda algo asi "z\n" luego tienes 2 chars para leer. la z va en el primer y la "jodia" \n (enter) deberia ir a la 2ª y no se que hace exactamente pero es ella la que te fastidia.
Bien..Lo que importa es la solucion. Una pasa por limpiar el buffer y otra pasa por evitar que \n(enter) vaya a parar en el buffer.
Una cosa que es bien facil y te puede ayudar es hacer el scanf asi: scanf ("%c%*c", &x); . Eso quiere decir que esperas un char con el especificador %c y rechazas el enter con el especificador %*c o sea le una letra y ignora la segunda.
Busque en google como limpiar el buffer y encontraras el grial. Ese erro se dar al leer cadenas y caracteres.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 09/12/2014 00:02:47
Si señor que buena explicacion..!!, he comprendido la filosofia del asunto...Mañana me pongo las pilas con lo del buffer. De nuevo muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 15/12/2014 17:08:58
Hola..!! escribo porque ahora tengo otro problemilla...estoy haciendo un programa al que le metas un numero del 0 al 9 y te devuelva la tabla de multiplicar. El problema lo tengo en que si introduces un número menor a 0 ó superior a 9, el programa te debe avisar de que el número no es correcto, y tienes cuatro intentos para introducir un número de 0-9, sino el programa se cerrará....Si lo hago utilizando el depurador, supuestamente funciona, pero si ejecuto sin más, la cosa no va...Ayuda por favor....que estoy loqueando....Muchas gracias.

#include<stdio.h>


int main (){

int x,y;
int contador, contador_1;

printf ("Introduce un numero del 0 al 9 y te mostrare su tabla de multiplicar\n\n");
scanf ("%i", &x);

contador_1 = 0;

while (x < 0 || x > 9){
if(contador_1 < 3){
printf ("El numero introducido no es correcto\n");
printf ("Introduce un numero entre 0 y 9\n");
scanf ("%i", &x);
contador_1++;
}
else{
printf ("Has agotado los tres intentos\n");
system ("pause");
return 0;
}
}



contador = 1;
printf ("Los resultados de la tabla del %i son:\n",x);
while(contador < 11){
y = x * contador;
printf ("%i\n",y);
contador++;

}

system ("pause");
return 0;

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Thanatos (72 intervenciones) el 16/12/2014 14:39:25
Tu programa funciona, sólo le faltaba el header stdlib.h para evitar una advertencia del compilador. No le hice muchas modificaciones, sólo agregué unos detalles en la salida del programa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
 
    int x, y;
    int contador;
 
    printf ("Introduce un numero del 0 al 9 y te mostrare su tabla de multiplicar\nnumero = ");
    scanf ("%i", &x);
 
    contador = 0;
    while (x < 0 || x > 9) {
        if(contador < 3) {
            printf ("\nEl numero introducido no es correcto\n");
            printf ("Introduce un numero entre 0 y 9\nnumero = ");
            scanf ("%i", &x);
            contador++;
        } else {
            printf ("\nHas agotado los cuatro intentos\n\n");
            system ("pause");
            return 0;
        }
    }
 
    printf ("\nLos resultados de la tabla del %i son:\n", x);
    contador = 1;
    while (contador < 11) {
        y = x * contador;
        printf ("%i x %2i = %2i\n", x, contador, y);
        contador++;
    }
    printf ("\n");
    system ("pause");
 
    return 0;
}

Saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 16/12/2014 18:18:48
Hola Thanatos..!!...muchisimas gracias por contestar...!!...lo que propones funciona de maravilla...no entiendo porqué tengo que añadir la librería stdlib.h y tampoco consigo ver para qué sirve el 2 en %2i en :
printf ("%i x %2i = %2i\n", x, contador, y);

Gracias de nuevo por ayudarme..!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Jasantonio (11 intervenciones) el 16/12/2014 19:01:15
si fuese %0.2f entiendo que es para darle dos decimales, pero al ser un entero...no sé.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Socorro...No veo el error..!!

Publicado por Thanatos (72 intervenciones) el 18/12/2014 01:02:08
Hola!

Cuando utilizas elementos de las librerías de C/C++ en tus programas, debes verificar que estén incluidos los headers en los que están declarados dichos elementos. Por ejemplo, cuando tu código hace uso de las funciones printf() o scanf(), se incluye el header stdio.h. Por el mismo motivo, al incluir la función system() en tu código, se debe incluir el header stdlib.h:

1
system ("pause");

Si al compilar no se mostró la advertencia que mencioné en mi anterior respuesta, seguramente se debe al comando que está utilizando tu editor o IDE al momento de usar el compilador.
Los mensajes de advertencia del compilador son más estrictos, dependiendo de los argumentos (flags), que se le pasen. Por ejemplo, si compilo el código de mi anterior respuesta, guardado en el fichero: tablas.c, sin incluir el header stdlib.h y sin incluir flags para provocar advertencias adicionales, de esta manera:

gcc tablas.c -o tablas

No se producen errores, ni advertencias.

Pero si compilo el código utilizando un par de flags adicionales, por ejemplo:

gcc -Wall -Wextra tablas.c -o tablas

El compilador mostrará advertencias para las líneas en las que aparece la función system():

warning

warnign2

Cuando estamos dando los primeros pasos en la programación, generalmente nos molesta ver las advertencias y los errores que lanza el compilador, pero con el tiempo, cuando los programas se hacen más complejos, esas advertencias son una parte imprescindible para lograr que funcionen correctamente. Te dejo un pequeño ejemplo, respecto a la librería stdlib.h, en el que se aprecia mejor la ayuda que nos proporcionan esas advertencias adicionales:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
//include <stdlib.h>
 
int main (void) {
    int entero = atoi("1");
    double real = atof("2");
 
    fprintf (stdout, "entero = %d\nreal   = %g\n", entero, real);
 
    return 0;
}

La función atoi() convierte la cadena argumento a un número entero (int).
La función atof() convierte la cadena argumento a un número de punto flotante de tipo double.
La función fprintf(), utilizada de la manera que se ve en el ejemplo, realiza una operación similar a printf(), debido a que el primer argumento (stdout) especifica que la salida se enviará a la salida estándar, en este caso a la consola del sistema.
El especificador de formato %g, sirve para evitar que la salida contenga ceros innecesarios, luego del punto decimal. Puedes comprobar la diferencia sustituyendo este especificador por %f.

La salida que se espera del programa es:
1
2
entero = 1
real   = 2

stoi() y atof() forman parte de la librería stdlib.h. Si compilas el programa sin incluir #include <stdlib.h>, como en el ejemplo, donde esa línea está comentada, obtendrás un resultado diferente al indicado. Si quitas el comentario de esa linea y vuelves a compilar, el programa funcionará como se espera.

Sin los flags adicionales, el compilador no lanzaría la advertencia y continuaríamos obteniendo resultados extraños sin tener idea del motivo, y sin ayuda para detectar la línea que causa el error. Si estás usando un IDE como Visual Studio Express, Code::Blocks, Dev-C++, etc. puedes configurarlo para modificar el comportamiento del compilador.


En cuanto al 2 que aparece en los especificadores de formato del programa:

1
printf ("%i x %2i = %2i\n", x, contador, y);

Lo utilicé para alinear la salida de las tablas de multiplicar. Como el mayor número que aparecerá en las tablas es de dos cifras, utilicé el 2 para especificar el ancho reservado para cada cifra correspondiende a las variables contador y y. No lo utilicé para la variable x, porque esa variable sólo tomará valores del 0 al 9, es decir, valores de sólo una cifra.

Sin el 2, la salida queda así:

uno

Con el 2, los números con valores del 1 al 10, siempre utilizan dos espacios, sin importar si son de una o dos cifras, esto hace que la cifra de las unidades de cada número esté alineada en esa columna. Lo mismo sucede con la columna de los resultados:

dos

Saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Socorro...No veo el error..!!

Publicado por A (11 intervenciones) el 18/12/2014 12:54:30
OK..!!...Muchas gracias...creo que ya voy enlazando varias cosas...bueno, poco a poco. De nuevo muchas gracias..!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar