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

 C Discussion :

Convertisseur Notation romaine => arabe et inversement


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Convertisseur Notation romaine => arabe et inversement
    Voila alors j'ai un devoirs à en programmation en C et quoi que je fasse je bloque:

    On souhaite écrire un programme qui convertit un nombre écrit en chiffres arabes saisi
    par l’utilisateur en notation romaine et inversement un nombre écrit en chiffres romains
    en notation arabe.
    Par exemple, si la suite de caractères est 321, la valeur affichée est CCCXXI.
    Rappel correspondance:
    I=1
    V=5
    X=10
    L=50
    C=100
    D=500
    M=1000

    Pour simplifier, on suppose que les chiffres romains sont toujours écrit de la plus grande
    valeur à la plus petite, ainsi 4 s’écrira IIII, et non pas IV, 40 s’ écrira XXXX, et non pas XL,et ainsi de suite. Par exemple, on suppose que le nombre 14 s’écrit XIIII, et non pas XIV ; de même, on suppose que le nombre 499 s’ écrit CCCCLXXXXVIIII, et non pas CDXCIX.

    1. Il faut d’abord tester si le nombre à convertir est donné exclusivement en chiffres
    romains ou arabes. Dans tous les autres cas, la saisie n’est pas valide. Ecrivez un
    programme principal qui effectue la saisie et les tests nécessaires.

    2. Si l’utilisateur a saisi un nombre en chiffres arabes, nous allons procéder par soustractions successives pour afficher un par un les chiffres en notation romaine. Ecrivez le code qui effectue cet affichage.

    3. Si l’utilisateur est en train de saisir un nombre en chiffres romains, nous allons
    calculer la valeur correspondante au fur et à mesure en ajoutant la valeur de chaque
    chiffre romain saisi.

    4. Ajoutez les conversions au programme principal de la question 1 et testez votre
    code.


    Voila j'aurais besoin de vous pour la question 1: autant les questions 2 et 3 je pense pouvoir les faire tout seul, autant la une je suis dessus depuis une heure et rien à faire je ne trouve pas comment mettre cela dans mon code.

    J'ai bien compris que d'un coté les chiffres arabes et seulement les chiffres sont acceptés. de l'autre les chiffres romains et seulement es chiffres romains sont acceptés mais impossible de trouver le moyen de coder cela.

    Pouvez vous m'aider ?

    En vous remerciant d'avance,

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Qua,

    Pour la notation arabe, seuls les caractères 0 à 9 sont admissibles, pour la romaine, seuls I, V, X, L, C, D et M sont acceptés (en majuscules ou minuscules, à condition de rester cohérent : tous majuscule, ou tous minuscule).
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Bonsoir,

    Merci pour cette réponse mais je vous avoue que cela ne règle en rien mon problème:
    Je vous montre ce que j'ai commencé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <cini.h>
     
     
    int main() {
    int arabe;
    char romain;
     
    printf("Veuillez saisir une valeure en chiffre romain ou arabe : ");
     
    if (scanf("%d", &arabe) != 1) {
    printf("Erreur fatale a la saisie\n");
    return -1;
    }
    }
    Comment puis je faire pour rajouter un scan f qui n'accepte qu'une suite aleatoire de X, V I etc ... ? Ai-je bien commencé ou je pars sur une mauvaise base?

    Merci,

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Koa,

    Il faut lire une chaîne de caractères, PUIS tester son contenu.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Je pense que tu t'y prends mal.

    La raison est simple : la consigne dit que ton utilisateur entre son nombre comme il le souhaite et que tu dois déterminer s'il a entré un nombre romain, un nombre arabe, ou une chaine invalide. Il te faut donc récupérer une chaine avec la fonction dédiée fgets (interdiction d'utiliser la fonction http://man.developpez.com/man3/fgets.3.php#L6, voir partie Bogues !), en utilisant un buffer de taille arbitraire suffisant (à toi de choisir, sois généreux mais pas trop non plus ^^)

    Il te faut ensuite une fonction prend en paramètre une chaine et qui définit si c'est un nombre arabe / romain / invalide.

    Il te faut deux fonctions de conversion qui prennent une chaine et rendent une chaine ou un nombre (attention à celle avec le retour de type chaine à l'allocation de la mémoire ^^).

    Et ensuite tu assembles le tout

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    donc quelque chose qui ressemblerait a 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
    #include <cini.h>
     
     
    int main() {
    int arabe;
    char romain [7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
    if(scanf(" %d", &arabe)!=1) {
          printf("Erreur fatale a la saisie\n");
          return -1;
      }
      if(scanf(" %s", &romain)!=1) {
    	  printf("Erreur fatale a la saisie\n");
          return -1;
      }
     
    printf("Veuillez une valeure : ");
     
      }

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par krolle666 Voir le message
    donc quelque chose qui ressemblerait a 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
    #include <cini.h>
     
     
    int main() {
    int arabe;
    char romain [7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
    if(scanf(" %d", &arabe)!=1) {
          printf("Erreur fatale a la saisie\n");
          return -1;
      }
      if(scanf(" %s", &romain)!=1) {
    	  printf("Erreur fatale a la saisie\n");
          return -1;
      }
     
    printf("Veuillez une valeure : ");
     
      }
    Ouch pas vraiment
    Encore la saisie de l'int peut à la rigueur aller mais la saisie de "romain"...
    Déjà comme romain est un tableau (donc une adresse), pas de "&" dans scanf. Mais surtout étant donné que la saisie écrase ce qui s'y trouve auparavant, tchao tes valeurs 'I', 'V', 'X' etc......

    1) tu fais saisir quelque chose (on ne sait pas quoi) => donc ce sera saisi dans une chaine via fgets()
    2) tu analyses cette chaine pour déterminer si l'utilisateur a entré
    • des chiffres arabes => dans ce cas tu fais la conversion et affiche la même valeur en chiffres romains
    • des chiffres romains => dans ce cas tu fais la conversion et affiche la même valeur en chiffres arabes
    • autre chose => ce cas est le seul qui reste si la chaine ne correspond pas aux deux précédents => là tu affiches un message d'erreurs


    Astuce expliquée par droggo pour déterminer de quoi est composé la chaine: une chaine ne contenant que des caractères allant de '0' à '9' est une chaine de chiffres arabes. Une chaine ne contenant que des caractères se trouvant dans le tableau "romain" est une chaine de chiffres romains.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Ouch pas vraiment
    Tu es trop gentil, j'aurai dit vraiment pas.

    Il te faut un moyen de lire l'entree clavier qui accepte tout, puis ensuite seulement tu feras le tri.
    Pour tout recuperer, je te conseille la lecture de la page suivante.

    L'idee est donc la suivante :
    Tu recuperes tout dans une chaine (ou equivalent)
    Tu regardes s'il n'y a que des entiers :
    Oui -> notation arabe
    Non -> regarder s'il n'y a bien que des I V X L D C M
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. Convertisseur codage couleur HTML/Hexadécimale et inversement
    Par ProgElecT dans le forum Vos contributions VB6
    Réponses: 2
    Dernier message: 17/07/2015, 15h10
  2. [C++0x] Convertisseur de chiffre arabe en romain
    Par Xanto dans le forum Langage
    Réponses: 5
    Dernier message: 30/07/2010, 14h41
  3. Langue arabe en inverse
    Par cocanouar dans le forum Vidéo
    Réponses: 0
    Dernier message: 08/07/2009, 14h47
  4. [Lex/Yacc] Convertir de chiffres romains en arabes
    Par Richard_Rahl dans le forum Générateurs de compilateur
    Réponses: 0
    Dernier message: 27/11/2007, 15h41

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