Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2482 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°71347
Hornet
Posté le 11-11-2001 à 13:52:16  profilanswer
 

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 !

mood
Publicité
Posté le 11-11-2001 à 13:52:16  profilanswer
 

n°71348
la viper
Posté le 11-11-2001 à 13:57:04  profilanswer
 

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:

n°71350
Hornet
Posté le 11-11-2001 à 14:01:23  profilanswer
 

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 ???

n°71351
la viper
Posté le 11-11-2001 à 14:16:59  profilanswer
 

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:

n°71352
Hornet
Posté le 11-11-2001 à 14:20:38  profilanswer
 

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.

n°71353
Olivier51
Posté le 11-11-2001 à 14:27:49  profilanswer
 

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.

n°71354
Hornet
Posté le 11-11-2001 à 14:32:01  profilanswer
 

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

n°71356
la viper
Posté le 11-11-2001 à 14:36:14  profilanswer
 

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;
}

n°71357
la viper
Posté le 11-11-2001 à 14:38:24  profilanswer
 

il te faut un nombre n de profondeur ?

n°71358
Olivier51
Posté le 11-11-2001 à 14:39:10  profilanswer
 

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

mood
Publicité
Posté le 11-11-2001 à 14:39:10  profilanswer
 

n°71359
Hornet
Posté le 11-11-2001 à 14:39:31  profilanswer
 

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 !

n°71360
Hornet
Posté le 11-11-2001 à 14:41:18  profilanswer
 

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

n°71361
la viper
Posté le 11-11-2001 à 14:45:07  profilanswer
 

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?

n°71362
la viper
Posté le 11-11-2001 à 14:47:38  profilanswer
 

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à !

n°71363
benou
Posté le 11-11-2001 à 14:47:56  profilanswer
 

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("" );
 }
    }
 
}

n°71364
Hornet
Posté le 11-11-2001 à 14:47:56  profilanswer
 

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

n°71365
Hornet
Posté le 11-11-2001 à 14:49:42  profilanswer
 

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

n°71366
la viper
Posté le 11-11-2001 à 14:50:48  profilanswer
 

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

n°71367
Hornet
Posté le 11-11-2001 à 14:51:31  profilanswer
 

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

n°71368
Olivier51
Posté le 11-11-2001 à 14:54:11  profilanswer
 

/////////////////////////////////////
#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)

n°71369
youdontcar​e
Posté le 11-11-2001 à 14:55:34  profilanswer
 

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

n°71370
freewol
Ceci n'est pas une citation
Posté le 11-11-2001 à 14:57:26  profilanswer
 

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 ...

n°71371
Hornet
Posté le 11-11-2001 à 14:58:02  profilanswer
 

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

n°71373
Olivier51
Posté le 11-11-2001 à 15:04:00  profilanswer
 

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 ...

n°71374
benou
Posté le 11-11-2001 à 15:05:05  profilanswer
 

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 ?

n°71375
Hornet
Posté le 11-11-2001 à 15:06:57  profilanswer
 

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

n°71376
Olivier51
Posté le 11-11-2001 à 15:08:00  profilanswer
 

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

n°71377
freewol
Ceci n'est pas une citation
Posté le 11-11-2001 à 15:08:18  profilanswer
 

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 ...

n°71378
Hornet
Posté le 11-11-2001 à 15:11:52  profilanswer
 

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

n°71379
Hornet
Posté le 11-11-2001 à 15:13:37  profilanswer
 

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

n°71380
Olivier51
Posté le 11-11-2001 à 15:14:17  profilanswer
 

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

n°71382
Hornet
Posté le 11-11-2001 à 15:21:34  profilanswer
 

aidez moi SVP !!!

n°71383
Olivier51
Posté le 11-11-2001 à 15:23:20  profilanswer
 

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

n°71384
Hornet
Posté le 11-11-2001 à 15:24:51  profilanswer
 

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

n°71386
Olivier51
Posté le 11-11-2001 à 15:26:29  profilanswer
 

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

n°71387
freewol
Ceci n'est pas une citation
Posté le 11-11-2001 à 15:34:23  profilanswer
 

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

n°71400
verdoux
And I'm still waiting
Posté le 11-11-2001 à 16:06:50  profilanswer
 

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]

n°71436
Hornet
Posté le 11-11-2001 à 19:07:16  profilanswer
 

bizarre, non ?

n°71487
tfj57
Posté le 12-11-2001 à 04:02:15  profilanswer
 

[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]

n°71504
beyonder
Posté le 12-11-2001 à 10:34:53  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
programmation graphique en CPlantage à l'installation d'un prog. créé sous VB HELP!
programmation graphique locker une surfaceUtilisation de eval en javascript ? Help ???
Remise à niveau en programmation, besoin de conseilsqqun peut me dire pourquoi j'arrive pas à répéter un son background
Fichiers "TIF" et Visual Basic... HELP!!!!!![ JavaScript / CSS ] changer la valeur d1 style avec onMouseOver. HELP
HELPHelp : mediaplayer sous delphi et mp3 : comment kon fait ???
Plus de sujets relatifs à : Exo de programmation en language C, j?arrive pas ! Help me !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR