#include "include/my.h"
#include <unistd.h>
#include <stdio.h>
char *classic_add(char *str1, char *str2)
{
char *result;
int cnt = 0;
int rest;
int i = my_strlen(str1) - 1;
int j = my_strlen(str2) - 1;
result = malloc(sizeof(char) * (i + j + 2));
/* rest = (str1[i] - '0') + (str2[j] - '0');*/
while (i >= 0 && j >= 0 || cnt >= 0)
{
rest = (str1[i] - '0') + (str2[j] - '0');
if (rest < 9){
result[cnt] = rest + '0';
} else {
result[cnt] = (rest % 10) + '0';
rest = rest + 1;
}
if (str1[i] == '\0' || str2[j] == '\0')
return;
i--;
j--;
cnt++;
}
my_putstr(result);
free(result);
return (result);
}
int main(int ac, char **av)
{
if (ac != 3)
my_putstr("Enter two strings please !\n");
else
classic_add(av[1], av[2]);
return 0;
}
Donc voilà, je n'arrive pas à implementer correctement la gestion des retenus. Aussi, avez vous un algorithme qui puisse me permettre de réussir l'exiercice plus aisément ?
Mon idéé était :
-Venir à la fin des deux chaines;
-Additioner sous forme de décimal le calcul des deux chiffres des unités;
-Stocker dans un tableau sous forme de charactères;
-Passer aux dizaines
-Si la 1ere addition donne plus de 10, ajouter 1 à la seconde opération;
-Faire cela à l'infini tant que le parcours d'une des deux chînes n'est pas encore fini.
Voîlà mon idée... Mais l'implémentation me gène vrament...
Votre aide me searait grandement utile...
- Edité par JuniorMedehou 21 octobre 2019 à 20:40:25
int r=0;
....
while(....) {
int sum=s1[i]-'0'+s2[j]-'0'+r;
if(sum>9) {
sum-=10;
r=1;
}
else
r=0;
result[....]=sum+'0';
....
}
À part ça, tu oublies que les chaines additionnées peuvent ne pas être de la même longueur (il faut terminer de remplir result avec la chaine la plus longue), que si les chaines ont la même longueur tu peux toujours avoir un report, et tu remplis le résultat à partir de la gauche. Et free(result) avant un return(result) Vas sérieusement falloir bosser
- Edité par edgarjacobs 21 octobre 2019 à 21:06:03
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Tu aurais pu nous dire pour quelle ligne tu obtiens le segfault.
En donnant le programme complet, j'aurais pu essayer, mais comme tu as des fonctions dont on ne connait pas le comportement ...
Sinon, pourquoi le -1 aux lignes 6 et 7?.
Autre remarque: à ta place je parenthéserais l'expression booléenne de la ligne 11 à moins que tu maîtrises suffisamment ton compilateur pour savoir lequel du ET et du OU va être exécuté en premier.
Perso je pense à la ligne vingt où je dois faire passer à chaque fois les valeurs de sum + '0' dans un tableau. Je me demande aussi si le compteur du tableau (cnt) est bien conditionner dans le while. Parce que je veux qu'à chaque tour de boucle, il me stocke la valeur de sum sous forme de caractère.
Pour les fonctions, my_putstr me permet de display le contenu d'une chaine de caractères et my_strlen reproduit le comportement de strlen.
- Edité par JuniorMedehou 22 octobre 2019 à 5:45:13
Perso je pense à la ligne vingt où je dois faire passer à chaque fois les valeurs de sum + '0' dans un tableau.
Un debogueur te permettra de connaitre précisément la ligne qui provoque le segfault, même si l'erreur peut être antérieure, mais on y verra plus clair.
JuniorMedehou a écrit:
Je me demande aussi si le compteur du tableau (cnt) est bien conditionner dans le while.
Vu que cnt est initialisé à 0 et ne peut plus être qu'incrémenté, je ne comprends pas la présence du test cnt >= 0 dans le while.
JuniorMedehou a écrit:
Pour les fonctions, my_putstr me permet de display le contenu d'une chaine de caractères et my_strlen reproduit le comportement de strlen.
Dans ce cas, pourquoi ne pas utiliser les vraies fonctions puts et srtlen?
Je répète également la question à laquelle tu n'as pas répondu:
Le -1 est dû au fait que j'ai besoin de me retrouver en fin de tableau... Or strlen me mettra à la position du \0. Du coup j'ai juste fait -1 pour être au dernier caractère..
Le malloc, il est bien trop grand ! Il devrait être de la taille de la plus grande des deux chaînes + 2 (1 au cas de la retenue si les deux chaînes ont une longueur identique et un pour le '\0' .
Je vois... Bon, en corrigeant pas mal de chose j'ai fini par arrivé à un code un peu plus simple à écrire.
char *classic_add(char const *str1, char const *str2)
{
int k = 0;
int rest = 0;
int i = my_strlen(str1) - 1;
int j = my_strlen(str2) - 1;
char *result = malloc(sizeof(char) * (i + j +1 ));
int dec_i;
int dec_j;
while (i >= 0 || j >= 0 || rest != 0){
dec_i = (i >= 0) ? str1[i] - '0' : 0;
dec_j = (j >= 0) ? str2[j] - '0' : 0;
result[k] = ((dec_i + dec_j + rest) % 10) + '0';
rest = (dec_i + dec_j + rest) / 10;
i--;
j--;
k++;
}
result[k] = '\0';
result = my_revstr(result);
my_putstr(result);
return (result);
}
Voilà un peu. Mais le programme plante sur certains calculs... Le truc, c'est que pour certains grand nombre... C'est un peu comme si je sautais une case...
- Edité par JuniorMedehou 23 octobre 2019 à 10:45:26
Mais le programme plante sur certains calculs... Le truc, c'est que pour certains grand nombre...
Il y a certaines erreurs à certaines lignes.
- Edité par michelbillaud 23 octobre 2019 à 11:08:16
Aide sur un programme d'addition infinie
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Voilà ce que ça donne mais là je me retrouve avec un segfault... Je ne vois pas bien oû se situe le problême...
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent