Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

chaine de caractère



  1. #1
    dalida1111

    chaine de caractère


    ------

    salut
    je suis bloquée devant un exo et j 'ai besoin d'aide svplé
    faut ecrire une fonction qui demande une date et vérifie la validité de la date qui doit etre sous la forme d une chaine de caractere ( jj/mm/aaaa)

    exigences:
    *utiliser une fonction int verifier (char ch[]) ( qui vérifie la validité de la date )et des variables booléennes
    transformer les caractère vers des chiffres

    *l'année doit contenir 4 chiffres( aaaa) et doit etre à partir de 1000
    *faut prendre en consideration que le mois de février compte 28 jours sauf si l’année est bissextile, auquel cas il en compte 29. L’année est bissextile si elle est divisible par quatre. Toutefois, les années divisibles par 100 ne sont pas bissextiles, mais les années divisibles par 400 le sont....
    *faut prendre en consideration si l utilisateur tape par exemple jj:mm:aaaa
    en tous cas faut afficher une date sous la forme jj/mm/aaaa ( 10 caractères)

    ce que j 'ai pas compris :
    le fait que jj/mm/aaaa est une chaine de caractère alors qu on doit à la fin afficher des nombre ( par exemple 12/10/2012)
    j'ai pas bien compris l ennoncé pour faire l exo

    -----

  2. Publicité
  3. #2
    dalida1111

    Re : chaine de caractère

    selon ce que j 'ai compris :
    PS: j'ai pas utilisé les fonctions ,

     Cliquez pour afficher


    merci de m 'avoir aidée
    Dernière modification par Jack ; 31/12/2011 à 16h49. Motif: indentation, pour la nième fois

  4. #3
    photon57

    Re : chaine de caractère

    Hello,

    ... indente ton code ...

    Écris des fonctions sinon ton code sera illisible.

    Étape 1 : la fonction int bisextile(int annee) qui renvoie 1 si annee est une année bisextile, 0 sinon (on s'en tient à l'énoncé : une année est bisextile si elle soit divisible par 400 soit par 4 et pas par 100.)

  5. #4
    Jack
    Modérateur

    Re : chaine de caractère

    ... indente ton code ...
    Ce n'est pas faute de l'avoir déjà demandé ...

    afficher des nombre
    Dès qu'on affiche quoi que ce soit c'est forcément des caractères, numériques ou pas, mais des caractères.

    A+
    Dernière modification par Jack ; 31/12/2011 à 16h54.

  6. A voir en vidéo sur Futura
  7. #5
    dalida1111

    Re : chaine de caractère

    ce que j 'ai pas bien compris , commment puis je vérifier la validité le la date en utilisons la fonction verifier ( char ch[]) ?
    dois je afficher jj/mm/aaaa par exemple sous la forme lundi/janvier/2012 ou tout simplement 12/01/2012 (%d/%d/%d)?

    merci
    Dernière modification par dalida1111 ; 31/12/2011 à 17h00.

  8. #6
    photon57

    Re : chaine de caractère

    tu as du mal avec les fonctions ... il va falloir vraiment t'y mettre ...

    une chaîne 'JJ/MM/AAAA' représente une date valide si :

    *JJ est un nombre (i.e. le premier caractère est un chiffre le second aussi)
    * MM est un nombre
    * AAAA est un nombre
    ** ces trois premières conditions peuvent se traduire par le premier caractère est un chiffre, le second est un chiffre, le troisième est un slash, ........
    * d'après l'énoncé AAAA>1000
    * MM est un nombre compris entre 1 et 12
    * JJ est inférieur ou égal au nombre de jours du mois MM, la seule difficulté est que ce nombre n'est pas fixe pour février car il dépend de l'année si elle est bissextile ou non.

    rien de bien compliqué, et c'est ce qu'on fait quand on veut vérifier à la main si une date est valide ...

  9. Publicité
  10. #7
    dalida1111

    Re : chaine de caractère

     Cliquez pour afficher

    c bien ça?!
    merci

  11. #8
    dalida1111

    Re : chaine de caractère

    ma question est la suivant: 'JJ/MM/AAAA' est considerée comme une chaine de caractère donc lorsqu on va comparetraiter l par exemple les mois ( des mois de 30 jours , des mois de 31...) , on doit transformer les caractères en chiffres?
    exemple : si mm>0 && mm<=28
    'mm' est une chaine de caractères , alors que 28 est un chiffre
    c une comparaison fausse?!donc je dois ecrire une autre fonction qui permet de convertir les caractères en chiffre , ca existe en c??
    merci de m avoir répondue

  12. #9
    photon57

    Re : chaine de caractère

    Tu dois avoir quelques erreurs à la compilation :

    dans ta fonction bisextile il manque une parenthèse fermante ...
    dans le main A n'est pas déclaré ...

    une version correcte et indentée (avec un appel dans une conditionnelle) pourrait être :

    Code:
    #include <stdio.h>
    
    int
    bisextille (int annee)
    {
      int res = 1;
      if ((annee % 400 == 0) || ((annee % 100 != 0) && (annee % 4 == 0)))
        res = 1;
      else
        res = 0;
      return res;
    }
    
    //programme principal
    main ()
    {
      int a;
      printf ("donner une année :");
      scanf ("%d", &a);
      if (bisextille (a))           //appel de la fonction
        printf ("%d est bisextile\n", a);
      else
        printf ("%d n'est pas bisextile\n", a);
      return 0;
    }

  13. #10
    dalida1111

    Re : chaine de caractère

    Merci infiniment je vais essayer mnt de faire l autre partie

  14. #11
    photon57

    Re : chaine de caractère

    Citation Envoyé par dalida1111 Voir le message
    ma question est la suivant: 'JJ/MM/AAAA' est considerée comme une chaine de caractère donc lorsqu on va comparetraiter l par exemple les mois ( des mois de 30 jours , des mois de 31...) , on doit transformer les caractères en chiffres?
    exemple : si mm>0 && mm<=28
    'mm' est une chaine de caractères , alors que 28 est un chiffre
    c une comparaison fausse?!donc je dois ecrire une autre fonction qui permet de convertir les caractères en chiffre , ca existe en c??
    merci de m avoir répondue
    Ce que je ferais est :

    * je vérifie que la chaîne contient des chiffres là où on s'attend à trouver des chiffres
    * je transforme les portions de chiffres en nombre, une fonction pourrait-être int nombre(char str[],int debut, int fin) qui renvoie le nombre situé dans la chaîne str entre le caractère d'index debut et celui d'index fin. Cela te permettrait d'avoir des appels du genre :
    Code:
    int jour=nombre(str,0,1);
    int mois=nombre(str,3,4);
    int annee=nombre(6,9);
    pour transformer une chaine en nombre tu peux faire appel à atoi ou sscanf par exemple.

  15. #12
    dalida1111

    Re : chaine de caractère

     Cliquez pour afficher


    c bien ça ?
    c ce que j 'ai pu faire , concernant la condition qui est en rouge je ne sais pas comment la traiter
    j'ai commencé les fonctions et les string snt un peu compliquées pour moi mais bon ...j'ai besoin d un coup de pousse
    merci d avance de m avoir répondue
    Dernière modification par JPL ; 31/12/2011 à 18h53.

  16. Publicité
  17. #13
    photon57

    Re : chaine de caractère

    Tu dois commencer par lire une chaine donc plutôt :

    Code:
    int main()
    {
      char strDate[11];
      int valide;
    
      printf("Entrez une date : ");
      scanf("%10s", strDate);
    
      if (estDateValide(strDate))
        printf("La chaine %s est une date valide\n");
      else
        printf("La chaine %s n'est pas une date valide\n");
    }
    Le tout est d'écrire la fonction int estDateValide(char str[11])

    Prépare toi un squelette d'algo pour te guider et code ensuite ...
    tu pourras essayer de coder par exemple estFormatDate, qui vérifie qu'il y a des chiffres où il doit y en avoir et des slash où il doit y en avoir ; une fonction extraitDate(char str[11], int* jour, int* mois, int* annee) qui va s'appuyer sur nombre(char str[11], int debut, int fin) ; une fonction estDateNumeriqueValide(int jour, int mois, int annee) qui vérifie que jour mois annee en nombre est valide ;

  18. #14
    JPL
    Responsable des forums

    Re : chaine de caractère

    Ce n'est quand même pas aux modérateurs de mettre la balise Code à ta place, même s'ils le font. Recommence encore comme ça et ton message sera viré !
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  19. #15
    dalida1111

    Re : chaine de caractère

    Bonjour
    au lieu de bis =(annee%400==0 || (annee%100!=0 && annee %4==0)) je peux ecrire bis= (bisextille (annee))?
    merci et bonne année

  20. #16
    defender19

    Re : chaine de caractère

    Oui, comme ça ton code est plus lisible et fait appel à la fonction que tu as créée avant!

  21. #17
    dalida1111

    Re : chaine de caractère

    Citation Envoyé par defender19 Voir le message
    Oui, comme ça ton code est plus lisible et fait appel à la fonction que tu as créée avant!
    Merci mais je ne sais pas comment traiter la fonction estFormatDate, qui vérifie qu'il y a des chiffres où il doit y en avoir et des slash où il doit y en avoir
    est ce qu il faut demander la date 3 fois? jj et on ajoute slash mm et on ajoute slash .... il faut vérifier dans ce cas la longueur de la DATE 'jj/mm/aaaa' ou de verifier la longueur de jj , mm et puis aaaa ?
    je suis bloquée ici ça

  22. #18
    defender19

    Re : chaine de caractère

    Tu as deux méthodes :

    soit tu demandes séparément le jour, la date, l'année, c'est plus long mais plus facile puisque tu traites que des int, tu peux donc dans ce cas vérifier la saisie directement :

    Code:
    printf("Quel est le jour?\n");
    scanf("%d", &jour);
    
    while(jour<1 && jour>31){
    printf("Erreur de saisie, le jour doit être compris entre 1 et 31\nQuel est le jour?\n");
    scanf("%d", &jour);
    }
    soit tu demandes la date complète, donc par une chaine de caractère et tu la découpes ensuite en jour, mois, année comme l'a dit et montré photon précédemment.

  23. Publicité
  24. #19
    Jack
    Modérateur

    Re : chaine de caractère

    scanf est une fonction pleine de ressources. Essaie ce code:
    Code:
    #include <stdio.h>
    
    int main(void)
    {
        int j, m, a;
    
        puts ("entrez une date sous la forme jj/mm/aaaa ou jj:mm:aaaa");
        scanf("%d%*[/:]%d%*[/:]%d",&j, &m, &a);
        printf("jour = %d, mois = %d et annee = %d",j, m, a);
        return 0;
    }
    Ce n'est qu'une ébauche. Il faut notamment tester la valeur de retour de scanf, mais ça dégrossi déjà bien le travail.
    Les explications ici:
    http://xrenault.developpez.com/tutoriels/c/scanf/

    A+

  25. #20
    dalida1111

    Re : chaine de caractère

    Merci Jack
    pour a fonction saisiDate() et FormatDate () :



     Cliquez pour afficher


    c bien ça ?? ou je me trompe?!
    je suis bloquéeee
    Merci Merci

  26. #21
    Jack
    Modérateur

    Re : chaine de caractère

    ta fonction saisie date:
    - ne correspond pas à l'énoncé puisque le format d'entrée de la date doit être jj/mm/aaaa ou jj:mm:aaaa
    - ne sert à rien puisque toutes les valeurs des variables vont être perdues à la fin de la fonction

    Quant à la fonction Formatdate(), je cherche encore à quoi elle sert ...

    je te donne un code qui résout une grande partie de ton problème et tu n'en fais rien ...
    je crois qu'ici aussi, je vais laisser tomber

  27. #22
    dalida1111

    Re : chaine de caractère

    Citation Envoyé par Jack Voir le message
    ta fonction saisie date:
    - ne correspond pas à l'énoncé puisque le format d'entrée de la date doit être jj/mm/aaaa ou jj:mm:aaaa
    - ne sert à rien puisque toutes les valeurs des variables vont être perdues à la fin de la fonction

    Quant à la fonction Formatdate(), je cherche encore à quoi elle sert ...


    je te donne un code qui résout une grande partie de ton problème et tu n'en fais rien ...
    je crois qu'ici aussi, je vais laisser tomber
    en tous cas merci je vais relire vos remarques et refaire tous le programme .

  28. #23
    Jack
    Modérateur

    Re : chaine de caractère

    Tu es vraiment allergique aux balises code
    http://www.siteduzero.com/forum-83-7...date-en-c.html

  29. #24
    dalida1111

    Re : chaine de caractère


    depuis hier j arrive pas à faire l exo ...

  30. Publicité
  31. #25
    JPL
    Responsable des forums

    Re : chaine de caractère

    Ne mets pas ton code dans un spoiler, il n'est pas si long que ça ; utilise uniquement la balise Code.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  32. #26
    photon57

    Re : chaine de caractère

    Citation Envoyé par dalida1111 Voir le message

    depuis hier j arrive pas à faire l exo ...

    Hello,

    Ton énoncé est simple et clair :

    Citation Envoyé par dalida1111 Voir le message
    (...)
    faut ecrire une fonction qui demande une date et vérifie la validité de la date qui doit etre sous la forme d une chaine de caractere ( jj/mm/aaaa)
    (...)
    Si tu analyses un peu tu remarques qu'il y a deux choses :

    1. saisir une date
    2. vérifier qu'une saisie est une date

    ---

    La partie 1. est relativement simple et le post #20 de Jack est un des moyens les plus simples de transformer une saisie jj/mm/aaaa en trois nombres (comme le précise JAck il faut évidemment vérifier la valeur de retour de scanf, pour justement s'assurer que 3 nombres ont été tapés ...)

    Tu peux également demander la saisie d'une chaîne de caractères de longueur 10 (dinc un char[11] à cause du \0 final) et transformer (spliter) par toi même cette chaîne en trois nombres représentant respectivement le quantième, le mois et l'année.


    ---

    Pour la partie 2 on assume que tu ne manipules plus que 3 nombres.
    La fonction a écrire est relativement simple, toutes les conditions se trouvent dans l'énoncé :

    * annee >= 1000
    * mois représente bien un mois => 0<mois<13
    * jour est bien un quantième valide pour le mois (mois que l'on sait valide si on essaye de tester la validité du jour)
    si mois=1,3,5,7,8,10,12 alors 0<jour<32
    sinon si mois=4,6,9,11 alors 0<jour<31 // après ce teste on est forcément sur mois=2
    sinon si bisextile(Annee) alors 0<jour<30
    sinon 0<jour<29

    ---


    Fais une partie avant l'autre, en lisant particulièrement les docs dont on t'a donné les liens.
    N'hésite pas non plus à faire des recherches avec google.

    ---> jette un coup d'oeil à la notion de variable, la portée surtout ...

  33. #27
    dalida1111

    Re : chaine de caractère

    Merci infiniment Photon57,Jack , Defender19 et les autres ...je vais refaire tous le programme en utilisant vos remarques avant de faire
    Dernière modification par dalida1111 ; 01/01/2012 à 17h30.

  34. #28
    defender19

    Re : chaine de caractère

    De plus dans le sujet d'a côté, on parle pas mal de date : http://forums.futura-sciences.com/pr...e-un-truc.html

Discussions similaires

  1. chaîne de caractère
    Par dalida1111 dans le forum Programmation et langages, Algorithmique
    Réponses: 15
    Dernier message: 01/01/2012, 15h06
  2. Lire chaine de caractère
    Par celine2 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 31/01/2011, 21h06
  3. copie de chaine et changements de caractere en C
    Par gdm dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 19/10/2009, 08h08
  4. Chaine de caractère C++
    Par lui dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 06/03/2008, 20h29
  5. Fonction retournant une chaine de caractère
    Par youril dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 05/09/2007, 21h28