p'tit incompréhension de mon propre code.

p'tit incompréhension de mon propre code. - C - Programmation

Marsh Posté le 28-11-2003 à 19:37:46    

Salut !
Ce soir mon frere est revenu tout joyeux en me disant qu'il avait reussi son TP de Caml et m'a proposer de faire un des exo de son TP, "le triangle pascal".
Je pense que vous connaissez sinon compilez le code qui suit et regarder le résultat, ca va vous paraitre plus clair.
 
Dans mon code il y'a quelque chose que je ne comprends pas, je l'ai mis parce que j'étais parti sur autre chose (initialiser tout mon tableau a 1, mais c'est bete), et finalement j'en suis arriver a mettre ca :  

Code :
  1. for(unsigned long i=0;i<1;i++);


Et si je mets pas ca...essayer, vous verrez que le triangle pascal ne renvoi plus quelque chose comme ca :
 

Code :
  1. 1
  2. 1  1
  3. 1  2  1
  4. 1  3  3  1
  5. 1  4  6  4  1


mais il renvoi plutot :

Code :
  1. 10
  2. 10  10
  3. 10  2  10
  4. 10  3  3  10
  5. 10  4  6  4  10


 
Et je comprends pas pourquoi il fait ca..
 
voilà le code que j'ai pondu (c'était demandé de le faire en CAML mais n'y connaissant rien au CAML, je l'ai fait en C)
 

Code :
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. unsigned long tab[1000][1000];
  7. for(unsigned long i=0;i<1;i++); // <== ca sert a quoi ?
  8. unsigned long nbligne;
  9. printf("Bienvenu dans \"Triangle de Pascal\"\n" );
  10. printf("Combien de ligne souhaitez vous :" );
  11. scanf("%d",&nbligne);
  12. unsigned long b;
  13. unsigned long j;
  14. for(b=0;b<nbligne;b++)
  15. {
  16. printf("\n" );
  17. for(j=0;j<b;j++)
  18. {
  19.    tab[b][j]=tab[b-1][j-1]+tab[b-1][j];
  20.    printf("%d\t",tab[b][j]);
  21. }
  22. }
  23. getchar();
  24. getchar();
  25. }


 
Voilà, donc ma question final est, a quoi sert

Code :
  1. for(unsigned long i=0;i<1;i++);


surtout que au début tout les variables "b" du programme s'appelait i, mais je les ai renommés pour voir si ca changeai quelque chose, mais non, puisque le "unsigned long i=0" appartient a la boucle for et il est donc comme une variable local a ce bloc.
 
Merci d'avance.


Message édité par smilm le 28-11-2003 à 20:15:12

---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 19:37:46   

Reply

Marsh Posté le 28-11-2003 à 19:45:36    

troll ?
 
pour répondre à ta question finale, RIEN. Le ";" après le for fait que la boucle ne répète rien du tout

Reply

Marsh Posté le 28-11-2003 à 19:48:20    

SmilM a écrit :


 
 
 for(j=0;j<b;j++)
 {
   tab[b][j]=tab[b-1][j-1]+tab[b-1][j];
   printf("%d\t",tab[b][j]);
 }
 
 


 
C'est pas du C, t'as des variables déclarées après des instructions.
Sinon j'ai pas tout regardé mais jette un coup d'oeil sur ce que j'ai mis en gras.
 
[edit] zut les balises gras marchent pas dans des blocs de code
[edit] ni dans le fixed.


Message édité par SquiZZ le 28-11-2003 à 19:49:49
Reply

Marsh Posté le 28-11-2003 à 19:48:21    

Non, pas troll du tout.
Relis le topic.
le "for(unsigned long i=0;i<1;i++);" est obligé si je veux que ca marche.
Compile le code chez toi, tu verras par toi meme


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 19:50:11    

mdr tu plaisante

Reply

Marsh Posté le 28-11-2003 à 19:50:40    

mes varianbles sont déclarés bien avant les instructions sur ce coup là.(et que ca soit plus du C ou C++, ou que ca soit plus au norme, cela m'importe peu.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 19:50:46    

tu compiles avec quoi ? moi j'ai pas de problèmes

Reply

Marsh Posté le 28-11-2003 à 19:52:02    

JagStang a écrit :

mdr tu plaisante


 :fou: Compile ca :
 

Code :
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. unsigned long tab[1000][1000];
  7. for(unsigned long i=0;i<1;i++); // <== ca sert a quoi ?  
  8. unsigned long nbligne;
  9. printf("Bienvenu dans \"Triangle de Pascal\"\n" );
  10. printf("Combien de ligne souhaitez vous :" );
  11. scanf("%d",&nbligne);
  12. unsigned long b;
  13. unsigned long j;
  14. for(b=0;b<nbligne;b++)
  15. {
  16. printf("\n" );
  17. for(j=0;j<b;j++)
  18. {
  19.   tab[b][j]=tab[b-1][j-1]+tab[b-1][j];
  20.   printf("%d\t",tab[b][j]);
  21. }
  22. }
  23. getchar();
  24. getchar();
  25. }


 
et compile ca :
 

Code :
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. unsigned long tab[1000][1000];
  7. unsigned long nbligne;
  8. printf("Bienvenu dans \"Triangle de Pascal\"\n" );
  9. printf("Combien de ligne souhaitez vous :" );
  10. scanf("%d",&nbligne);
  11. unsigned long b;
  12. unsigned long j;
  13. for(b=0;b<nbligne;b++)
  14. {
  15. printf("\n" );
  16. for(j=0;j<b;j++)
  17. {
  18.   tab[b][j]=tab[b-1][j-1]+tab[b-1][j];
  19.   printf("%d\t",tab[b][j]);
  20. }
  21. }
  22. getchar();
  23. getchar();
  24. }

 
 
Au cas ou ca serait un bug de compilo => j'utilise DevC++


Message édité par smilm le 28-11-2003 à 20:14:48

---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 19:52:07    

SmilM a écrit :

mes varianbles sont déclarés bien avant les instructions sur ce coup là.(et que ca soit plus du C ou C++, ou que ca soit plus au norme, cela m'importe peu.


 
tu respectes les normes, c'est du C, tu respectes pas c'est pas du C.
c'est pas parce que ton compilo te retapisse pas ta chambre en vert que c'est du C.

Reply

Marsh Posté le 28-11-2003 à 19:54:33    

unsigned long tab[1000][1000]; --> static pas bien
unsigned long b; --> pas initilisé : pas bien
 
 

Reply

Marsh Posté le 28-11-2003 à 19:54:33   

Reply

Marsh Posté le 28-11-2003 à 20:00:59    

JagStang a écrit :

unsigned long tab[1000][1000]; --> static pas bien
unsigned long b; --> pas initilisé : pas bien
 
 
 


long tab[1000][1000]; --> static pas bien
Comment ca static ?
tab[][]; provoque 5 erreurs chez moi.
 
Enfin bon, j'ai pas trop compris l'histoire des variables static, enfin, j'ai cru comprendre que c'était des variables qui ne se reinitialiser pas a chaque passage dans la fonction mais uniquement au 1er passage, et qu'il garde donc la valeur de cette variable en memoire pour la prochaine utilisation de la fonction.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:06:50    

et mes remarques en gras dans ton code ?

Reply

Marsh Posté le 28-11-2003 à 20:11:11    

Code :
  1. #include <stdlib.h> 
  2.   #include <stdio.h> 
  3.  
  4.   int main() 
  5.   { 
  6.     unsigned long tab[1000][1000]; 
  7.     unsigned long b;
  8.     unsigned long j;
  9.     unsigned long nbligne; 
  10.     printf("Bienvenu dans \"Triangle de Pascal\"\n" ); 
  11.     printf("Combien de ligne souhaitez vous :" ); 
  12.     scanf("%d",&nbligne); 
  13.     printf("----%d----\n",tab[b][j]); 
  14.     for(b=0;b<nbligne;b++) 
  15.     { 
  16.       printf("\n" ); 
  17.       for(j=0;j<b;j++) 
  18.       { 
  19.           tab[b][j]=tab[b-1][j-1]+tab[b-1][j]; 
  20.           printf("%d\t",tab[b][j]); 
  21.       } 
  22.     } 
  23.     getchar(); 
  24.     getchar(); 
  25.   }


 
Ton for ne servait à rien, par contre en remettant les déclarations de variables avant les instructions, tout marche... bizarre non?  :heink:  
Compile le code au dessus...
 

Citation :

printf("----%d----\n",tab[b][j]);


T'as rien dans b, ni dans j, pourquoi tu met cette ligne ???
 
 


---------------
- mon feed-back
Reply

Marsh Posté le 28-11-2003 à 20:12:16    

SquiZz a écrit :

et mes remarques en gras dans ton code ?
 


 
heu voui mais j'ai pas bien compris ce que tu voulais me montrer...désolé, je débute.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:14:15    

Zipo désolé pour cette ligne, effectivement elle ne sert a rien, elle me servait plus tot dans mon "develloppement" mais plus maintenant, surtout que vu que j'ai pas initialiser b et j elles sont obseletes.
j'édite :)


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:15:32    

SmilM a écrit :

Zipo désolé pour cette ligne, effectivement elle ne sert a rien, elle me servait plus tot dans mon "develloppement" mais plus maintenant, surtout que vu que j'ai pas initialiser b et j elles sont obseletes.
j'édite :)
 


Ben si tu met toutes les déclarations de var avant les instructions ca marche


---------------
- mon feed-back
Reply

Marsh Posté le 28-11-2003 à 20:16:08    

un tableau en C ca commence a quel indice ?
 
quand j vaut 0, combien vaut j-1 (attention j est un unsigned long) ?
 
refaire le même exercice avec la variable b.
 
Est ce que c'est c'est la cause de ton problème ? j'en sais rien.
 
[edit] question subsidiaire, qu'est ce qu'il y a à l'indice 4294967295 d'un tableau ?


Message édité par SquiZZ le 28-11-2003 à 20:23:47
Reply

Marsh Posté le 28-11-2003 à 20:21:36    

le iostream.h t'en fait quoi ? le stdlib.h ?
 
1000*1000*4 octets ça te parait pas un peu gros pour ta pile ?

Reply

Marsh Posté le 28-11-2003 à 20:23:59    

voilà le Taz. le problème va être vite réglé :)

Reply

Marsh Posté le 28-11-2003 à 20:24:22    

Taz a écrit :

le iostream.h t'en fait quoi ? le stdlib.h ?
 
1000*1000*4 octets ça te parait pas un peu gros pour ta pile ?


oui, je sais, c enorme mais ca on s'en moque, remplace le par 20 si tu veux.


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:26:31    

SquiZz a écrit :

un tableau en C ca commence a quel indice ?
 
quand j vaut 0, combien vaut j-1 (attention j est un unsigned long) ?
 
refaire le même exercice avec la variable b.
 
Est ce que c'est c'est la cause de ton problème ? j'en sais rien.
 
[edit] question subsidiaire, qu'est ce qu'il y a à l'indice 4294967295 d'un tableau ?


 
c'est vrai que ca pose un probleme, et c'est pour ca que quand je compile et que je donne nbligne=10, il ne me donne que 9 ligne de résultat.
En fait il donne 10 ligne de résultat, dont la 1er qui est vide


---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:30:06    

SmilM a écrit :


 
c'est vrai que ca pose un probleme, et c'est pour ca que quand je compile et que je donne nbligne=10, il ne me donne que 9 ligne de résultat.
En fait il donne 10 ligne de résultat, dont la 1er qui est vide


mais meme dans la 2eme tu sors du tableau lorsque t'as b=1 et j=0 et que tu fais tab[b][j]=tab[b-1][j-1]+tab[b-1][j];  
ya un pb ;)


---------------
- mon feed-back
Reply

Marsh Posté le 28-11-2003 à 20:36:05    

hum oui c'est vrai, et puis de toute facon il est tout crado mon code.
J'essayerais de refaire cette exo prochainement.
Merci de votre aide :)
 
En tout cas j'ai (presque) reussi a faire cet exercice et ya des personnes de la classe à mon frere qui n'ont pas reussi à le faire en CAML :d


Message édité par smilm le 28-11-2003 à 20:36:19

---------------
AfterEnd: Batissez un nouveau monde
Reply

Marsh Posté le 28-11-2003 à 20:37:42    

SmilM a écrit :

hum oui c'est vrai, et puis de toute facon il est tout crado mon code.
J'essayerais de refaire cette exo prochainement.
Merci de votre aide :)
 
En tout cas j'ai (presque) reussi a faire cet exercice et ya des personnes de la classe à mon frere qui n'ont pas reussi à le faire en CAML :d


 
reviens quand t'auras compris que programmer ne consiste pas a tapper sur des touches au hazard et dire "j'ai réussi" quand ca compile.

Reply

Marsh Posté le 28-11-2003 à 20:38:42    

tu te rends compte que tu n'a pas besoin de toute la matrice ? il te faut juste les deux dernière lignes ...

Reply

Marsh Posté le 28-11-2003 à 20:41:20    

Taz a écrit :

tu te rends compte que tu n'a pas besoin de toute la matrice ? il te faut juste les deux dernière lignes ...


Ya bien pire que ca dans son algo :D


---------------
- mon feed-back
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed