Ver Mensaje Individual
  #12 (permalink)  
Antiguo 30/05/2012, 03:20
oldesebas
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Cómo evitar que el 'scanf' lea los datos introducidos antes?

Va como un tiro con el flush_stdin() :)

Aquí os dejo el programa completo y perfectamente depurado para quien le pueda interesar:

Código C++:
Ver original
  1. /***********************************************************************************************************************************************
  2.  
  3. PARKING:
  4.  
  5. Realizar un programa para controlar un aparcamiento que dispone de 25 plazas de 2 tamaños: 10 grandes y 15 pequeñas. Las plazas se asignaran
  6. automáticamente cuando entre un vehiculo segun el tamaño:
  7.  
  8. · Cada vehiculo solo ocupara una plaza.
  9. · Un vehiculo pequeño siempre ocupara una plaza pequeña salvo que estén todas ocupadas y haya plazas grandes libres.
  10. · Un vehiculo grande solo podrá aparcar en una plaza grande.
  11. · Cuando entre un vehiculo ocupara siempre la plaza de número menor de todas las libres.
  12.  
  13. El programa tendrá tres opciones básicas:
  14.  
  15. · Entrada: es necesario indicar el tamaño del coche.
  16. · Salida: es necesario indicar la plaza que deja libre.
  17. · Situación del aparcamiento: indicando las plazas libres y las ocupadas.
  18.  
  19. ***********************************************************************************************************************************************/
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23.  
  24. /* Vectores que indicarán la situación de cada aparcamiento */
  25.  
  26. typedef bool Tipo_Vector_ParkingP[15];
  27. typedef bool Tipo_Vector_ParkingG[10];
  28. Tipo_Vector_ParkingP Vector_ParkingP = {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
  29. Tipo_Vector_ParkingG Vector_ParkingG = {false, false, false, false, false, false, false, false, false, false};
  30.  
  31. /* Función para limpiar el BUFFER */
  32.  
  33. void flush_stdin(){
  34.  
  35.    int ch;
  36.    while( (ch = getchar()) != '\n' && ch != EOF );
  37.  
  38. }
  39.  
  40. /* Subprograma que se encarga de imprimir las plazas pequeñas del parking una a una, vacias o llenas, según la situación del vector 'Vector_ParkingP' */
  41.  
  42. void imprimir_plazaP(){
  43.  
  44.     for(int k = 1; k <= 15; k++){
  45.  
  46.         if (Vector_ParkingP[k]){
  47.             printf("xx|");
  48.         } else {
  49.             printf("  |");
  50.         }
  51.     }
  52. }
  53.  
  54. /* Subprograma que se encarga de imprimir las plazas grandes del parking una a una, vacias o llenas, según la situación del vector 'Vector_ParkingG' */
  55.  
  56. void imprimir_plazaG(){
  57.  
  58.     for(int k = 1; k <= 10; k++){
  59.  
  60.         if (Vector_ParkingG[k]){
  61.             printf("xxx|");
  62.         } else {
  63.             printf("   |");
  64.         }
  65.     }
  66. }
  67.  
  68. /* Subprograma que imprime la gráfica del parking indicando su situación */
  69.  
  70. void imprimir_parking(){
  71.  
  72.     printf("   _01_02_03_04_05_06_07_08_09_10_11_12_13_14_15_\n");
  73.     printf("P >|");
  74.     imprimir_plazaP();
  75.     printf("\n   |");
  76.     imprimir_plazaP();
  77.     printf("\n   |                                            |\n");
  78.     printf("   |- - - - - - - - - - - - - - - - - - - -     |\n");
  79.     printf("   |                                            |\n");
  80.     printf("   |");
  81.     imprimir_plazaG();
  82.     printf("    |\nG >|");
  83.     imprimir_plazaG();
  84.     printf("in/ |\n   |___|___|___|___|___|___|___|___|___|___| out|\n");
  85.     printf("    01  02  03  04  05  06  07  08  09  10 |    |\n");
  86.  
  87. }
  88.  
  89. /* Subprograma que gestiona las entradas de vehiculos. */
  90.  
  91. void entrar_vehiculo(){
  92.  
  93.     char tecla = ' ';
  94.  
  95.     while (tecla != 'P' && tecla != 'G'){
  96.  
  97.         printf("\nIndique si el vehiculo es grande 'G' o pequeño 'P': ");
  98.  
  99.         scanf("%c", &tecla);
  100.         flush_stdin();
  101.         tecla = toupper (tecla);
  102.  
  103.         if(tecla != 'P' && tecla != 'G'){
  104.             printf("\nCOMANDO INCORRECTO\n");
  105.         }
  106.     }
  107.  
  108.     if (tecla == 'P'){
  109.  
  110.         for(int k = 1; k <= 15; k++){
  111.  
  112.             tecla = 'G';
  113.  
  114.             if (!Vector_ParkingP[k]){
  115.                 Vector_ParkingP[k] = true;
  116.                 tecla = ' ';
  117.                 k = 16;
  118.             }
  119.         }
  120.     }
  121.  
  122.     if (tecla == 'G'){
  123.  
  124.         for(int k = 1; k <= 10; k++){
  125.  
  126.             if (!Vector_ParkingG[k]){
  127.                 Vector_ParkingG[k] = true;
  128.                 k = 11;
  129.                 tecla = ' ';
  130.             }
  131.         }
  132.     }
  133.  
  134.     if (tecla != ' '){
  135.  
  136.         printf("\n\nParking lleno, no pueden entrar más vehiculos:\n\n");
  137.  
  138.     } else {
  139.  
  140.         printf("\n\nEl vehiculo ha ocupado su plaza:\n\n");
  141.         tecla = ' ';
  142.     }
  143.  
  144.     imprimir_parking();
  145. }
  146.  
  147. /* Subprograma que gestiona las salidas de vehiculos. */
  148.  
  149. void salir_vehiculo(){
  150.  
  151.     int plaza = 0;
  152.     char teclo = ' ';
  153.  
  154.     while (teclo != 'P' && teclo != 'G'){
  155.  
  156.         printf("\nIndique la zona (G/P)): ");
  157.  
  158.         scanf("%c", &teclo);
  159.         flush_stdin();
  160.         teclo = toupper (teclo);
  161.  
  162.         if(teclo != 'P' && teclo != 'G'){
  163.             printf("\nCOMANDO INCORRECTO\n");
  164.         }
  165.  
  166.         if (teclo == 'P'){
  167.  
  168.             printf("\nIndique la plaza (1-15)): ");
  169.  
  170.             scanf("%d", &plaza);
  171.             flush_stdin();
  172.  
  173.             if (Vector_ParkingP[plaza]){
  174.                 Vector_ParkingP[plaza] = false;
  175.                 printf("\n\nEl vehiculo ha abandonado la plaza:\n\n");
  176.  
  177.             } else {
  178.                 printf("\n\nERROR: No hay vehiculo en esa plaza:\n\n");
  179.             }
  180.         }
  181.  
  182.         if (teclo == 'G'){
  183.  
  184.             printf("\nIndique la plaza (1-10)): ");
  185.  
  186.             scanf("%d", &plaza);
  187.             flush_stdin();
  188.  
  189.             if (Vector_ParkingG[plaza]){
  190.                 Vector_ParkingG[plaza] = false;
  191.                 printf("\n\nEl vehiculo ha abandonado la plaza:\n\n");
  192.  
  193.  
  194.             } else {
  195.                 printf("\n\nERROR: No hay vehiculo en esa plaza:\n\n");
  196.             }
  197.         }
  198.     }
  199.     teclo = ' ';
  200.     imprimir_parking();
  201. }
  202.  
  203. /* Programa principal. */
  204.  
  205. int main (){
  206.  
  207.     char accion = ' ';
  208.  
  209.     do{
  210.  
  211.         printf("\nIndique acción a realizar (Si entra vehiculo pulse 'E', si sale vehiculo pulse 'S', si desea observar el estado del parking pulse 'O', si desea finalizar el programa pulse 'F'): ");
  212.         scanf("%c", &accion);
  213.         flush_stdin();
  214.         accion = toupper (accion);
  215.  
  216.         switch (accion) {
  217.  
  218.             case 'E':
  219.             entrar_vehiculo();
  220.             break;
  221.  
  222.             case 'S':
  223.             salir_vehiculo();
  224.             break;
  225.  
  226.             case 'O':
  227.             printf("\n\n");
  228.             imprimir_parking();
  229.             break;
  230.  
  231.             default:
  232.             printf("\nCOMANDO INCORRECTO\n");
  233.         }
  234.  
  235.     } while (accion != 'F');
  236.  
  237.     return 0;
  238. }

Gracias a todos por vuestra ayuda ;)