Petit soucis avec les fonctions [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011
-
 f0xi -
Bonjour a tous,

J'ai créé un code :
program fonction_nb_lettre_phrase;

var
phrase:string;
result:integer;
lettre:char;
nbchar:integer;


Function nblettre ( phrase : string; lettre :char ) : integer ;

var
x:integer;

  begin
      result:=0;
      nbchar:=0;

     for x:=1 to length(phrase) do
       begin
         if (upcase(phrase[x])>='A') and (upcase(phrase[x])<='Z')
            then inc(result);
         if (upcase(phrase[x])=lettre)
            then inc(nbchar);

       nblettre:=result;
       nblettre:=nbchar;

       end;
  end;


begin

Write('Entrez une phrase : ');
Readln(phrase);

Write('Entrez une lettre : ');
Readln(lettre);

writeln('Il y a : ', nblettre(result), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', nblettre(nbchar), 'la lettre "',
        lettre,'".');

  readln;
end.


La fonction a pour but de compter les nombres de lettres dans la phrase ET de compter le nombre de fois que la lettre demande par l'utilise se trouve ds cette phrase.

Mon probleme est le suivant, je ne comprend pas comment récuperer ses infos..
Lorsque je compile on me dit que 'String' et 'Integer' sont incompatible...

Une idée ?

Merci bcp :)

Arsenik

26 réponses

Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016

Bonjour

le Intotstr permet de convertir un chiffre en chaine de caractère
cela peut être utile pour afficher le résultat
En l'occurrence ici le WRITE ou WRITELN fait la conversion tout seul

En fait l'erreur de compilation vient du fait qu'il y a une grosse erreur dans le code suivant
writeln('Il y a : ', nblettre(result), 'dans la phrase :"', phrase, '".');

Vous appeler la fonction nblettre avec en paramètre result qui est un integer alors
que la fonction attend deux variable une type string et l'autre de type char
une autre petite erreur dans la fonction
if (upcase(phrase[x])=lettre)

ne marchera pas à si lettre est minuscule
donc il faudrait remplacer par
if (upcase(phrase[x])=upcase(lettre))


de plus dans la fonction il y a une ligne qui ne sert à rien (la première)
nblettre:=result;
nblettre:=nbchar;


Donc voici le code qui fonctionne
var
phrase:string;
result:integer;
lettre:char;
nbchar:integer;

function nblettre ( phrase : string; lettre :char ) : integer;
var
  x:integer;
begin
  nbchar := 0;
  result := 0;
  for x:=1 to length(phrase) do
  begin
    if (upcase(phrase[x])>='A') and (upcase(phrase[x])<='Z')
      then inc(result);
    if (upcase(phrase[x])=upcase(lettre))
      then inc(nbchar);
  end;
end;


begin

  Write('Entrez une phrase : ');
  Readln(phrase);

  Write('Entrez une lettre : ');
  Readln(lettre);

  writeln('Il y a : ', nblettre(phrase,lettre), ' lettre dans la phrase :"', phrase, '".');
  writeln('Dans cette phrase, il y a ',nbchar , ' fois la lettre "',lettre,'".');
  readln;
end.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Parce que si c'est le code de la page précedente que tu essayes de faire fonctionner, il me semble bien qu'il manque le code ci-dessous :

{$APPTYPE CONSOLE}

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
dans
writeln('Il y a : ', nblettre(result), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', nblettre(nbchar), 'la lettre "',

mettre:

writeln('Il y a : ',inttostr( nblettre(result)), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', inttostr(nblettre(nbchar)), 'la lettre "',
lettre,'".');
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

Tout d'abord, merci pour ta réponse :)

inttostr ? A quoi me sert-elle ?

J'ai revu un peur, et j'avais changé :

writeln('Il y a : ', nblettre(result), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', nblettre(nbchar), 'la lettre


en

writeln('Il y a : ', nblettre(result, lettre), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', nblettre(phrase, nbchar), 'la lettre "',


Car dans ma fonction j''envois deux données. Ca me semble mieux, mais bon, ca ne compile tjrs pas...
Une fonction peut-elle sortir plusieurs résultat ? Une procédure ne serait-elle pas plus adapter ?
Une derniere chose, est-ce-que je peux afficher les resultats de ma fonction comme cela ? :)

Dsl de posé autant de question :D ^^
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
Essaye comme cela
program fonction_nb_lettre_phrase;

var
phrase:string;
result:integer;
lettre:char;
nbchar:integer;
nLettres:integer;


Procedure nblettre ( phrase : string; lettre :char );
var
x:integer;

  begin
      nblettres:=0;
      nbchar:=0;

     for x:=1 to length(phrase) do
       begin
         if (upcase(phrase[x])>='A') and (upcase(phrase[x])<='Z')
            then inc(nblettres);
         if (upcase(phrase[x])=lettre)
            then inc(nbchar);
       end;
  end;


begin

Write('Entrez une phrase : ');
Readln(phrase);

Write('Entrez une lettre : ');
Readln(lettre);
nblettre(phrase,lettre);
writeln('Il y a : ', inttostr(nblettres), 'dans la phrase :"', phrase, '".');
writeln('Dans cette phrase, il y a ', inttostr(nbchar), ' lettre "',

        lettre,'".');


  readln;
end.


Il faudra peut être rajouter un uses pour l'utilisation de inttostr qui comme son nom l'indique transforme un integer en string.
(bien que le writeln accepte peu être directement les integer, (j'utilise rarement (voir jamais) ce genre de programmation)
Dubois77
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

Quel est l'interet de "inttostr" ? je dois avoir un resultat chiffré, je ne comprend pas bien... :/
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

Merci beaucoup pour tes explications qui me sont d'une grande utilité :)

J'ai juste un mesasge d'erreur lors de la compilation, c'est possible que se soit du au code ? :/
Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016

oui comme je l'ai expliqué "nblettre(result)" génère forcement une erreur lors de la compilation
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

ben oui mais ds ton code, il y a n'y a pas de "nblettre(result)"
Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016

oups j'avais pas bien lu la question
çà plante à quel ligne ?
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

En fait il m'annonce que la compilation a réussie mais j'ai droit a l'affiche de "Runtime 105 00406E4" :/
Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016

Avec quel soft vous compilez
Turbo pascal, delphi ....
Messages postés
251
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
11 novembre 2016

Si c'est avec Turbo pascal
il faut ajouter WinCRT à la clause Uses
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

non, j'ai delphi 2010 :)
avec la ligne il est mis qu'il est impossible de résoudre le nom d'unité...

Je vais regarder après ca sur internet :) sauf si mnt tu sais, autant me le dire ^^ :p

merci en tout cas :p
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

Avec "uses SysUtils;" j'ai un message d'erreur toujours 105 mais un différent :/
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Bonsoir

Runtime Error 105 = File not open for output

N.B. C'est une application console ?

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

oui :)
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Et si tu fais Menu Fichier > Nouveau > Application console. En compilant ce nouveau projet, tu obtiens la même erreur ?

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
13
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
24 mai 2011

fantastique !! :p
ca fonctionne a la perfection ! :) merci pour tout :D

Salut

var
phrase:string;
result:integer;
lettre:char;
nbchar:integer;


Attention Result est un mot réservé donc à ne pas utiliser (Surtout dans une fonction)
1 2