Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Bistromathique] Avis sur ma Somme

    24 octobre 2019 à 16:55:44

    Bonjour !

    J'ai commencé a essayer d'écrire une fonction Somme pour faire une Bistromathique j'ai réussi à écrire ceci :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *Sum(char *FirstNumber, char *LastNumber)
    {
    	char *Result = NULL;
    	char *TemporaryString = NULL;
    	
    	int Index = 0;
    	int SubIndex = 0;
    	
    	if(strlen(FirstNumber) < strlen(LastNumber))
    	{
    		TemporaryString = FirstNumber;
    		FirstNumber = LastNumber;
    		LastNumber = TemporaryString;
    	}
    
    	Result = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
    	for(Index = 0; Index < strlen(LastNumber); Index++)
    	{
    		if(FirstNumber[Index]-48+LastNumber[Index]-48 < 10)
    		{
    			Result[Index] += FirstNumber[Index]-48+LastNumber[Index];		
    		}
    		else
    		{
    			Result[Index]=FirstNumber[Index]+LastNumber[Index]-58;
    			Result[Index-1] += 1;		
    		}
    	}
    	printf("A : %s",Result);
    	return Result;
    }
    
    
    int main(void)
    {
    	Sum("119","199");
    	return EXIT_SUCCESS;
    }
    

    J'aimerai avoir vos avis s'il vous plaît j'ai essayé tout un tas de tests y compris avec des nombres très grands mais j'imagine que je n'ai pas pu tout anticiper ^^

    Merci Beaucoup

    Bonne Journée

    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2019 à 16:58:58

          Sum("119","999");
      Me donne 118  ?!?
      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2019 à 18:26:28

        Hello,

        Ligne 30: result[index-1] avec index=0 ?

        -
        Edité par edgarjacobs 24 octobre 2019 à 18:27:03

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          24 octobre 2019 à 20:40:33

          "115" + "185"  ne fait pas 300, ça fait "2:0".
          Quand j'étais petit (il y a quelques années) on me disait que les additions se posent de la droite vers la gauche, il y avait une bonne raison.
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            27 octobre 2019 à 10:04:00

            Bonjour tout le monde

            J'ai essayé de réécrire mon code en tenant compte de vos remarques en particulier j'ai changé l'ordre d'évaluation de la Somme

            J'ai maintenant ceci :

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            
            char *Sum(char *FirstNumber, char *LastNumber)
            {
            	int Index = 0;
            	int SubIndex = 0;
            	int Count = 0;
            	char *TemporaryString = NULL;
            	char *Result = NULL;
            
            	if(strlen(FirstNumber) < strlen(LastNumber))
            	{
            		TemporaryString = FirstNumber;
            		FirstNumber = LastNumber;
            		LastNumber = TemporaryString;
            	}
            	
            	Result = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
            	Index = strlen(LastNumber)-1;
            	SubIndex = strlen(FirstNumber)-1;
            	while(Index >= 0)
            	{
            		Result[Count] += FirstNumber[SubIndex]+LastNumber[Index]-48;
            		if(Result[Count] > 57)
            		{
            			Result[Count] -= 10;			
            			Result[Count+1] += 1;
            		}
            		Count++;		
            		SubIndex--;
            		Index--;
            		printf("%s\n",Result);
            	}
            	if(Result[strlen(FirstNumber)] == 1)
            	{
            		Result[strlen(FirstNumber)] = '1';	
            	}
            	printf("%s",Result);
            	return Result;
            }
            
            
            int main(void)
            {
            	Sum("9232","1729");
            	return EXIT_SUCCESS;
            }
            Qu'en pensez vous s'il vous plaît ?

            -
            Edité par WindowsARencontreUnProblemeEtDoitRedemarrer 27 octobre 2019 à 10:14:09

            • Partager sur Facebook
            • Partager sur Twitter
              27 octobre 2019 à 10:51:26

              Je viens de re tester ton code, tel quel, 

                  Sum("9232","1729");

              me donne 16901 au lieu de 10961,  tu as les 5 chiffres dans le désordre !



              • Partager sur Facebook
              • Partager sur Twitter
                27 octobre 2019 à 13:03:02

                rouloude a écrit:

                Je viens de re tester ton code, tel quel, 

                    Sum("9232","1729");

                me donne 16901 au lieu de 10961,  tu as les 5 chiffres dans le désordre !

                Bonjour !

                Effectivement j'aurai du le préciser l'ordre est inversé comme j'ai réécris mon code pour qu'il fasse l'addition de droite à gauche ^^

                J'ai préféré ne pas mettre la partie qui remet le code à l'endroit pour ne pas trop surcharger les choses

                Je l'ai à nouveau réécrit :

                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                
                char *Sum(char *FirstNumber, char *LastNumber)
                {
                	char *Result = NULL;
                	char *TemporaryString = NULL;
                	char *ReverseResult = NULL;
                	int Index = 0;
                	int Count = 0;
                	int SubCount = 0;
                	if(strlen(FirstNumber) < strlen(LastNumber))
                	{
                		TemporaryString = FirstNumber;
                		FirstNumber = LastNumber;
                		LastNumber = TemporaryString;
                	}
                
                	Result = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
                	ReverseResult = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
                	SubCount = strlen(FirstNumber)-1;
                	Count = strlen(LastNumber)-1;
                	while(Count >= 0)
                	{
                		Result[Index] += FirstNumber[SubCount]+LastNumber[Count]-48;
                		if(Result[Index] > 57)
                		{
                			Result[Index]-=10;
                			Result[Index+1]+=1;
                		}
                		Index++;
                		SubCount--;
                		Count--;
                	}
                	if(Result[strlen(Result)-1] < 10)
                	{
                		Result[strlen(Result)-1] += 48;
                	}
                	while(SubCount >= 0)
                	{
                		Result[Index] = FirstNumber[SubCount];
                		SubCount--;
                		Index++;
                	}
                	printf("%s",Result);
                }
                
                
                int main(void)
                {
                	
                	char *FirstInput = (char*)calloc(150,sizeof(char));
                	char *LastInput = (char*)calloc(150,sizeof(char));
                	scanf("%s",FirstInput);
                	scanf("%s",LastInput);
                	Sum(FirstInput,LastInput);
                	return EXIT_SUCCESS;
                }
                

                Il a l'air de mieux marcher mais l'addition  1448485445455454477772211546984 + 5544554549595  donne un résultat faux à un chiffre près selon Wolframalpha je ne comprend pas ou est mon erreur, pourriez vous m'aider s'il vous plaît ?



                • Partager sur Facebook
                • Partager sur Twitter
                  27 octobre 2019 à 13:08:10

                      Sum("119","999");

                  result : 811☺¶

                  C'est pas top !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 octobre 2019 à 13:15:38

                    Brouloude a écrit:

                        Sum("119","999");

                    result : 811☺¶

                    C'est pas top !


                    Bizarre chez moi j'ai bien 8111

                    Mais serait il possible d'avoir un indice de la raison pour laquelle ça ne fonctionne pas s'il vous plaît ?

                    Voici mon code actuel

                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <string.h>
                    
                    char *Sum(char *FirstNumber, char *LastNumber)
                    {
                    	char *Result = NULL;
                    	char *TemporaryString = NULL;
                    	char *ReverseResult = NULL;
                    	int Index = 0;
                    	int Count = 0;
                    	int SubCount = 0;
                    	if(strlen(FirstNumber) < strlen(LastNumber))
                    	{
                    		TemporaryString = FirstNumber;
                    		FirstNumber = LastNumber;
                    		LastNumber = TemporaryString;
                    	}
                    
                    	Result = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
                    	ReverseResult = (char*)calloc(strlen(FirstNumber)+1,sizeof(char));
                    	SubCount = strlen(FirstNumber)-1;
                    	Count = strlen(LastNumber)-1;
                    	while(Count >= 0)
                    	{
                    		Result[Index] += FirstNumber[SubCount]+LastNumber[Count]-48;
                    		if(Result[Index] > 57)
                    		{
                    			Result[Index]-=10;
                    			Result[Index+1]+=1;
                    		}
                    		Index++;
                    		SubCount--;
                    		Count--;
                    	}
                    	if(Result[strlen(Result)-1] < 10)
                    	{
                    		Result[strlen(Result)-1] += 48;
                    	}
                    	while(SubCount >= 0)
                    	{
                    		Result[Index] = FirstNumber[SubCount];
                    		SubCount--;
                    		Index++;
                    	}
                    	printf("%s",Result);
                    }
                    
                    
                    int main(void)
                    {
                    	
                    	char *FirstInput = (char*)calloc(150,sizeof(char));
                    	char *LastInput = (char*)calloc(150,sizeof(char));
                    	scanf("%s",FirstInput);
                    	scanf("%s",LastInput);
                    	Sum(FirstInput,LastInput);
                    	return EXIT_SUCCESS;
                    }
                    



                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 octobre 2019 à 14:21:56

                      WindowsARencontreUnProblemeEtDoitRedemarrer a écrit:

                      Mais serait il possible d'avoir un indice de la raison pour laquelle ça ne fonctionne pas s'il vous plaît ?

                      Oui, tu n'as pas pensé à réserver de la place pour la retenue sur les chiffres les chiffres les plus significatifs. Ici par exemple, ton calloc réserve 4 caractères ce qui n'est pas suffisant si tu veux que la chaine puisse accueillir le zéro terminal.

                      C'est d'ailleurs pour cela que l'affichage foire car le 1 des milliers a écrasé ce zéro terminal.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 octobre 2019 à 16:03:43

                        zoup a écrit:

                        WindowsARencontreUnProblemeEtDoitRedemarrer a écrit:

                        Mais serait il possible d'avoir un indice de la raison pour laquelle ça ne fonctionne pas s'il vous plaît ?

                        Oui, tu n'as pas pensé à réserver de la place pour la retenue sur les chiffres les chiffres les plus significatifs. Ici par exemple, ton calloc réserve 4 caractères ce qui n'est pas suffisant si tu veux que la chaine puisse accueillir le zéro terminal.

                        C'est d'ailleurs pour cela que l'affichage foire car le 1 des milliers a écrasé ce zéro terminal.


                        Effectivement merci beaucoup je ne l'avais pas vu

                        J'ai donc désormais ce code :

                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <string.h>
                        
                        char *Sum(char *FirstNumber, char *LastNumber)
                        {
                            char *Result = NULL;
                            char *TemporaryString = NULL;
                            char *ReverseResult = NULL;
                            int Index = 0;
                            int Count = 0;
                            int SubCount = 0;
                            if(strlen(FirstNumber) < strlen(LastNumber))
                            {
                                TemporaryString = FirstNumber;
                                FirstNumber = LastNumber;
                                LastNumber = TemporaryString;
                            }
                        
                            Result = (char*)calloc(strlen(FirstNumber)+2,sizeof(char));
                            ReverseResult = (char*)calloc(strlen(FirstNumber)+2,sizeof(char));
                            SubCount = strlen(FirstNumber)-1;
                            Count = strlen(LastNumber)-1;
                            while(Count >= 0)
                            {
                                Result[Index] += FirstNumber[SubCount]+LastNumber[Count]-48;
                                if(Result[Index] > 57)
                                {
                                    Result[Index]-=10;
                                    Result[Index+1]+=1;
                                }
                                Index++;
                                SubCount--;
                                Count--;
                            }
                            if(Result[strlen(Result)-1] < 10)
                            {
                                Result[strlen(Result)-1] += 48;
                            }
                            while(SubCount >= 0)
                            {
                                Result[Index] = FirstNumber[SubCount];
                                SubCount--;
                                Index++;
                            }
                            printf("%s",Result);
                        }
                        
                        
                        int main(void)
                        {
                        
                            char *FirstInput = (char*)calloc(150,sizeof(char));
                            char *LastInput = (char*)calloc(150,sizeof(char));
                            scanf("%s",FirstInput);
                            scanf("%s",LastInput);
                            Sum(FirstInput,LastInput);
                            return EXIT_SUCCESS;
                        }
                        

                        J'ai rajouté une case mémoire aux lignes 20 et 21 pour pouvoir y stocker le caractère nul 

                        J'ai fais des tests ( Y compris avec des nombres très grands comme 46145645646416132448789845112+64213131646165164656465464456 qui donne le bon résultat )

                        Mon Code est il donc correct ? ( Outre le fait que la sortie apparaisse encore inversée ) 

                        Merci beaucoup

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 octobre 2019 à 16:13:51

                          La fonction est de type char* mais ne retourne rien.

                          De plus, tu devrais "inviter" l'utilisateur à saisir les 2 nombres.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 octobre 2019 à 17:17:09

                            zoup a écrit:

                            La fonction est de type char* mais ne retourne rien.

                            De plus, tu devrais "inviter" l'utilisateur à saisir les 2 nombres.


                            J'avais prévu de rajouter le return une fois que le code afficherait le bon résultat mais il semblerait que ce ne soit pas le cas malheureusement :(

                            J'ai essayé avec des nombres de différentes tailles comme 5 et 190 qui me donne 190 je ne comprend pas pourquoi je croyais que je gérais les cas de longueurs diffèrentes ligne 40 :(

                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 octobre 2019 à 20:07:47

                              WindowsARencontreUnProblemeEtDoitRedemarrer a écrit:

                              J'ai essayé avec des nombres de différentes tailles comme 5 et 190 qui me donne 190 je ne comprend pas pourquoi je croyais que je gérais les cas de longueurs diffèrentes ligne 40 :(

                              Bizarre, ton programme m'affiche 951, ce qui correspond bien à 195.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 octobre 2019 à 19:24:07

                                Tu devrais faire un revstr à la fin sur le tableau que tu as utilisé pour stocker les caractères
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [Bistromathique] Avis sur ma Somme

                                × 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.
                                • Editeur
                                • Markdown