Programmation questionnaire (fichier,structure,pile).
Discutez d'informatique ici !
-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 12:41
Salut tous le monde alors voila je vous exposes les questions dont je doutes la justesse de mes réponses en espèrant que vous pourrez m'aidez.
struct Chambre
{
int NbLits;
char Categorie[20];
};
struct Hotel
{
char Nom[20];
int NbEtoiles;
struct Chambres LesChambres[10];
};
struct Hotel H ,
*PH ,
TH[20];
int *PI;
char *PC;
Question 3 (2 pts) Ecrire une instruction qui fait pointer PI sur le nombre d'étoiles de l'hôtel désigné par PH.
*PI->PH->NbEtoiles
Question 4 (5 pts) Toujours dans le même contexte, écrire le code nécessaire pour rechercher, dans le tableau TH, l'hôtel qui comporte le plus grand nombre de lits (au total). On suppose que chaque hôtel comporte 10 chambres
.
int cpt=0;
char memoire[20];
while (cpt =TH[cpt].LesChambres.NbLits)
{
Mémoire = TH[cpt].Nom[20];
}
}
Question 5 On dispose d'une chaîne de caractères d'identificateur ch. Ecrire les instructions nécessaires pour remplacer les deux caractères qui suivent le premier espace par la lettre A. Il est interdit d'utiliser une boucle (pensez strchr).
PC = strchr(ch, ' ');
*PC+1=A;
*PC+2=A;
Question 6 On a les déclarations suivantes.
int tab[10] = {3, 6, 9, 12, 15, 18, 21, 24, 27, 30},
*pt_tab_1,
*pt_tab_2;
pt_tab_1 = &tab[0];
pt_tab_2 = pt_tab_1 + 3;
Donner les valeurs des expressions ci-dessous.
Expressions
a 5 + (*tab)
b *(pt_tab_1 + 3)
c pt_tab_1[4]
d pt_tab_1 == tab
e tab == pt_tab_1
f *pt_tab_2
g pt_tab_2[0]
h pt_tab_2 == &tab[3]
i *(pt_tab_1) + *(pt_tab_2 + 2)
j *(pt_tab_1+4) == pt_tab_2[1]
Et je ne comprends pas la question 6.
-
uztop
- Membre Complexe
- Messages: 2396
- Enregistré le: 12 Sep 2007, 11:00
-
par uztop » 10 Juin 2009, 13:22
Salut,
*PI->PH->NbEtoiles
non PI est un pointeur vers un int, il ne contient pas d'element PH
Il faut assigner quelque chose a PI
if(TH[cpt].LesChambres.NbLits>TH[cpt].LesChambres.NbLits)
attention, LesChambres est un tableau, tu ne peux pas mettre un . juste apres.
*PC+1=A;
il faut ajouter quelques parentheses, et des guillemets autour du A.
Pour la 6, un tableau est un pointeur vers son premier element:
*tab ou tab[0] c'est exactement la meme chose
De la meme facon *(tab + i) est equivalent a tab[i]
-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 13:53
Merci
uztop a écrit:Salut,
non PI est un pointeur vers un int, il ne contient pas d'element PH
Il faut assigner quelque chose a PI
Donc je dois donne l'adresse de se que je veux pointer a PI c'est a dire PI=PH->&NbEtoiles?
uztop a écrit:attention, LesChambres est un tableau, tu ne peux pas mettre un . juste apres.
if(TH[cpt].LesChambres[10].NbLits>TH[cpt].LesChambres[10].NbLits)
Comme ceci?
uztop a écrit:il faut ajouter quelques parentheses, et des guillemets autour du A.
*PC+1='A'; A ui les guillemets (des parenthèses ?)
-
uztop
- Membre Complexe
- Messages: 2396
- Enregistré le: 12 Sep 2007, 11:00
-
par uztop » 10 Juin 2009, 14:19
PI=PH->&NbEtoiles
non, tu ne peux pas mettre le & a cet endroit la:
PI=&(PH->NbEtoiles)
if(TH[cpt].LesChambres[10].NbLits>TH[cpt].LesChambres[10].NbLits)
Comme ceci?
Non, ce code la va faire un segmentation fault.
Il y a 10 chambres donc la derniere a pour indice 9 (vu qu'on commence a 0). Mais tu dois prendre en compte toutes les chambres (et donc boucler sur les chambres)
En fait, je ne vois pas tres bien ce que tu essayes de tester: tu as ecrit la meme chose des deux cotes du > Je ne vois pas comment ton test peut retourner true.
*PC+1='A'
Ca marche peut etre, mais je ne suis pas sur de la priorite des operations:
*(PC+1)='A' est plus sur
PC[1]='A' me semble encore mieux (plus lisible je trouve)
Et pour le dernier, tu n'as rien trouve ?
-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 14:44
uztop a écrit:Non, ce code la va faire un segmentation fault.
Il y a 10 chambres donc la derniere a pour indice 9 (vu qu'on commence a 0). Mais tu dois prendre en compte toutes les chambres (et donc boucler sur les chambres)
En fait, je ne vois pas tres bien ce que tu essayes de tester: tu as ecrit la meme chose des deux cotes du > Je ne vois pas comment ton test peut retourner true.
A oui j'avais oublier le +1 mais j'ai compris je doit faire une sorte de tris a bulle.
uztop a écrit:Ca marche peut etre, mais je ne suis pas sur de la priorite des operations:
*(PC+1)='A' est plus sur
PC[1]='A' me semble encore mieux (plus lisible je trouve)
ty je vais jouer le prudence et le mettre comme tu as dis
uztop a écrit:Et pour le dernier, tu n'as rien trouve ?
a=15
b=9
c=&tab[4];
d=3
Je galère a mort pour cette matière la voila se que j'ai trouver mais il me semble que je devrais relire se chapitre encore une fois puis redonner mes réponse :we:
-
uztop
- Membre Complexe
- Messages: 2396
- Enregistré le: 12 Sep 2007, 11:00
-
par uztop » 10 Juin 2009, 14:54
A oui j'avais oublier le +1 mais j'ai compris je doit faire une sorte de tris a bulle.
Non, on ne te demande pas de trier le tableau mais de trouver l'hotel qui a le plus grand nombre de lits.
Il faut donc pour chaque hotel, trouver le nombre total de lits. Pour cela, il faut stocket deux variables (le plus grand nombre de lits trouve et l'indice de l'hotel correspondant)
Pour la derniere, je pense qu'il faut que tu relises ton cours; la b est bonne mais pas les autres.
Pour la a, (*tab) est la valeur du premier element du tableau
Pour la c, il faut d'abord voir que &tab[0] est juste une facon compliquee d'ecrire tab
Pour la d, la reponse doit etre 0 ou 1 (true ou false) vu qu'il y a un == au milieu
-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 19:11
Voila j'ai Relus (ma fallu le temps pour assimiler) je les ais refais et corriger avec mon compil 1 erreur

et encore merci.
Voici une colle (dernier truc :happy2: ) si qlq peut me dire si c'est correct et pourquoi pas me corriger sa m'aiderais beaucoup ².
Vous travaillez dans une banque. Voici un fragment de code.
#include
char* GetNrCompte(char* nrCarte);
struct oprTerminal
{
char nrCarte[20];
float montant;
};
struct total
{
char nrCompte;
float totalMontants;
};
void main()
{
int nbrCol;
int nbrOpRefusees = 0;
struct total tabTotaux[1000];
//appel à la fonction Cumuler
}
Vous disposez d'un fichier appelé Opera.dat qui contient la liste des retraits réalisés sur des terminaux automatiques par des clients de votre banque. Chaque enregistrement possède une structure interne conforme à la structure struct oprTerminal, et les montants des retraits sont des nombres positifs. Notez que ce fichier peut contenir plusieurs opérations relatives à une même carte.
Vous disposez aussi d'une fonction (elle est déjà écrite, vous pouvez donc l'appeler) appelée GetNrCompte. Elle reçoit en paramètre un numéro de carte et retourne le numéro du compte bancaire associé. Si le compte n'est pas trouvé, cette fonction retourne une chaîne vide. Notez que plusieurs cartes peuvent être associées à un même compte.
On vous demande d'écrire une fonction Cumuler telle que après son appel dans la fonction principale ci-dessus,
les n premières colonnes de tabTotaux contiennent chacune un numéro de compte et le montant total des opérations réalisées à l'aide de cartes associées à ce compte (un compte ne peut être présent que dans une seule colonne);
nbrCol contienne le nombre de colonnes de tabTotaux effectivement remplies;
nbOpRefusées contienne le nombre total d'opérations qui ont été refusées car le compte associé n'a pas été trouvé par GetNrCompte.void Cumuler();
{
struct oprTerminal term;
cpt=0;
refuse=0;
col=0;
fseek(ptro, 0, SEEK_SET);
fread(&term, sizeof(struct oprTerminal), 1, ptro);
while(!feof(ptro))
{
stop=0;
cpt=0; /*donc ici je transmet a ma fonction le numerm de la carte pour quelle me donne son numero de compte*/
x= term.nrCarte[20];
numcompte=char* GetNrCompte(x);
while(!feof(ptro) && stop==0 && numcompte!=NULL)
{
fseek(ptrv, 0, SEEK_SET);
fread(&term, sizeof(struct oprTerminal), 1, ptro); /*Si le numero de compte exsiste je sors du processus de recherche et j'additione le montant (*) */if(numcompte==tabTotaux[cpt].nrCompte)
{
stop=1;
}
else
{
cpt++
fread(&term, sizeof(struct oprTerminal), 1, ptro);
}
}
(*)
if(stop==1)
{
tabTotaux[cpt].totalMontants+=term.montant;
} Si le numero de compte n'est pas nul et n'as pas été trouver je le mets en "fin de tableau"
else
if(numcompte!=NULL)
{
tabTotaux[cpt].nrCompte=numcompte
tabTotaux[cpt].totalMontants=term.montant;
}
if(numcompte==NULL)
{
Refusee++;
}
else
{
col++
}
cpt++;
fread(&term, sizeof(struct oprTerminal), 1, ptro);[/COLOR]
/*Le processus continuera temps que je n'ais pas lu tous le fichier opera.dat*/ }
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 10 Juin 2009, 19:20
salut,
je laisse le soin a uztop ou aux autres de te corriger.
Juste quelques remarques :
Il faut bien distinguer le code et ce que l'on attend.
Il n'y a pas de notions de "juste". Tout dépend comment est posé l'énoncé, et comment tu interprètes l'énoncé.
Une fois que tu as interprété l'énoncé et que tu as dégagé ce qui est attendu, tu peux établir un plan (grossier) de test pour ta fonction/programme. Si ta fonction valide ces tests on peut "admettre" qu'elle est correcte.
Te lancer dans le code sans savoir réellement ou tu vas, c'est une perte de temps total.
ps : le forum comprends les tabulations, tu peux donc exporter en copiant/collant depuis ton IDE, tu pourras ainsi garder l'indentation.
Pour finir, même si les quelques lignes de code qu'on te propose ne font pas preuve d'une qualité exemplaire, ca ne te dispense pas de commenter ce que tu fais ( ca te parait evident, mais pour les autres c'est un gain de temps et de sureté! )
la vie est une fête

-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 19:35
Salut oui je vais essayer de mettre des remarques (moi mêmes je suis perdu avec se que j'ai fait tous a l'Heure :p).
Dsl je n'ais pas bien compris le truc avec les tabulations.
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 10 Juin 2009, 20:24
Ben le coup des tabulations c'est pour avoir ca :
- Code: Tout sélectionner
void Cumuler();
{
struct oprTerminal term;
cpt=0;
refuse=0;
col=0;
fseek(ptro, 0, SEEK_SET);
fread(&term, sizeof(struct oprTerminal), 1, ptro);
while(!feof(ptro))
{
stop=0;
cpt=0;
/*donc ici je transmet a ma fonction le numerm de la carte pour quelle me donne son numero de compte*/
x= term.nrCarte[20];
numcompte=char* GetNrCompte(x);
while(!feof(ptro) && stop==0 && numcompte!=NULL)
{
fseek(ptrv, 0, SEEK_SET);
fread(&term, sizeof(struct oprTerminal), 1, ptro);
/*Si le numero de compte exsiste je sors du processus de recherche et j'additione le montant (*) */
if(numcompte==tabTotaux[cpt].nrCompte)
{
stop=1;
}
else
{
cpt++
fread(&term, sizeof(struct oprTerminal), 1, ptro);
}
}
(*)
if(stop==1)
{
tabTotaux[cpt].totalMontants+=term.montant;
}
Si le numero de compte n'est pas nul et n'as pas été trouver je le mets en "fin de tableau"
else
if(numcompte!=NULL)
{
tabTotaux[cpt].nrCompte=numcompte
tabTotaux[cpt].totalMontants=term.montant;
}
if(numcompte==NULL)
{
Refusee++;
}
else
{
col++
}
cpt++;
fread(&term, sizeof(struct oprTerminal), 1, ptro);
[/COLOR]
/*Le processus continuera temps que je n'ais pas lu tous le fichier opera.dat*/
}
Inutile de préciser que ton code ne compile pas, mais c'est pas tres grave ca. Pour les commentaires c'est mieux, il reste les noms des variables (incompréhensible!), ce que fait la fonction, ...
Dsl detre chiant, mais je rajoute une derniere couche : la manière de coder est toute aussi importante que le résultat. A savoir un code agréable à lire est un élément non négligeable. Ca implique des variables bien nommées pour que le mec qui passe derriere toi comprenne a quoi elles servent. Quit a rajouter une description de la variable si besoin.
ex : pourquoi appeler ta variable stop et non pas noCompteTrouve ?
Les commentaires sont tout aussi important. C'est pas quelque chose qu'on pond à l'arrache (les fautes d'orthographe/conjugaison !!!!).
la vie est une fête

par Dominique Lefebvre » 10 Juin 2009, 20:26
Sion a écrit:/*donc ici je transmet a ma fonction le numerm de la carte pour quelle me donne son numero de compte*/
Bonsoir,Juste une petite remarque : je te prie de vouloir bien ne pas écrire en bleu. Cette couleur est réservée à la modération. Merci.
-
Sion
- Membre Naturel
- Messages: 20
- Enregistré le: 02 Mai 2009, 15:07
-
par Sion » 10 Juin 2009, 20:35
fatal_error a écrit:Inutile de préciser que ton code ne compile pas, mais c'est pas tres grave ca. Pour les commentaires c'est mieux, il reste les noms des variables (incompréhensible!), ce que fait la fonction, ...
Dsl detre chiant, mais je rajoute une derniere couche : la manière de coder est toute aussi importante que le résultat. A savoir un code agréable à lire est un élément non négligeable. Ca implique des variables bien nommées pour que le mec qui passe derriere toi comprenne a quoi elles servent. Quit a rajouter une description de la variable si besoin.
ex : pourquoi appeler ta variable stop et non pas noCompteTrouve ?
Les commentaires sont tout aussi important. C'est pas quelque chose qu'on pond à l'arrache (les fautes d'orthographe/conjugaison !!!!).
Oui c'est une mauvaise habitude les noms des variables incompréhensible je prends note ^^.
Dominique Lefebvre a écrit:Bonsoir,
Juste une petite remarque : je te prie de vouloir bien ne pas écrire en bleu. Cette couleur est réservée à la modération.
Merci.
Bonsoir désolé je prends note aussi.
-
uztop
- Membre Complexe
- Messages: 2396
- Enregistré le: 12 Sep 2007, 11:00
-
par uztop » 11 Juin 2009, 08:18
merci fatal_error pour tes remarques.
Les noms des variables, et les commentaires sont tres importants. Pour les variables, une bonne habitude est de mettre une majuscule au debut de chaque mot qui compose la variable (accountNumber par exemple) et de commencer par un p quand on a un pointeur (pAccountNumbersArray par exemple). J'ai aussi l'impression que l'habitude est de mettre les noms des variables en anglais (y compris en France)
Sinon, on ne peut pas vraiment corriger du code "sur le papier" comme ca. En lisant rapidement, je vois qu'il manque quelques parentheses, des ";" ...
Mais c'est normal, je n'ai jamais ecrit du code qui compile du premier coup, le mieux est d'essayer de le compiler pour corriger les differentes erreurs.
De la meme facon, comme le suggere fatal_error, il faut faire quelques tests pour voir si le code fonctionne bien.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités