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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. 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.
12  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. en: 12 Febrero 2013, 06:22 am
Actualizo, no funciono mi metodo :\
13  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. 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?
14  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. en: 11 Febrero 2013, 20:29 pm
Ok tomare en cuenta tu consejo amchacon! Muchas gracias!
15  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. en: 11 Febrero 2013, 07:10 am
Ok capsulasinformaticas muchas gracias por tu opinion :D
 Respecto a lo de la compilacion, creo que es tu compilador por que a mi me compila sin ningun problema.
16  Programación / Programación C/C++ / Re: Programa de Educacion Asistida por Computadora en C. en: 11 Febrero 2013, 05:35 am
Que tal capsulasinformaticas! ¿Entonces no hay necesidad de modificarle nada respecto a la estructuración de código? ¿Alguna recomendación o algo?
   
17  Programación / Programación C/C++ / Programa de Educacion Asistida por Computadora en C. en: 11 Febrero 2013, 03:50 am
Hola de nuevo, pues ahora hice un programa para practicar las operaciones aritméticas básicas (suma, resta, multiplicación y división). Solamente me gustaría su opinión sobre el mismo, es decir, que les parece la estructura del código. 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. Me gustaría saber en que aspectos podría mejorar mi programa, me refiero a la estructura del código, hago este tipo de preguntas por que quiero aprender a programar limpiamente y hacer que mi código sea fácil de comprender. Agradecimientos por adelantado.

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.  
  20. srand( time( NULL ) ); /* Modificacion de la semilla de los numeros pseudoaleatorios */
  21.  
  22. printf( "Bienvenido al sistema de aprendizaje asistido por computadora, se te preguntaran\n" );
  23. printf( "10 operaciones y luego se te mencionara si necesitas ayuda tutorial.\n" );
  24.  
  25. printf( "Por favor ingresa el nivel que quieres practicar ( 1 al 3 )..." );
  26.  
  27. do {
  28. scanf( "%d", &nivel );
  29.  
  30. if ( nivel < 1 || nivel > 3 ) {
  31. printf( "Nivel no valido, intenta otravez..." );
  32. }
  33. } while ( nivel < 1 || nivel > 3 );
  34.  
  35. printf( "Que tipo de operaciones quiere resolver:\n" );
  36. printf( "1. Sumas\n2. Restas\n3. Multiplicaciones\n4. Divisiones\n" );
  37. printf( "5. Operaciones Aleatorias\n" );
  38. printf( "Recuerda que no es obligatorio hacer las operaciones mentalmente, puedes\n" );
  39. printf( "apoyarte de lapiz y papel para realizarlas. ATENCION! No se permite el\n" );
  40. printf( "uso de calculadora.\n..." );
  41.  
  42. do {
  43. scanf( "%d", &operando );
  44.  
  45. if ( operando < 1 || operando > 5 ) {
  46. printf( "Opcion no valida, intenta de nuevo..." );
  47. }
  48. } while ( operando < 1 || operando > 5 );
  49.  
  50. operando2 = operando; /* Esta variable guarda el valor de operando, esto es para tener intacta nuestra variable y modificar la copia */
  51.  
  52. for ( i = 1; i <= 10; i++ ) {
  53. /* Llamamos a las funciones generadoras de numeros aleatorios */
  54. num1 = generarNumero( nivel );
  55. num2 = generarNumero( nivel );
  56.  
  57. if ( operando == 5 ) { /* Y por este motivo es por el que debemos mantener intacta nuestra variable operando */
  58. operando2 = 1 + rand() % 4; /* Genera una operacion aleatoria */
  59. }
  60.  
  61. resultado = operacion( num1, num2, operando2 ); /* Llamamos a la funcion que resuelve la operacion elegida ( o generada ) */
  62.  
  63. printf( "Cuanto es %.0f ", num1 );
  64. impresionTipoDeOperacion( operando2 );
  65. printf( " %.0f?...", num2 );
  66.  
  67. do {
  68. scanf( "%f", &intento );
  69.  
  70. if ( intento != resultado ) {
  71. respuestaIncorrecta(); /* Llamada a la funcion que genera los mensajes aleatorios cuando se responde incorrectamente */
  72. correcta--; /* Se decrementa en uno cada vez que se ingresa una respuesta correcta */
  73. }
  74. } while ( intento != resultado );
  75.  
  76. /* Cuando se ingresa la respuesta correcta, se llama a a funcion que genera el mensaje aleatorio y se incrementa correcta */
  77. respuestaCorrecta();
  78. correcta++;
  79.  
  80. } /* Fin de for */
  81.  
  82. if ( correcta < 7 ) { /* Si hubo mas de 3 respuestas incorrectas, se imprime este mensaje */
  83. printf( "Cometiste varios errores, por favor pide ayuda adicional a tu profesor. Hasta la proxima!\n" );
  84. }
  85.  
  86. return 0;
  87. } /* Fin de main */
  88.  
  89. /* Definicion de funciones */
  90. float generarNumero( int nivelDificultad )
  91. {
  92. switch ( nivelDificultad ) { /* Para generar numeros de 1, 2 y 3 digitos en los niveles 1, 2 y 3 respectivamente */
  93. case 1:
  94. return 1 + rand() % 9;
  95. break;
  96.  
  97. case 2:
  98. return 10 + rand() % 90;
  99. break;
  100.  
  101. case 3:
  102. return 100 + rand() % 900;
  103. break;
  104. } /* Fin de switch */
  105. } /* Fin de funcion generaNumero */
  106.  
  107. float operacion( float numero1, float numero2, int operacionElegida )
  108. {
  109. switch ( operacionElegida ) { /* Para la resolucion de nuestra operacion, esto es para compararlo posteriormente con la respuesta del
  110. user*/
  111. case 1:
  112. return numero1 + numero2;
  113. break;
  114.  
  115. case 2:
  116. return numero1 - numero2;
  117. break;
  118.  
  119. case 3:
  120. return numero1 * numero2;
  121. break;
  122.  
  123. case 4:
  124. return numero1 / numero2;
  125. break;
  126. }
  127. } /* Fin de funcion operacion */
  128.  
  129. void respuestaCorrecta( void )
  130. {
  131. switch ( 1 + rand() % 4 ) {
  132. case 1:
  133. printf( "Muy bien!!\n" );
  134. break;
  135.  
  136. case 2:
  137. printf( "Excelente!!\n" );
  138. break;
  139.  
  140. case 3:
  141. printf( "Manten ese buen rendimiento!!\n" );
  142. break;
  143.  
  144. case 4:
  145. printf( "Buen trabajo!!\n" );
  146. break;
  147. } /* Fin de switch */
  148. } /* Fin de funcion respuestaCorrecta */
  149.  
  150. void respuestaIncorrecta( void )
  151. {
  152. switch ( 1 + rand() % 4 ) {
  153. case 1:
  154. printf( "No. Por favor intenta de nuevo...\n" );
  155. break;
  156.  
  157. case 2:
  158. printf( "Incorrecto. Trata una vez mas\n" );
  159. break;
  160.  
  161. case 3:
  162. printf( "No te rindas!!\n" );
  163. break;
  164.  
  165. case 4:
  166. printf( "No. Sigue intentando\n" );
  167. break;
  168. } /* Fin de switch */
  169. } /* Fin de funcion respuestaIncorrecta */
  170.  
  171. void impresionTipoDeOperacion( int tipoDeOperacion )
  172. {
  173. switch ( tipoDeOperacion ) {
  174. case 1:
  175. printf( "mas" );
  176. break;
  177.  
  178. case 2:
  179. printf( "menos" );
  180. break;
  181.  
  182. case 3:
  183. printf( "por" );
  184. break;
  185.  
  186. case 4:
  187. printf( "entre" );
  188. break;
  189. }
  190. } /* Fin de funcion impresionTipoDeOperacion */
18  Programación / Programación C/C++ / Re: Muchas gracias! en: 10 Febrero 2013, 05:01 am
BatchianoISpyxolo muchas gracias por tus consejos y la respuesta, en realidad como dices lo unico que queria con este codigo era entender un poco mas la recursividad. Hasta luego!
19  Programación / Programación C/C++ / Optimizacion de codigo en C. en: 10 Febrero 2013, 01:58 am
Hola que tal. Es mi primer tema aqui en la pagina de elhacker.net, y pues solo me gustaria una pequeña ayuda en un programa que elabore. Este programa imprime los factoriales de los numeros del 0 hasta el 10 con sus respectivas llamadas recursivas, es decir imprime las llamadas recursivas que se hacen en cada factorial agregandoles un salto de linea y un nivel de sangrado. El punto es que tengo dudas respecto a la estructura de mi codigo, es decir, quisiera saber si lo elabore con la optimizacion de codigo correcta o si aun se puede optimizar mas. Con optimizacion de codigo me refiero a que si esta correctamente estructurado y en cualquier respuesta, si se puede estructurar mas.

Código
  1. /* Se despliegan los factoriales de los numeros del 0 al 10, se utiliza la recursividad para calcularlos */
  2. #include <stdio.h>
  3.  
  4. /* Prototipo de funcion */
  5. long calculaFactorial( long numero );
  6. void muestraLlamadasRecursivas( long numero );
  7.  
  8. /* Inicia la ejecucion del programa */
  9. int main()
  10. {
  11.  
  12. int i; /* Contador */
  13.  
  14. printf( "\n\n***Este programa imprime los factoriales de los numeros del 0 al 10\n" );
  15. printf( "y sus llamadas recursivas a la funcion que calcula los mismos.\n" );
  16. printf( "Este programa se crea con la finalidad de hacer que sea mas facil\n" );
  17. printf( "entender el tema de recursividad***\n\n" );
  18.  
  19. /* Repite 11 veces; durante cada iteracion calcula el factorial de i y lo despliega en pantalla */
  20. for ( i = 0; i <= 10; i++ )
  21. {
  22. printf( "%d! = %ld\n", i, calculaFactorial( i ) ); /* Imprimimos el valor del factorial */
  23. muestraLlamadasRecursivas( i ); /* Llamamos a la funcion que imprime las llamadas a funcion */
  24. }
  25.  
  26. return 0; /* Terminacion exitosa */
  27.  
  28. } /* Fin de main */
  29.  
  30. /* Definicion recursiva de la funcion factorial */
  31. long calculaFactorial( long numero )
  32. {
  33. /* Caso base */
  34. if ( numero <= 1 ) {
  35. return 1;
  36. } /* Fin de if */
  37. else { /* Paso recursivo o llamada recursiva */
  38. return ( numero * calculaFactorial( numero - 1 ) );
  39. } /* Fin de else */
  40. } /* Fin de la funcion factorial */
  41.  
  42. void muestraLlamadasRecursivas( long numero )
  43. {
  44. static int contadorEspacios = 1; /* es static para que el valor no se destruya entre las llamadas recursivas a funcion */
  45. int contador = contadorEspacios; /* Variable que determinara el numero de espacios a imprimir */
  46.  
  47. for ( contador; contador >= 1; contador-- ) { /* Imprimimos los espacios correspondientes */
  48. printf( " " );
  49. } /* Fin de for */
  50.  
  51. if ( numero <= 1 ) {
  52. printf( "1\n" );
  53. printf( "-------------------\n" );
  54. }
  55. else {
  56. printf( "%ld * factorial( %ld - 1 )\n", numero, numero ); /* Imprimimos la llamada recursiva */
  57. contadorEspacios++; /* Agregamos 1 a la variable de espacios */
  58. muestraLlamadasRecursivas( numero - 1 ); /* Llamamos recursivamente a la funcion */
  59. }
  60.  
  61. contadorEspacios = 1; /* Reestablecemos la variable a 1 para que no se vallan a imprimir los espacios ya calculados en el factorial anterior*/
  62. } /* Fin de funcion muestraLlamadasRecursivas */
  63.  

Enserio agradeceria muchisimo su ayuda.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines