Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 22 Enero 2014, 22:05 pm



Título: Reserva de asientos en un cine
Publicado por: sora_ori en 22 Enero 2014, 22:05 pm
Hola compañeros,

Estoy haciendo un programa en C que me haga con una matriz los asientos de un cine, y me ha surgido un problema tonto. Cuando asigno un asiento reservado y muestro por pantalla me aparece así:

(http://i43.tinypic.com/28vq7o4.png)

Yo escogí reservar fila 3 y columa 3 y me reserva los anteriores, es decir, donde he marcado en rojo debería estar en "0".

Código
  1.                      printf("\nEscribe la fila: ");
  2.                      scanf("%d", &fila);
  3.                      printf("\nEscribe la columna: ");
  4.                      scanf("%d", &columna);
  5.  
  6.                      for (i=0; i<fila; i++) {
  7.                          for (j=0; j<columna; j++) {;}
  8.                          if (mat[i][j] != 1){    
  9.                             mat[i][j] = 1;
  10.                          }
  11.                          else printf("Asiento ocupado");
  12.                      }
  13.  



Gracias!


Título: Re: Reserva de asientos en un cine
Publicado por: engel lex en 22 Enero 2014, 22:12 pm
Decidiste reservas fila 3 Y columna 3 o decifiste reservar el asiento que cumpla ambas condiciones?


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 22 Enero 2014, 22:13 pm
Solamente el asiento, como se ve en la imagen, el color verde es el correcto, el color rojo es lo que sobra.


Saludos


Título: Re: Reserva de asientos en un cine
Publicado por: ivancea96 en 22 Enero 2014, 22:28 pm
Tal como está, yo quitaría los 2 for, y lo dejaría:

Código
  1. if (mat[i][j] != 1){  
  2.      mat[i][j] = 1;
  3. }
  4. else printf("Asiento ocupado");


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 22 Enero 2014, 22:47 pm
@ivancea96

De esa forma no me funciona. Si no recorro la matriz no se puede hacer nada.


Título: Re: Reserva de asientos en un cine
Publicado por: dato000 en 22 Enero 2014, 23:19 pm
Puede ser que el scanf este guardando en el buffer de memoria el salto de linea lo que provoca esos errores.

Intenta con:
Código
  1. printf("\nEscribe la fila: ");
  2. scanf("%d%c", &fila);  //Para cuando presiones Enter
  3. printf("\nEscribe la columna: ");
  4. scanf("%d%c", &columna);  //Para cuando presiones Enter
  5.  
  6. for (i=0; i<fila; i++) {
  7.      for (j=0; j<columna; j++) {;}  // WAAAAAAT???
  8.             if (mat[i][j] != 1){    
  9.                      mat[i][j] = 1;
  10.             }
  11.             else printf("Asiento ocupado");
  12. }



Título: Re: Reserva de asientos en un cine
Publicado por: rir3760 en 23 Enero 2014, 03:10 am
Estoy haciendo un programa en C que me haga con una matriz los asientos de un cine, y me ha surgido un problema tonto. Cuando asigno un asiento reservado y muestro por pantalla me aparece así:
(http://i43.tinypic.com/28vq7o4.png)
El problema se debe a que por alguna extraña razón estas utilizando un bucle:
Código
  1. printf("\nEscribe la fila: ");
  2. scanf("%d", &fila);
  3.  
  4. printf("\nEscribe la columna: ");
  5. scanf("%d", &columna);
  6.  
  7. for (i = 0; i < fila; i++){
  8.   for (j = 0; j < columna; j++){
  9.      ; /* Este es el cuerpo del bucle */
  10.   }
  11.   /* El valor final de "j" es "columna" */
  12.  
  13.   if (mat[i][j] != 1){ /* Si mat[i][columna] != 1 ... */
  14.      mat[i][j] = 1;
  15.   }else
  16.      printf("Asiento ocupado");
  17. }

Basta con eliminar el bucle, quedando así:
Código
  1. puts("Escribe la fila:");
  2. scanf("%d", &fila);
  3.  
  4. puts("Escribe la columna:");
  5. scanf("%d", &columna);
  6.  
  7. if (mat[fila][columna] != 1)
  8.   mat[i][j] = 1;
  9. else
  10.   puts("Asiento ocupado");

Un saludo


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 23 Enero 2014, 13:23 pm
Gracias "dato000" y "rir3760" por la ayuda, hice las sugerencias de ambos y me sigue printando igual (en el caso de "dato000") y en el caso de "rir3760" me lo deja todo en 0.


Saludos


Título: Re: Reserva de asientos en un cine
Publicado por: ivancea96 en 23 Enero 2014, 14:56 pm
Código
  1. if (mat[fila][columna] != 1)
  2.   mat[fila][columna] = 1;
  3. else
  4.   puts("Asiento ocupado");

Si con eso que hemos dicho, sin los bucles, no te va, es que ha de haber algo mal en el código.


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 23 Enero 2014, 15:33 pm
Posteo todo el code haber si así me podeis ayudar a encontrar el error.

Gracias!


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(){
  6.    srand(time(NULL));
  7.    int opcion, i, j, fila, columna;
  8.    int mat[20][15];
  9.  
  10.    while (opcion != 0){
  11.          system("cls");
  12.          printf("1.- Vaciar sala\n");
  13.          printf("2.- Visualizar asientos disponibles\n");
  14.          printf("3.- Reservar asientos\n");
  15.          printf("0.- Salir\n");
  16.          printf("\nEscoge una opcion: ");
  17.          fflush(stdin);
  18.          scanf("%d", &opcion);
  19.  
  20.          switch (opcion){
  21.                 case 1: // Vaciar sala
  22.                      system("cls");
  23.                      for (i=0; i<20; i++) {
  24.                          for (j=0; j<15; j++) {
  25.                              mat[i][j] = 0;
  26.                          }
  27.                      }
  28.                      printf("La sala ha sido vaciada correctamente");
  29.                      getch();
  30.                      break;
  31.  
  32.                 case 2: // Visualizar asientos disponibles
  33.                      system("cls");
  34.                      for (i=0; i<20; i++) {
  35.                          printf("\n");
  36.                          for (j=0; j<15; j++) {
  37.                              printf(" %d ", mat[i][j]);
  38.                          }
  39.                          printf("\n");
  40.                      }
  41.                      getch();
  42.                      break;
  43.  
  44.                 case 3: // Reservar asientos
  45.                      system("cls");
  46.                      printf("\tReserva de asientos");
  47.                      printf("\n------------------------------\n");
  48.                      printf("\nEscribe la fila: ");
  49.                      scanf("%d%c", &fila);
  50.                      printf("\nEscribe la columna: ");
  51.                      scanf("%d%c", &columna);
  52.  
  53.                      for (i=0; i<fila; i++) {
  54.                         for (j=0; j<columna; j++) {;}
  55.                          if (mat[i][j] != 1){    
  56.                             mat[i][j] = 1;
  57.                          }
  58.                          else printf("Asiento ocupado");
  59.                     }
  60.  
  61.                      getch();
  62.                      break;
  63.  
  64.                 case 0:
  65.                      system("cls");
  66.                      printf("Has decidido salir, hasta luego");
  67.                      getch();
  68.                      return 0;
  69.                      break;
  70.  
  71.                 } // Fin switch
  72.    } // Fin while
  73.  
  74.    getch();
  75.    return 0;
  76. }


Título: Re: Reserva de asientos en un cine
Publicado por: ivancea96 en 23 Enero 2014, 15:44 pm
En primer lugar:
Código
  1. while (opcion != 0){

No inicializas la variable opcion. Inicializala a un número diferente de 0, o usa do-while.


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 23 Enero 2014, 15:46 pm
int opcion

Si que la he inicializado, pero el error que tengo en lo de antes no viene de ahí ¿verdad?


Saludos


Título: Re: Reserva de asientos en un cine
Publicado por: dato000 en 23 Enero 2014, 17:34 pm
int opcion

Si que la he inicializado, pero el error que tengo en lo de antes no viene de ahí ¿verdad?


Saludos

Pues habian varios, pero el relacionado con el tema era que usabas un ciclo en el que recorria todos los valores de la sala desde i=0 y j=0 hasta la columna y fila deseada, por lo que mientras recorria todo el arreglo rellenando los valores, ahora, eso seria a modo general pero tu usaste la siguiente sentencia en el ciclo for:

Código
  1. for (i=0; i<fila; i++) {
  2.    for (j=0; j<columna; j++) {;} // aqui recorre cada fila hasta la columna que digita el usuario
  3.                                  // pero no hace nada
  4.        if (mat[i][j] != 1){  //al primer uso, todos los valores son 0, entonces si son diferentes de 1
  5.            mat[i][j] = 1; // con eso llenas todas las columnas, pues esta recorriendo i=0 hasta la fila...      
  6.  
  7.        }
  8.        else printf("Asiento ocupado");
  9. }
  10.  

No necesitas usar un ciclo, si solo una sentencia de validación if para comprobar si es un asiento ocupado o no, eso es todo, ya tienes la columna y la fila que necesitas, el usuario la da, solo es comprobar si ya esta ocupada.

En fin, hay varias cosas, dejo el código, suerte con eso, sigue con el empeño.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define max_columnas 5
  6. #define max_filas    5
  7.  
  8.  
  9. int main()
  10. {
  11.    srand(time(NULL));
  12.    int opcion, i, j, fila, columna;
  13.    int mat[max_columnas][max_filas];
  14.  
  15.    do {
  16.          system("clear");
  17.          printf("1.- Vaciar sala\n");
  18.          printf("2.- Visualizar asientos disponibles\n");
  19.          printf("3.- Reservar asientos\n");
  20.          printf("0.- Salir\n");
  21.  
  22.          printf("\nEscoge una opcion: ");
  23.          //fflush(stdin);
  24.          scanf("%d", &opcion);
  25.  
  26.          switch (opcion){
  27.                 case 1: // Vaciar sala
  28.                      system("clear");
  29.                      for (i=0; i < max_columnas; i++) {
  30.                          for (j=0; j < max_filas; j++) {
  31.                              mat[i][j] = 0;
  32.                          }
  33.                      }
  34.                      printf("La sala ha sido vaciada correctamente");
  35.                      getchar();
  36.                      getchar();
  37.                      break;
  38.  
  39.  
  40.  
  41.                 case 2: // Visualizar asientos disponibles
  42.                      system("clear");
  43.                      for (i=0;  i < max_columnas; i++) {
  44.                          printf("\n");
  45.                          for (j=0; j < max_filas; j++) {
  46.                              printf(" %d ", mat[i][j]);
  47.                          }
  48.                          printf("\n");
  49.                      }
  50.                      getchar();
  51.                      getchar();
  52.                      break;
  53.  
  54.  
  55.  
  56.                 case 3: // Reservar asientos
  57.                      system("clear");
  58.                      printf("\tReserva de asientos");
  59.                      printf("\n------------------------------\n");
  60.  
  61.                      printf("\nEscribe la fila: ");
  62.                      scanf("%d", &fila);
  63.                      printf("\nEscribe la columna: ");
  64.                      scanf("%d", &columna);
  65.  
  66.                      if(mat[fila][columna] == 0)
  67.                      {
  68.                        mat[fila][columna] = 1;
  69.                        printf("Asiento asignado correctamente");
  70.                      }
  71.                      else
  72.                      {
  73.                        printf("Asiento ocupado");
  74.                      }
  75.  
  76.                      getchar();
  77.                      getchar();
  78.                      break;
  79.  
  80.                 case 0:
  81.                      system("clear");
  82.                      printf("Has decidido salir, hasta luego");
  83.                      getchar();
  84.                      return 0;
  85.                      break;
  86.  
  87.                 default:
  88.                      printf("Opcion no encontrada, hubo un error, esto va a explotar ARGH!!!\n\n");
  89.                      getchar();
  90.                      getchar();
  91.                      break;
  92.  
  93.  
  94.  
  95.                 } // Fin switch
  96.  
  97.    } while (opcion != 0); // Fin do-while
  98.  
  99.    getchar();
  100.    return 0;
  101. }
  102.  


Título: Re: Reserva de asientos en un cine
Publicado por: sora_ori en 23 Enero 2014, 17:38 pm
Muchas gracias!

Ahora funciona perfecto, seguiré mejorandolo :P


Saludos