elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa de Educacion Asistida por Computadora en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Programa de Educacion Asistida por Computadora en C.  (Leído 6,796 veces)
oblivionxor

Desconectado Desconectado

Mensajes: 19


No hay mayor fracaso que apresurar el exito


Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #10 en: 12 Febrero 2013, 05:58 am »

Muchas gracias a todos por sus consejos! dato000 pondré en practica lo de poner signos al principio de los comentarios de funcionamiento y de estructura! leosansan respecto a lo que dices crees que de esta manera sea correcto validar la entrada? :
Código
  1.  
  2.    do
  3.    {
  4.            scanf( "%d", &operando );
  5.  
  6.            if ( operando != 1 && operando != 2 && operando != 3 && operando != 4 && operando != 5 )
  7.                  printf( "Opcion no valida, intenta de nuevo..." );
  8.  
  9.    } while ( operando != 1 && operando != 2 && operando != 3 && operando != 4 && operando != 5 );
  10.  

O hay otra forma? Todavia no llego al tema de arreglos ni punteros, soy super principiante pero solo me gustaria saber si hay otra forma de hacer la validacion sin usar los temas que no he visto?


« Última modificación: 12 Febrero 2013, 06:21 am por oblivionxor » En línea

oblivionxor

Desconectado Desconectado

Mensajes: 19


No hay mayor fracaso que apresurar el exito


Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #11 en: 12 Febrero 2013, 06:22 am »

Actualizo, no funciono mi metodo :\


En línea

oblivionxor

Desconectado Desconectado

Mensajes: 19


No hay mayor fracaso que apresurar el exito


Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #12 en: 12 Febrero 2013, 07:29 am »

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:
Código
  1. /* Este programa sirve para practicar sumas, restas, multiplicaciones y divisiones */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. /* Prototipos de funciones */
  7. float generarNumero( int nivelDificultad );
  8. float operacion( float numero1, float numero2, int operacionElegida );
  9. void respuestaCorrecta( void );
  10. void respuestaIncorrecta( void );
  11. void impresionTipoDeOperacion( int tipoDeOperacion );
  12.  
  13. /* Inicia la ejecucion del programa */
  14. int main()
  15. {
  16. int i, correcta, nivel, operando, operando2;
  17. float num1, num2, resultado, intento;
  18. correcta = 0;
  19. /* Estas declaraciones nos serviran para que si el usuario ingresa un caracter en vez de una letra, se falle la prueba de validacion.
  20. 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
  21. el programa */
  22. operando = 0;
  23. nivel = 0;
  24. intento = -2000000;
  25.  
  26. srand( time( NULL ) ); /* Modificacion de la semilla de los numeros pseudoaleatorios */
  27.  
  28. printf( "Bienvenido al sistema de aprendizaje asistido por computadora, se te preguntaran\n" );
  29. printf( "10 operaciones y luego se te mencionara si necesitas ayuda tutorial.\n" );
  30.  
  31. printf( "Por favor ingresa el nivel que quieres practicar ( 1 al 3 )..." );
  32.  
  33. do
  34. {
  35. scanf( "%d", &nivel );
  36. while ( getchar() != '\n' ); /* Esta instruccion sirve para eliminar todos los caracteres que se ingresen. Esto dejara la variable
  37. nivel intacta con su valor original "0" y fallara la prueba de validacion */
  38.  
  39. if ( nivel < 1 || nivel > 3 )
  40. printf( "Nivel no valido, intenta otravez..." );
  41.  
  42. } while ( nivel < 1 || nivel > 3 );
  43.  
  44. printf( "Que tipo de operaciones quiere resolver:\n" );
  45. printf( "1. Sumas\n2. Restas\n3. Multiplicaciones\n4. Divisiones\n" );
  46. printf( "5. Operaciones Aleatorias\n" );
  47. printf( "Recuerda que no es obligatorio hacer las operaciones mentalmente, puedes\n" );
  48. printf( "apoyarte de lapiz y papel para realizarlas. ATENCION! No se permite el\n" );
  49. printf( "uso de calculadora.\n..." );
  50.  
  51. do
  52. {
  53. scanf( "%d", &operando );
  54. while ( getchar() != '\n' ); /* Esta instruccion sirve para eliminar todos los caracteres que se ingresen. Esto dejara la variable
  55. operando intacta con su valor original "0" y fallara la prueba de validacion */
  56.  
  57. if ( operando < 1 || operando > 5 )
  58. printf( "Opcion no valida, intenta de nuevo..." );
  59.  
  60. } while ( operando < 1 || operando > 5 );
  61.  
  62. operando2 = operando; /* Esta variable guarda el valor de operando, esto es para tener intacta nuestra variable y modificar la copia */
  63.  
  64. for ( i = 1; i <= 10; i++ )
  65. {
  66. /* Llamamos a las funciones generadoras de numeros aleatorios */
  67. num1 = generarNumero( nivel );
  68. num2 = generarNumero( nivel );
  69.  
  70. if ( operando == 5 ) /* Y por este motivo es por el que debemos mantener intacta nuestra variable operando */
  71. operando2 = 1 + rand() % 4; /* Genera una operacion aleatoria */
  72.  
  73. resultado = operacion( num1, num2, operando2 ); /* Llamamos a la funcion que resuelve la operacion elegida ( o generada ) */
  74.  
  75. printf( "Cuanto es %.0f ", num1 );
  76. impresionTipoDeOperacion( operando2 );
  77. printf( " %.0f?...", num2 );
  78.  
  79. do
  80. {
  81. scanf( "%f", &intento );
  82. while ( getchar() != '\n' ); /* Funcion de esta instruccion ya explicada arriba */
  83.  
  84. if ( intento != resultado )
  85. {
  86. respuestaIncorrecta(); /* Llamada a la funcion que genera los mensajes aleatorios cuando se responde incorrectamente */
  87. correcta--; /* Se decrementa en uno cada vez que se ingresa una respuesta correcta */
  88. }
  89. } while ( intento != resultado );
  90.  
  91. /* Cuando se ingresa la respuesta correcta, se llama a a funcion que genera el mensaje aleatorio y se incrementa correcta */
  92. respuestaCorrecta();
  93. correcta++;
  94.  
  95. } /* Fin de for */
  96.  
  97. if ( correcta < 7 ) /* Si hubo mas de 3 respuestas incorrectas, se imprime este mensaje */
  98. printf( "Cometiste varios errores, por favor pide ayuda adicional a tu profesor. Hasta la proxima!\n" );
  99.  
  100. return 0;
  101. } /* Fin de main */
  102.  
  103. /* Definicion de funciones */
  104. float generarNumero( int nivelDificultad )
  105. {
  106. switch ( nivelDificultad ) /* Para generar numeros de 1, 2 y 3 digitos en los niveles 1, 2 y 3 respectivamente */
  107. {
  108. case 1:
  109. return 1 + rand() % 9;
  110. break;
  111.  
  112. case 2:
  113. return 10 + rand() % 90;
  114. break;
  115.  
  116. case 3:
  117. return 100 + rand() % 900;
  118. break;
  119. } /* Fin de switch */
  120. } /* Fin de funcion generaNumero */
  121.  
  122. float operacion( float numero1, float numero2, int operacionElegida )
  123. {
  124. switch ( operacionElegida ) /* Para la resolucion de nuestra operacion, esto es para compararlo posteriormente con la respuesta del user*/
  125. {
  126. case 1:
  127. return numero1 + numero2;
  128. break;
  129.  
  130. case 2:
  131. return numero1 - numero2;
  132. break;
  133.  
  134. case 3:
  135. return numero1 * numero2;
  136. break;
  137.  
  138. case 4:
  139. return numero1 / numero2;
  140. break;
  141. } /* Fin de switch */
  142. } /* Fin de funcion operacion */
  143.  
  144. void respuestaCorrecta( void )
  145. {
  146. switch ( 1 + rand() % 4 )
  147. {
  148. case 1:
  149. printf( "Muy bien!!\n" );
  150. break;
  151.  
  152. case 2:
  153. printf( "Excelente!!\n" );
  154. break;
  155.  
  156. case 3:
  157. printf( "Manten ese buen rendimiento!!\n" );
  158. break;
  159.  
  160. case 4:
  161. printf( "Buen trabajo!!\n" );
  162. break;
  163. } /* Fin de switch */
  164. } /* Fin de funcion respuestaCorrecta */
  165.  
  166. void respuestaIncorrecta( void )
  167. {
  168. switch ( 1 + rand() % 4 )
  169. {
  170. case 1:
  171. printf( "No. Por favor intenta de nuevo...\n" );
  172. break;
  173.  
  174. case 2:
  175. printf( "Incorrecto. Trata una vez mas\n" );
  176. break;
  177.  
  178. case 3:
  179. printf( "No te rindas!!\n" );
  180. break;
  181.  
  182. case 4:
  183. printf( "No. Sigue intentando\n" );
  184. break;
  185. } /* Fin de switch */
  186. } /* Fin de funcion respuestaIncorrecta */
  187.  
  188. void impresionTipoDeOperacion( int tipoDeOperacion )
  189. {
  190. switch ( tipoDeOperacion )
  191. {
  192. case 1:
  193. printf( "mas" );
  194. break;
  195.  
  196. case 2:
  197. printf( "menos" );
  198. break;
  199.  
  200. case 3:
  201. printf( "por" );
  202. break;
  203.  
  204. case 4:
  205. printf( "entre" );
  206. break;
  207. } /* Fin de switch */
  208. } /* Fin de funcion impresionTipoDeOperacion */

Si todavia tienen mas consejos, por favor no duden en decirmelos jaja. Gracias.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #13 en: 12 Febrero 2013, 18:05 pm »

Hice un programa anteriormente (distinto a este) y me hicieron la recomendación de no comentar tanto el código por que se veia muy adornado y pues puse en practica ese consejo, esta comentado pero solo lo necesario.
Un buen consejo. En mi opinión deberías eliminar todos los comentarios del tipo "fin de esto" ya que son las llaves las que indican el termino de un bloque. Si tienes problemas para detectar el inicio/fin de un bloque o función es mejor optar por un editor de texto para programadores con la característica de resaltado (por ejemplo los basados en Scintilla).

Bueno yo le cambiaría el diseño de las llaves [...] Siguiendo las normativas de estilo las pondría abajo:
Código
  1.  
  2. do
  3. {
  4.         scanf( "%d", &operando );
  5.  
  6.         if ( operando < 1 || operando > 5 )
  7.         {
  8.              printf( "Opcion no valida, intenta de nuevo..." );
  9.         }
  10. } while ( operando < 1 || operando > 5 );
La ventaja que tiene es que puede ver mejor a que corresponde cada llave cerrada, ya que se encuentran al mismo nivel.
Hay varios estilos y algunos de estos se pueden revisar en la pagina de la aplicación astyle), lo importante no es buscar cual es el mejor (no hay respuesta, es subjetivo) sino utilizar uno de forma consistente.

----

En cuanto al programa la única forma 100% a prueba de fallos para la lectura de un numero es mediante funciones como strtol, strtoul y strtod. Se puede utilizar la familia scanf pero con sus limitantes. Con esta ultima se debe verificar primero su valor de retorno (numero de conversiones realizadas con éxito) y, si aplica, que el numero este en el rango valido. Un programa de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void)
  5. {
  6.   int opcion;
  7.   int ok;
  8.   int ch;
  9.  
  10.   while (1){
  11.      printf("Indica la opcion: ");
  12.      fflush(stdout);
  13.      ok = scanf("%d", &opcion) == 1 && opcion > 0 && opcion < 6;
  14.  
  15.      while ((ch = getchar()) != EOF && ch != '\n')
  16.         ;
  17.  
  18.      if (ok)
  19.         break;
  20.      else
  21.         puts("Opcion no valida, intenta de nuevo...");
  22.   }
  23.   printf("La opcion es la %d\n", opcion);
  24.  
  25.   return EXIT_SUCCESS;
  26. }

La función "generarNumero" se puede reducir utilizando la función pow (prototipo en <math.h>):
Código
  1. #include <math.h>
  2.  
  3. /* ... */
  4.  
  5. float generarNumero(int nivel)
  6. {
  7.   int a = pow(10.0, nivel - 1.0);
  8.  
  9.   return a + rand() % (9 * a);
  10. }

Y las funciones que seleccionan e imprimen una cadena al azar o indicando su posición se pueden reducir utilizando arrays:
Código
  1. void respuestaCorrecta(void)
  2. {
  3.   char *resp[] = {
  4.      "Muy bien!!",
  5.      "Excelente!!",
  6.      "Manten ese buen rendimiento!!",
  7.      "Buen trabajo!!"
  8.   };
  9.  
  10.   puts(resp[rand() % 4]);
  11. }
  12.  
  13. void impresionTipoDeOperacion(int num_op)
  14. {
  15.   char *op[] = {
  16.      "mas",
  17.      "menos",
  18.      "por",
  19.      "entre"
  20.   };
  21.  
  22.   printf("%s", op[num_op - 1]);
  23. }

Un saludo
En línea

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
capsulasinformaticas

Desconectado Desconectado

Mensajes: 15



Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #14 en: 13 Febrero 2013, 03:46 am »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void)
  5. {
  6.   int opcion;
  7.   int ok;
  8.   int ch;
  9.  
  10.   while (1){
  11.      printf("Indica la opcion: ");
  12.      fflush(stdout);
  13.      ok = scanf("%d", &opcion) == 1 && opcion > 0 && opcion < 6;
  14.  
  15.      while ((ch = getchar()) != EOF && ch != '\n')
  16.         ;
  17.  
  18.      if (ok)
  19.         break;
  20.      else
  21.         puts("Opcion no valida, intenta de nuevo...");
  22.   }
  23.   printf("La opcion es la %d\n", opcion);
  24.  
  25.   return EXIT_SUCCESS;
  26. }

Me da lata extender mas el tema e irnos por las ramas, pero tengo una duda, ¿Siempre que quiera mostrar un printf sin que finalize con un '\n' seria conveniente usar un fflush(stdout)?

Y otra cosa que no entendi es el uso de
Código:
while ((ch = getchar()) != EOF && ch != '\n')
         ;
en ese codigo, es decir, probe el codigo sin esa parte y como que el bucle hace un loop infinito y no me puedo ingresar la opcion con scanf("%d", &opcion) si ingreso una opcion invalida, pero no se por que pasa.

Saludos.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #15 en: 13 Febrero 2013, 11:18 am »

Me da lata extender mas el tema e irnos por las ramas, pero tengo una duda, ¿Siempre que quiera mostrar un printf sin que finalize con un '\n' seria conveniente usar un fflush(stdout)?
En realidad, el buffer se vacía automáticamente al usar un \n. Por lo que no sería necesario

Y otra cosa que no entendi es el uso de
Código:
while ((ch = getchar()) != EOF && ch != '\n')
         ;
en ese codigo, es decir, probe el codigo sin esa parte y como que el bucle hace un loop infinito y no me puedo ingresar la opcion con scanf("%d", &opcion) si ingreso una opcion invalida, pero no se por que pasa.

Saludos.

Es una forma para limpiar el buffer de teclado (mientras no se llegue al salto de línea o al máximo buffer disponible...).

Por cierto muy elegante el código, me gusta (aunque sigo insistiendo que la llave del while estaría mejor abajo).
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Programa de Educacion Asistida por Computadora en C.
« Respuesta #16 en: 13 Febrero 2013, 18:52 pm »

¿Siempre que quiera mostrar un printf sin que finalize con un '\n' seria conveniente usar un fflush(stdout)?
Si, es necesario.

En el caso de los bufers relacionados con streams de salida estos se vacían en tres escenarios, cuando:

A) Se llena, vaciado automático.
B) La secuencia de caracteres es seguida por el caracter '\n'.
C) Se indica de forma explicita mediante la llamada fflush(stream).

En nuestro caso la opción A no vale porque no se tiene control de este, la segunda tampoco porque la cadena no termina con el mentado carácter, la única opción es la restante.

Si ello no se hace el funcionamiento del programa puede resultar confuso ya que puede este esperar una entrada y solo después enviar el mensaje al stream de salida (por ejemplo instrucciones de uso).

Y otra cosa que no entendi es el uso de
Código:
while ((ch = getchar()) != EOF && ch != '\n')
         ;
en ese codigo, es decir, probe el codigo sin esa parte y como que el bucle hace un loop infinito y no me puedo ingresar la opcion con scanf("%d", &opcion) si ingreso una opcion invalida, pero no se por que pasa.
Porque la función scanf solo consume los caracteres que sean validos para la conversión en turno. Si el carácter a procesar no cumple se queda en la entrada estándar.

Dos ejemplos para explicarlo mejor (con la mentada llamada a scanf):

A) La entrada contiene los caracteres:
Código:
' ', ' ', ' ', '1', '2', '3', '\n'
Aquí los caracteres de espacio blanco se descartan, '1', '2' y '3' se utilizan para obtener el entero 123. Como el '\n' no es valido para la conversión (valor de tipo signed int) este se queda en el bufer de la entrada estándar.

B) La entrada contiene:
Código:
'J', '\n'
Aquí la función revisa el bufer encontrando el carácter 'J', como este no es valido se queda en el bufer y la función termina de inmediato. En la siguiente iteracion sucede lo mismo y ello ocasiona el bucle infinito que mencionas.

Para evitarlo se descarta el resto de la linea mediante el bucle.

Un saludo
En línea

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
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Educación
Sugerencias y dudas sobre el Foro
‭lipman 5 2,528 Último mensaje 22 Diciembre 2006, 21:13 pm
por
No puedo ejecutar ningun programa en mi Computadora
Seguridad
sakuracards87 2 7,730 Último mensaje 28 Marzo 2012, 16:36 pm
por ro_djm
Con que programa o técnica puedo sacara a los intrusos de mi computadora?
Seguridad
ba_ca 2 2,673 Último mensaje 22 Abril 2012, 17:18 pm
por ba_ca
La educacion prohibida.
Foro Libre
0xDani 3 2,428 Último mensaje 12 Diciembre 2012, 15:14 pm
por Stakewinner00
En mi computadora funciona el programa, en otras no...
Programación C/C++
Trollwer 1 2,330 Último mensaje 2 Diciembre 2020, 18:26 pm
por ThunderCls
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines