Petit soucis avec les fonctions

Résolu
arsenik360 Messages postés 13 Date d'inscription jeudi 16 décembre 2010 Statut Membre Dernière intervention 24 mai 2011 - 26 janv. 2011 à 10:23
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 30 janv. 2011 à 03:21
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

arsenik360 Messages postés 13 Date d'inscription jeudi 16 décembre 2010 Statut Membre Dernière intervention 24 mai 2011
27 janv. 2011 à 14:07
et pourquoi ?
si je comprend bien les fonction,

"result" est le résultat que sort la fonction, car par définition, une fonction ne sort qu'un seul résultat.

En écrivant donc 'nblettre(phrase, lettre)' : j'entre les info pour que la fonction fonctionne :)
Ensuite je peux sortir 'nbchar' car c'est une variable globale et étant donnée que les info ont été envoyées ds la fonction, je sais en sortir l'entier.
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
27 janv. 2011 à 21:55
Salut,
Comme le dit francky result est un mot réservé est ne doit pas être utilisé en variable globale
var
result : integer // à banir c'est une régle, une obligation

mais result s'utilise dans la fonction et pas à l'extérieur
function test(s: string) : Integer;
begin
    result := 0;
end;

Autre point ta fonction peut s'écrire aussi
function nblettre () : integer;
et lorsque tu l'utilise plus besoin de 'nblettre(phrase, lettre)' mais juste 'nblettre'
Pourquoi ? parce que tu as mis 'phrase' et 'lettre' dans les variables globales et qu'elles portent le même nom que dans ta fonction...
Maintenant imagine avec des result ou des variables ayant le même nom partout pour des utilisations différentes...
Lorsqu'on utilise une fonction on en attend donc un résultat et pas une modification de variables externes...(c'est mon point de vue, bon parfois...)
Result donne un résultat oui, mais peut aussi donner un résultat de plusieurs résultats
un exemple en reprennent ton code avec info minuscule majuscule
program Test;
{$APPTYPE CONSOLE}
type
    ComLet = packed record
        NbCar       : Integer;//nombre de caractère dans la phrase
        NbLetMin    : Integer;//nombre de lettre minuscule
        NbLetMaj    : Integer;//nombre de lettre majuscule
    end;

var
    Phrase  : string;
    Lettre  : Char;
    ResLet  : ComLet;


function DownCase(Ch: WideChar): WideChar;//majuscule vers minuscule
begin
    Result := Ch;
    if Result in ['A'..'Z'] then
        Dec(Result, Ord('A') - Ord('a'));
end;

function nbLettre(APhrase: string; ALettre: Char): ComLet;
var
    X : Integer;
    C : PWideChar;
begin
    Result.NbCar := 0;
    Result.NbLetMin := 0;
    Result.NbLetMaj := 0;
    C := Pointer(APhrase);
    for X := 0 to Length(APhrase) -1 do
    begin
        if C^ in ['A'..'Z','a'..'z'] then
        begin
            Inc(Result.NbCar);
            if DownCase(ALettre) = C^ then
                Inc(Result.NbLetMin);
            if UpCase(ALettre) = C^ then
                Inc(Result.NbLetMaj);
        end;
        Inc(C);
    end;
end;

begin
    Write('Entrez une phrase : ');
    Readln(Phrase);
    Write('Entrez une lettre : ');
    Readln(Lettre);
    ResLet := nbLettre(Phrase, Lettre);
    Writeln('Il y a : ', ResLet.NbCar, ' lettres dans la phrase :" ', Phrase, ' ".');
    Writeln('Dans cette phrase, il y a ', ResLet.NbLetMin, ' lettres minuscule " ', DownCase(Lettre),' ".');
    Writeln('Dans cette phrase, il y a ', ResLet.NbLetMaj, ' lettres majuscule " ', UpCase(Lettre),' ".');
    Readln;
end.

en espérant t'avoir fait comprendre la remarque de francky et +
@+yanb
0
arsenik360 Messages postés 13 Date d'inscription jeudi 16 décembre 2010 Statut Membre Dernière intervention 24 mai 2011
27 janv. 2011 à 22:03
Waouw :D

je n'ai pas encore si loin en programmation, ceci dit, j'ai très bien compris tes remarques, c'est comme ca qu'on aprrend.
Je vais analyser ton code pour m'instruire d'avantage :D

C'est cool, thx :D
0
arsenik360 Messages postés 13 Date d'inscription jeudi 16 décembre 2010 Statut Membre Dernière intervention 24 mai 2011
27 janv. 2011 à 22:25
Donc pour faire un mini résumé,
Un mot réserve comme "result" ne dois même pas être déclarée alors puisqu'il retourne le résultat de la fonction ?

Ici, je dois juste effacer la ligne de la variable :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
27 janv. 2011 à 23:19
exacte pas besoin de déclarer result...
function test(s:string):integer;
begin
    result := length(s);
end;

result ici est un integer, si tu supprime la ligne la fonction ne renverra pas de résultat.
si tu regarde mon code je n'ai jamais utilisé un var result : ...
result est lié à la fonction qui l'appel donc pas besoin de la déclarer dans var ou où que ce soit, le seul endroit où tu doit avoir result c'est dans la fonction pour le résultats...
@+yanb
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 janv. 2011 à 03:21
pourquoi ne pas aller plus loin ? :

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TPhraseAnalysis = packed record
    Spaces    : integer;
    UpChars   : integer;
    LowChars  : integer;
    Numbers   : integer;
    Specials  : integer;
    Length    : integer;
    IsUnicode : boolean;
    ATUStrict : packed array[Char] of integer;
    ATU       : packed array[Char] of integer;
  end;

procedure PhraseAnalysisReset(var aPA: TPhraseAnalysis);
var C: char;
begin
  aPA.Spaces := 0;
  aPA.UpChars := 0;
  aPA.LowChars := 0;
  aPA.Numbers  := 0;
  aPA.Specials := 0;
  aPA.Length   := 0;
  for C := low(char) to high(char) do
  begin
    aPA.ATUStrict[C] := 0;
    aPA.ATU[C] := 0;
  end;
end;

function PhraseAnalyze(const aPhrase: string): TPhraseAnalysis;
var N: integer;
    C,uC,lC: char;
begin
  PhraseAnalysisReset(result);

  result.IsUnicode := SizeOf(Char) <> 1;
  result.Length := Length(aPhrase);

  for N := 1 to result.Length do
  begin
    C := aPhrase[N];
    uC := upperCase(C)[1];
    lC := lowerCase(C)[1];

    inc(result.ATUStrict[C]);
    if uC <> lC then
    begin
      inc(result.ATU[uC]);
      inc(result.ATU[lC]);
    end
    else
      inc(result.ATU[C]);

    case aPhrase[N] of
      '0'..'9' : inc(result.Numbers);
      ' '      : inc(result.Spaces);
      'A'..'Z' : inc(result.UpChars);
      'a'..'z' : inc(result.LowChars);
      else
        inc(result.Specials);
    end;
  end;
end;

const
  TestPhrase = '0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ?./§,;:!ù*^$&#168;£%µ&é';
  TestChar = 'a';
  TestLettre = 'a';
  UnicodeResponse : array[boolean] of string = ('non','oui');

var
  PA : TPhraseAnalysis;
begin
  PA := PhraseAnalyze(TestPhrase);
  writeln(
    format(
      'Taille de la phrase : %d caracteres'+#13#10+
      '  Espaces    : %d'+#13#10+
      '  Majuscules : %d'+#13#10+
      '  Minuscules : %d'+#13#10+
      '  Nombres    : %d'+#13#10+
      '  Speciaux   : %d'+#13#10+
      '  Unicode    : %s'+#13#10+
      '  Le caractere "%s" y apparait %d fois'+#13#10+
      '  La lettre "%s" y apparait %d fois',
      [
        PA.Length,
        PA.Spaces,
        PA.UpChars,
        PA.LowChars,
        PA.Numbers,
        PA.Specials,
        UnicodeResponse[PA.IsUnicode],
        TestChar, PA.ATUStrict[TestChar],
        TestLettre, PA.ATU[TestLettre]
      ]
    )
  );
  readLn;
end.


________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
0
Rejoignez-nous