Accueil > Forum > > > > [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?
[TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?
samedi 26 avril 2008 à 16:18:57 |
[TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

Zenith
|
bonjour, je suis novice en C, et je voudrais passer un tableau 2D dans une fonction. le but de mon programme est de générer 6 combinaisons de 6 entiers toutres distinces en prenant des nombres entre 1 et 49 inclus: voici mon code ou il me retourne des errueurs que je ne comprends pas: #include <stdio.h> #include <stdlib.h> #include <time.h> int hasard(int min, int max); void grille(int cmp[][2],int li);
int main(int argc, char *argv[]) { srand(time(NULL)); int i,n, cmp[49][2]; for(i=0;i<49;i++) { cmp[i][0]=i+1; cmp[i][1]=0; } system("PAUSE"); // le programme plante juste apres ce pause for(i=0;i<6;i++) { grille(cmp,49); printf("\n"); } system("PAUSE"); return 0; }
// genere entier aleatoire entre min et max inclus int hasard(int min, int max) { return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1))); }
// genere une grille de 6 numeros distince des autres grilles generees void grille(int cmp[][2],int li) { int i, j, k, e, nb;
for(i=0;i<6;i++) { e=0; do { nb=hasard(1,49); while(cmp[k][0]!=nb && k<li) { k=k+1; } if (cmp[k][1]==0) { cmp[k][1]=1; printf("%d ",nb); e=1; }else { e=0; } }while(e=0); } }
voila, merci de m'aider j'en peux plus
merci d'avance
|
|
samedi 26 avril 2008 à 16:35:13 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

jfrancois
|
Bonjour, Il manque k=0 dans grille(), avant, ou au début, de la boucle i. Avec ça ne plante plus ! Jean-François
|
|
samedi 26 avril 2008 à 16:38:20 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

jfrancois
|
... et pas besoin de passer par float pour générer un nombre aléatoire : int hasard(int min,int max) { return (rand() % (max - min + 1)) + min; }
Jean-François
|
|
dimanche 27 avril 2008 à 07:29:12 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

Zenith
|
merci ! j'ai corrigé avec vos conseils, et enlevé la fonction grille, pour la mettre direct dans le code, comme c'est pas enorme:
#include <stdio.h> #include <stdlib.h> #include <time.h>
int hasard(int min, int max); void grille(int cmp[],int util[],int li);
int main(int argc, char *argv[]) { srand(time(NULL)); int m, n, s, i, k, e, nb, cmp[49],util[49]; printf("8 grilles de 6 numeros a genere:\n\n"); for(m=0;m<49;m++) { cmp[m]=m+1; util[m]=0; } for(m=0;m<8;m++) // pour chaque grille { for(i=0;i<6;i++) // pour chaque numero de la grille { // genere un numero distinct des autres deja utilisés e=0; do { nb=hasard(1,49); k=0; while(cmp[k]!=nb) { k=k+1; } if (util[k]==0) { util[k]=1; printf("%d ",nb); e=1; }else { e=0; } }while(e=0); } printf("\n"); } printf("\n\n[ "); s=0; for(m=0;m<49;m++) { printf("%d : %d fois\n",cmp[m],util[m]); s=s+util[m]; } printf("\nsoit %d/49 numeros utilises ]\n\n",s); // } system("PAUSE"); return 0; }
// genere entier aleatoire entre min et max inclus int hasard(int min, int max) { return (rand() % (max - min + 1)) + min; }
mais maintenant mon probleme est que le code me genere des combinaisons allant de 1 a 6 numeros, alors que moi j'en veux que de 6 pile, j'ai beau relire je vois pas, some help ?
normalement sur 8 grilles il devrait utiliser 8*6 numeros, c'est a dire 48, mais pour ma derniere execution, j'arrive a 30, je comprends pas trop d'ou ca sort ca ...
merci en tous cas pour votre aide :)
|
|
dimanche 27 avril 2008 à 07:30:35 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

Zenith
|
j'ai oublié de supprimer le prototype de grille dans mon dernier message
|
|
dimanche 27 avril 2008 à 11:37:48 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

jfrancois
|
Voici une réécriture rapide qui donne un résultat correct. 1) Pensez à utiliser des noms de variables qui veulent dire quelque chose, ça aide énormément à l'écriture et à la compréhension (certains commentaires deviennent totalement inutiles) . Une variable sur une lettre c'est bien pour un indice de boucle très local mais dans un traitement plus important on ne comprend plus et il y a trop de riques de la modifier par inadvertance. Le code généré par le compilateur n'a aucun rapport avec la longueur des noms de variables et les disques durs font des centaines de Go alors profitons-en !
2) Pensez aussi à paramétrer. Eviter les valeurs "en dur" comme 6, 8 et 49. Placez-les dans des variables ou des constantes (qui veulent dire quelque chose là aussi !) et le programme devient facilement modifiable. Dans la version ci-dessous, pour avoir 10 grilles, il suffit de modifier iNbGrilles = 10 et recompiler sans se passer en revue tout le programme.
3) Bonne chance au LOTO !
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc,char **argv) { const int iNbGrilles = 8; // nb grilles à générer const int iNbTirages = 6; // nb tirages / grille const int iNbMax = 49; // nb max à tirer (min = 1) bool abGrille[iNbMax]; int aiCompteurs[iNbMax]; int iGrille,iTirage,iMax; int iHazard,iTotal; // --- Initialiser les compteurs globaux for (iMax=0 ; iMax<iNbMax ; ++iMax) aiCompteurs[iMax] = 0; // --- Générer les grilles printf("Generer %d grilles de %d numeros\n\n",iNbGrilles,iNbTirages); srand(time(NULL)); for (iGrille=0 ; iGrille<iNbGrilles ; ++iGrille) { // --- Initialiser la grille for (iMax=0 ; iMax<iNbMax ; ++iMax) abGrille[iMax] = false; // --- Remplir la grille for (iTirage=0 ; iTirage<iNbTirages ; ++iTirage) { // --- Les tirages doivent être différents while (true) { // --- Tirer un nombre au hazard entre 1 et 'iNbMax' iHazard = (rand() % iNbMax) + 1; // --- Conserver ce nombre s'il n'a pas déjà été tiré // --- (RAPPEL : les indices commencent à zéro !) if (! abGrille[iHazard - 1]) { abGrille[iHazard - 1] = true; ++aiCompteurs[iHazard - 1]; break; } } } // --- Montrer la grille // --- (les tirages sont naturellement ordonnés) printf("Grille %d :",iGrille + 1); for (iMax=0 ; iMax<iNbMax ; ++iMax) if (abGrille[iMax]) printf(" %2d",iMax + 1); printf("\n"); } // --- Montrer les compteurs globaux et le total printf("\n"); iTotal = 0; for (iMax=0 ; iMax<iNbMax ; ++iMax) { printf("%2d : %d fois\n",iMax + 1,aiCompteurs[iMax]); iTotal += aiCompteurs[iMax]; } printf("\nsoit %d numeros utilises / %d numeros disponibles\n",iTotal,iNbMax); system("PAUSE"); return 0; } Ce qui donne (différent à chaque exécution bien sûr) :
Generer 8 grilles de 6 numeros Grille 1 : 7 15 17 18 28 44 Grille 2 : 9 14 17 19 29 41 Grille 3 : 8 9 14 15 35 48 Grille 4 : 10 12 33 37 45 47 Grille 5 : 1 11 17 24 30 37 Grille 6 : 6 9 22 25 30 33 Grille 7 : 2 6 25 29 40 44 Grille 8 : 4 16 20 32 37 40 1 : 1 fois 2 : 1 fois 3 : 0 fois 4 : 1 fois 5 : 0 fois 6 : 2 fois 7 : 1 fois 8 : 1 fois 9 : 3 fois 10 : 1 fois 11 : 1 fois 12 : 1 fois 13 : 0 fois 14 : 2 fois 15 : 2 fois 16 : 1 fois 17 : 3 fois 18 : 1 fois 19 : 1 fois 20 : 1 fois 21 : 0 fois 22 : 1 fois 23 : 0 fois 24 : 1 fois 25 : 2 fois 26 : 0 fois 27 : 0 fois 28 : 1 fois 29 : 2 fois 30 : 2 fois 31 : 0 fois 32 : 1 fois 33 : 2 fois 34 : 0 fois 35 : 1 fois 36 : 0 fois 37 : 3 fois 38 : 0 fois 39 : 0 fois 40 : 2 fois 41 : 1 fois 42 : 0 fois 43 : 0 fois 44 : 2 fois 45 : 1 fois 46 : 0 fois 47 : 1 fois 48 : 1 fois 49 : 0 fois soit 48 numeros utilises / 49 numeros disponibles Appuyez sur une touche pour continuer...
Jean-François
|
|
dimanche 27 avril 2008 à 15:39:57 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

Zenith
|
bon, deja un grand merci a toi jfrancois pour tes conseils et surtout pour t'etre cassé la tete a tout reecrire !! je regarderai ca plus en détail ce soir, mais deja la, a premiere vue, il y a un probleme, c'est que par exemple, 14 et 15 ont ete utilise chacun 2 fois. Ce que je voulais faire a la base, c'est de faire en sorte que sur 8 tirages de 6 numeros par exemple, 6*8=48 nombres soient utilisés une et une fois seulement, c'est pour ca que je fesait tout mon patakes avec la variable e(=0 si on na pas tire un nombre unique et =1 si c'est ce cas) ansi que les tableaux cmp[] et util[](qui contient soit 1 soit 0 si le nombre a deja ete utilise une fois ou pas)
merci en tous cas pour tes conseils sur l'interet de bien nommer ses variables et de mettre des parametres plustot que des nombres en dur, je pense que tu as raison ... ca m'aurai permi de faciliter la relecture aussi je pense ... j'ai merdé lol
merci encore,
|
|
dimanche 27 avril 2008 à 15:52:46 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

jfrancois
|
J'avais pas compris ça en effet ! Il suffit de remplacer un test et c'est bon : // --- Conserver ce nombre s'il n'a pas déjà été tiré // --- (RAPPEL : les indices commencent à zéro !) //if (! abGrille[iHazard - 1]) if (aiCompteurs[iHazard - 1] == 0)
Jean-François
|
|
dimanche 27 avril 2008 à 17:07:52 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

Zenith
|
merci ca marche !!!
mais j'aurais 2 questions: - est ce que j'ai bien compri? -> abGrille[] sert a stocker si oui ou non le nombre "indice+1" a deja ete utilisé -> aiCompteurs[] sert a compter le nombre de fois qu'a ete utilise "indice+1" - est ce que la boucle suivante ne devrait pas etre infinie ? la condition ne change jamais: true est toujours egal a true:
// --- Les tirages doivent être différents while (true) {...}
merci, a bientot
|
|
dimanche 27 avril 2008 à 17:55:45 |
Re : [TABLEAUX 2D] comment passer un tableau 2D dans une fonction ?

jfrancois
|
- Les décalages de 1 sont dus aux indices qui commencent à zéro. - abGrille[] est un tableau de booléens qui marque le tirage d'un nombre dans une grille (ce tableau est initialisé au début de chaque grille). - aiCompteurs[] est un tableau de compteurs globaux des nombres tirés (il n'est pas réinitialisé au début de chaque grille). Il sert aussi à ne pas retirer 2 fois le même nombre dans toutes les grilles (avec la dernière modification). - La boucle while (true) est infinie. On en sort avec le break (on casse la boucle) quand on a trouvé le bon nombre. C'est une structure très pratique qui évite de s'encombrer d'indicateurs et/ou de tests. // --- Les tirages doivent être différents while (true) { // --- Tirer un nombre au hazard entre 1 et 'iNbMax' iHazard = (rand() % iNbMax) + 1; // --- Conserver ce nombre s'il n'a pas déjà été tiré // --- (RAPPEL : les indices commencent à zéro !) if (aiCompteurs[iHazard - 1] == 0) { abGrille[iHazard - 1] = true; ++aiCompteurs[iHazard - 1]; break; } }
Jean-François
|
|
Cette discussion est classée dans : int, max, min, 2d, cmp
Répondre à ce message
Sujets en rapport avec ce message
Problème avec les classes. [ par xelados ]
J'ai commencer les classes et j'avoue que je les comprend plus ou moin je ne sais pas exactement c quoi mes erreurs .. mais j'en nais 16 ... Ce que j'
langage C : probleme syntax [ par Keymi ]
Bonjour , tous d'abord le but de l'exercice est de faire une fonction permettant de determiner la valeur maximale et minimale d'un tableau de flottant
Problème pour générer des nombres aléatoires [ par Etoiline ]
Hello !Voilou je suis débutante en c++. Je dois faire un jeu de yams mais j'ai un problème : pour le premier lancer de dé tout va bien mais pour le se
Problème tri d'un vecteur [ par Etoiline ]
Voilà j'ai un petit problème j'arrive pas à trier mon vecteur (selon un ordre croissant)Voilà un bout de mon algo donc si vous pouviez m'aider svp....
fonction min max [ par devamos ]
bonjour,j'aimerais des corrections,si vous pouvez m'aider j'ai ecri ces instructions en devc++,,, c'est une fonction qui cherche le max et le min dans
éliminer les doublons ! [ par jekburn ]
Bonsoir, J'ai demandé de l'aide y'a 2 semaines, mais là je suis toujours bloqué ! Please help ! Je cherche à supprimer les doublons que me sort mon p
bug d'execution pour ecrire dans un fichier en C [ par sebtheboss4 ]
Bonjour, je suis encore un novice en C, voici un petit programme qui fait rien de très durs. Je souhaite enregistrer une phrase lors de la compilation
Probleme puissance 4 en SDL, sur l'IA min/max [ par diablosephiroth ]
Bonjours , je rencontre un problème pour mon programme sur la partie intelligence artificielle. En effet, au début j'étais partie sur une simple IA à
Besoin d'une petite aide ... [ par celialita ]
j'ai ce programme qui cherche le min d'un tableau de 10 entiers . on renvoie sa position , pas sa valeur. int MINTAB ( int T[10]) { int i, min=0; for
recherche valeur min dans un tableau ? [ par cur2009 ]
Bonjour, J'ai besoin de votre aide pour me corriger le code que j'ai crée ci-dessous. ce code permet d'afficher la valeur minimale qui se trouve dans
Livres en rapport
|
Derniers Blogs
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|