Array de reserva de vuelos

Disculpe mi ignorancia pero tengo que realizar un algoritmo que me pide según las normas
Número de plazas del avión: 300, plazas fumadores: 1 a 100 y plazas no fumadores: 101 a 300.
Debo reralizar la reserva y cerrarla cuando no hayan plazas libres.
Quisiera saber si en la primera parte del algoritmo voy bien encaminado:
Algoritmo Reserva
Tipo
Tipo array[1...100] de entero: Fumadores
Tipo array[101..300] de entero: NoFumadores
var
Fumadores: F
NoFumadores:NF
Entero: i
Cadena: respuesta
Inicio
Escribir('Reserva para fumador o No fumador')
Leer(respuesta)
 si respuesta = fumador entonces
              desde i = 1 hasta 100 hacer
                  leer(F)
                  si F = 1 entonces
                    F = 0
                    escribir ('Su asiento es:', F]
                  si_no
                    escribir ('No hay Lugar')
                fin_si
               fin_desde
Coloco si es igual a 1 como condición del Si porque:
F = 1 Hay lugar
F = 0 No hay Lugar

1 respuesta

Respuesta
1
Según lo que comentas vas bien encaminado. Solo hay un punto que debes de corregir y es el punto siguiente:
                    si_no
                        Escribir ('No hay Lugar')
Te cuento. Imagina que el siguiente asiento libre de fumadores está en el asiento 99. En ese caso te aparecería 98 mensajes por pantalla del tipo 'No hay Lugar'
Lo que yo haría es definir una varaible de tipo booleana, por ejemplo bEncontradoSitio. La inicializas a False después de leer la respuesta para fumador o no fumador. Si encuentras el asiento haces
                    F = 0
                    escribir ('Su asiento es:', F]
                    bEncontradoSitio = True
después del fin_desde lo que haría es
Si No bEncontradoSitio entonces
  escribir ('No hay Lugar')
fin_si
Es decir, si hemos recorrido todo el array de no fumadores y no hay sitio libre la variable bEncontradoSitio valdrá False por lo que mostrará el mensaje de que no hay sitio. Mientras que si lo ha encontrado mostrará el número de asiento y acabará.
Otro consejo que te hago es que utilices un único array para los asientos, ya que entre otras cosas cuando muestras el número de asiento para no fumadores no muestras el número de asiento del avión sino la posición del vector de no fumadores por lo que el valor dado no será correcto, ¿Lo entiendes?
Antes que nada quiero expresar mi agradecimiento por haberme dado un poco de su valioso tiempo y por la pedagogía expresada para explicarme.
Creo haber comprendido de no ser así mi algoritmo reflejara lo contrario, lo expongo para ver si voy bien en su desarrollo:
Algoritmo Reserva
Tipo Array[1...300] de entero: Avión
var
Avión: A
boolean: sitioencontrado
Entero: i
Cadena: respuesta
Inicio
sitioencontrado = falso
Escribir('Reserva para fumador o para no fumador')
Leer(respuesta)
 si respuesta = fumador entonces
  desde i = 1 hasta 100 hacer
                    leer(A)
                 si A = 1 entonces
                           A = 0
                       escribir('Su asiento es:', A)
                        sitioencontrado = verdadero
                 si_no
                        escribir('No hay lugar')
                        fin_si
                fin_desde
De nuevo agradezco su tiempo y quisiera saber si he mejorado la primera parte de mi desarrollo, nuevamente gracias y que se encuentre bien saludos!
¿Hola cómo está? Espero que bien, me han agregado la condición de que si el avión está pronto a despegar no hay reserva
ni cancelación y justamente la posibilidad de poder anular las reservas, quisiera saber
si mi desarrollo es correcto:
Algoritmo Reserva
Tipo Array[1...300] de entero: Avión
var
Avión: A
boolean: sitioencontrado
entero: i, noroAsiento
cadena: respuesta
real: horaActual, horaSalida
inicio
sitioencontrado = falso
horaActual = X //(función interna para la hora del sistema)
Mientras (horaSalida <= horaActual - 100) hacer
escribir('Reserva para fumador o para no fumador o presione * para cancelar reserva')
leer(respuesta)
  mientras (respuesta <> *) hacer
 si respuesta = fumador entonces
  desde i = 1 hasta 100 hacer
                    leer(A)
   si A = 1 entonces
                           A = 0
   escribir('Su asiento es:', A)
                        sitioencontrado = verdadero
                        fin_si
               fin_desde
                   si sitioencontrado = falso entonces
                     escribir ('No hay lugar')
                   fin_si
        fin_si
         si respuesta = nofumador entonces
             desde 1 = 101 hasta 300 hacer
               leer(A)
                 si A = 1
                 A = 0
                 escribir('Su asiento es:', A)
                 sitioencontrado = verdad
                 fin_si
             fin_desde
                si sitioencontrado = falso entonces
                  escribir('No hay lugar')
                fin_si
         fin_si
    fin_mientras
escribir('Deme nro asiento para cancelar reserva')
leer(nroAsiento)
           desde i = 1 hasta nroAsiento hacer
              leer(A)
              si A = nroAsiento entonces
                A = 1
           fin_desde
   escribir('Reserva cancelada')
 fin _mientras
Escribir('Lo sentimos pero el tiempo ha caducado para su tramite')
Fin

Nuevamente le expreso mi agradecimiento por la disponibildad de su tiempo y po su paciencia, gracias!
El algoritmo parce correcto. Pero lo que no acabo de entender es por que indicas lo de cancelar la reserva al final del algoritmo. ¿Por qué no añades la opción de cancelar en la pregunta para la reserva?
Hola muchas gracias como siempre por tu disponibilidad, creo ver que a lo que te refieres de no entender es lo que tengo en negrita
 A = 1
           fin_desde
   Escribir('Reserva cancelada')
Lo que yo quiero es darle un mensaje de verificación al usuario como que ha concretado la cancelación de la reserva. Si es a eso a lo que te refieres, ¿crees qué he podido desarrollar el algoritmo?
Gracias por tu disponibilidad, que este bien saludos!
Casiiiiiiii, lo que no entiendo es porque preguntas al final del todo lo de cancelar la reserva. Desde mi punto de vista deberías de preguntarlo al mismo tiempo de lo de fumadores o no fumadores. ¿Qué tal ahora?
Un lujo ya he comprendido, la ultima duda que me surge después de varias lecturas del algoritmo es:
Si cuando busco en el array depende la respuesta de fumador o no fumador, por ejemplo en fumador desde i = 1 hasta 100 y asigno A = 0 cuando encuentro el asiento libre (A = 1), ¿no estaría colocando todo lo que encuentre en 1 en 0 en lugar ( o sea todos los asientos libres en lugar del primero que encuentre) del primer asiento libre que encuentre?. ¿Tendría qué colocar dos condiciones en el desde como por ejemplo desde i = 1 hasta 101 o A = 1. Se puede hacer esto?. Eso es lo único que no me termina de convencer, ¿qué crees?
Gracias por tu disponibilidad, saludos!
Debes de modificar tu algoritmo para que cuando devuelvas el número de asiento lo marques como ocupado. Algo como:
Asiento estructura de
  NumAsiento como int;
  ocupado como booleano;
AvionFumador array [1..100] de Asiento
De esta forma cuando busques en fumadores mirarás si el asiendo está libre así:
Si NO Avionfumador. Ocupado entonces
  // está libre.
  Avionfumador.ocupado = True
  Escribir('Su asiento es:', i)
¿Qué tal?
Hola, pero si yo coloco
      desde i = 1 hasta 100 hacer
         si AvionFumador.ocupado = false entonces
                    AvionFumador = true
                    escribir('Su asiento es :', i)
       fin_desde
¿Al estar en una estructura repetitiva no me estaría ocupando todos los asientos para un pasajero? ¿O dices de suprimir el desde y dejarlo con la selectiva si y dos arrays una para fumadores y otra para no fumadores?
                 Gracias!
Ah, ya te entiendo!. Puedes hacer varias cosas, te aconsejo la más fácil y es que cuando encuentres el asiento libre pongas
i = 100
de esta forma acabarás la iteración en el momento que encuentres el sitio libre.
Otra cosa, corrijo un detalle y es el siguiente:
      si AvionFumador.ocupado = false entonces
                    AvionFumador = true
                    escribir('Su asiento es :', i)
       fin_desde
Hola muchas gracias como siempre por tu disposición para conmigo y para con los demás usuarios,
claro ese justamente era mi dilema, entonces al poder darle el valor 100 (fumador) o 300 (no fumador) a i al final de la iteración termina el bucle sin llenar todos los asientos.
Adjunto mi algoritmo que ahora si parece haber quedado finalizado (gracias a tu ayuda) para que si lo puedes confirmar:
Algoritmo Reserva
Tipo
array[1...300] de entero: Avión
var
Avion: A
double: hora_salida, hora_actual
entero: i, nroAsiento
cadena: respuesta
boolean: asiento_encontrado
inicio
hora_actual = x (funcion interna para calcular la hora del sistema)
asiento_encontrado = false
hora salida = 19.30
 mientras (hora_actual <= hora_salida - 2) hacer
        escribir('Reserva para fumador o no fumador o presione * para cancelar reserva')
        leer(respuesta)
        mientras(respuesta <> *) hacer
            si respuesta = fumador entonces
                 desde i=1 hasta 100 hacer
                     leer(A)
                      si A = 1 entonces
                         A = 0
                        escribir('Nro Asiento:', i)
                        asiento_encontrado = true
                        i  = 100
                 fin_desde
                si asiento_encontrado = false entonces
                escribir('No hay lugar')
                 fin si
          fin si
          si respuesta = no fumador entonces
                desde i=101 hasta 300 hacer
                     leer(A)
                    si A = 1 entonces
                           A = 0
                          escribir('Nro Asiento:', i)
                         asiento_encontrado = true
                            i = 300
                 fin_desde
                     si asiento_encontrado = false entonces
                                Escribir('No hay lugar')
            Fin si
          Fin si

Fin mientras
           Escribir('Deme Nro asiento para cancelar reserva')
           Leer(nroAsiento)
                desde i = 1 hasta nroAsiento
                          leer(A)
                          si A = nroAsiento entonces
                                         A = 1
                                        Escribir('Reserva Cancelada')
                   Fin si
                fin_desde

Fin mientras

        Escribir('Lo sentimos pero el tiempo ha caducado para su trámite')
Fin
Espero que este correcto, de nuevo agradezco su disposición y paciencia para el refinamiento del algoritmo, que esté muy bien y saludos.
Gracias!
Después de repasar tu algoritmo veo que has puesto otra vez lo de cancelar la reserva después de preguntar lo de fumador o no fumador. Te recuerdo lo que yo te puse:
"hola,
casiiiiiiii, lo que no entiendo es porque preguntas al final del todo lo de cancelar la reserva. Desde mi punto de vista deberías de preguntarlo al mismo tiempo de lo de fumadores o no fumadores. ¿Qué tal ahora?
Un saludo"
Es decir, que no tenga que preguntar lo de fumador o no fumador para poder cancelar una reserva.
Hola como está, gracias como siempre por su disponibilidad, he reformado alguna parte del algoritmo, aquí lo adjunto para ver si comprendí lo que me aconsejo usted en la última respuesta:
Algoritmo Reserva
Tipo
array[1...300] de entero: Avión
var
Avion: A
double: hora_salida, hora_actual
entero: i, nroAsiento
cadena: respuesta
boolean: asiento_encontrado
inicio
hora_actual = x (funcion interna para calcular la hora del sistema)
asiento_encontrado = false
hora salida = 19.30
 mientras (hora_actual <= hora_salida - 2) hacer
Escribir('Reserva o Cancelación ')
   Leer(respuesta)
 Si respuesta = Reserva hacer
Escribir('Fumador o no fumador')
Leer(respuesta)
      si respuesta = fumador entonces
        desde i=1 hasta 100 hacer
          leer(A)
         si A = 1 entonces
         A = 0
         escribir('Nro Asiento:', i)
          asiento_encontrado = true
         i = 100
          fin si
  fin_desde
  si asiento_encontrado = false entonces
  escribir('No hay lugar')
  fin si
     fin si
    si respuesta = no fumador entonces
  desde i=101 hasta 300 hacer
          leer(A)
         si A = 1 entonces
         A = 0
        escribir('Nro Asiento:', i)
          asiento_encontrado = true
          i = 300
         fin si
        fin_desde
  si asiento_encontrado = false entonces
  Escribir('No hay lugar')
  Fin si
   fin si
Si NO
Escribir('Deme Nro asiento para cancelar reserva')
Leer(nroAsiento)
  desde i = 1 hasta nroAsiento
   leer(A)
   si A = nroAsiento entonces
   A = 1
   Escribir('Reserva Cancelada')
   Fin si
  fin_desde
Fin Si
Fin mientras

        Escribir('Lo sentimos pero el tiempo ha caducado para su trámite')
Fin
Muchas gracias por su disponibilidad y amabilidad, que se encuentre bien, saludos!
Está bien. Buena suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas