Exo de programmation en language C, j?arrive pas ! Help me !

Exo de programmation en language C, j?arrive pas ! Help me ! - Programmation

Marsh Posté le 11-11-2001 à 13:52:16    

Voilà j?ai un exercice en language C a réaliser :
 
On souhaite afficher à l?écran le « triangle de Pascal » dont le principe de constitution est illustré ci dessous :
    1
    1   1
    1   2   1  
    1   3   3   1
    1   4   6   4   1     (triangle de Pascal comportant 5 lignes)
 
· Chaque élément est égal à la somme de l?élément situé au dessus de lui (si il exise) et de l?élément situé à gauche du précedent.
 
 
Voici ce que j?ai fait en C :
 
#include<stdio.h>
 
int main(void){  
int numlig;  
int N;  
int i,j;
int a,b;
 
printf("Entrez le nombre de ligne:" );
scanf("%d",&N);  
 
for(numlig=1;numlig<=N;numlig++){  
for(j=1;j<=numlig;j++){
printf(" %d",j);
(i-1,j)=a;
(j-1,i-1)=b;
printf("%d",a+b);
}  
printf("\n" );
}
return(0);
}
 
Si il y a quelqu?un qui trouve la solution à mon problème, qu?il me dise car moi je ne sais plus quoi faire ! :(
 
Merci d?avance pour votre aide, c?est URGENT !

Reply

Marsh Posté le 11-11-2001 à 13:52:16   

Reply

Marsh Posté le 11-11-2001 à 13:57:04    

je te conseille de faire un tableau à 2 dimensions.
je ne sais pas si tu dois tous afficher ou sinon que sur 5 profondeurs.
 
mais admettons 5 profondeurs.
 
int pascTab[5][5];
 
et puis là tu les remplis comme tu le ferais à la main.
càd ..
1
1 1
1 2 1 -> 1+1 = 2
1 3 3 1 -> 1+2 = 3  
 
 
etc .. bon je te laisse chercher .. mais de cette facon ca sera surement plus simple et plus rapide :jap:

Reply

Marsh Posté le 11-11-2001 à 14:01:23    

effectivement c sur 5 profondeurs. Mais y a t'il pas une formule toute bête à appliquer ?
 
Sinon merci pour ta réponse la viper !
 
quelqu'un d'autre ???

Reply

Marsh Posté le 11-11-2001 à 14:16:59    

bien vu qu'il faut que tu connaisses les valeurs qu'il y a au dessus de toi .. je vois pas comment une simple formule te permettrait de le faire dans ta methode.. par contre, oui ca doit etre possible avec les tableaux .. je vais regarder ca ..
 
 
keske tu es chanceux !!  :lol:

Reply

Marsh Posté le 11-11-2001 à 14:20:38    

Je te remercie bcp car je suis bloqué depuis 2 jours dessus et j'en ai un peu marre !
 
Si tu pouvait m'aider, ca serait vraiment sympa !
Je débute seulement et c pas facile.

Reply

Marsh Posté le 11-11-2001 à 14:27:49    

Pour le triangle de pascal, il n'y a aps une formule addition de deux Cnp, si je me souviens bien, ce que tu peux faire c'est créer une fonction en C qui gènère ton Cnp, et après tu fait ta boucle et tu affiches un par un tes nombres.
 
Le problème pour le tableau, c'est qu'il faudrait que tu le déclare dynamiquement, parce que si tu avais prévu 5 colonnes et on t'en demandes 6 ça va planter. Mais comme tu débutes en C je pense que tu ne sais pas encore créer des tableaux dynamiquement.

Reply

Marsh Posté le 11-11-2001 à 14:32:01    

Non c vrai, pour l'instant je débute. J'aimerais finir ce prog mais je suis complètement bloqué ! :(
 
aidez-moi svp

Reply

Marsh Posté le 11-11-2001 à 14:36:14    

voilà ..
 
y'a surement moyen d'optimiser ..
 
#define SIZE 5
 
int main(int argc, char* argv[])
{
 int PasTab[SIZE][SIZE];
 
 printf("Triangle de Pascal sur 5 profondeurs\n\n" );
 
 for(int i=0;i<SIZE;i++)
 {
  for(int j=0;j<SIZE;j++)
  {
   if((i != 0) && (j!=0))
    PasTab[i][j] = PasTab[i-1][j-1] + PasTab[i-1][j];
   else  
    if(j==0)
     PasTab[i][j] = 1;
    else
     PasTab[i][j] = 0;
   
   printf("%d ", PasTab[i][j]);
  }
 
  printf("\n" );
 }
 
 return 0;
}

Reply

Marsh Posté le 11-11-2001 à 14:38:24    

il te faut un nombre n de profondeur ?

Reply

Marsh Posté le 11-11-2001 à 14:39:10    

Je réplique avec la formule des Cnp ça n'ira pas plus vite ???

Reply

Marsh Posté le 11-11-2001 à 14:39:10   

Reply

Marsh Posté le 11-11-2001 à 14:39:31    

Y'a pas moins compliqué, il faut dire que je débute et je n'ai que des simples base en C (comme mon programme en haut).
 
Je te remercie bcp !

Reply

Marsh Posté le 11-11-2001 à 14:41:18    

Peux me donner ta méthode Olivier51 pour que je compare, merci

Reply

Marsh Posté le 11-11-2001 à 14:45:07    

pose ta formule, mais je pense pas, car dans mon exemple à 5 profondeurs je ne fais que des additions .. c'est une autre histoire si y'a n profondeur.
 
plus simple ?!?..
 
cé l'algo le plus claire que tu puisses sortir d'un triangle de pascal .. enfin je pense. je suppose que tu connais pas les tableaux à 2 dimensions?

Reply

Marsh Posté le 11-11-2001 à 14:47:38    

j'viens de lire ton bout de code  :D  
en fait, ton histoire de  
(i-1,j)=a;  
(j-1,i-1)=b;  
 
ca existe pas en C..
 
mais je suppose que tu as voulu materialiser un tableau à 2 dimensions là !

Reply

Marsh Posté le 11-11-2001 à 14:47:56    

bon, c'est en Java mais tu traduiras (c'est quasiment pareil) ...
 
public class Pascal {
 
    public static final int TAILLE=5;
 
    public static void main(String[] args) {
 int[][] pasc = new int[TAILLE][TAILLE];
 int l,c;
 // initialisation diagonale
 for (l=0; l < TAILLE; l++)
     pasc[l][l] = 1;
 // initialisation colone 0
 for (l=0; l < TAILLE; l++)
     pasc[l][0] = 1;
 
 
 for (l=1; l < TAILLE; l++)
     for (c=1; c<l; c++)
   pasc[l][c] = pasc[l-1][c-1] + pasc[l-1][c];
 
 for (l=0; l < TAILLE; l++) {
     for (c=0; c<=l; c++)
   System.out.print("  " + pasc[l][c]);
     System.out.println("" );
 }
    }
 
}

Reply

Marsh Posté le 11-11-2001 à 14:47:56    

Si je connais vaguement.
 
c ca par exemple :  
 
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

Reply

Marsh Posté le 11-11-2001 à 14:49:42    

En plus, mon triangle de Pascal doit effectivement se faire sur n lignes.

Reply

Marsh Posté le 11-11-2001 à 14:50:48    

bon applique la formule bete de math (que je n'ai plus en tete -heureusement-) et ca ca fonctionnera impec..

Reply

Marsh Posté le 11-11-2001 à 14:51:31    

il y a des commandes que je connais pas Binou. Il faudrais les traduire en C ?

Reply

Marsh Posté le 11-11-2001 à 14:54:11    

/////////////////////////////////////
#include <stdio.h>
 
/////////////////////////////////////
unsigned int Cnp(unsigned int n,unsigned int p);
unsigned int fact(unsigned int n);
 
/////////////////////////////////////
void main(void)
{
//...là tu affiches ton triangle...
}
 
/////////////////////////////////////
unsigned int Cnp(unsigned int n,unsigned int p)
{
 return fact(n)/(fact(p)*fact(n-p));
}
 
/////////////////////////////////////
unsigned int fact(unsigned int n)
{
 unsigned int i=1,j=1;
 for (;j<n;j++) i=i*j;
 return i;
}
 
Bon c'est vrai que c'est plus long, je pensaias que la fonction factorielle existait dans les fonctions maths.
Mais avec ma méthode tu as gagné une fonction factorielle et une fonction Cnp.
 
Rappel de la formule du triangle de Pascal :
Cnp(n+1,k)=Cnp(n,k)+Cnp(n+1,k-1)

Reply

Marsh Posté le 11-11-2001 à 14:55:34    

deux tableaux d'une seule dimension, de la largeur de ta surface d'affichage, suffisent.  
 
au début, tu remplis les deux tableaux de zéros. tu initialises les premières valeurs : tab1[0] = 1; longueur = 1;. puis tu fais une boucle de N itérations qui contient une boucle sur la longueur, chaque calcul utilisant le résultat de la ligne précédente.
 
LE truc intéressant à propos du triangle de pascal : si tu le dessines en mode graphique en prenant
* un nombre impair = un pixel noir
* un nombre pair = un pixel blanc
tu obtiens le triangle de sierpinski !
 
http://www.laubender.de/fractaline/images/fractal-sierpinski.gif

Reply

Marsh Posté le 11-11-2001 à 14:57:26    

quand je ne sais plus qui parlait de la formule, la voilà :
valeur à la ligne a colone b = a(a-1)(a-2)...(a-b+1)/(b!)
ça peut être plus simple à programmer, mais ça sera forcément bcp plus long à éxecuter ...

Reply

Marsh Posté le 11-11-2001 à 14:58:02    

Sinon, on ne peut pas modifier un peu mon programme ???
Où alors il est complètement faux ?

Reply

Marsh Posté le 11-11-2001 à 15:04:00    

freewol-> c'est moi qui parlait de la formule, toi tu pense qu'on peut avoir des problèmes de rapidités, mais je pense que sur le très peu de ligne qu'on va demandé (<= 100), je pense qu'on ne verra pas les erreurs c'est sûr que sur des très grands nombres on risque de voir des marges de temps différents entre les deux techniques. Mais la mienne aura l'avantage de demander moins de mémoire, on n'a pas besoin d'initialiser des tableaux ...

Reply

Marsh Posté le 11-11-2001 à 15:05:05    

Hornet a écrit a écrit :

il y a des commandes que je connais pas Binou. Il faudrais les traduire en C ?  




 
pfff le C, c'est vieux pour moi !! ;) je risque de faire des erreurs et comme j'ai pas de compilo sous la main ...
 
mais bon, maintenant t'as toute les briques. Tu devrais t'en sortir nan ?

Reply

Marsh Posté le 11-11-2001 à 15:06:57    

Je vais essayer, mais je voudrais savoir si mon programe est faux où si il y a 2-3 choses à changer.

Reply

Marsh Posté le 11-11-2001 à 15:08:00    

Hornet-> tu as qu'à le compiler !!!

Reply

Marsh Posté le 11-11-2001 à 15:08:18    

Olivier51 a écrit a écrit :

freewol-> c'est moi qui parlait de la formule, toi tu pense qu'on peut avoir des problèmes de rapidités, mais je pense que sur le très peu de ligne qu'on va demandé (<= 100), je pense qu'on ne verra pas les erreurs c'est sûr que sur des très grands nombres on risque de voir des marges de temps différents entre les deux techniques. Mais la mienne aura l'avantage de demander moins de mémoire, on n'a pas besoin d'initialiser des tableaux ...  




 
ben pour la rapidité c'est évident que sur p3 pour 100 lignes ça changera rien, je parlais juste dans l'absolu, il vaut mieux éviter ...  
quant à la mémoire, c'est bien pour chipoter, mais la méthode la plus efficace qui se base sur l'addition ne demande pas tellement de mem si on décide d'utiliser 2 pointeurs pour 2 lignes consécutives, qu'on les aloue dynamiquement et ainsi chaque fois qu'on rajoute une ligne on ne prends qu'un nombre de plus en memoire ...

Reply

Marsh Posté le 11-11-2001 à 15:11:52    

j'ai un prob ici apparament : (j-1,i-1)=b;
 
Mais même si ca passe, c pas sur qu'il fonctionne !

Reply

Marsh Posté le 11-11-2001 à 15:13:37    

Vous n'avez jamais fait se prog quand vous avez débuter en C ?

Reply

Marsh Posté le 11-11-2001 à 15:14:17    

freewol->bon d'accord tu m'as battu, c'est vrai que tu as raison ...

Reply

Marsh Posté le 11-11-2001 à 15:21:34    

aidez moi SVP !!!

Reply

Marsh Posté le 11-11-2001 à 15:23:20    

tu voulais écrire quoi quand tu as écrit "(j-1,i-1)=b;"

Reply

Marsh Posté le 11-11-2001 à 15:24:51    

J'ai essayé pas mal de combinaisons, alors tu sais, j'ai dès fois fait un peu, beaucoup n'importe quoi !

Reply

Marsh Posté le 11-11-2001 à 15:26:29    

c'était quoi comme opération que tu voulais écrire ?

Reply

Marsh Posté le 11-11-2001 à 15:34:23    

j'ai trouvé ça avec google : http://www.esil.univ-mrs.fr/~chaou [...] uestion4.c
je pense que c'est ce que tu cherches ...

Reply

Marsh Posté le 11-11-2001 à 16:06:50    

freewol a écrit a écrit :

j'ai trouvé ça avec google : http://www.esil.univ-mrs.fr/~chaou [...] uestion4.c
je pense que c'est ce que tu cherches ...  




 
Extrait du code:  

Code :
  1. int t[max];
  2.   t[0]=1;t[1]=0; // initialisations
  3.   for (n=1;n<=max;n++) { // calcul et affichage de max lignes
  4.     for (p=n-1;p>0;p--) { // c'est la ruse !!  
  5.       t[p]=t[p]+t[p-1];     
  6.       printf("%4d",t[p]);
  7.     }
  8.     printf("%4d\n",t[0]);
  9.     t[n]=0;
  10.   }


 
Ca va faire du segfault ça !  
Comme quoi il faut pas se fier aux corrigés des profs:D

 

[edtdd]--Message édité par Verdoux--[/edtdd]

Reply

Marsh Posté le 11-11-2001 à 19:07:16    

bizarre, non ?

Reply

Marsh Posté le 12-11-2001 à 04:02:15    

[citation]
#include<stdio.h>
 
int main(void){
int numlig;
int N;
int i,j;
int a,b;
 
printf("Entrez le nombre de ligne:" );
scanf("%d",&N);
 
for(numlig=1;numlig<=N;numlig++){
a=1;
for(j=1;j<=numlig;j++){
printf(" %d",a);
a=a*(numlig-j)/j;

}
printf("\n" );
}
return(0);
}
[/citation]
 
Dans une ligne (0 à ...) du triangle, les valeurs correspondent aux c(n,i) avec i variant de 0 à n.
 
Le rapport de 2 valeurs consécutives sur une ligne est c(n,i+1)/c(n,i)=(n-i)/(i+1) et la première valeur d'une ligne est toujours c(n,0)=1 ... A toi de vérifier cela, remarque : c(n,p)=n!/((n-p)!*p!)
 
J'ai modifié très simplement ton programme pour tenir compte de cela, un tableau n'est pas nécessaire.
 
A+

 

[edtdd]--Message édité par tfj57--[/edtdd]

Reply

Marsh Posté le 12-11-2001 à 10:34:53    

Une autre version sous forme d'algorythme a la
sauce VB facilement adaptable:
 
 
dim tt(9,9) as integer 'on fait avec N=10
dim N as integer
 
sub main()
N=10
'initialise les premiers elements des colonnes a 1
for i=0 to N-1
tt(i,0)=1
next
 
'initialise la premiere colonne a 1
for i=0 to N-1
tt(0,i)=1
next
 
for colonne=1 to N-1
remplitableau(colonne)
next
 
affichage()
 
end sub
 
 
sub remplitableau(col as integer)
 
for i=1 to N-col-1
tt(col,i)=tt(col,n-1)+tt(col-1,i-1)
next
 
end sub
 
 
 
sub affichage()
for j=0 to N-1
for i=0 to j
print((tt(i,j-i) & " " )
next
print 'on saute une ligne
next
end sub

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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