Hello,
Bon, je crois que ton code devient trop compliqué par rapport à ce qu'il devrait être, donc je te propose de reprendre étape par étape. Pour commencer, on se concentre sur le fonction d'inversion.
1. Passage d'argument
Effectivement, comme l'a souligné jopopmk, si tu fais une fonction avec ce prototype, InverserTableau va travailler sur une copie de la variable que tu as passé en paramètre. La copie sera donc inversée, mais pas l'original, donc tu auras fais tout ça pour rien. Tu pourrais retourner le résultat de l'inversion de la façon suivante:Code:void InverserTableau(Entier_long a);
L'inconvénient est que le type Entier_long est assez "gros", et il est donc plus efficace de passer par les pointeurs. Par contre, habituellement on écrira plutôt la fonction de la sorte:Code:
1
2
3
4
5
6
7
8
9
10 /* prend un Entier_long en paramètre, l'inverse, * et retourne le résultat. */ Entier_long InverserTableau(Entier_long a) { /* * faire le job... */ return resultat; }
Maintenant, je te recommande de faire une batterie de tests sur cette fonction, et une fois que tu t'es assuré qu'elle fait le job sans faillir, on n'en parle plus.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void InverserTableau(Entier_long *a) /* Inverse le tableau Chiffres_sign[] de Entier_long */ { int i1=0; int i2=a->taille-1; int x; while(i1<i2) { x=a->Chiffres_sign[i1]; a->Chiffres_sign[i1]=a->Chiffres_sign[i2]; a->Chiffres_sign[i2]=x; i1=i1+1; i2=i2-1; } }
2. Le calcul
Je n'ai pas compris pourquoi tu voulais ajouter des zéros. Je crois qu'à force de buter sur ce code, tu as fini par t'embrouiller. Donc, reprenons tranquillement sur ce qu'il y a à faire:
- On veut additionner a et b, tous deux de type Entier_long
- On inverse a->Chiffres_sign[] et b->Chiffres_sign
- Soit i un index initialisé à zéro
- Soit r un nombre entier initialisé à zéro pour mémoriser la retenue
- Si i est strictement inférieur à a->taille ET à b->taille, alors:
- On calcul chiffre = a->Chiffres_sign[i] + b->Chiffres_sign[i] + r
- Sinon, si i est strictement inférieur à a->taille, alors:
- On calcul chiffre = a->Chiffres_sign[i] + r
- Sinon:
- On calcul chiffre = b->Chiffres_sign[i] + r
- FinSi
- r = chiffre / 10 (division euclidienne, encore appelée division entière, à mémoriser pour le prochain tour)
- chiffre = chiffre % 10
- On pose resultat->Chiffres_sign[i] = chiffre
- On incrémente i de 1
- On repart au numéro 5 tant que i est strictement inférieur à a->taille OU à b->taille
- En sortant de la boucle, si r n'est pas nul, on rajoute un resultat->Chiffres_sign[i] = r
- Puis on inverse à nouveau a et b pour les remettre dans leur état d'origine
Voilà en gros. A prendre avec précautions, car j'ai fait ça vite. La question qu'il faut vite te poser, c'est où tu vas stocker le résultat de l'addition.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* avec ce prototype, la seule façon de récupérer le résultat de * mon addition c'est si a ou b stocke le résultat. Il peut en découler * pas mal de problèmes si tu oublies que les opérandes de ton opération * s'en trouvent modifiées. */ void Addition (Entier_long *a, Entier_long *b); /* tu pourrais retourner le résultat de cette façon, * mais ce ne serait pas très efficace en termes de temps * d'exécution, vu la taille de ton type Entier_long. */ Entier_long Addition (Entier_long *a, Entier_long *b); /* la meilleure alternative, pour moi, c'est d'ajouter un troisième * paramètre, qui serait un pointeur sur la variable où le résultat * doit être stocké. */ void Addition (Entier_long *a, Entier_long *b, Entier_long *resultat);
Ouf! bon, je te laisse méditer tout ça, il est vraiment temps que je retourne au boulot!
Bon courage