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

Delphi Discussion :

besoin d'aide pour fonction de conversion de base


Sujet :

Delphi

  1. #1
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut besoin d'aide pour fonction de conversion de base
    bonzour bonzour

    Alors je dois faire un programme qui converti un nombre d'un base à une autre,
    j'ai fait ca mais bon ca ne marche pas biensur, ca fait 1 semaine me tape la tete contre les murs

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    program final;
    {$APPTYPE CONSOLE}
    uses
      sysutils;
    var
     
    nbch,i,basedep,basefin:integer;
    ch,rep:string;
    erreur,controlsaisie:boolean;
     
    function control (nb:string;basedep:integer):boolean;
    begin
     
    nbch:=length(nb);
    i:=1;
    erreur:= false;
     
    while  (not erreur) and (i <= nbch) do
    begin
    ch:= copy(nb,i,1);
    if (ch > '0 ')and  (ch <'basedep-1')
       then erreur:= true ;
     
    end;
    end;
     
    function conver (basefin:integer;nb:string):string;
    begin
     
    quotient := nb div basefin
    reste := quotient mod basefin
     
    result:= result + intostr(result)
    end;
     
    begin
     
    write('voulez-vous effectuer une conversion ? o/n:');
    readln(rep);
     
    while rep = 'o' do
     
          begin
     
          write('saisir un nombre:');
          readln(nb);
     
          write ('base de depart:');
          readln(basedep);
     
          write ('base de fin:');
          readln(basefin);
     
          controlsaisie:= control (nb,basedep);
     
          if controsaisie:= true
               then writeln('erreur saisie')
               else resultat:= conver(basefin,nb);
     
    write('resultat:',resultat);
     
    write('voulez-vous effectuer une autre conversion ? o/n:');
    readln(rep);
     
          end;
     
    end.

    pensez vous que jsui sur la bonne voie ??

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (ch > '0 ')and  (ch <'basedep-1')
    Y a déjà un problème là je pense
    Ce ne serait pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (StrToInt(ch) > 0) and (StrToInt(ch) < BaseDep - 1)
    ?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    vi je pense que c mieux

  4. #4
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bonjour
    et ailleur
    tu utilise des variables non déclarées
    Quel est ton compilateur ?

    voici le truc une fois compiler :

    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
    59
    60
    61
    62
    uses
      sysutils;
    var
      nbch, i, basedep, basefin : integer;
      ch, rep                   : string;
      erreur, controlsaisie     : boolean;
    
      resultat, nb              : string;
    
    function control (nb:string;basedep:integer):boolean;
    begin
      nbch:=length(nb);
      i:=1;
      erreur:= false;
    
      while  (not erreur) and (i <= nbch) do
      begin
        ch:= copy(nb,i,1);
        if (ch > '0 ')and  (ch <'basedep-1')
           then erreur:= true ;
      end;
    end;
    
    function conver (basefin:integer;nb:string):string;
    var
      reste, quotient : integer;
    begin
     quotient := StrToInt(nb) div basefin;
     reste    := StrToInt(nb) mod basefin;
     result   := intToStr(quotient) + intToStr(reste);
      // Comment penses tu traiter le passage en hexadécimal par exemple ?
    end;
    
    begin
      write('voulez-vous effectuer une conversion ? o/n:');
      readln(rep);
    
      while rep = 'o' do
      begin
        write('saisir un nombre:');
        readln(nb);
    
        write ('base de depart:');
        readln(basedep);
    
        write ('base de fin:');
        readln(basefin);
    
        controlsaisie:= control (nb,basedep);
    
        if controlsaisie
          then writeln('erreur saisie')
          else resultat:= conver(basefin,nb);
    
        writeln('resultat:',resultat);
    
        write('voulez-vous effectuer une autre conversion ? o/n:');
        readln(rep);
    
      end;
    end.
    Disons que ce n'est pas un mauvais début mais ta fonction conver est à poser sur papier il faut je crois traiter chacun des nombres de ton chiffre en focntion de son rang.

    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  5. #5
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    bah... pour lhexa jpensais au code ascii
    je pense mal ?

  6. #6
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Il te faudra utiliser le code ascii, mais il faut aussi que tu tiennes compte de ta base de départ dans ta fonction conver.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  7. #7
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    ok ok donc faut ke jla fasse passer en variable ?

  8. #8
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Ce serait plus réutilisable (+ fonctionnel) mais tes variables étant globale ce n'est pas indispensable.
    Il faut surtout que tu réfléchisse à ce que 111 en base 10 vaut en base 8 et en base 16 et vice versa.

    a+
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  9. #9
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    ok merci
    a+

  10. #10
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    apres quelque modif j'obtient cela

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    program final;
    {$APPTYPE CONSOLE}
    uses
      sysutils;
    var
     
      nbch, i, basedep, basefin, reste, quotient : integer;
      ch, rep,resultat, nb  : string;
      erreur, controlsaisie     : boolean;
     
    function control (nb:string;basedep:integer):boolean;
    begin
     
    nbch:=length(nb);
    i:=1;
    erreur:= false;
     
    while  (not erreur) and (i <= nbch) do
    begin
    ch:= copy(nb,i,1);
    if (StrToInt(ch) > 0) and (StrToInt(ch) < BaseDep - 1)
     
       then erreur:= true ;
     
    end;
    end;
     
    function conver (basedep,basefin:integer;nb:string):string;
    begin
     
     if (basedep=16) and (StrToInt(ch)>=10)
        then ch:= Chr(StrToInt(ch));
     
     quotient := StrToInt(nb) div basefin;
     reste    := StrToInt(nb) mod basefin;
     result   := intToStr(quotient) + intToStr(reste);
     
    end;
     
    begin
     
    write('voulez-vous effectuer une conversion ? o/n:');
    readln(rep);
     
    while rep = 'o' do
     
          begin
     
          write('saisir un nombre:');
          readln(nb);
     
          write ('base de depart:');
          readln(basedep);
     
          write ('base de fin:');
          readln(basefin);
     
          controlsaisie:= control (nb,basedep);
     
          if controlsaisie = true
               then writeln('erreur saisie')
               else resultat:= conver(basedep,basefin,nb);
     
    writeln('resultat:',resultat);
     
    write('voulez-vous effectuer une autre conversion ? o/n:');
    readln(rep);
     
          end;
     
    end.

    ca marche mais pour l'hexa ile me donne le resultat en chiffre par exemple au lieu de me donner 6F il me donne 615 et en octale il fait des erreurs

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Tes variables globales, c'est horrible, et c'est une très mauvaise habitude.

    Pour la conversion en base 16, comme pour les autres, tu lui demandes de convertir un entier en chaine, il t'obéit (comment veux-tu que ton programme devine ton intention de mettre F au lieu de 15, par exemple ?).

    Également : prends l'habitude d'indenter ton code de manière régulière, tu verras que ça simplifie la vie.

    Constatations :

    - du fait de l'utilisation de bases > 10, et que cette utilisation implique celle de symboles spéciaux (comme A à F pour la base 16), il vaut mieux créer des fonctions spéciales pour ces bases.

    - de plus, je ne pense pas qu'il soit utile de prévoir l'utilisation de n'importe quelle base.
    Se limiter aux bases 2,8,10,16 me paraît suffisant (mais ce n'est pas mon programme, évidemment).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  12. #12
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Babou

    Comme j'ai constaté que la conversion d'un nombre d'une base à une autre posait souvent des problèmes, j'ai donc écrit 3 fonctions qui permettent les conversions de nombres depuis la base 2 à la base 36.

    Ces 3 fonctions sont:
    1. DecToBaseN: conversion de la base 10 en base N
    2. BaseNToDec: conversion de la base N en base 10
    3. BaseNToBaseM: convertion de la base N vers la base M


    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    unit uConvertBase;
     
    interface
     
    uses
      Math, SysUtils;
     
    type
      TBase = 2..36;   // Etendue de conversion: de la base 2 à la base 36
                       // caractères utilisés: '0'..'9', 'A'..'Z'
     
      function BaseNToBaseM(const AValue: string; const FromBase, ToBase: TBase): string;
      function BaseNToDec(AValue: string; const FromBase: TBase): Cardinal;
      function DecToBaseN(AValue: Cardinal; const ToBase: TBase): string;
     
    implementation
     
    // Vérifier qu'un nombre appartient à une Base n
    function IsNumInBaseN(AValue: string; const Base: TBase): Boolean;
    var
      I: Integer;
      C: Char;
    begin
      result := True;
      AValue := UpperCase(AValue);
      for I := 1 to Length(AValue) do
      begin
        C := AValue[I];
        if (C in ['0'..'9']) then
          result := result and (StrToInt(C) < Base)
        else if (C in ['A'..'Z']) then
          result := result and ((Ord(C) - 55) < Base)
        else
          result := False;
      end;
      if not result then
        raise Exception.Create(Format('La valeur %s n''appartient pas à la base %d',
                                      [AValue, Base]));
    end;
     
    // Conversion d'un nombre de base N vers une base M
    function BaseNToBaseM(const AValue: string; const FromBase, ToBase: TBase): string;
    begin
      if isNumInBaseN(AValue, FromBase) then
        result := DecToBaseN(BaseNToDec(AValue, FromBase), ToBase);
    end;
     
    // Conversion d'un décimal vers une base n
    function DecToBaseN(AValue: Cardinal; const ToBase: TBase): string;
    var
      Q, R: Integer;
    begin
      result := '';
      repeat
        Q := AValue div ToBase;
        R := AValue mod ToBase;
        if (R > 9) then
          result := Chr(55 + R) + result   // Chr(55 + 10) renvoie 'A'
        else
          result := IntToStr(R) + result;
        AValue := Q;
      until (Q = 0);
    end;
     
    // Conversion d'un nombre de base n en décimal
    function BaseNToDec(AValue: string; const FromBase: TBase): Cardinal;
    var
      I: Integer;
      C: Char;
    begin
      AValue := UpperCase(AValue);
      result := 0;
      for I := 1 to Length(AValue) do
      begin
        C := AValue[I];
        if (C in ['0'..'9']) then
          result := result + Trunc(StrToInt(C) * IntPower(FromBase, Length(AValue) - I))
        else
          result := result + Trunc((Ord(C) - 55) * IntPower(FromBase, Length(AValue) - I));
      end;
    end;
     
    end.
    Une limitation cependant ces fonctions ne fonctionne qu'avec des valeurs positives.

    J'attends vos éventuelles remarques au sujet de ces fonctions, en espérant que ce sera utile au plus grand nombre.

    Bon Week-end
    @+ Claudius

  13. #13
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    oula merci beaucoup!!
    bon jvai analyser et essayer de comprendre

Discussions similaires

  1. besoin d'aide pour fonction split
    Par remitbo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/06/2009, 12h45
  2. Besoin d'aide pour fonction
    Par jbertin9 dans le forum Excel
    Réponses: 5
    Dernier message: 04/02/2009, 11h14
  3. Besoin d'aide pour la jonction de 2 bases
    Par djsava dans le forum Débuter
    Réponses: 6
    Dernier message: 18/10/2008, 01h26
  4. besoin d'aide pour fonction et redirection
    Par roilion dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/09/2008, 10h29
  5. Besoin d'aide pour fonctions OpenSSL..... HELP !!!
    Par aide64 dans le forum Langage
    Réponses: 7
    Dernier message: 12/05/2006, 17h46

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