Y vuelvo a actualizar jajaja, ya me puse a investigar y encontré un truco que limpia el buffer y pues lo use para que elimine cualquier carácter ingresado y deje intactas las variables con el valor que les preestableci en la declaración. leonsansan crees que lo haya hecho bien? El código quedo asi:
Si todavia tienen mas consejos, por favor no duden en decirmelos jaja. Gracias.
Código (c) [Seleccionar]
/* Este programa sirve para practicar sumas, restas, multiplicaciones y divisiones */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* Prototipos de funciones */
float generarNumero( int nivelDificultad );
float operacion( float numero1, float numero2, int operacionElegida );
void respuestaCorrecta( void );
void respuestaIncorrecta( void );
void impresionTipoDeOperacion( int tipoDeOperacion );
/* Inicia la ejecucion del programa */
int main()
{
int i, correcta, nivel, operando, operando2;
float num1, num2, resultado, intento;
correcta = 0;
/* Estas declaraciones nos serviran para que si el usuario ingresa un caracter en vez de una letra, se falle la prueba de validacion.
La variable intento esta declarada a ese valor por que hay veces que los resultados de las funciones dan 0 y puede haber un error de logica en
el programa */
operando = 0;
nivel = 0;
intento = -2000000;
srand( time( NULL ) ); /* Modificacion de la semilla de los numeros pseudoaleatorios */
printf( "Bienvenido al sistema de aprendizaje asistido por computadora, se te preguntaran\n" );
printf( "10 operaciones y luego se te mencionara si necesitas ayuda tutorial.\n" );
printf( "Por favor ingresa el nivel que quieres practicar ( 1 al 3 )..." );
do
{
scanf( "%d", &nivel );
while ( getchar() != '\n' ); /* Esta instruccion sirve para eliminar todos los caracteres que se ingresen. Esto dejara la variable
nivel intacta con su valor original "0" y fallara la prueba de validacion */
if ( nivel < 1 || nivel > 3 )
printf( "Nivel no valido, intenta otravez..." );
} while ( nivel < 1 || nivel > 3 );
printf( "Que tipo de operaciones quiere resolver:\n" );
printf( "1. Sumas\n2. Restas\n3. Multiplicaciones\n4. Divisiones\n" );
printf( "5. Operaciones Aleatorias\n" );
printf( "Recuerda que no es obligatorio hacer las operaciones mentalmente, puedes\n" );
printf( "apoyarte de lapiz y papel para realizarlas. ATENCION! No se permite el\n" );
printf( "uso de calculadora.\n..." );
do
{
scanf( "%d", &operando );
while ( getchar() != '\n' ); /* Esta instruccion sirve para eliminar todos los caracteres que se ingresen. Esto dejara la variable
operando intacta con su valor original "0" y fallara la prueba de validacion */
if ( operando < 1 || operando > 5 )
printf( "Opcion no valida, intenta de nuevo..." );
} while ( operando < 1 || operando > 5 );
operando2 = operando; /* Esta variable guarda el valor de operando, esto es para tener intacta nuestra variable y modificar la copia */
for ( i = 1; i <= 10; i++ )
{
/* Llamamos a las funciones generadoras de numeros aleatorios */
num1 = generarNumero( nivel );
num2 = generarNumero( nivel );
if ( operando == 5 ) /* Y por este motivo es por el que debemos mantener intacta nuestra variable operando */
operando2 = 1 + rand() % 4; /* Genera una operacion aleatoria */
resultado = operacion( num1, num2, operando2 ); /* Llamamos a la funcion que resuelve la operacion elegida ( o generada ) */
printf( "Cuanto es %.0f ", num1 );
impresionTipoDeOperacion( operando2 );
printf( " %.0f?...", num2 );
do
{
scanf( "%f", &intento );
while ( getchar() != '\n' ); /* Funcion de esta instruccion ya explicada arriba */
if ( intento != resultado )
{
respuestaIncorrecta(); /* Llamada a la funcion que genera los mensajes aleatorios cuando se responde incorrectamente */
correcta--; /* Se decrementa en uno cada vez que se ingresa una respuesta correcta */
}
} while ( intento != resultado );
/* Cuando se ingresa la respuesta correcta, se llama a a funcion que genera el mensaje aleatorio y se incrementa correcta */
respuestaCorrecta();
correcta++;
} /* Fin de for */
if ( correcta < 7 ) /* Si hubo mas de 3 respuestas incorrectas, se imprime este mensaje */
printf( "Cometiste varios errores, por favor pide ayuda adicional a tu profesor. Hasta la proxima!\n" );
return 0;
} /* Fin de main */
/* Definicion de funciones */
float generarNumero( int nivelDificultad )
{
switch ( nivelDificultad ) /* Para generar numeros de 1, 2 y 3 digitos en los niveles 1, 2 y 3 respectivamente */
{
case 1:
return 1 + rand() % 9;
break;
case 2:
return 10 + rand() % 90;
break;
case 3:
return 100 + rand() % 900;
break;
} /* Fin de switch */
} /* Fin de funcion generaNumero */
float operacion( float numero1, float numero2, int operacionElegida )
{
switch ( operacionElegida ) /* Para la resolucion de nuestra operacion, esto es para compararlo posteriormente con la respuesta del user*/
{
case 1:
return numero1 + numero2;
break;
case 2:
return numero1 - numero2;
break;
case 3:
return numero1 * numero2;
break;
case 4:
return numero1 / numero2;
break;
} /* Fin de switch */
} /* Fin de funcion operacion */
void respuestaCorrecta( void )
{
switch ( 1 + rand() % 4 )
{
case 1:
printf( "Muy bien!!\n" );
break;
case 2:
printf( "Excelente!!\n" );
break;
case 3:
printf( "Manten ese buen rendimiento!!\n" );
break;
case 4:
printf( "Buen trabajo!!\n" );
break;
} /* Fin de switch */
} /* Fin de funcion respuestaCorrecta */
void respuestaIncorrecta( void )
{
switch ( 1 + rand() % 4 )
{
case 1:
printf( "No. Por favor intenta de nuevo...\n" );
break;
case 2:
printf( "Incorrecto. Trata una vez mas\n" );
break;
case 3:
printf( "No te rindas!!\n" );
break;
case 4:
printf( "No. Sigue intentando\n" );
break;
} /* Fin de switch */
} /* Fin de funcion respuestaIncorrecta */
void impresionTipoDeOperacion( int tipoDeOperacion )
{
switch ( tipoDeOperacion )
{
case 1:
printf( "mas" );
break;
case 2:
printf( "menos" );
break;
case 3:
printf( "por" );
break;
case 4:
printf( "entre" );
break;
} /* Fin de switch */
} /* Fin de funcion impresionTipoDeOperacion */
Si todavia tienen mas consejos, por favor no duden en decirmelos jaja. Gracias.