IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Pascal Discussion :

Somme de deux entiers de 200 chiffres


Sujet :

Contribuez Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Somme de deux entiers de 200 chiffres
    Voilà, j'ai créé un logiciel en Pascal qui permet de calculer la somme de deux entiers. En Pascal il ne faut pas dépasser 32767 mais avec ce programme on peut dépasser 32767.
    Vos avis sur mon projet svp
    dsl pour mon pauvre français
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    program mfchedly;
    uses wincrt;
    var
      ch1,ch2,ch,ch3:string;
      divx,test1,test2,n1,n2,i,x1,x2,x,e:integer;
    begin
      repeat
        test1:=0;
        writeln('Saisir un entier');
        readln(ch1);
        for i := 1 to length(ch1) do
          if ch1[i] in ['0','1','2','3','4','5','6','7','8','9' ]then
            test1:= test1+1 ;
      until test1=length(Ch1);
      repeat
        test2:=0;
        writeln('Saisir un autre entier');
        readln(ch2);
        for i:= 1 to length (ch2) do
          if ch2[i] in ['0','1','2','3','4','5','6','7','8','9' ]
            then test2:=test2+1  ;
      until test2=length(ch2);
      if length(ch1) > length(ch2)  then
        begin
          for i:= 1 to (length(ch1)-length(ch2))do
            insert('0',ch2,1)
        end
      else
        if length(ch2) > length(ch1) then
          for i:= 1 to (length(ch2)-length(ch1)) do
            insert('0',ch1,1);
      insert('0',ch1,1);
      insert('0',ch2,1);
      x1:=0 ;
      ch3:='';
      for i:= length(ch1) downto 1 do
        begin
          val(ch1[i],n1,e);
          val(ch2[i],n2,e);
          if x1+n2+n1 in [10..19] then
            begin
              divx:=x1+n1+n2;
              divx:= divx mod 10;
              str(divx,ch);
              ch3:=ch+ch3 ;
              x1:=1;
            end
          else
            begin
              x2:=x1+n1+n2;
              str(x2,ch);
              ch3:=ch+ch3;
              x1:=0;
            end;
        end;
      if ch3[1]='0' then delete(ch3,1,1);
      writeln(ch3);
    end.

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 18
    Points
    18
    Par défaut
    sinon,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    program addition;
     
    var
       x : longint;
       y : longint;
     
    begin
     
       writeln('x1 ? ');
       readln(x);
       writeln('x2 ? ');
       readln(y);
     
       writeln('L''addition des deux nombres vaut : ', x+y, '.');
     
    end.
    mais il est limité également

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    C'est un concours ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    program addition;
     
    begin
      writeln('1 + 1 = 2');
      readln;
    end.
    Plus sérieusement, tu devrais revoir ton code et le rendre lisible et compréhensible mf.chedly. Parce que là, c'est illisible, je n'ai même pas pris la peine de regarder vu la tête du code...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Foe,

    Il faut correctement présenter le code (indentation, aération par des lignes vides pour séparer les différents blocs, commentaires...)

    ET éclater tout ça en fonctions/procédures pour rendre le code plus facile à suivre.

    Comme il est écrit, je n'ai pas envie de plonger dans ton code.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    j' ai eu à faire une unité traitant toutes les operations basiques sur des grands entiers (300 chiffres) pour le besion de la cryptographie RSA. Le probleme qui se pose alors est le cout du calcul.
    Je te donne en piece jointe cette unité.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    ouiii mais c'est ma premier pas vers la programmation.
    Merci a vous amis
    La prochaine fois ça sera améliorer

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Heo,

    Pour implémenter une bibliothèque de calcul multi-précision, il faut oublier les char comme tu l'as fait, ce n'est absolument pas efficace (on peut éventuellement s'en servir pour tester les algorithmes, sans plus).

    Pour être efficace, il faut faire de l'assembleur (je ne connais aucun langage, et donc aucun compilateur capable d'optimiser ce genre de calcul), en faisant :

    - Le mot à traiter en une fois (au lieu de char) doit être le type natif du processeur (32 bits sur une machine 32, 64 sur 64... [pour le 64, sous réserve que le système d'exploitation soit lui-même en 64 bits, sinon ça posera des problèmes, et il faut alors se limiter à la taille maxi des mots pour l'OS]).

    - Ce mot doit être traité en non signé, pour profiter au maximum de la capacité du processeur.

    - Pour distinguer nombres positifs/négatifs, on ajoute un mot dans lequel on stocke le signe.

    - Pour connaître la longueur actuelle du nombre, encore un mot pour la stocker.

    Le tout stocké dans un tableau, qui peut être dynamique pour la souplesse, mais il faut alors être attentif pour les allocations (ne jamais diminuer l'allocation faite pour un tableau, sauf besoin impératif de mémoire, et lors de l'augmentation, ajouter une quantité suffisante pour ne pas avoir à recommencer à chaque tour de boucle [en général, on double la longueur réservée chaque fois qu'on a besoin de l'augmenter])

    Bien entendu, cela implique d'écrire ce qu'il faut pour traduire une chaîne contenant le nombre au format de ces données, et inversement, mais c'est facile à faire, une fois qu'on a la division et la multiplication.

    Enfin, une fois les algorithmes "naïfs" implémentés, il faut implémenter des algorithmes plus performants, car il en existe qui permettent de gagner beaucoup en temps de calcul quand la taille des nombres augmente).

    Donc, bon courage si tu veux aller plus loin.
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    On peut aussi utiliser les bonnes vieilles instructions BCD (ou DCB en français) de l'assembleur x86. Je sais ce que tu vas me dire, droggo, c'est moins performant pour les calculs (encore que pour les additions/soustractions je n'en sois pas certain sur un processeur moderne), mais on gagne pour les conversions vers/depuis l'écriture décimale. N'ayant jamais tenté de programmer une multiplication/division en BCD, je ne sais pas pour ces opérations (je m'étais posé la question, mais n'ai jamais eu le temps de le faire).

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Oui vous avez raisons.
    Mais je suis débutant dans le monde de programmation .
    pas à pas j'augmente mes connaissances.
    Merci pour vous

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gai,
    Citation Envoyé par CapJack Voir le message
    On peut aussi utiliser les bonnes vieilles instructions BCD (ou DCB en français) de l'assembleur x86. Je sais ce que tu vas me dire, droggo, c'est moins performant pour les calculs (encore que pour les additions/soustractions je n'en sois pas certain sur un processeur moderne), mais on gagne pour les conversions vers/depuis l'écriture décimale. N'ayant jamais tenté de programmer une multiplication/division en BCD, je ne sais pas pour ces opérations (je m'étais posé la question, mais n'ai jamais eu le temps de le faire).
    C'est bien ce je te dis, et effectivement, c'est moins efficace (ne pas oublier, entre autres, qu'a chaque calcul il faut demander la correction au processeur, et ces opérations n'ont pas vraiment été optimisées [d'ailleurs, je n'en ai jamais réellement compris l'intérêt]), et en plus tu perds de la place, puisque tu n'utilises pas toute la capacité de représentation des valeurs de ton processeur.

    Les conversions ne sont pas le problème de ce genre de bibliothèque, car dès qu'on s'en sert pour des calculs effectifs, donc enchaînés, etc., les conversions ne représentent qu'une toute petite partie de l'exécution (j'ai des programmes qui calculent plusieurs heures ou jours entre 2 conversions ).

    Citation Envoyé par mf.chedly Voir le message
    Mais je suis débutant dans le monde de programmation
    Ma remarque était destinée à t'orienter, pas à te reprocher ce que tu as fait concernant la possibilité de calculer sans limite de taille.
    Si les cons volaient, il ferait nuit à midi.

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    je crois qu'il faut avoir des chose avant de programmer en pascal par exemple des cours d'algorithme.....
    svp que ce qu'il faut faire....

    c'est mieux d'étudier assembleur avant le pascal ou directement vers le c ou avoir une formation en algo !!!!!!!!!!!.
    Aidez moi donnez moi un schéma à suivre pour être un excellent programmeur

  12. #12
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    Citation Envoyé par mf.chedly Voir le message
    je crois qu'il faut avoir des chose avant de programmer en pascal par exemple des cours d'algorithme.....
    svp que ce qu'il faut faire....
    +1 voila http://algo.developpez.com/cours/
    Citation Envoyé par mf.chedly Voir le message
    c'est mieux d'étudier assembleur avant le pascal ou directement vers le c ou avoir une formation en algo !!!!!!!!!!!.
    Aidez moi donnez moi un schéma à suivre pour être un excellent programmeur
    Quelque soit le langage choisi il faut un cours d'algorithme à coté le code Pascal ne fait que traduire l'algorithme en langage pour le compilateur.
    Apres étudier un langage avant un autre comme Assembleur avant Pascal, le choc peut être brutal pour certains mais ça peut justement varier suivant les personnes et donc c'est possible à faire. Pascal déjà te montrera les bonnes bases de la programmation à avoir pour débuter encore l'Assembleur ou C sont encore plus stricte (l'assembleur ça pardonne pas ). Après faut savoir les objectifs qu'on s'est fixé pour choisir ....

    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  13. #13
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Novembre 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci Krachik

Discussions similaires

  1. Somme de deux entiers non signés
    Par Med_be dans le forum Assembleur
    Réponses: 1
    Dernier message: 18/01/2011, 18h55
  2. Somme de deux entiers d'un tableau
    Par beegees dans le forum Cobol
    Réponses: 7
    Dernier message: 10/06/2008, 13h39
  3. Inverser nombre entier de 4 chiffres
    Par zenattitude dans le forum Langage
    Réponses: 3
    Dernier message: 27/11/2005, 15h18
  4. entier à + de 15 chiffres (vb6)
    Par vorx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/05/2005, 20h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo