Aide pour petit exo 2 [C] - C - Programmation
Marsh Posté le 04-06-2012 à 08:26:52
Avant de se lancer dans le code, il faut au moins avoir un algo correct. Or ce n'est pas le cas.
Comment ferais-tu la recherche si tu la faisais "à la main" ?
Marsh Posté le 04-06-2012 à 15:11:54
et bien je parcours le tableau jusqu'à tomber sur un 1, je récupère sa position et je regarde si les éléments position+1 sont des 1 jusqu'au nombre de sièges voulus non ?
Marsh Posté le 04-06-2012 à 15:56:56
Et il se passe quoi quand la position est la dernière du tableau et que tu vérifies la position+1 ?
Marsh Posté le 04-06-2012 à 16:38:25
ReplyMarsh Posté le 04-06-2012 à 16:41:02
bakkiesboucher a écrit : et bien je parcours le tableau jusqu'à tomber sur un 1, je récupère sa position et je regarde si les éléments position+1 sont des 1 jusqu'au nombre de sièges voulus non ? |
Ce n'est pas ce que fait ton code.
A+,
Marsh Posté le 04-06-2012 à 16:43:24
bakkiesboucher a écrit : beh ça marche pas, je mets un exit() si la position=places |
au rang d'avant, j vaut places - 1, et tu regardes
salle[j] + salle[j+1] soit salle[places - 1] + salle[places - 1+1] c'est a dire salle[places - 1] + salle[places].
Et ils varient de combien à combien, les éléments de salle?
A+,
Marsh Posté le 04-06-2012 à 17:23:49
Et la fuite de mémoire, tu l'as vue ou pas ?
Marsh Posté le 04-06-2012 à 17:27:05
oui, je rajouterais un free, mais c'est bon c'est résolu...
Marsh Posté le 04-06-2012 à 18:12:06
ça donne ça, apparemment pas d'erreur
Code :
|
Marsh Posté le 04-06-2012 à 19:37:37
J'aurais pondu ceci, qui me semble logique:
Code :
|
On cherche au i-ème siège s'il y a demande sièges libres consécutifs (la boucle interne)
Si on trouve un siège occupé lors de la boucle interne, on positionne i dessus et on sort.
La fin de la boucle externe avec le ++i positionne i après ce siège occupé, pour recommencer la recherche.
Sinon, on sort de la boucle interne avec j == demande, ce qu'on teste pour voir s'il faut sortir de le boucle externe.
A+,
Marsh Posté le 04-06-2012 à 20:46:21
Il se passe quoi si l'utilisateur indique qu'il existe 4 294 967 297 de places dans la salle ?
edit: de toute façon, ça pètera quel que soit le nombre saisi...
Marsh Posté le 04-06-2012 à 21:16:37
Harkonnen a écrit : Il se passe quoi si l'utilisateur indique qu'il existe 4 294 967 297 de places dans la salle ? edit: de toute façon, ça pètera quel que soit le nombre saisi... |
c'est bon j'ai rajouté un exit(0) si places>1000 ou <=0
Harkonnen a écrit : edit: de toute façon, ça pètera quel que soit le nombre saisi |
why ? de 1 à 999 sa marche chez moi
ps: Merci de ta réponse gilou
Marsh Posté le 04-06-2012 à 21:32:32
c'est bon j'ai rajouté un exit(0) si places>1000 ou <=0 |
Le problème n'est pas là, renseigne-toi sur malloc.
Regarde aussi les bornes des boucles.
Marsh Posté le 04-06-2012 à 22:36:54
bakkiesboucher a écrit : |
c'est dégueulasse comme solution : il se passe quoi si ton utilisateur saisit des lettres par exemple ?
1ère chose à savoir avec scanf() : TOUJOURS vérifier le nombre retourné par la fonction qui indique le nombre de formattages réussis. Si ce nombre == 0, alors le scanf a échoué et tu le signales.
2ème chose : toujours spécifier une chaine de formattage la plus proche possible de ce que tu souhaites que l'user rentre, car il ne faut JAMAIS faire confiance aux saisies de l'utilisateur (surtout avec scanf(), remplace le par fgets() chaque fois que tu peux).
Ainsi, ici, si tu veux que ton utilisateur ne saisisse qu'un nombre compris entre 1 et 999, alors une solution pourrait être :
Code :
|
mais comme je te disais, préfère l'emploi de fgets() à scanf(), beaucoup plus sécurisé.
bakkiesboucher a écrit : |
au temps pour moi, j'ai lu de travers (même si ça serait mieux d'initialiser tes variables)
Marsh Posté le 04-06-2012 à 23:05:52
Ok merci de l'aide Harkonnen, le fgets et les précisions sur le scanf, on ne nous les a pas enseignés à la fac.
Marsh Posté le 04-06-2012 à 23:38:04
Et puis surtout,
Citation : salle=malloc(places * sizeof(int)); |
Vérifier que le malloc n'a pas échoué et que salle n'est pas NULL.
Bon, c'est sur que de nos jours, ça doit pas être courant, vu la taille des mémoires, mais autant prendre les bonnes habitudes.
A+,
Marsh Posté le 16-06-2012 à 00:06:03
Perso l'algo je l'aurais fait plutôt sur un compteur de places vides consécutives, ça évite la double boucle, non ? (je pense que c'est l'algo qu'attend le prof )
Code :
|
EDIT : oouupppps j'avais pas vu le i+=j dans la boucle de gilou, mea culpa, ce n'est pas une "vraie" double boucle
Marsh Posté le 16-06-2012 à 11:15:50
Dans mon algo, contrairement au tien, salle[i] vaut 1 si la place est occupée (ça me semblait logique) et c'est optimisé pour pas compter a partir de positions pour i dont on sait que ça va échouer, d'ou le i+=j; et l’arrêt de boucle avec i <= (places - demande).
Une suite logique et utile de cet algo serait de lui faire pondre la liste des place proposées possibles, et non pas seulement la première.
A+,
Marsh Posté le 16-06-2012 à 13:25:59
pour le if(salle[i]) ==> erreur de ma part, je ne devrais pas poster à minuit...
Mais finalement ton j est bien l'équivalent strict de mon compteur "consécutif", sauf que je trouve qu'avec la seconde boucle imbriquée, c'est moins "visible/lisible", mais ce n'est qu'une question de point de vue.
Maintenant si la demande évolue vers de contraintes plus compliquées, la logique "look-ahead" explicite est largement plus adapté.
Pour faire l'équivalent de ton optim (mais je ne cherchais pas à optimiser) pour sortir quand on sait qu'il n'y a plus de possibilités, faut que je rajoute des "break"
Le code (car au final c'est le même algo) corrigé (je l'espère)
Code :
|
Sinon, je suis d'accord que la suite serait plutôt autour de
- donner la liste des possibilités
- la gestion de rangs
- a chaque place correspond un prix, et proposer la liste des solutions possibles avec le prix cumulé associé.
A+
Marsh Posté le 04-06-2012 à 02:10:41
Bonsoir,
En fait j'aimerais savoir, comment, dans un tableaux de booléens aléatoire en C, je pourrais faire pour additionner les suites de 1 (qui correspondent à une place de spectacle libre).
En fait l'exo consiste à réserver un nb de place consécutif demandé par un client, retourner la position du 1er si elles sont dispo et -1 si pas de places dispo, mais je vois pas trop comment m'y prendre, j'ai fais un code mais il lâche à partir du nombre de sièges.
Le salle[j] + salle[j+1] est faux vu que ça va additionner même les zéros, mais je sais pas comment faire pour additionner des éléments identiques consécutifs et renvoyer leur position, merci de l'aide
Message édité par bakkiesboucher le 04-06-2012 à 15:08:33