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 :

Conversion en chiffres romains


Sujet :

Turbo Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Conversion en chiffres romains
    Bonjour

    Je ne trouve pas l'erreur de mon programme. Quand je compile c'est ok mais quand je le teste, ça ne fonctionne pas.
    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
    program rom;
    uses crt;
    var
      nombre : integer;
     
    procedure romain(var n :integer;limite :integer;txt:string);
     
             Begin
     
                  while n >=limite do
     
                  write ('txt');
                  n:=n-limite;
             end;
     
    Begin
       clrscr;
       repeat
             gotoxy(1,1);
             write ('Entrez un nombre (de 1 à 10000) : ');
             clreol;
             readln(nombre);
       until (nombre>0)and(nombre<=10000);
     
       gotoxy(1,3);
       write('Le nombre ',nombre,' correspond en romain : ');
     
       romain (nombre,1000,'M');
       romain (nombre,999,'IM');
       romain (nombre,900,'CM');
       romain (nombre,500, 'D');
       romain (nombre,400,'CD');
       romain (nombre,100, 'C');
       romain (nombre,99, 'IC');
       romain (nombre,90, 'XC');
       romain (nombre,50,  'L');
       romain (nombre,49, 'IL');
       romain (nombre,40, 'XL');
       romain (nombre,10,  'X');
       romain (nombre,9,  'IX');
       romain (nombre,5,   'V');
       romain (nombre,4,  'IV');
       romain (nombre,1,   'I');
     
     readln;
     
    end.
    Pouvez-vous m'aider ?
    Merci

  2. #2
    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
    Noe,

    Retour à la base, c'est à dire papier + crayon, et tu suis ton programme ligne à ligne, en notant toutes les valeurs des variables.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure romain(var n :integer;limite :integer;txt:string);
    Begin
     while n >=limite do
      write ('txt');
     n:=n-limite;
    end;
    ce bout de code peu conduire à une boucle infinie. Je crois que u devrais ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure romain(var n :integer;limite :integer;txt:string);
    Begin
     while n >=limite do
      begin
       write ('txt');
       n:=n-limite;
      end;
    end;
    Quand je compile c'est ok mais quand je le teste, ça ne fonctionne pas
    Qu'enend tu par "ne fonctionne pas?"?
    Pense à mettre des balise code (#), et bien identer on code.

  4. #4
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Bonjour,

    Ton programme compile sans problème avec FreePascal (je n'utilise plus Turbo et conseille de ne plus le faire, Free est totalement compatible).
    Mais il y a une (autre) erreur qui l'empêche de fonctionner correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure romain(var n :integer;limite :integer;txt:string);
    Begin
     while n >=limite do
      begin
       write ('txt'); { Faux ! Ceci écrit la chaîne 'txt' à la place du du chiffre romain à cause des apostrophes}
       n:=n-limite;
      end;
    end;
    Il faut donc que ta procédure ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure romain(var n :integer;limite :integer;txt:string);
    Begin
     while n >=limite do
      begin
       write (txt);
       n:=n-limite;
      end;
    end;
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    ce bout de code peu conduire à une boucle infinie. Je crois que u devrais ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure romain(var n :integer;limite :integer;txt:string);
    Begin
     while n >=limite do
      begin
       write ('txt');
       n:=n-limite;
      end;
    end;
    Qu'enend tu par "ne fonctionne pas?"?
    Pense à mettre des balise code (#), et bien identer on code.
    Merci Darrylsite grâce à toi ça fonctionne (ca ne boucle+ à l'infinie).
    Mais pq faut-il mettre 2 begin et 2 end;
    Désolé de cette question mais j'essaie de comprendre pour ne + commettre des erreurs

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    cadeaux ... (voir pj)

    à savoir que la norme des chiffres romain c'est 1 à 3999 et non 1 à 10000!

    en gros, les romains ne savaient pas et n'avaient pas besoin de compter au delà de 4000 et n'avaient pas la notion des nombres négatif.
    Fichiers attachés Fichiers attachés
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par lediamant Voir le message
    Merci Darrylsite grâce à toi ça fonctionne (ca ne boucle+ à l'infinie).
    Mais pq faut-il mettre 2 begin et 2 end;
    Désolé de cette question mais j'essaie de comprendre pour ne + commettre des erreurs
    La différence entre les deux extraits de code suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while n >=limite do
      begin
       write ('txt');
       n:=n-limite;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while n >=limite do
      write ('txt');
     n:=n-limite;
    est que, dans le premier, c'est tout le bloc délimité par begin et end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       write ('txt');
       n:=n-limite;
    qui est exécuté à chaque itération de la boucle alors que, dans le second, seule l'instruction
    est exécutée et donc n n'est jamais modifié, d'où la boucle infinie.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Citation Envoyé par lediamant Voir le message
    Merci Darrylsite grâce à toi ça fonctionne (ca ne boucle+ à l'infinie).
    Je persiste à dire que ton programme ne fonctionne pas et ne peut pas fonctionner correctement (voir mon post précédent). Compile et teste ton programme, tu verras ...
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  9. #9
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    cadeaux ... (voir pj)

    à savoir que la norme des chiffres romain c'est 1 à 3999 et non 1 à 10000!

    en gros, les romains ne savaient pas et n'avaient pas besoin de compter au delà de 4000
    Ceci est faux. Les Romains avaient bien entendu besoin de compter au-delà de 3999 (il suffit pour cela de lire les documents comptables du port d'Avignon par exemple et on comprend l'énorme machine économique et la rigueur de la comptabilité que cela suposait ...). Simplement le système changeait à 3999 : pour exprimer un nombre supérieur ils utilisaient le système du surlignement :

    _
    V = cinq mille
    __
    VICCCLI = 6351 etc.

    Référence : Vicipaedia (attention c'est en latin mais facile à comprendre)

    Citation Envoyé par Vicipaedia
    Linea super numerum indicat miliens

    ____
    CLXI = miliens CLXI = 161 x 1000 = 161 000

    Et même les centaines de milliers !

    Citation Envoyé par Vicipaedia
    Linea super numerum et lineae verticales indicant centiens milia
    _____
    |LVI| = centiens milia LVI = 56 x 100 x 1000 = 5 600 000 (lege: quinquagiens sexiens centena milia)
    De plus tout n'était pas standardisé, il y a avait donc des variantes. Par exemple : IV pouvait aussi s'écrire IIII (regardez vos montres à aiguilles ou vos pendules), 9 pouvait aussi s'écrire VIIII et pour 49 on avait 3 possibilités : XLIX / XXXXIX / IL
    Toutes ces variantes sont attestées dans différents documents. Nous avons retenu la forme principale le plus souvent, i.e celle qui était la plus utilisée dans l'empire mais cela dépendait des régions en fait.

    Un programme correct de conversion doit tenir compte évidemment de ces variantes.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  10. #10
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    ce que je disais c'etait plus pour plaisanter qu'autre chose.

    j'ai écris cette unité sur un autre site. on y parle justement de la notation "moderne" des chiffres romains et j'y explique pourquoi j'ai volontairement limité l'unité aux chiffres romains de 1 à 3999.
    par contre, il me semble que ma fonction est tout à fait compatible avec les chiffres romain exotique, c'est uniquement les validations d'intervalles qui limite les nombres possible en entrée.
    mais qu'on entre IV ou IIII, elle renverra 4, IX ou VIIII elle renverra 9... aucun problème.
    par contre, c'est dommage, il semblerai que tout les commentaires de florenth, qui m'avais aider a l'époque ont disparus...

    par ailleurs il y a eu un portage Java fait par DJE_JAY, il fournis le liens dans le liens que j'ai mis.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  11. #11
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Désolé, je n'avais pas compris.

    => J'ai téléchargé ton unité et je vais regarder ça dès que j'ai un moment. j'avais fait un programme similaire en TurboPascal objet (c'était un de mes premiers objets ...) V.6 le tien est probablement plus développé, je n'avais pas traité le surlignement par exemple.

    NB : après avoir relu ton post et le fil en lien, il y a une erreur : la notation "moderne" dont parle un des contributeurs n'a pas de sens. Les éléments que je donne (et les exemples qu'il donne) étaient en usage dès les haut Empire, il n'y a aucune "modernité" là-dedans. Depuis les Etrusques on savait compter bien au-delà de 3999, ceci est une grave erreur historique.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  12. #12
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    je vois que tu maitrise parfaitement l'histoire des chiffres romains !

    tu es prof ?

    en tout cas, tu peux tout à fait utiliser la base de mon unité pour l'améliorer.
    ça peux te faire gagner du temps, au cas ou.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  13. #13
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    C'est ça

    Très exactement je suis prof de lettres ... ce qui est étrange pour quelqu'un qui programme mais j'ai fait aussi des études de linguistique et dans ce cadre j'ai eu un module (en maîtrise) de programmation et langages en ... BASIC que j'ai lâché très tôt pour le Pascal (auquel je suis revenu après un détour par Python qui est très bon aussi je trouve mais je préfère la compilation pour des raisons d'environnemnt professionnel).

    Je vais regarder de près ton unité dans quelque temps et piquer tes idées () pour améliorer mes objets.

    Merci pour ce code.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  14. #14
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    he ben ... je me sens tout petit avec mes deux BTS d'un coups

    prof de lettres ... j'ai intérêt à corriger mes fautes...
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  15. #15
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Ben, franchement, c'est plutôt moi qui ait à apprendre ici ...

    Ce ne sont pas les diplômes qui sont importants mais ce qu'on est capable de faire (avec ou sans). Et je suis bien placé pour savoir que l'université fabrique un nombre non négligeable de crétins diplômés (heureusement cela reste une minorité quand même).
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  16. #16
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32

    Informations forums :
    Inscription : Décembre 2012
    Messages : 2
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par droggo Voir le message
    Noe,

    Retour à la base, c'est à dire papier + crayon, et tu suis ton programme ligne à ligne, en notant toutes les valeurs des variables.
    comment ecrire les chiffre romain sur turbo pascal svp édit moi

  17. #17
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Voila la réponse :

    Unité RomanUtils.pas / Delphi, adaptable TurboPascal

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    {
    RomanUtils unit v0.0.1.3 - 03/11/2006
    Main code :
    Deefaze [f0xi/Dr.Who - delphifr/www.developpez.com] 5/11/2005
    Additionnal code :
    Florenth - delphifr
    Special thanks :
    Delphiprog - delphifr
    Florenth - delphifr
    RomanUtils link, news and support :
    delphifr
    }
    UNIT RomanUtils;
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    INTERFACE
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // INTERFACE_USES ----------------------------------------------------------------------------------
    USES SysUtils, Dialogs, math;
    // INTERFACE_FUNCTIONS -----------------------------------------------------------------------------
    Function IsRomanNumber(const RN : string) : boolean; overload;
    Function IsRomanNumber(const I : integer) : boolean; overload;
    Function RomanCharToValue(const RV : char) : integer;
    Function RomanToInt(const RN : string) : integer;
    Function IntToRoman(const I : integer) : String;
    // INTERFACE_VARS ----------------------------------------------------------------------------------
    VAR
    RomanValidWarnMessage : string;
    RomanRangeWarnMessage : string;
    RomanDisableWarnMessage: boolean = false;
    // INTERFACE_CONSTS --------------------------------------------------------------------------------
    CONST
    RomanNumber = ['I','V','X','L','C','D','M'];
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    IMPLEMENTATION
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // MESSAGE_ROMANNOTVALID (private) ----------------------------------------------------------------
    procedure Message_RomanNotValid(const value : string);
    begin
    if length(RomanValidWarnMessage) = 0 then
    RomanValidWarnMessage := 'not a valid Roman number.';
    MessageDlg(format('<%s> %s',[value,RomanValidWarnMessage]),mtWarning,[mbOk],0);
    end;
    // MESSAGE_OUTOFROMANRANGE (private) ----------------------------------------------------------------
    procedure Message_OutOfRomanRange(const value : integer);
    begin
    if length(RomanRangeWarnMessage) = 0 then
    RomanRangeWarnMessage := 'not in interval';
    MessageDlg(format('<%d> %s 1 > 3999.',[value,RomanRangeWarnMessage]),mtWarning,[mbOk],0);
    end;
    // ROMANCHARTOVALUE --------------------------------------------------------------------------------
    function RomanCharToValue(const RV : char) : integer;
    begin
    result := 0;
    case RV of
    'I','i' : result := 1;
    'V','v' : result := 5;
    'X','x' : result := 10;
    'L','l' : result := 50;
    'C','c' : result := 100;
    'D','d' : result := 500;
    'M','m' : result := 1000;
    end;
    end;
    // ISROMANNUMBER -----------------------------------------------------------------------------------
    function IsRomanNumber(const RN : string) : boolean;
    var oc : integer;
    begin
    result := true;
    for oc := 1 to length(RN) do
    if not (Rn[oc] in RomanNumber) then begin
    result := false;
    exit;
    end;
    end;
    function IsRomanNumber(const I : integer) : boolean;
    begin
    result := (I >= 1) and (I <= 3999);
    end;
    // ROMANTOINT --------------------------------------------------------------------------------------
    function RomanToInt(const RN : string) : integer;
    var oc, OldRV, NewRV : integer;
    begin
    Result := 0;
    OldRV := 0;
    if IsRomanNumber(RN) then begin
    for oc := 1 to length(RN) do begin
    NewRV := RomanCharToValue(RN[oc]);
    if NewRV > OldRV then
    inc(Result, NewRV-(OldRV shl 1))
    else
    inc(Result, NewRV);
    OldRv := NewRV;
    end;
    end else begin
    if RomanDisableWarnMessage = false then
    Message_RomanNotValid(RN);
    end;
    end;
    // INTTOROMAN --------------------------------------------------------------------------------------
    const
    _RRUTR : array [0..9] of string = ('','I','II','III','IV','V','VI','VII','VIII','IX');
    _RRDTR : array [0..9] of string = ('','X','XX','XXX','XL','L','LX','LXX','LXXX','XC');
    _RRCTR : array [0..9] of string = ('','C','CC','CCC','CD','D','DC','DCC','DCCC','CM');
    _RRMTR : array [0..9] of string = ('','M','MM','MMM','','','','','','');
    function IntToRoman(const I : integer) : string;
    begin
    result := '';
    if IsRomanNumber(i) then begin
    case I of
    0..9 : Result := _RRUTR[i];
    10..99 : Result := _RRDTR[i div 10]+
    _RRUTR[i mod 10];
    100..999 : Result := _RRCTR[i div 100]+
    _RRDTR[i div 10 mod 10]+
    _RRUTR[i mod 10];
    1000..3999 : Result := _RRMTR[i div 1000]+
    _RRCTR[i div 100 mod 10]+
    _RRDTR[i div 10 mod 10]+
    _RRUTR[i mod 10];
    end;
    end else begin
    if RomanDisableWarnMessage = false then
    Message_OutOfRomanRange(I);
    end;
    end;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  18. #18
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Elle est jolie ton unité, Dr.Who. J'en ai fait une adaptation pour FlashPascal.

    Il y a toutefois un passage que je ne comprends pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          if NewRV > OldRV then
            inc(Result, NewRV-(OldRV shl 1))
          else
            inc(Result, NewRV);
    Pourrais-tu l'expliquer ?
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Elle est jolie ton unité, Dr.Who. J'en ai fait une adaptation pour FlashPascal.
    Excellent
    Citation Envoyé par Roland Chastain Voir le message
    Il y a toutefois un passage que je ne comprends pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          if NewRV > OldRV then
            inc(Result, NewRV-(OldRV shl 1))
          else
            inc(Result, NewRV);
    Pourrais-tu l'expliquer ?
    ça m'a surpris aussi au début mais en fait c'est logique, à chaque boucle le nombre est ajouté, si le nombre suivant est plus grand que le précédent il faut ajouter la différence des deux mais comme il a déjà été ajouté une fois il faut le retirer 2 fois (shl 1 = * 2)

    IV
    +1
    +(5-(2*1))
    = 4
    
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    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
    Citation Envoyé par Paul TOTH Voir le message
    Excellent

    ça m'a surpris aussi au début mais en fait c'est logique, à chaque boucle le nombre est ajouté, si le nombre suivant est plus grand que le précédent il faut ajouter la différence des deux mais comme il a déjà été ajouté une fois il faut le retirer 2 fois (shl 1 = * 2)
    J'adore les sources du dixième Doctor. Je vois de plus en plus très peu de développeur utilisant des opérations bit à bit ou des optimisation bas niveau dans leur code.

Discussions similaires

  1. Conversion décimal vers chiffres romains
    Par sofiane1255 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 27/04/2013, 14h13
  2. Conversion d'un nombre nb arabe en chiffres romains
    Par zebrac dans le forum Général Python
    Réponses: 7
    Dernier message: 22/11/2012, 18h55
  3. [JavaScript] Conversion de chiffres arabes en chiffres romains et inversement
    Par danielhagnoul dans le forum Contribuez
    Réponses: 1
    Dernier message: 05/11/2012, 07h48
  4. Conversion de nombres en chiffres romains
    Par Manila2 dans le forum Pascal
    Réponses: 9
    Dernier message: 13/11/2008, 15h42
  5. Conversion de chiffres en lettres
    Par Driss35 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 30/01/2006, 15h23

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