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 :

Petit soucis dans mon programme/compilation


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 54
    Points : 14
    Points
    14
    Par défaut Petit soucis dans mon programme/compilation
    Bonjour, voilà j'ai créer un petit programme (demander en exercice à la fac) qui donne la date du lendemain. Le problème est qu'à la compilation je reçois des messages d'erreurs que je ne comprend pas...

    Voici le programme en question:

    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
    // Alessandro giuliani M12
     
    // ** Exercice 1 **
    // ** Partie c) **
     
    #include <stdio.h>
    #include <math.h>
     
     
     
    int bissextile(i){
      int bis;
      if (i % 4 == 0) { if (i % 100 == 0 && i % 400 != 0) { bis=0;}
    		    else { bis=1;}
    		  }
      else bis=0;
      return bis;
    }
     
    int main(){
    int i;
    scanf("%d",&i);
    printf("%d", bissextile(i) ) ;
    return 0;
    }
     
     
    void lendemain(j,m,a){
    int jj,mm,aa;
    switch (m) { case 1: if(j==31) {jj=1, mm=2, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 2: if(bissextile(a)==1) {
    	     		if(j==29) {jj=1, mm=3, aa=a;}
    		        else if (j>29) {jj=0,mm=0,aa=0;}
    		        else {jj=j+1, mm=m, aa=a;}}
    		     else {
    		        if(j==28) {jj=1, mm=3, aa=a;}
    		        else if (j>28) {jj=0,mm=0,aa=0;}
    		        else {jj=j+1, mm=m, aa=a;}}
    		     break;
     
    	     case 3: if(j==31) {jj=1, mm=4, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 4: if(j==30) {jj=1, mm=5, aa=a;}
    		     else if (j>30) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 5: if(j==31) {jj=1, mm=6, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 6: if(j==30) {jj=1, mm=7, aa=a;}
    		     else if (j>30) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 7: if(j==31) {jj=1, mm=8, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 8: if(j==31) {jj=1, mm=9, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 9: if(j==30) {jj=1, mm=10, aa=a;}
    		     else if (j>30) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 10: if(j==31) {jj=1, mm=11, aa=a;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 11: if(j==30) {jj=1, mm=12, aa=a;}
    		     else if (j>30) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     case 12: if(j==31) {jj=1, mm=1, aa=a+1;}
    		     else if (j>31) {jj=0,mm=0,aa=0;}
    		     else {jj=j+1, mm=m, aa=a;}
    		     break;
     
    	     default:{jj=0,mm=0,aa=0;}}
     
    if(jj==0) {printf("Date invalide!\n");}
    else {printf("Demain nous serons le : %d/%d/%d\n" ,jj,mm,aa);}
    return;
    }
     
    int main(){
    int j,m,a;
    printf("Entrez le jour: ");
    scanf("%d",&j);
    printf("Entrez le mois: ");
    scanf("%d",&m);
    printf("Entrez l'annee': ");
    scanf("%d",&a);
    printf("Nous sommes le : %d/%d/%d\n", j,m,a);
    lendemain(j,m,a);
    return 0;
    }
     
     
    // ** Partie d) **
     
    // Comme jeu de test je propose les dates suivantes: * 31/12/2009 ==>> pour testez le passage à l'année suivante (affiche 1/1/2010)
    //				    		     * 28/2/2009 ==>> pour testez le passage au mois de mars (affiche 1/3/2009)
    //						     * 32/1/2009 ==>> pour testez un cas impossible (affiche "Date invalide!")
    //						     * 5/13/2009 ==>> pour testez un autre cas impossible (affiche "Date invalide!")
    Et le message d'erreur:
    lendem1.c: Dans la fonction «lendemain» :
    lendem1.c:102: attention : «main» is normally a non-static function
    lendem1.c:113: erreur: expected declaration or statement at end of input
    Et si je compile la fonction bissextile elle seule, le terminal ne fait rien et je dois arreter la compilation avec ctrl+C sinon c'est infini...

    Je suis tout ouïe à vos réponses (enfin même si vous écrivez ^^)

    P.S: Je ne souhaite pas que vous me fassiez l'exo, j'aimerais savoir ou sa coince et pourquoi!

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Points : 53
    Points
    53
    Par défaut
    Je crois que tu as oublié une } pour fermer la fonction lendemain

    Edit : quoique tu as deux main c surement ça le prob

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 54
    Points : 14
    Points
    14
    Par défaut
    Oui deux main.
    Un autre soucis se pose.. Quand je fait un programme pour la fonction bissextile, quand je le compile rien ne se passe:

    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
    #include <stdio.h>
    #include <math.h>
     
     
     
    int bissextile(i){
      int bis;
      if (i % 4 == 0) { if (i % 100 == 0 && i % 400 != 0) { bis=0;}
    		    else { bis=1;}
    		  }
      else bis=0;
      return bis;
    }
     
    int main(){
    int i;
    scanf("%d",&i);
    printf("%d", bissextile(i) ) ;
    return 0;
    }
    Pourtant à la fac, sous KDE (la je suis sous gnome), la compilation marchait :s

  4. #4
    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
    int bissextile(i){
    int bis;
    if (i % 4 == 0) { if (i % 100 == 0 && i % 400 != 0) { bis=0;}
    else { bis=1;}
    }
    else bis=0;
    return bis;
    }
    Je crois que tu as aussi oublié d'indiquer le type du parametre i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int bissextile(int i){
      int bis;
      if (i % 4 == 0) { if (i % 100 == 0 && i % 400 != 0) { bis=0;}
    		    else { bis=1;}
    		  }
      else bis=0;
      return bis;
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 54
    Points : 14
    Points
    14
    Par défaut
    Sa ne change rien au problème de compilation

    Et un dernier petit problème, après j'arrête promis

    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
    #include <stdio.h>
    #include <math.h>
     
    int main(){
      float a,b;
      char op;
      printf("Entrer le premier nombre : ");
      scanf("%f", &a);
      printf("Entrer le deuxieme nombre : ");
      scanf("%f", &b);
      printf("Entrer l'operateur (+, -, *, /) : ");
      scanf("%c", &op);  
      switch (op){
      	case '+': printf("%f+%f=%f",a,b,a+b);
      	case '-': printf("%f-%f=%f",a,b,a-b);
      	case '*': printf("%f*%f=%f",a,b,a*b);
      	case '/': printf("%f/%f=%f",a,b,a/b);
      	default: printf("Operateur non pris en charge");
      	}
      return 0;
      }
    Lancement du programme:

    aless@aless-laptop:~/Bureau/TP/TP2$ ./calculatrice
    Entrer le premier nombre : 20
    Entrer le deuxieme nombre : 10
    Entrer l'operateur (+, -, *, /) : Operateur non pris en chargealess@aless-laptop:~/Bureau/TP/TP2$
    Quand je le lance dans le terminal, j'entre les nombres, mais quand sa arrive à la demande de l'opérateur, il m'affiche directement le mesage d'erreur sans que je ne puisse rentrer un + ou un - auparavant...
    Je comprend pas <_<

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 879
    Points : 219 234
    Points
    219 234
    Billets dans le blog
    122
    Par défaut
    C'est que ta fonction scanf("%f",&b); , va certe prendre le nombre que tu aura rentrée avec le clavier, mais elle va laisser dans le buffer le retour chariot ( ou la touche entrée si tu préfère ).
    Donc le prochain scanf qui prend un caractère , il va regarder le buffer et voir un caractère ( le \n ; retour charriot ). Ainsi donc , entre les deux scanf il faut que tu vide le buffer ( je ne sais plus comment on fait , mais cela doit être marqué dans la faq C du site ).
    Au sinon si tu trouve pas dans l'immédiat ( mais pas conseillé ) tu peux faire un deuxième scanf("%c"); ( juste pour prendre le stupide '\n' )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 54
    Points : 14
    Points
    14
    Par défaut
    2 scanf sa produit un scanf infini
    et le vidage du buffer ne marche pas, sa ne change rien (j'utilise cette commande : fflush(stdout)

    que faire

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    • suivre les conseils plus haut
    • ajouter des "break;" à la fin de chaque case..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 54
    Points : 14
    Points
    14
    Par défaut
    Le double scanf marche mais je ne veux pas commencer à programmer n'importe comment comme un masson bricolerait sa maison...

    fflush(stdin); ==>> cette commande ne change rien chez mois, le scanf est ignoré et le programme passe directement au message d'erreur...

    Voilà, après j'ai tester d'autre ligne de code comme fflush(stdout) mais rien non plus!

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    fflush(stdin); ==>>
    fflush ne doit être utilisé que pour des flux de sortie (fflush(stdout)). Pour des flux d'entrée, le comportement dépend de l'implémentation.

    tu peux compléter ton format par %*[^\n]%*c . Le premier %*... lit tout jusqu'à '\n' et écarte la partie lue et le deuxième lit le '\n' et l'écarte.
    Au final, tout le reste de ta ligne après la partie qui t'interresse est écartée.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      printf("Entrer le premier nombre : ");
      scanf("%f%*[^\n]%*c", &a);
      printf("Entrer le deuxieme nombre : ");
      scanf("%f%*[^\n]%*c", &b);
    si tu entres
    1xxxxx puis sur la ligne suivante
    2 cccc
    les valeurs de a et b seront 1 et 2
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    de plus je vais me répéter, mais l'instruction break existe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      switch (op){
      	case '+': printf("%f+%f=%f",a,b,a+b);
      	case '-': printf("%f-%f=%f",a,b,a-b);
      	case '*': printf("%f*%f=%f",a,b,a*b);
      	case '/': printf("%f/%f=%f",a,b,a/b);
      	default: printf("Operateur non pris en charge");
      	}
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. petit souci dans mon code
    Par Cyang dans le forum Débuter
    Réponses: 3
    Dernier message: 05/07/2010, 12h30
  2. [Débutant] Petit problème dans mon programme
    Par bsangoku dans le forum MATLAB
    Réponses: 8
    Dernier message: 22/04/2010, 16h19
  3. un petit souci dans mon script !
    Par kerberos dans le forum VBScript
    Réponses: 1
    Dernier message: 25/06/2008, 15h42
  4. Petit souci de recherche dans mon programme
    Par jojo72000 dans le forum Débuter
    Réponses: 4
    Dernier message: 03/06/2008, 18h54
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

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