Gestion d'un cinéma

Résolu
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011 - 4 déc. 2009 à 19:30
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011 - 15 déc. 2009 à 18:05
Bonsoir bonsoir ! Je suis novice en langage c, je m'y suis mis depuis début novembre et j'ai quelques lacunes dans la résolution de mon problème. En fait jdois réaliser un projet pour après les vac de Noël qui consiste à gérer les reservations d'une salle de cinéma! Ma foi j'ai donc travaillé avec des structures de données que jvais lister apres mais je bloque sur un probleme : celui de l'affectation d'un numéro "d'identifiant" pour une place (ou pour un client c est dans la meme logique je pense )
donc j'ai défini des structures :
/* Creation de la structure Client */

struct Client {
char Nom[20];
char Prenom[20];
char Adresse[50];
char Mail[50];
char Telephone[15];
int IDClient;	
};
struct Place {
int Ligne ;
int Colonne;
int Statut;
float Prix;
int IDPlace;
};
j'ai également crée une fonction qui permet de saisir les coordonnees d'un client et de les afficher enfin bref je cherche a définir un numéro unique pour chaque place. Sachant que j'ai crée une fonction qui me permet d'afficher la salle avec la valeur "0" (=libre) grace a
void afficheTab(struct Place tabplace[], int longueur, int largeur)
{...}

Je sais qu'on doit prendre en parametre le numéro de ligne et de colonne mais je seche un peu s il vous plait

27 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 22:46
const char filename: juste un seul caractère ! A la limite tu peux écrire const char filename[].
Pour "const Client compte", tu fais une copie pour rien, donc pour éviter de faire une copie, je passe directement l'objet compte, et non une copie de celui-ci à la fonction. D'où le const Client* compte.
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 19:57
Ton problème est assez mal défini. J'ai beaucoup de mal à comprendre ce que tu veux réaliser. Pourrais-tu reformuler clairement la partie sur laquelle tu bloques ?

Si c'est donner un identifiant unique à chaque fois, il te suffit de donner comme identifiant un nombre aléatoire ou non, dont tu vérifies qu'il n'existe pas avant.
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 20:21
Merci de réponse CptPingu . en effet je pense qu'en quelque sorte chaque case du tableau représentant la salle est identifiée par un nombre aléatoire ou non par exemple la case(0,0) est identifiée par 1, la case(0,1) par 1 etc sans utiliser pour l'instant de nombres aléatoires. Donc en gros je pense qu'on a une fonction qui prend en parametre le tableau de la salle, un indice de colonne et de ligne et qui renvoie un numéro. J"ai donc pensé a quelque chose du genre
long idPlace(char tab[],int ligne, int col){ /*une place a un statut soit 'o'=libre soit occupé='x' */
int i, j;
int val=1;
for (i=0;i<ligne;i++){
for (j=0;j<col;j++){

tab[i*col+j]=val;
                       val =val + 1;

}
}
return val;
}

Mais en fait ca ne marche pas :( je veux incrémenter la valeur de val a chaque tour de boucle . Je ne sais si c est comme ca qu il faut s yprendre
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 20:36
Désolé, mais c'est toujours totalement incompréhensible.
Au lieu de montrer ta fonction en expliquant ce qu'elle fait, explique plutôt le résultat que tu attends et celui que tu obtiens actuellement.

Pourquoi ta fonction renvoie un numéro ? Pourquoi modifie-t-elle le tableau ? Pourquoi affecte tu des valeurs de type char ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 20:46
oui c'est vrai que ce n'est pas très clair. En fait chaque place est identifiée par :
- un numéro de ligne de type entier
- un numéro de colonne de type entier aussi
- un statut libre/occupé
- un prix de de type float
- un id de type entier

de même pour le client :
- un nom de type chaine
- un prenom de type chaine
- une adresse de type chaine
- un id de type entier

Et en fait l'id de reservation correspondrait a un numéro de reservation. Par exemple a la fac lors de l'inscription chaque étudiant est affecté par un numéro d'étudiant unique. c est en gros ce qui faudrait faire avec les places de la salle. Si on demande d'afficher toutes les données d'un client, il faudrait que soient écrits :
son nom, prenom, adresse,idclient et idreservation(=numero de reservation). j'espere que c'est un peu plus clair, jsuis désolé c est la premiere fois que je suis amené a programmer objet.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 20:55
c'est un peu plus clair, jsuis désolé c est la premiere fois que je suis amené a programmer objet.


Mais alors... Il y a de fortes chances que tu soit en C++, pas en C ! [1]
Commence par remplacer tout tes char[] par des std::string.

L'id dans Place représente-t-il la même information que l'id dans Client ?
Si non, l'id dans Place ne devrait-t-il pas être constant ?


[1] PS: pour les experts en C qui me lirait: oui, on peut faire de l'objet en C aussi, mais ce n'est pas à la portée d'un débutant de gérer ses "vtables" à la main.
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 21:15
L'id dans Place représente-t-il la même information que l'id dans Client ?
la c'est une colle mais je pense que ca pourrait etre la meme. Je ne connais pas du tyle le type std::string. j'ai vraiment débuté le C il y a quelques semaines j'ai du avoir une demi dizaine de cours seulement et je vais devoir faire une soutenance orale sur ce projet que j'aimerais finir avant les vac. donc jvais voir comment je peux me debrouiller avec ces "id"
merci en tout cas Cptpingu pour tes réponses
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 21:25
Est-tu en C ou en C++ ? (le std::string n'existe pas en C). Le langage C++ est objet, ce qui n'est pas le cas du C. J'ai besoin de savoir, car ça va orienter la manière dont je vais t'aider. (Je pense que c'est du C, et que tu as fait un abus de langage.)

J'ai maintenant beaucoup mieux compris le contexte de ton problème.
Tu dois donc réaliser un logiciel, qui attribue des réservations à des clients. Je suppose que celui-ci permet de vérifier le nombre de place restantes, le montant gagné, etc... Tu as donc deux tableaux: un pour les "Place" et un pour les "Client".
Le nombre de "Place" est-il fixe ou dynamique (sa taille maximal peut-elle changer) ? Même question pour les "Client" ?

Maintenant, j'aimerais savoir quel est le problème exact ? Ou est-ce que tu bloques dans ton code ? C'est à dire, quelle fonctionnalité n'arrive-tu pas à réaliser ? Peux-tu me décrire précisément ce qui ne vas pas en m'expliquant le résultat attendu, et celui que tu as actuellement ?
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 21:46
Merci pour ta patience. C'est tres gentil de t'attarder sur mon cas. j'ai fait du java et je trouvais que le C lui ressemblait etrangement . donc actuellement je fais du C (programmation impérative en C). Je n'ai pas vu les tableaux dynamiques donc le tableau de places est statique défini par :
#include<stdlib.h>
#include<stdio.h>
#include<string.h> 
#define LONGUEUR 8
#define LARGEUR 7
#define LIBRE 0
#define OCCUPE 1

truct Client {
char Nom[30];
char Prenom[30];
char Adresse[50];
char Mail[50];
char Telephone[15];
int IDClient;	
};

/* Creation de la structure Place */

struct Place {
int Ligne ;
int Colonne;
int Statut;
float Prix;
int IDPlace;
};

void initTab(struct Place tabplace[], int longueur, int largeur)
{
int i, j;
int c =0;
for (i = 0; i < longueur; i++){
for(j = 0; j < largeur; j++){
tabplace[c].Ligne = i;
tabplace[c].Colonne = j;
tabplace[c].Statut = LIBRE;
tabplace[c].Prix = 5;
tabplace[c].IDPlace = c;
c=c+1;
}

    }
}

ici j'ai donc initialisé tous les champs d'un tableau de places. Le nombre de places est statique donc (je suis loin d'aborder la notion de tableaux dynamiques lol) Quand au nombre de clients, je pense qu'il est statique aussi.

D'après ce que je crois il faudrait une fonction IDPlace qui construit la clé de reservation qui est un entier ou éventuellement un string.
je ne sais pas vraiment comment procéder je n'ai pas plus d'informations concernant cette clé de réservation. Mais en gros a chaque place correspond une clé d'identifant. je pense que ca fonctionne un peu comme pour les reservations de places de concerts a la fnac, une fois qu'on a validé une reservation, on nous donne un numéro de reservation. le programme ne va pas etre hyper élaboré dans la mesure ou je n'ai que quelques cours sur les boucles for, while et les tris .
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 21:57
C'est maintenant très clair pour moi. Ta question était bien: comment attribuer un numéro de place, et un numéro de réservation.

Pour attribuer un numéro de place, ce n'est pas compliqué: tu les numérotes dans l'ordre (ce que tu fais déjà). Donc c'est très bien.

Pour les numéros de réservations, j'ai besoin de savoir si ceux-ci sont dépendants d'une date. Est-ce qu'un client réserve pour une date précise ou est-ce qu'on ne se soucie pas de ce cas particulier ?

Si on ne s'en soucie pas, alors il te suffit de faire une fonction qui permet d'attribuer une place à un client. Il suffit juste de donner le même numéro de place au client.

Attention non testé:
void attribPlaceClient(struct Place* place, struct Client* client)
{
  place->Statut = OCCUPE;
  /* Deux solutions: */
  /* 1) Tu ajoutes dans ta structure client un: int IdPlace;*/
  client->IdPlace = place->IdPlace;
  /* OU */
  /* 2) Tu ajoutes un pointeur sur place dans client: struct Place* place;*/
  client->place = place;
}


Tu remarqueras que je suis obligé d'utiliser des pointeurs. En effet, pour passer des éléments par référence et non par copie, il n'y a pas le choix.

A utiliser comme suit, ex:
 attribPlaceClient(&tabplace[0], &tabclient[0]);
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 22:01
MErci vraiment infiniment!! c'est super clair mais qu'est ce que " ->" signifie en c? est ce un peu comme "this" en java ? (et on ne doit pas prendre en compte la date, encore heureux ca soulage un peu le problème ! ouff)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 22:07
Ok si tu n'as pas vu les pointeurs, j'ai écrit un cours il y a quelques temps dessus:
http://0217021.free.fr/Cours/pointeurs.pdf

Pour simplifier, non "->" n'a aucun rapport avec "this". Le langage Java est un langage purement objet. Le C n'est pas du tout orienté objet, et il n'y a donc pas d'équivalent à this, puisqu'il n'y a pas de classe.

truc->muche équivaut à (*truc).muche

C'est un pointeur sur structure. L'étoile déréférence le pointeur (c'est à dire qu'il devient ce qu'il pointe). Et le . permet d'accéder à la valeur dans la structure. Comme c'est chiant d'écrire tout le temps "(*truc)." on a inventé par faignantise: "truc->"
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 22:14
D'accord parfait je ne connaissais pas cette annotation '->'
Merci beaucoup pour le cours que je m'empresse d'imprimer parce que j'admets que la notion de pointeurs reste un peu floue meme si je l'ai deja rencontréé en fortran. Juste une dernière petite question, comment dois déclarer tabclient ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 22:16
Tout comme ton tabplace:
struct Client tablient[NOMBRE];
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 22:24
ha oui d'accord parce que le nombre est fixé. Grace a vous j'ai bien avancé je vous remercie beaucoup . Je m'attaque au problème d'enregistrement du programme dans un fichier pour pouvoir l'utiliser ultérieurement et pouvoir ajouter des reservations quand on le désire. Donc j'ai réecris une fonction que j'ai trouvé dans des bouquins mais je ne sais pas exactement comment on doit l'adapter. J'ai donc commencé par écrire :
struct Client compte; 
void EnregDansFichier ()
{
     char nomFichier [30]; /* nom du fichier dans lequel il faut sauvegarder */
     int erreur;
     int i;
     FILE *prog;

     printf("Entrez le nom du fichier: ");
     scanf("%s",&nomFichier);
  
     prog=fopen(nomFichier,"at");
 
    if (sortie == NULL)
    {
        printf("Un probleme est survenu lors de la tentative d'enregistrement  %s\n",nomFichier);
    }
    else
    {
fprintf(prog,"%s \n %s \n %s \n %s \n %s \n ", compte.Nom, compte.Prenom, compte.Adresse, compte.Mail, compte.Telephone);
    } 
       fclose(prog);
}
mais je ne vois pas vraiment comment utiliser cette fonction . ou est ce qu'on doit mettre l'extension du fichier et le chemin d'acces ou on veut enregistrer le programme.? apres cette question je pense que je ferai le reste par moi mais j'avoue etre un perdu devant toutes ces nouvelles notions. En plus je mélange les différents langages de prof parce que dans ma fac on apprend 2-3 langages par semestre et ce n'est pas évident de suivre partout :s
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 déc. 2009 à 22:30
Il suffit juste de faire une fonction qui nécessite un Client et un nom de fichier.

void EnregDansFichier(const char* filename, const Client* compte)
{
    int erreur;
    int i;
    FILE *prog;

    prog=fopen(filename, "a");
 
    if (prog == NULL)
    {
        printf("Un probleme est survenu lors de la tentative d'enregistrement  %s\n", filename);
    }
    else
    {
        fprintf(prog, "%s:%s:%s:%s:%s\n", compte->Nom, compte->Prenom, compte->Adresse, compte->Mail, compte->Telephone);
    } 
    fclose(prog);
}


Utilisation:
  EnregDansFichier("chemin/fichier.txt", &tabclient[0]);
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 22:42
(const char* filename, const Client* compte)
juste une dernière question avant d'aller dormir, pourquoi avez vous utilisé des pointeurs dans les paramètres de la fonction?
C'est incorrect d'écrire
void EnregDansFichier(char filename, Client compte){ 
?
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
4 déc. 2009 à 22:54
ok parfait. Bon je vais continuer mon petit programme puis si vraiment je patauge comme ce soir j'essaierai de me debrouiller sinon je posterai quelques questions. En tout cas, je vous remercie vraiment parce que ce n'est pas évident d'élaborer un projet pareil avec aussi peu d'heures de cours dans les dents. J'essaierai de poster au fur et a mesure les avancées de mon prog.
Merci encore et bonne soirée à vous CptPingu !
0
rouday55 Messages postés 40 Date d'inscription jeudi 28 février 2008 Statut Membre Dernière intervention 8 décembre 2011
9 déc. 2009 à 20:50
Bonsoir c'est encore moi j'aurais besoin d'une petite lumière concernant toujours le projet de reservation en effet
j'ai ma salle definie par :

#define LIBRE 0
#define OCCUPE 1
#define longueur 5
#define largeur 4:

struct Place {
int Ligne ;
int Colonne;
int Statut;
float Prix;
int IDPlace;
};

void afficheTab(struct Place tabplace[], int longueur, int largeur)
{
int i,j;
printf("\n\n");


for (i = 0; i < longueur; i++){

for(j = 0; j < largeur; j++){		

if (tabplace[i*largeur + j].Statut==LIBRE)

printf("O ");

else 
printf("X ");


}
            }

}


Et la fonction permettant de reserver une ou deux places:

void reserver(struct Place tabplace[]){
  int c=0;
  char rep;
  int siege;
  int i, j;


 printf("Combien de places voulez vous reserver ? (2 maximum) \n");
 scanf("%d", &siege);

 while((c < LONGUEUR * LARGEUR) && (rep != 'o')){

switch(siege){
case 1: 
{if(tabplace[c].Statut == LIBRE){										printf("La place (%d, %d) est disponible, vous interesse t elle ? o/n ", tabplace[c].Ligne,tabplace[c].Colonne);
scanf("%c", &rep);

if(rep == 'o')
{
tabplace[c].Statut = OCCUPE;}	
c++;}break;

case 2:{	
        if ((tabplace[c].Statut == LIBRE) && (tabplace[c+1].Statut == LIBRE))	{
  printf("La place (%d, %d) et la place (%d, %d) sont disponibles, vous interessent elles ? o/n ", tabplace[c].Ligne,tabplace[c].Colonne,tabplace[c+1].Ligne,tabplace[c+1].Colonne);
scanf("%c", &rep);
}
if(rep == 'o')
{
tabplace[c].Statut = OCCUPE;
tabplace[c+1].Statut = OCCUPE;
}			
c++;
}break;


Mon probleme est que si on arrive en fin de ligne et qu'on veut reserver deux places, le programme enregistrer la derniere place de la ligne N et la premiere place de la ligne N+1
comment faire pour choisir deux places contigues uniquement .? (Olala j'ai du mal a m exprimer :'()
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 déc. 2009 à 21:14
Plusieurs remarques:

case 1:
{
  //code
}
break;
case 2:
{
}

Pas besoin d'accolade.

case 1:
  // code
  break;
case 2:


tabplace[c].Statut == LIBRE) && (tabplace[c+1].Statut == LIBRE)

Dangereux ! Car bien que tu vérifies que la position c est valide, tu ne le fait pas pour la position c + 1.

tabplace[c].Statut == LIBRE) && (c + 1) < LONGUEUR * LARGEUR && (tabplace[c+1].Statut == LIBRE)



Mon probleme est que si on arrive en fin de ligne et qu'on veut reserver deux places, le programme enregistrer la derniere place de la ligne N et la premiere place de la ligne N+1
comment faire pour choisir deux places contigues uniquement .? (Olala j'ai du mal a m exprimer :'()


Effectivement, j'ai mis un moment à comprendre !
Il faut que tu vérifies si (c % (LONGUEUR - 1) !0). Si (c % (LONGUEUR - 1) 0), alors c'est que tu es à la fin d'une ligne (à la dernière place).
Si tu es à la fin d'une ligne, ne fait pas de demande de réservation à deux places, juste celles à une place.
0
Rejoignez-nous