2

No tengo mucha idea de como realizar el programa, necesito mostrar la cantidad de asientos disponibles, pedir el número de asiento y mostrar si está disponible, y en caso que no, volver a solicitar el dato.

#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <string>

int cantidad=0,num;
char resp;
int arreglo[40] ;
int A;

using namespace std;

int main ()
{

    system("color 3A");//Da color a nuestra programa
    for(int i = 0; i < 40; i++){
        arreglo[40]= i+1;
        //printf("%d\n",arreglo[40]);
    }


    cout<<"\t\t\t\t\tBienvenido a mi Proyecto Final"<<endl;//Mensaje en pantalla
    cout<<"\t\t\t\t\t\tMoises Nava Reza"<<endl;//Mensaje en pantalla
    cout<<endl;//Salto de linea

    do{

    printf("El numero de asientos disponibles son: %d\n",arreglo[40]);
    cout<<"Introduce la cantidad de asientos que desea comprar: "<<endl;
    cin>>cantidad;
    arreglo[40]= arreglo[40]-cantidad;

    for(int i=1;i<=cantidad;i++){
        printf("Introduce un numero de asiento: \n");
        scanf("%d",&arreglo[A]);

        switch(arreglo[A]){
        case 1:
            if(arreglo[A]==1){
            printf("Disponible\n");
            }
            break;
            case 2:
            if(arreglo[A]==2){
            printf("Disponible\n");
            }
            break;
            case 3:
            if(arreglo[A]==3){
            printf("Disponible\n");
            }
            break;
            case 4:
            if(arreglo[A]==4){
            printf("Disponible\n");
            }
            break;
            case 5:
            if(arreglo[A]==5){
            printf("Disponible\n");
            }
            break;
            case 6:
            if(arreglo[A]==6){
            printf("Disponible\n");
            }
            break;
            case 7:
            if(arreglo[A]==7){
            printf("Disponible\n");
            }
            break;
            case 8:
            if(arreglo[A]==8){
            printf("Disponible\n");
            }
            break;
            case 9:
            if(arreglo[A]==9){
            printf("Disponible\n");
            }
            break;
            case 10:
            if(arreglo[A]==10){
            printf("Disponible\n");
            }
            break;
    }

    }


    cout<<"Si desea continuar introduzca S, si desea salir N"<<endl;
    cin>>resp;

    }
    while(resp != 'N' && resp != 'n');
    system("PAUSE");
}
Shaz
  • 28,742
  • 18
  • 37
  • 61
  • 1
    case 1: if(arreglo[A]==1) y en todos los case, que intentas hacer? siemrpe es true porque entro a ese lugar por el case. Mira [ask] para que tu pregunta sea mejor recibida. También, aprovecha y haz el [tour] para entender mejor cómo funcionamos. Y aclara en tu pregunta cual es el problema especifico que tenes – gbianchi Oct 25 '17 at 00:54
  • Necesito mostrar en cada asiento que esta disponible, lo que intento hacer en todos los case es de cierta forma rectificar el valor del arreglo para que imprima "Disponible",Soy nuevo pero vale muchas gracias, tratare de ser mas especifico. – Moisés Nava Reza Oct 25 '17 at 01:16

1 Answers1

4

Tu código es, muy inadecuado.

Inclusiones.

Has marcado tu pregunta como C++ pero estás usando inclusiones de C. No sólo tienes ese problema, si no que usas cabeceras de ambos lenguajes que hacen lo mismo (tanto <stdio.h> como <iostream> incorporan rutinas para mostrar datos por consola). Por lo que veo de tu código sólo necesitarías <iostream> y posiblemente <Windows.h>.

Echa un vistazo a este hilo para conocer mejor las diferencias entre caabeceras de C++ y de C.

printf/scanf y cout/cin hacen lo mismo.

La funcion printf sirve para escribir en consola, pero pertenece a las rutinas de C. El objeto cout sirve para escribir en consola, pertenece a las rutinas de C++. La funcion scanf sirve para leer datos introducidos por consola, pero pertenece a las rutinas de C. El objeto cin sirve para leer datos introducidos por consola, pertenece a las rutinas de C++.

Redundancia.

Haces un switch sobre cada posición del arreglo arreglo para comprobar el valor de dicha posición y en el case que captura dicho valor compruebas con un if si tiene ese valor... ciertamente si ha entrado por ese case es imposible que tenga un valor diferente.

Algoritmo.

Dices:

Mostrar la cantidad de asientos disponibles, pedir el número de asiento y mostrar si está disponible.

Para eso creas un arreglo de 40 enteros en que guardas los números del 1 al 40. No tiene sentido. Lo único que te interesa del asiento es saber si está ocupado o libre, el número del asiento te lo da su posición en el arreglo así que ¿por qué no crear un arreglo de booleanos?

Propuesta.

Usa un arreglo de booleanos que indique si el asiento está ocupado:

bool ocupado[40] {false};

Ese arreglo se inicializa automáticamente con 40 booleanos con valor false, para saber si el asiento 12 está ocupado tan sólo debes mirar en la posición 11 del arreglo.

Para contar cuantos asientos están disponibles usa count_if de <algorithm>:

auto disponibles = std::count_if(std::begin(ocupado), std::end(ocupado), [](bool v){ return v == false; });

Para marcar un asiento como ocupado, lee el indice de asiento y ponlo a true:

std::cout << "El numero de asientos disponibles son: " << disponibles
          << "\nIntroduce la cantidad de asientos que desea comprar: "
int cantidad;
std::cin >> cantidad;

for(int i=1;i<=cantidad;i++){
    std::cout << "\nIntroduce un numero de asiento: ";
    int asiento;
    std::cin >> asiento;

    if (ocupado[asiento - 1])
        std::cout << "Asiento " << asiento << " ocupado!\n";
    else
        ocupado[asiento - 1] = true;
}

Como ves, no es necesario un switch monstruoso.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Muchas gracias por tu propuesta, aclaraciones y correcciones tengo muy poco conocimiento sobre programación y me ha ayudado mucho tu respuesta. – Moisés Nava Reza Oct 25 '17 at 20:56