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

Turbo Pascal Discussion :

[TP] Programme de transcodage


Sujet :

Turbo Pascal

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut [TP] Programme de transcodage
    Bonjour
    Je veux réaliser un programme qui permet de convertir un nombre d'une base à une autre.
    Est-ce que je dois utiliser les bases les plus connues ???

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Non, tu peux très bien faire un algorithme générique de changement de base, c'est pas bien compliqué, tape "changement de base" dans google et regarde le premier résultat.

    L'algorithme à implémenter est une simple réécriture de la formule mathématique.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    merci beaucoup
    loceka

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut tp de transcodage
    mon programme de transcodage d'une base a une autre ne marche que pour des nombres entiers, que dois-je ajouter pour des nombres réels et bien sûr signés ??!!

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Pour les nombres réels, le principe reste le même mais c'est un peu plus compliqué.

    Bon, voici la formule de changement de base :

    b1 = base 1, c1_i = i-ème coefficient dans [0..b1[
    b2 = base 2, c2_k = k-ième coefficient dans [0..b2[

    Tout nombre représenté dans la base b1, est associé à un nombre dans la base b2. La relation est :
    Somme_i ( c1_i * b1^i ) = Somme_k ( c2_k * b2^k)

    Le nombre (2,5)_10 (lire 2,5 en base 10) s'écrit en base 2 :
    (2,5)_10 = 1x2^-1 + 0x2^0 + 1x2^2 = (10,1)_2

    Pour le traitement d'un nombre réel, il est donc plus simple de séparer la partie entière et la partie décimale.

    Tu auras donc :
    Partie entière :
    Somme_k_de_0_à_n ( c2_k * b2^k )

    Partie décimale :
    Somme_k_de_-1_à_-m ( c2_k * b2^k )


    Voilà pour les nombres réels. Si de plus ton nombre est négatif, il suffit de le positiver pour effectuer le changement de base puis de le négativer une fois que c'est fait.

    Après, je te laisse trouver comment obtenir les différents coefficients (indice : sers-toi de la division euclidienne).

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    merci beaucoup, je pense pouvoir le faire.

  7. #7
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    salut tous le monde ,voici une fonction qui permet de changer un nombre de n'importe quelle base vers la base 10,mais le probleme est que je ne comprend pas l'instruction mise en bleue
    remarque:cette fonction marche correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function Base10(v1:string;Base:BYTE):LONGINT;          
    var
        i   : BYTE;
        B10 : LONGINT;
    begin
         B10:=0;
         i:=1;
         while i<=  length(v1)do
             begin
            B10:=B10*Base+POS(v1[i],t1)-1;        
             i:=i+1;
            end;
             Base10:=B10
    end;

  8. #8
    Membre émérite
    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
    Par défaut
    1) Utilise la balise CODE.

    2) Mets en forme ton source

    3) Il est incomplet : il manque la constante t1, qui, je suppose, doit probablement contenir une liste des chiffres usuels, plus les caractères censés être utilisés comme chiffres pour les bases supérieures à 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const t1 = '0123456789ABCDEF.......'; // <- c'est bien ça ? j'ai bien deviné ?
    L'instruction en bleue multiplie par la base le résultat précédent de la boucle (ça c'est assez facile à comprendre, si tu n'y arrives pas, il faut étudier mieux que ça la théorie des changements de base), puis ajoute au résultat obtenu la valeur correspondant au "chiffre" de la base donnée, déterminé par sa position dans t1.

    Exemples : si v1[i] est le caractère 'B', pos(v1[i]) renvoit 12 car B est à la douxième place dans t1, et pos(v1[i])-1 renvoit 11, qui est effectivement la valeur traditionnelle de B en base 16 par exemple.

    De même si v1[i] est le caractère '7', pos(v1[i])-1 renvoit 7, etc.

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jal,

    N'oublie pas les balises [code] pour mettre ton code .

    Bon grillé par CapJack, avant que j'aie eu le temps de tout écrire.

    J'étais en train d'écrire à peu près la même chose, mais j'y ajoute :

    Cette manière de faire conduit droit à des erreurs de décodage.

    Exemples :

    Exemple 1 :

    - On veut travailler avec une base = 2,
    - On entre la chaîne 10102501

    Que se passe-t-il : on renvoie une valeur totalement erronée, car on ne fait pas de vérification (ici, des caractères incompatibles avec la base désirée)

    Exemple 2 :

    J'admets que la chaîne de référence suggérée par CapJack est bonne, et donc
    t1 = '0123456789ABCDEF.......'

    - On veut travailler en base 16
    - On entre la chaîne 4aBe

    Même problème que pour le 1er exemple : valeur erronée, car pas de vérification (ici, des caractères en minuscules alors que dans la référence ils sont en majuscules).

    Quand on veut décoder une chaîne de caractère, il faut toujours vérifier qu'elle est compatible avec ce que l'on veut faire.

    Une fonction de décodage doit donc, au minimum, positionner une variable booléenne à true ou false selon que le décodage est bon ou pas.

    A charge alors au programme appelant de gérer le problème s'il reçoit false.

    Je préfère carrément une fonction qui renvoie un booléen, avec mise à jour de la valeur décodée dans une variable passée par adresse, car on peut alors écrire
    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
    ...
    function decode(const chaine : string; var resultat : integer) : boolean;
    ...
    var
      s : string;
      r : integer;
    ...
    { après initialisation de s }
    if decode(s,r) then
    begin
      { code si le décodage a été ok }
    end
    else
    begin
      { s'il y a eu un problème de décodage }
    end;
    ...

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    pour le tableau t je l'ai fais mais je me suis arrété a 'f' est ce que c'est juste? pour la fonction je l'ai fais c bon une qui verifie si le nombre est juste et l'autre qui convertie en majuscule.
    je vs remercie de votre aide.

  11. #11
    Membre émérite
    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
    Par défaut
    je l'ai fais mais je me suis arrété a 'f' est ce que c'est juste?
    Oui si tu n'as pas besoin d'aller au-delà de la base 16.

  12. #12
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    oui mais moi je veus aller au dela de 16...

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Ial,
    Citation Envoyé par nawal.02
    oui mais moi je veus aller au dela de 16...
    Seulement comme exercice ou dans un but bien déterminé ?

    Si c'est à titre d'exercice, ça ne présente pas beaucoup d'intérêt, car si tu sais faire le transcodage pour les bases 2 à 16, les autres ne te poseront pas de problème.

    Je suppose donc que c'est dans un but précis.

    Dans ce cas, il va falloir faire attention aux caractères que tu utiliseras pour représenter les valeurs dans les autres bases.
    Jusqu'à l'utilisation de "Z", pas de problème, c'est après.

    Il existe des choses plus ou moins standard à ce niveau là, je ne sais plus très bien, car je n'ai fait que survoler les textes qui en parlaient.
    En particulier, il me semble qu'il y a des composants de chez M$ qui utilisent la base 64, mais c'est très vague dans mon esprit, je ne suis même plus sûr que ce soit chez M$ .

  14. #14
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    ok j'essayerais de chercher plus. pour votre aide.

  15. #15
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    salut: j'ai un probléme avec cette fonction elle ne veux pas marcher:

    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
    function Base_10(St:string;Base:longint):real;
    var
        i,l,l1,l2,k,r   : longint;
        b1,b2 : real;
        nbr1:string;
        begin        
             i:=1;
             nbr:='';
             l:=length(st);    
             while (st[i]<>'.')and (i<=l) do
                   begin
                        nbr1:=nbr1+st[i];  
                        i:=i+1;                   
                   end;
             l1:= length(nbr1);
             r:=1;
             b1:=0;
             while r<= l1 do
                   begin
                        B1:=B1+(POS(nbr1[r],t1)-1)*power(base,(l1-r));
                        r:=r+1;
                   end;
             if st[i]='.' then
                begin
                     k:=i+1;
     
                     nbr2:='';
                     while i<=l do
                           begin
                                nbr2:=nbr2+st[k];
                                k:=k+1;
                           end;
                     l2:=length(nbr2);
                     j:=1;
                      b2:=0;
                     while j<=l2 do
                           begin
                                b2:=b2+(POS(nbr2[j],t1)-1)*power(base,(l2-j));
                                j:=j+1;
                           end;
                end;
                   Base_10:=b1+b2;
    end;
    c'est une fonction qui permet de convertir un nombre(réel ou entier) de n'importe quelle base vers la base 10.
    ou est le probléme?????

  16. #16
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut modifié
    Lre,

    Ça compile ce truc ?

    J'y vois au moins l'utilisation d'une variable non déclarée, qui entraîne l'utilisation d'une variable non utilisée.

    Je ne suis pas allé plus loin

    Revoici ton code NON CORRIGÉ mis en forme de manière un peu plus classique concernant l'indentation (ce n'est qu'une préférence).
    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
    function Base_10(St: string; Base: longint): real;
    var
      i, l, l1, l2, k, r: longint;
      b1, b2: real;
      nbr1: string;
    begin        
      i := 1;
      nbr := '';
      l := Length(st);    
      while (st[i] <> '.') and (i <= l) do
      begin
        nbr1 := nbr1 + st[i];  
        i    := i + 1;                   
      end;
      l1 := Length(nbr1);
      r := 1;
      b1 := 0;
      while r <= l1 do
      begin
        B1 := B1 + (Pos(nbr1[r], t1) - 1) * power(base, (l1 - r));
        r  := r + 1;
      end;
      if st[i] = '.' then
      begin
        k := i + 1;
     
        nbr2 := '';
        while i <= l do
        begin
          nbr2 := nbr2 + st[k];
          k := k + 1;
        end;
        l2 := Length(nbr2);
        j  := 1;
        b2 := 0;
        while j <= l2 do
        begin
          b2 := b2 + (Pos(nbr2[j], t1) - 1) * power(base, (l2 - j));
          j := j + 1;
        end;
      end;
      Base_10 := b1 + b2;
    end;
    Il serait bon d'aérer le code avec des lignes vides pour séparer les différentes parties du traitement, ET de mettre des commentaires, qui deviennent d'autant plus utiles que le code s'allonge

  17. #17
    Membre confirmé
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    80
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 80
    Par défaut
    merci a tous ceux qui m'on aidé a realisé ce tp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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