Exo de programmation en language C, j?arrive pas ! Help me ! - Programmation
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
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 ???
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 !!
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.
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.
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
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;
}
Marsh Posté le 11-11-2001 à 14:39:10
Je réplique avec la formule des Cnp ça n'ira pas plus vite ???
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 !
Marsh Posté le 11-11-2001 à 14:41:18
Peux me donner ta méthode Olivier51 pour que je compare, merci
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?
Marsh Posté le 11-11-2001 à 14:47:38
j'viens de lire ton bout de code
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à !
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("" );
}
}
}
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
Marsh Posté le 11-11-2001 à 14:49:42
En plus, mon triangle de Pascal doit effectivement se faire sur n lignes.
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..
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 ?
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)
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 !
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 ...
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 ?
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 ...
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 ?
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.
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 ...
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 !
Marsh Posté le 11-11-2001 à 15:13:37
Vous n'avez jamais fait se prog quand vous avez débuter en C ?
Marsh Posté le 11-11-2001 à 15:14:17
freewol->bon d'accord tu m'as battu, c'est vrai que tu as raison ...
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 !
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 ...
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 :
|
Ca va faire du segfault ça !
Comme quoi il faut pas se fier aux corrigés des profs
[edtdd]--Message édité par Verdoux--[/edtdd]
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]
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
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 !