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

Pascal Discussion :

Conversion de nombres en chiffres romains


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Conversion de nombres en chiffres romains
    Bonjour,

    écrire un programme qui lis une annee ecrite en chiffres arabes, entre le rang de 1 a 2000, et le rendre en numéros romains (I=1, V=5, X=10, L=50,
    C=100, D=500,
    M=1000).

    entrées

    introduire année (de 1 a 2100) => 2008
    introduire année (de 1 a 2100) => 1966
    introduire année (de 1 a 2100) => 2200

    Sorties

    l année 2008 en numéros romains est : MMVIII
    l'année 1966 en numéros romains est : MCMLXVI
    l année 2200 dehors de rang

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Bonjour,

    tu as déjà avancé un peu ton code ?
    tu as quelque chose à nous montrer ?
    quel est exactement ton problème ?

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    en fait, je ne suis un peu perdu, et je ne sais ou je commencerai, mais l'idée est : utiliser des opérations mathématiques (des divisions).... par exemple pour savoir s'il faut ajouter un "M" le nombre romain, il faut diviser l'année ajoutée par clavier PAR 1000, et voir le résultat, Si on entre 2008, le resultat est 2 donc le début d nombre romain est MM, puis on pass à D=500 ...
    .

  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
    Koe,

    Ton programme doit suivre le même algorithme que toi quand tu fais cette conversion à la main.

    Donc, tu écris ça au net, en affinant suffisamment pour traiter tous les cas, et il ne te reste plus qu'à traduire en Pascal. yapuka
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    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
    Citation Envoyé par Manila2 Voir le message
    en fait, je ne suis un peu perdu, et je ne sais ou je commencerai, mais l'idée est : utiliser des opérations mathématiques (des divisions).... par exemple pour savoir s'il faut ajouter un "M" le nombre romain, il faut diviser l'année ajoutée par clavier PAR 1000, et voir le résultat, Si on entre 2008, le resultat est 2 donc le début d nombre romain est MM, puis on pass à D=500 ...
    .
    Et pour 1900 ? 40 ? 9 ?

    Je crains que ton algorithme ne soit trop simple, mais peut-être est-ce déjà un bon angle d'approche.

  6. #6
    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
    J'ai du faire un truc similaire il y a quelques semaines pour un cours d'algorithme.

    Si ça t'interesse, voilà mon programme, ainsi que son énnoncé. Tu arriveras surement à l'améliorer et à le modifié en fonction de se que tu veux faire.

    Ennoncé :
    "Soit a un nombre entier positif. On demande de concevoir un algorithme qui imprime la représentation de ce nombre en chiffres romains.
    Exemple : 317 --> CCCXVII

    On ne tiendra pas compte des conventions que l'on utilise habituellement pour représenter les nombres suivants:

    Pour écrire : 4 9 40 90 et ainsi de suite
    on utilisera : IIII VIIII XXXX LXXXX
    au lieu de : IV IX XL XC

    Le programme imprimera le nombre en chiffres arabes et en chiffres romains. Il pourra éventuellement appliquer répétitivement cette conversion à plusieurs nombres."
    Voici mon code :

    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
    program chiffre_romain;
     
    uses crt;
     
    var
       somme    : integer;
       romain   : array [0..6] of char;
       arabe    : array [0..6] of integer;
       temp_sum : integer;
       i	    : integer;
       a	    : integer;
       g	    : integer;
     
     
    begin
     
       writeln('Entrer un nombre compris entre 0 et 3000 en chiffre arabe : ');
       readln(somme);
     
       clrscr;
     
       romain[0] := 'I'; romain[1] := 'V'; romain[2] := 'X';
       romain[3] := 'L'; romain[4] := 'C'; romain[5] := 'D';
       romain[6] := 'M';
     
       arabe[0] := 1; arabe[1] := 5; arabe[2] := 10; arabe[3] := 50;
       arabe[4] := 100; arabe[5] := 500; arabe[6] := 1000;
     
       i := 6; a := 0;
     
       temp_sum := somme;
     
       write(somme, ' = ');
     
       while (temp_sum > 0) do
       begin
          if (temp_sum div arabe[i] >= 1) then
          begin
     
    	 a := temp_sum div arabe[i];
    	 g := 0;
     
    	 while (g < a) do
    	 begin
    	    write(romain[i]);
    	    g := g+1;
    	 end;
     
          end;
     
          temp_sum := temp_sum mod arabe[i];
          i:= i - 1;
     
       end;
     
       readln();
       clrscr;
     
    end.

  7. #7
    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
    Ce n'est pas un bon service à rendre à quelqu'un, que de lui fournir une solution toute mâchée !

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Tu as tout à fait raison, mais ce code là ne correspond pas à l'énoncé de l'exercice
    C'est tout au plus une base de travail.

  9. #9
    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
    Citation Envoyé par Guardian Voir le message
    Tu as tout à fait raison, mais ce code là ne correspond pas à l'énoncé de l'exercice
    C'est tout au plus une base de travail.
    C'est pour ça que je me suis permis de la poster.

  10. #10
    Membre confirmé
    Avatar de diden138
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    714
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 714
    Points : 589
    Points
    589
    Par défaut Re
    Bonjour,

    Dans le passé j'avais réalisé à peu près le même programme sauf que c'était pour des chiffres (malheureusement je n'ai pas le code sous la main) donc je vais essayer de t'expliquer un peu ma solution et je pense que c'est même mieux qu'un code source tout prêt .
    Avant de commencer, j'avais envie de revenir sur une chose : l'exercice donné par "kaikait" ne correspond pas du tout à ton probléme puisque cet exercice ne tient pas compte des règles dans la numération romaine (on ne peut pas écrire une lettre 4 fois successivement (exemple : XXXX est faux) à part le M, le X est une unité de L et C et j'en passe (LXXXX c'est double faute)...etc) ce n'est tout simplement pas une conversion en chiffres romains .

    Il faut savoir aussi un truc basique sur les chiffres romains :
    • le I est une unité de V et X
    • le X est une unité de L et C
    • le C est une unité de D et M

    Maintenant, pour ma solution c'est simple, je t'explique en gros ce que ça donne.
    Prenons un nombre, par exemple 453.
    Tu décomposes d'abord ton nombre : 453 =4*100+5*10+3*1.
    Ensuite, tu vas convertir chaque partie avec une petite fonction que nous verrons plus tard; ça donnera dans l'exemple cité plus haut CD+L+III=CDLIII.
    Maintenant, voyons à quoi ressemble cette fonction
    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
     
    Fonction Convert_Number_ArabeToRomain(Num:Integer):String;
     var 
       num2:Integer;
       begin
       {1ere chose à faire maintenant c'est de voir dans quel intervalle se situe ton numéro simplement pour voir les lettre que tu va utiliser, est ce qu'il est entre 1-5 ou 5-10 ou 10-50, 50-100,100-500 ou 500 et 1000//}
    toujours dans l'exemple cité plus haut ça donnera: 400 est entre 100 et 500 ok.
     {// maintenant tu vois si ton chiffre est plus proche de la borne supérieur ou inférieur en cas d'égalité tu prends la borne inférieur comme premier symbole //}
        400 est-il plus proche de 500 ou 100 naturellement il est plus proche de 500 donc convert_number_arabetoromain:='D'/ * on prend D comme premier symbole*/
     maintenant on lance une boucle pour continuer la conversion toujours de ce même chiffre(400 dans notre exemple)
        num2:=500;/* borne supérieur et on commence à soustraire un C jusqu'à ce qu'on arrive à 400, pourquoi un C ? parce que c'est une unité de D et M*/
        while num2>num {num= à 400 dans notre exemple} do
         begin
           concat (convert_number_arabetoromain,"C");/* on ajoute le C à la gauche du D rien de nouveau*/
            num2:=num2-100;/* on soustrait*/
          end;
       et tu fais la même chose avec les autres cas ;) 
       end;
    Maintenant, pour convertir un chiffre par exemple : 5462
    1- décomposition du chiffre 5*1000+4*100+6*10+2*1
    2-après un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writeln(convert_number_arabetoromain(5000),convert_number_arabetoromain(400),convert_number_arabetoromain(60),convert_number_arabetoromain(2))
    t'affichera le résultat
    Bon voilà, j'espère que ça t'aidera et si tu as une question pose la
    Cordialement,
    et vint le 20siècle et l'homme se mit à réflechir comme la machine auteur: diden138
    Langage: Pascal,OCaml,Delphi,c/c++.
    Langages web:Xhtml,Css,Php/Mysql,Javascript,Actionscript 2.0
    Plate forme:Windows XP Pro SP2./Red Hat 9.0/SUSE 10.2
    Config :Intel P4 3.2GHZ,2MO cach,512 RAM.
    Outils:Tp7,objective caml,Delphi 6 perso, C++builder 6,Visual C++ Express edition sous win,code-block sous linux(Ubuntu) .

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

Discussions similaires

  1. [Turbo Pascal] Conversion en chiffres romains
    Par lediamant dans le forum Turbo Pascal
    Réponses: 19
    Dernier message: 24/12/2012, 14h29
  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. [Débutant] Ecrire un nombre en chiffres romains !
    Par kriskikout dans le forum Ada
    Réponses: 2
    Dernier message: 05/12/2006, 12h56

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