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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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;
    ...

+ 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