IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut application reservation de place dans une salle de cinema
    Bonjour à tous,

    Je dois réaliser une application console permettant d'effectuer la réservation de place dans une salle. Cette salle est représenté par un tableau[X][Y].

    Dans cette application l'utilisateur a plusieurs option faire une demande de réservation, affiche les place occupées.

    Pour le moment j'ai réussi tous cela. Sauf que maintenant il m'est demandé d'ajouter une structure qui va permettre de savoir sur chacune des places le nom de le personne qui a réservé et son nombre de place réservés(à savoir qu'une personne peux réserver plusieurs place si celle-ci sont cote a cote)

    Bref je dois utiliser ceci struct reservation *salle[X][Y];

    Mon probleme c'est que je ne comprend pas comment remplir la structure... mon programme fonctionne de la façon suivante, il demande a l'utilisateur le nombre de place souhaitée, ensuite le programme cherche de façon aléatoire une place et lui attribue ou non si disponible.

    Le truc c'est que l'utilisateur entre son nom et son nombre de place avant que je sache à quelle position il va être affecté dans la salle. Donc comment les sauvegardé dans la structure avant de connaitre cette fameuse position c'est le probleme auquelle je me heurte et n'arrive pas à résoudre depuis plusieurs jours.

    je vous fournie mon code pour plus de compréhension.

    Merci pour toute aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    #include <stdio.h>;
    #include <stdlib.h>;
     
    #define X 10
    #define Y 5
     
    struct reservation								// init structure reservation
    {
    	char nom[10];
    	int ID;
    	int N;
    	int reserve;
    	int PosX;
    	int PosY;
    };
    void main(void)
    {
     
     
     
    	int randX, randY,cpt=0,tempN;
    	int salle_binarisee[X][Y];
    	int placeTrouve=0;
    	char choixM;
     
    	struct reservation* salle;
    	salle = (int*)malloc(X * Y * sizeof(salle));
     
     
    	for (int j = 0; j < Y; j++)				// remplissage du tableau salle binarisee de 0 (0 = place libre) 
    	{
    		for (int i = 0; i < X; i++)
    		{
    			salle_binarisee[i][j] = 0;
    		}
    	}
    	do
    	{
    		printf("---------------------------MENU--------------------------------------\n\n");	// affichage du menu 
    		printf("1 - Taper 1 pour faire une demande de reservation\n");
    		printf("2 - Taper 2 pour afficher l etat de le salle\n");
    		printf("3 - Taper 3 pour afficher le nombre de places libre et occupees\n");
    		printf("4 - Taper 4 pour afficher le nombre de reservations effectuees \n");
    		printf("5 - Taper 5 pour quitter le programme\n\n");
    		printf("--------------------------------------------------------------------\n");
    		printf("Que voulez vous faire ? : ");
    		scanf("%s", &choixM);
    		switch (choixM)																			// permet de détecter le choix de l'utilisateur depuis le menu
    		{		
    			case'1':																			// traitement pour effectuer une réservation
     
    				cpt = 0;																		//printf("Saisir le nom de la reservation : ");
    																		// on stoque le nom dans une variable tempo avant de le mettre dans la structure si la réservation est possible
    				do
    				{
    					printf("Saisir le nombre de place souhaite : ");
    					scanf("%d", &tempN);														
    				} while (tempN > X || tempN <= 0);
    				do																				
    				{
    					randX = rand()%X;															// on génére une place aléatoire dans la salle
    					randY = rand()%Y;
    					placeTrouve = 0;
    					for (int i = 0; i < tempN; i++)
    					{
    						if (salle_binarisee[randX+i][randY] == 0 && (randX+i)<=(X-1))			// on vérifie que la place est libre est également que nous ne sommes pas en dehors du tableau
    						{
    							placeTrouve++;														// on compte le nombre de place libre
    						}
    					}					
    					cpt++;
    				} while (cpt < 100 && placeTrouve!=tempN);						// on va génerer des nombres aléatoires situé dans entre 0 et X et 0 et Y tant que l'on ne trouve pas de place libre ou pas assez			
    				if (placeTrouve == tempN)														// on vérifie que l'on a bien trouvé le nombre N de place demandé libre
    				{
    					for (int i = 0; i < tempN; i++)
    					{
    						salle_binarisee[randX+i][randY] = 1;									// on remplace les places libres par des places occupées
    					}
    					printf("Reservation effectuee\n");
    				}
    				else
    				{
    					printf("Reservation impossible\n");								
    					strcpy(choixM,5);															// reservation impossible on quitte le programme
    				}
    				break;
     
    			case '2':
    				printf("Affichage de la salle :\n");
    				printf("___________\n");
    				for (int i = 0; i < Y; i++)														// on parcourt le tableau et affichage ligne à ligne la salle
    				{
    					printf("|");
    					for (int j = 0; j < X; j++)
    					{
    						if (salle_binarisee[j][i] == 1)
    						{
    							printf("*");
    						}
    						else
    						{
    							printf(" ");
    						}
    					}
    					printf("|\n");
    				}
    				printf("___________\n");
    				break;
     
    				default:
    					break;
    		}
     
    	} while (choixM != '5');
    	printf("Arrêt du programme");
    	free(salle);
    }

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 456
    Points : 29 655
    Points
    29 655
    Par défaut
    Salut,

    Ce code ressemble beaucoup plus à du C qu'à du C++.

    Tu as donc deux solutions:
    - soit tu demande à un modérateur de déplacer cette discussion dans la sections adéquate
    - soit tu modifies (intégralement ) ton code pour l'écrire en C++, cependant, il faut alors TOUT changer

    Ceci étant dit, pour te permettre d'avance quand même un tout petit peu:
    1- Vu que tu dois allouer la place pour garder l'équivalent de X * Y ("ligne" * "colonne") structures de type reservation, pourquoi n'utiliserais tu pas, tout simplement, sizeof(reservation) lors de ton malloc?

    2- ta fonction main en fait décidément beaucoup trop, dans le sens où tu lui a donné les responsabilités:

    de gérer la boucle principale (ca, c'est effectivement ce que l'on attend d'une fonction principale)
    d'afficher un menu
    permettre à l'utilisateur de faire un choix
    de réserver une (ou plusieurs) places
    d'afficher les places qui ont été réservées
    (d'autres choses qui n'apparaissent pas encore dans le code)

    Cela fait, au bas mot, 6 responsabilités, ce qui en fait gentiment cinq de trop, aux termes du SRP (Single Responsability Principle ou Principe de la Responsabilité Unique) : chaque type de donnée, chaque donnée, chaque fonction ne devrait servir qu'à une et une seule chose, si tu veux pouvoir travailler sereinement

    Tu devrais donc envisager de créer des fonctions pour les différents éléments qui ne correspondent pas à "gérer la boucle principale"

    3- tu ne définis jamais la graine pour ta fonction aléatoire (il manque un "srand" en dehors de la boucle)

    4- Plutôt que de placer les gens de manière aléatoire, et comme tu dois, de toutes manières, vérifier lors de la commande s'il y a la place pour le nombre de place réservées sur une ligne donnée (histoire que les gens qui viennent en groupe puissent être ensemble), pourquoi ne pas choisir la ligne de sièges sur laquelle ira un groupe donné en fonction du nombre de sièges disponible sur cette ligne: si le nombre de sièges disponibles sur une ligne est supérieur ou égal au nombre de sièges réservés par un groupe, tu peux placer le groupe sur la ligne en question, sinon, tu vérifie la ligne suivante

    5- tu définis tes valeurs de x et de y à respectivement 10 et 5, ce qui te fait, en toute logique, 50 sièges.

    Or, tu place comme limite la recherche aléatoire à cpt < 100 pour trouver une place libre.

    Pourquoi cette limite arbitraire (pourquoi ne pourrait-elle pas monter à 200, par exemple, vu que tu recherche de manière aléatoire)?

    Ne crois tu pas que, si tu faisais, justement, une recherche plus "systématique", tu trouverais sans doute plus vite (en maximum 50 boucles) ta solution ?
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour ta réponse!
    Citation Envoyé par koala01 Voir le message
    Salut,

    Ce code ressemble beaucoup plus à du C qu'à du C++.
    pourtant mon cours précise que c'est du c++ x(
    Tu as donc deux solutions:
    - soit tu demande à un modérateur de déplacer cette discussion dans la sections adéquate
    - soit tu modifies (intégralement ) ton code pour l'écrire en C++, cependant, il faut alors TOUT changer

    Ceci étant dit, pour te permettre d'avance quand même un tout petit peu:
    1- Vu que tu dois allouer la place pour garder l'équivalent de X * Y ("ligne" * "colonne") structures de type reservation, pourquoi n'utiliserais tu pas, tout simplement, sizeof(reservation) lors de ton malloc?
    je viens de faire que je n'ai pas besoin de malloc et que jai seulement a déclarer ma structure de cette façon struct reservation *salle[X][Y];
    Citation Envoyé par koala01 Voir le message
    2- ta fonction main en fait décidément beaucoup trop, dans le sens où tu lui a donné les responsabilités:

    de gérer la boucle principale (ca, c'est effectivement ce que l'on attend d'une fonction principale)
    d'afficher un menu
    permettre à l'utilisateur de faire un choix
    de réserver une (ou plusieurs) places
    d'afficher les places qui ont été réservées
    (d'autres choses qui n'apparaissent pas encore dans le code)

    Cela fait, au bas mot, 6 responsabilités, ce qui en fait gentiment cinq de trop, aux termes du SRP (Single Responsability Principle ou Principe de la Responsabilité Unique) : chaque type de donnée, chaque donnée, chaque fonction ne devrait servir qu'à une et une seule chose, si tu veux pouvoir travailler sereinement

    Tu devrais donc envisager de créer des fonctions pour les différents éléments qui ne correspondent pas à "gérer la boucle principale"
    en faite c'est un projet que j'ai en cours et ceci est la version 0 que je dois réaliser sans fonction, la version suivante me demandera de justement créer ces fonctions!
    Citation Envoyé par koala01 Voir le message
    3- tu ne définis jamais la graine pour ta fonction aléatoire (il manque un "srand" en dehors de la boucle)
    je ne pensais pas cela utilie j'ai fais un printf avec 100 rand de cette facon et cela me retournais des valeurs entre 0 et 9 donc je pensais bien faire.
    Citation Envoyé par koala01 Voir le message
    4- Plutôt que de placer les gens de manière aléatoire, et comme tu dois, de toutes manières, vérifier lors de la commande s'il y a la place pour le nombre de place réservées sur une ligne donnée (histoire que les gens qui viennent en groupe puissent être ensemble), pourquoi ne pas choisir la ligne de sièges sur laquelle ira un groupe donné en fonction du nombre de sièges disponible sur cette ligne: si le nombre de sièges disponibles sur une ligne est supérieur ou égal au nombre de sièges réservés par un groupe, tu peux placer le groupe sur la ligne en question, sinon, tu vérifie la ligne suivante
    dans mon énoncé il est précise que je dois les placers de façon aléatoire et queje dois effectué 100 recherches et que si au bout de ces 100 recherches aucune place n'est disponible alors on arrete le programme
    5- tu définis tes valeurs de x et de y à respectivement 10 et 5, ce qui te fait, en toute logique, 50 sièges.

    Or, tu place comme limite la recherche aléatoire à cpt < 100 pour trouver une place libre.

    Pourquoi cette limite arbitraire (pourquoi ne pourrait-elle pas monter à 200, par exemple, vu que tu recherche de manière aléatoire)?

    Ne crois tu pas que, si tu faisais, justement, une recherche plus "systématique", tu trouverais sans doute plus vite (en maximum 50 boucles) ta solution ?[/QUOTE]

    ah ca je suis d'accord !

  4. #4
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 781
    Points : 8 466
    Points
    8 466
    Par défaut
    Citation Envoyé par LeShérifPierrot Voir le message
    jai seulement a déclarer ma structure de cette façon struct reservation *salle[X][Y];
    Et pourquoi ? Seulement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct s_reservation  {
    // ...
    } t_reservation;
     
    t_reservation salle[X][Y];
    PS : il me semble que typedef n'est pas utile avec les structures en C++

    Et pour ton problème, je dirais que tu n'as pas besoin de stocker la position dans la structure.
    Il te faut le nom de la réservation et éventuellement 1 ID de réservation comme tu l'as fait si cela est utile.
    Ensuite, je pense que c'est le nom de ta structure qui est mauvais je l'appelerais t_one_seat pour y ajouter 1 enum free/ reserved/ occupied
    En gros :
    • libre, c'est libre
    • occupé, ce n'est pas libre mais on [ne s'intéresse pas à]/ [ignore] la réservation
    • réservé, ce n'est pas libre et on s'intéresse à la réservation


    Ainsi, tu peux garder 1 tableau fixe pour le nom de la réservation et ne peut pas constamment la nettoyer. C'est l'enum qui fait office de garant.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    je dois déclarer la structure de cette facon car on me l'impose dans cet exercice, et le tableau salle doit etre un tableau 2d de pointeurs.

    Mais du coup si je veux enregistré le nom d'une personne qui commence à s'enregistré quelle serait la syntaxe a adopter ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 773
    Points : 24 083
    Points
    24 083
    Billets dans le blog
    1
    Par défaut
    Bonjour
    En plus de ce qui a été dit, main() n'est pas de type void.

    Citation Envoyé par LeShérifPierrot Voir le message
    Mais du coup si je veux enregistrer le nom d'une personne qui commence à s'enregistrer quelle serait la syntaxe a adopter ?
    Toute personne qui entre doit se voir attribuer un espace "t_reservation" dans lequel il sera stocké son nom, son identifiant et tout le toutim qui est dans la structure (y compris sa position en X et en Y, ce qui est idiot vu que la position est aussi donnée par le X et Y du tableau de salle, ce qui offre alors la possibilité d'avoir des incohérences qu'il faudra alors gérer mais on va "imaginer" que c'est pour optimiser la recherche de la position d'une personne précise).
    Ensuite, suffit de stocker l'adresse de cette structure à la position X et Y du tableau de salle.

    PS: ce n'est pas parce que tu as quitté l'école que l'orthographe est brusquement devenue inutile. "a essayé" et "à essayer" ne signifient pas la même chose.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/10/2008, 18h25
  2. Simuler un clic par soft sur une forme placée dans une feuille de calculs.
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/10/2008, 12h03
  3. Réponses: 6
    Dernier message: 23/05/2008, 16h03
  4. sécurité reseaux dans une salle
    Par issam47 dans le forum Sécurité
    Réponses: 3
    Dernier message: 04/07/2007, 18h38
  5. Qu'est ce qui prend de la place dans une db access
    Par lepirlouit dans le forum Access
    Réponses: 8
    Dernier message: 25/07/2006, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo