Aide pour trouver les erreurs dans mon programme pascal
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Aide pour trouver les erreurs dans mon programme pascal



  1. #1
    invite204ee98d

    Aide pour trouver les erreurs dans mon programme pascal


    ------

    Bonjour,

    J'ai un dm à faire et je l'ai fait mais maintenant il faut le compiler et apparemment il y a des erreurs de "grammaire" (compilation sur free pascal) que je ne trouve pas, MERCI de m'aider:

    Je vous dis l'énoncer malgré tout mais je ne cherche pas à améliorer mon programme c'est a dire le rendre plus court car je sais qu'on le peut et en plus ca serait long pour vous, juste ce qui entraine une erreur de compilation sur freePascal:


    Le programme a réaliser doit dans un premier temps demander la saisie de la date
    actuelle sous la forme de 3 valeurs entières correspondant au jour, au mois et à l’année. Le
    programme doit vérifier que la saisie est correcte, c’est-à-dire que les valeurs correspondent
    à un jour, un mois et une année réels. Il faut aussi que la date existe (par exemple que
    ce ne soit pas le 31 d’un mois à 30 jours, ou qu’un 29 février soit bien dans une année
    bisextile). On autorisera seulement la saisie d’années allant de 1900 à 2012.
    Si la saisie n’est pas correcte le programme doit demander à l’utilisateur de saisir de
    nouvelles valeurs pour le jour, le mois, l’année ou toute la date.
    Une fois que la date actuelle a été correctement saisie, le programme demande la saisie
    d’une nouvelle date qui représentera une date de naissance. Ici encore, il faut que cette
    date soit valide, sinon le programme demandera de re-saisir certaines valeurs.
    Enfin, une fois que ces 2 dates sont saisies, le programme doit calculer et afficher l’âge
    (en années) de la personne dont la date de naissance a été saisie. Si elle n’est pas encore
    née, le programme devra aussi le mentionner.




    Code:
    program calcule_age;
    
    function estUneAnneeBissextile(annee : Integer)*: Boolean;
    begin
    	if annee mod 4:=0 then
    	     estUneAnneeBissextile:=true
    	else
    	      estUneAnneeBissextile:=false
    end; {estUneAnneeBissextile}
    
    
    function estUnMoisA31Jours(mois*: Integer)*: Boolean;
    begin
    	case mois of
    	     1,3,5,7,8,10,12*: estUnMoisA31Jours:=true
    	       else : estUnMoisA31Jours:=false
    end; {estUnMoisA31Jours}
    
    
    function estUneFausseDate(jour,mois,annee*: Integer) : Boolean;
    begin
    	if not(estUnMoisA31Jours(mois)) and (jour:=31) then
    	     estUneFausseDate:=true;
    	if mois:=2 and estUneAnneeBissextile(annee) and jour>29 then
    	      estUneFausseDate:=true;
    	if mois:=2 and not(estUneAnneeBissextile(annee)) and jour>28 then
    	       estUneFausseDate:=true
    	else
    	       estUneFausseDate:=false
    end; {estUneFausseDate}
    
    
    
    procedure saisieDate(S jour, mois, annee*: Integer);
    var	bJour, bMois, bAnnee*: Boolean;
    begin
    
    bJour:=true;
    bMois:=true;
    bAnnee:=true;
    
    repeat
    	repeat
    	        writeln('Entrez le jour*:')
    	        readln(jour)
    	        if (jour<1) or (jour>31) then
    		        bJour:=false
    		        writeln('Ce jour est invalide, recommencez svp')
    	 until bJour
    	 repeat
    	         writeln('Ce mois est invalide, recommencez svp')
    	          readln(mois)
    	          if(mois<1) ou (mois>12) then 
    	                  bMois:=false
    		       writeln('Ce mois est invalide, recommencez svp')
    until not(estUneFausseDate(jour,mois,annee))
    
    end; {saisieDate}
    
    
    
    procedure saisie(S jourActuel, moisActuel, anneeActuelle, jourDeNaissance, moisDeNaissance, anneeDeNaissance*: Integer);
    begin 
    
    writeln('Entrez la date actuelle');
    sasieDate(jourActuel, moisActuel, anneeActuelle);
    
    writeln('Entrez votre date de naissance');
    saisieDate(jourDeNaissance, moisDeNaissance,anneeDeNaissance);
    
    end; {saisie}
    
    
    function calculDeLAge(jourActuel, moisActuel, anneeActuelle, jourDeNaissance, moisDeNaissance, anneeDeNaissance*: Integer)*: Integer;
    begin
    	if moisActuel>moisDeNaissance then
    	     calculDeLAge:=(anneeActuelle-anneeDeNaissance)
    	else
    	      if moisActuel:=moisDeNaissance then
    		if jourActuel>=jourDeNaissance then
    		      calculDeLAge:=(anneeActuelle-anneeDeNaissance)
    		else
    		       calculDeLAge:=((anneeActuelle-anneeDeNaissance)-1)
    	       else
    		calculDeLAge:=((anneeActuelle-anneeDeNaissance)-1)
    
    end; {calculDeLAge}
    
    
    function ageNegatif(age*: Integer)*: Boolean;
    begin
    	if age<0 then
    	     ageNegatif:=true
    	else
    	      ageNegatif:=false
    end; {ageNegatif}
    
    procedure affichageAge(age*: Integer);
    begin
    	if ageNegatif(age) then
    		writeln('Vous n"êtes pas encore né')
    	else
    		writeln('Vous avez',age,'ans')
    
    end; {affichageAge}
    
    
    procedure ageActuel();
    var	jourActuel, moisActuel, anneeActuelle, jourDeNaissance, moisDeNaissance, anneeDeNaissance*: Integer;
    begin
    
    saisie(jourActuel, moisActuel, anneeActuelle, jourDeNaissance, moisDeNaissance, anneeDeNaissance);
    
    affichageAge(calculDeLAge(jourActuel, anneeActuelle, jourDeNaissance, moisDeNaissance, anneeDeNaissance));
    
    end. {ageActuel}

    -----
    Dernière modification par JPL ; 01/05/2012 à 18h18. Motif: Ajout de la balise Code pour garder l'indentation

  2. #2
    JPL
    Responsable des forums

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Merci de bien vouloir utiliser la balise Code.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    invite2d7144a7

    Re : Aide pour trouver les erreurs dans mon programme pascal

    bonjour,

    Sans aller bien loin, ta fonction estUneAnneeBissextile est fausse.

    Sinon, bon point pour l'utilisation de noms significatifs pour tous les identifiants.

    Pour en revenir à ton problème, le compilateur doit te dire sur quelles lignes il bloque, et t'indiquer pourquoi, il te faut essayer de comprendre.

  4. #4
    zoup1

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Bonjour,

    Cela fait bien longtemps que je n'ai pas fait de Pascal, mais certains souvenir sont tenaces. Je n'ai pas souvenir de devoir mettre des * partout (Comme c'est le cas par exemple dans la définition de la fonction
    function estUneAnneeBissextile(annee : Integer)*: Boolean;
    avant les .
    Par ailleurs, il faut faire bien attention à ne pas confondre l'affection := avec le test = par exemple dans
    if annee mod 4:=0 then
    C'est sans doute un test qui faut utiliser et donc
    if annee mod 4=0 then
    Ce n'est qu'un début et même si les messages d'erreur du compilateurs peuvent paraître difficile à comprendre, il faut faire l'effort de les comprendre pour corriger au moins la syntaxe utilisée, et ne pas hésiter à lire la documentation du language.

    Cordialement,
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

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

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Merci, je ne sais pas pourquoi il apparait ici les"*" car dans mon programme elles n'y sont pas ensuite j'ai corrigé le":=" en "=" mais je ne comprends pas ce que dit le compilateur maintenant, par exemple il est écrit:

    (22,1) Error: Illegal expression et à la meme ligne (22,10) Fatal: Syntax error, ";" expected but "identifier ESTUNEFAUSSEDATE" found

    a cette ligne j'ai: function estUneFausseDate(jour, mois, annee : Integer) : Boolean;

    Ou est l'erreur ?????????

  7. #6
    zoup1

    Re : Aide pour trouver les erreurs dans mon programme pascal

    C'est un peu dur de debogguer comme cela...
    La structure de ton case n'est pas bon :
    Code:
    case mois of
    	     1,3,5,7,8,10,12*: estUnMoisA31Jours:=true
    	       else : estUnMoisA31Jours:=false
    ce devrait être
    Code:
    case mois of
    	     1,3,5,7,8,10,12 : estUnMoisA31Jours:=true;
    	     else : estUnMoisA31Jours:=false;
    end;
    Il faut que tu te réfères à la documentation http://www.freepascal.org/docs.var pour trouver les erreurs...
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  8. #7
    invite204ee98d

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Dsl de dire ca mais sue le site indiqué dans la partie debugger il ne parle pas trop des erreurs indiquées par le compilateur.

    Pour en revenir à ce que j'ai dit sur la ligne 22 je ne comprends pas pourquoi en 22;1 qui correspond à "function" il y a "illegal expression" puisque c'est un terme valable tout comme en 22;10 qui correspond à estUneFausseDate qui est un nom de fonction défini seulement ici

  9. #8
    invite2d7144a7

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Bonjour,

    C'est fréquent.

    Le problème vient du end; manquant pour fermer le case of, signalé par zoup1 : pour le fermer, le compilateur a utilisé celui que tu as mis pour fermer la fonction, et à partir de là il est décalé par rapport au code, et il est susceptible de signaler à peu près n'importe quoi.

    C'est une habitude à prendre : si la ligne signalée fausse est en fait correcte, remonter plus haut.

  10. #9
    invite204ee98d

    Re : Aide pour trouver les erreurs dans mon programme pascal

    C'est normal que dès qu'on corrige une faute y'en a plus après ?

  11. #10
    zoup1

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Oui, il ne faut pas s'inquiéter pour cela...
    Il faut corriger les fautes dans l'ordre dans lequel elles apparaissent et ne pas chercher à les corriger toutes d'un coup.
    Bien souvent, un erreur de syntaxe à un endroit engendrent plein de messages d'erreur à des endroits où il n'y en a pas forcément...

    Bon courage...
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  12. #11
    invite204ee98d

    Re : Aide pour trouver les erreurs dans mon programme pascal

    Pour un Booleen je n'ai pas le droit de mettre par exemple:

    not(estUneAnneeBissextile(anne e)) ??? si estUneAnneeBissextile renvoit un Booleen

Discussions similaires

  1. Programme pour trouver une somme dans un tableau
    Par invitec529fad8 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 20/04/2010, 21h26
  2. aide programme pascal
    Par invite3d733769 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 24/03/2010, 23h45
  3. [PIC]erreurs dans un programme
    Par invitec35bc9ea dans le forum Électronique
    Réponses: 71
    Dernier message: 01/05/2008, 21h31
  4. Trouver l'erreur dans mon programme en BASIC:s
    Par invite935a281a dans le forum Électronique
    Réponses: 4
    Dernier message: 12/04/2008, 11h03
  5. Aide pour trouver probleme sur mon circuit
    Par invite935a281a dans le forum Électronique
    Réponses: 44
    Dernier message: 13/11/2007, 18h25