Test Foro de elhacker.net SMF 2.1

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".

                      printf("\nEscribe la fila: ");
                      scanf("%d", &fila);
                      printf("\nEscribe la columna: ");
                      scanf("%d", &columna);
                     
                      for (i=0; i<fila; i++) {
                          for (j=0; j<columna; j++) {;}
                          if (mat[i][j] != 1){   
                             mat[i][j] = 1;
                          }
                          else printf("Asiento ocupado");
                      }




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 (cpp) [Seleccionar]

if (mat[i][j] != 1){   
      mat[i][j] = 1;
}
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:
printf("\nEscribe la fila: ");
scanf("%d%c", &fila);  //Para cuando presiones Enter
printf("\nEscribe la columna: ");
scanf("%d%c", &columna);  //Para cuando presiones Enter

for (i=0; i<fila; i++) {
      for (j=0; j<columna; j++) {;}  // WAAAAAAT???
             if (mat[i][j] != 1){   
                      mat[i][j] = 1;
             }
             else printf("Asiento ocupado");
}


Título: Re: Reserva de asientos en un cine
Publicado por: rir3760 en 23 Enero 2014, 03:10 AM
Cita de: sora_ori en 22 Enero 2014, 22:05 PMEstoy 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:
printf("\nEscribe la fila: ");
scanf("%d", &fila);

printf("\nEscribe la columna: ");
scanf("%d", &columna);

for (i = 0; i < fila; i++){
   for (j = 0; j < columna; j++){
      ; /* Este es el cuerpo del bucle */
   }
   /* El valor final de "j" es "columna" */
   
   if (mat[i][j] != 1){ /* Si mat[i][columna] != 1 ... */
      mat[i][j] = 1;
   }else
      printf("Asiento ocupado");
}


Basta con eliminar el bucle, quedando así:
puts("Escribe la fila:");
scanf("%d", &fila);

puts("Escribe la columna:");
scanf("%d", &columna);

if (mat[fila][columna] != 1)
   mat[i][j] = 1;
else
   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 (cpp) [Seleccionar]
if (mat[fila][columna] != 1)
   mat[fila][columna] = 1;
else
   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!


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    srand(time(NULL));
    int opcion, i, j, fila, columna;
    int mat[20][15];

    while (opcion != 0){
          system("cls");
          printf("1.- Vaciar sala\n");
          printf("2.- Visualizar asientos disponibles\n");
          printf("3.- Reservar asientos\n");
          printf("0.- Salir\n");
          printf("\nEscoge una opcion: ");
          fflush(stdin);
          scanf("%d", &opcion);
         
          switch (opcion){
                 case 1: // Vaciar sala
                      system("cls");
                      for (i=0; i<20; i++) {
                          for (j=0; j<15; j++) {
                              mat[i][j] = 0;
                          }
                      }
                      printf("La sala ha sido vaciada correctamente");
                      getch();
                      break;
                     
                 case 2: // Visualizar asientos disponibles
                      system("cls");
                      for (i=0; i<20; i++) {
                          printf("\n");
                          for (j=0; j<15; j++) {
                              printf(" %d ", mat[i][j]);
                          }
                          printf("\n");
                      }
                      getch();
                      break;

                 case 3: // Reservar asientos
                      system("cls");
                      printf("\tReserva de asientos");
                      printf("\n------------------------------\n");
                      printf("\nEscribe la fila: ");
                      scanf("%d%c", &fila);
                      printf("\nEscribe la columna: ");
                      scanf("%d%c", &columna);
                     
                      for (i=0; i<fila; i++) {
                         for (j=0; j<columna; j++) {;}
                          if (mat[i][j] != 1){   
                             mat[i][j] = 1;
                          }
                          else printf("Asiento ocupado");
                     }
                     
                      getch();
                      break;
                     
                 case 0:
                      system("cls");
                      printf("Has decidido salir, hasta luego");
                      getch();
                      return 0;
                      break;
                 
                 } // Fin switch
    } // Fin while

    getch();
    return 0;
}
Título: Re: Reserva de asientos en un cine
Publicado por: ivancea96 en 23 Enero 2014, 15:44 PM
En primer lugar:
Código (cpp) [Seleccionar]
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
Cita de: 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

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:


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


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.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define max_columnas 5
#define max_filas    5


int main()
{
    srand(time(NULL));
    int opcion, i, j, fila, columna;
    int mat[max_columnas][max_filas];

    do {
          system("clear");
          printf("1.- Vaciar sala\n");
          printf("2.- Visualizar asientos disponibles\n");
          printf("3.- Reservar asientos\n");
          printf("0.- Salir\n");

          printf("\nEscoge una opcion: ");
          //fflush(stdin);
          scanf("%d", &opcion);

          switch (opcion){
                 case 1: // Vaciar sala
                      system("clear");
                      for (i=0; i < max_columnas; i++) {
                          for (j=0; j < max_filas; j++) {
                              mat[i][j] = 0;
                          }
                      }
                      printf("La sala ha sido vaciada correctamente");
                      getchar();
                      getchar();
                      break;



                 case 2: // Visualizar asientos disponibles
                      system("clear");
                      for (i=0;  i < max_columnas; i++) {
                          printf("\n");
                          for (j=0; j < max_filas; j++) {
                              printf(" %d ", mat[i][j]);
                          }
                          printf("\n");
                      }
                      getchar();
                      getchar();
                      break;



                 case 3: // Reservar asientos
                      system("clear");
                      printf("\tReserva de asientos");
                      printf("\n------------------------------\n");

                      printf("\nEscribe la fila: ");
                      scanf("%d", &fila);
                      printf("\nEscribe la columna: ");
                      scanf("%d", &columna);

                      if(mat[fila][columna] == 0)
                      {
                        mat[fila][columna] = 1;
                        printf("Asiento asignado correctamente");
                      }
                      else
                      {
                        printf("Asiento ocupado");
                      }

                      getchar();
                      getchar();
                      break;

                 case 0:
                      system("clear");
                      printf("Has decidido salir, hasta luego");
                      getchar();
                      return 0;
                      break;

                 default:
                      printf("Opcion no encontrada, hubo un error, esto va a explotar ARGH!!!\n\n");
                      getchar();
                      getchar();
                      break;



                 } // Fin switch

    } while (opcion != 0); // Fin do-while

    getchar();
    return 0;
}

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