Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2790 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  ma fonction ne fonctionne pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ma fonction ne fonctionne pas

n°1663346
capshane
Posté le 27-12-2007 à 13:33:13  profilanswer
 

Bonjour!
 
J’ai écris un programme sous pascal qui consiste a convertir des nombres binaire en décimale et vise versa sauf que la deuxième fonction (bintoint) ne marche pas et je n'arrive pas a détecter l'erreur merci de bien vouloir m'aider.
 
Le programme est exécutable, tout marche bien a l'exception de la deuxième fonction ; dans l'exécutable quand vous tapez 2 pour le deuxième choix vous pouvez entrez un nombre  binaire par exemple 100 (qui est 4 en décimale) et c'est là que le résultat s'affiche égale à 0! C’est là ou se trouve l'erreur sinon pour le reste c'est bon.
 
Voici le code en entier:
 
 
program Conversion;
uses wincrt;
var i,n,fon:integer;
sol,m: string;
choix: char;
 
function inttobin (n:integer): string;
 
var s,r: integer;
    solution,sol:string;
 
begin
solution:='';
repeat
      r:=n mod 2;
      s:=n div 2;
      str(r,sol);
      solution:=sol+solution;
      n:=s;
 
 
until s=0;
 
inttobin:=solution;
 
end;  
 
 
 
function puissance (b,k:integer):integer;   {Cette fonction sera appelée dans la fonction bintoint}
 
  var p,j:integer;
 
 
      begin
 
       p:=1;
       if k<>0 then
       for j:=1 to k do
 
           begin
 
            p:=p*b
 
           end;
 
 
       puissance:=p;
 
       
 
      end;
 
 
 
function bintoint (m: string): integer;    {La fonction qui marche pas}
                                           {Conversion du binaire au décimale}
 
 var result,code,i,s,long,puis: integer;
 
 
 
     begin
 
      long:=length(m);
      s:=0;
 
       for i:=1 to long do
         
          begin
 
           val(m[i],result,code);
           puis:=puissance(2,long-i);
           s:=s+(result*puis);
         
          end;
           
         bintoint:=s;
 
       end;
 
 
begin
 
writeln('*******************************  Menu  ******************************');
writeln;
writeln('Tapez:');
writeln('         1:Conversion décimale en binaire');  
writeln('         2:Conversion binaire en décimale');
writeln('         0:Quitter');
 
 
 
repeat
 
writeln;writeln;writeln;
write('Entrez votre choix:');
read(choix);
case choix of
 
 
'1':
 
begin
 
writeln;
write('Le nombre à convertir: ');
readln(n);
writeln;
write('Le résultat est: ');
sol:=inttobin(n);
write(sol);
 
end;  
 
 
'2':
 
begin
 
 writeln;
 write('Le nombre binaire: ');
 readln(m[i]);
 writeln;
 write('Le résultat est: ');
 fon:=bintoint(m);
 write(fon);
 
end;
 
 
end;
 
 
until choix = '0';
 
 
writeln;writeln;writeln;
 
writeln('                                              ***Fin***');
 
 
 
end.


Message édité par capshane le 27-12-2007 à 14:20:56
mood
Publicité
Posté le 27-12-2007 à 13:33:13  profilanswer
 

n°1663394
vttman2
Je suis Open ...
Posté le 27-12-2007 à 15:00:41  profilanswer
 

val(m[i],result,code);  
=>  
elle donne quoi comme résultat cette procédure ?


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
n°1663425
breizhbugs
Posté le 27-12-2007 à 16:30:34  profilanswer
 

et ca ca marche pas?

Code :
  1. function bintoint (m: string): integer;    {La fonction qui marche pas}
  2.                                            {Conversion du binaire au décimale}
  3. var result,code,i,s,long,puis: integer;
  4. begin
  5.       long:=length(m);
  6.       s:=0;
  7.  
  8.        for i:=1 to long do
  9.        begin
  10.            val(m[i],result,code);
  11.            s:=s*2+result;
  12.        end;
  13.        bintoint:=s;
  14. end;


(si ta procedure val() convertit bien le caractere m[i] (0 ou 1) en entier;

Message cité 1 fois
Message édité par breizhbugs le 27-12-2007 à 16:32:12
n°1663741
capshane
Posté le 28-12-2007 à 17:19:36  profilanswer
 

vttman2 a écrit :

val(m[i],result,code);  
=>  
elle donne quoi comme résultat cette procédure ?


 
 
slt le val(...) convertit les chaînes de caractères en integer.
 
Le m[i] est de type chaîne de caractère et le val l’enregistre au nom de result en temps que integer et ‘code’ c’est juste au cas ou la chaîne de caractère contient des lettre ; le code nous donne le code de la lettre donnée !


Message édité par capshane le 28-12-2007 à 17:30:07
n°1663753
capshane
Posté le 28-12-2007 à 17:36:05  profilanswer
 

breizhbugs a écrit :

et ca ca marche pas?

Code :
  1. function bintoint (m: string): integer;    {La fonction qui marche pas}
  2.                                            {Conversion du binaire au décimale}
  3. var result,code,i,s,long,puis: integer;
  4. begin
  5.       long:=length(m);
  6.       s:=0;
  7.  
  8.        for i:=1 to long do
  9.        begin
  10.            val(m[i],result,code);
  11.            s:=s*2+result;
  12.        end;
  13.        bintoint:=s;
  14. end;


(si ta procedure val() convertit bien le caractere m[i] (0 ou 1) en entier;


 
slt merci pour votre réponse j'ai essayé mais ça ne marche pas !
et le s il faut l'initialisée a 1 et non pas 0 mais ça ne marche pas de toute façon!

Message cité 1 fois
Message édité par capshane le 28-12-2007 à 17:36:58
n°1663840
breizhbugs
Posté le 28-12-2007 à 23:56:22  profilanswer
 

capshane a écrit :


 
slt merci pour votre réponse j'ai essayé mais ça ne marche pas !
et le s il faut l'initialisée a 1 et non pas 0 mais ça ne marche pas de toute façon!


J'ai essayé un équivalent en C et ca marche. Non il ne faut pas que s soit initialisé a 1.  
 
attends je viens de voir:

Citation :

begin  
 
 writeln;  
 write('Le nombre binaire: ');  
 readln(m[i]);
 writeln;  
 write('Le résultat est: ');  
 fon:=bintoint(m);  
 write(fon);  
 
end;


c'est pas readln(m) plutot?


Message édité par breizhbugs le 28-12-2007 à 23:57:43
n°1663846
capshane
Posté le 29-12-2007 à 00:34:17  profilanswer
 

[quotemsg=1663840,6,255008]
J'ai essayé un équivalent en C et ca marche. Non il ne faut pas que s soit initialisé a 1.  
 
attends je viens de voir:

Citation :

begin  
 
 writeln;  
 write('Le nombre binaire: ');  
 readln(m[i]);
 writeln;  
 write('Le résultat est: ');  
 fon:=bintoint(m);  
 write(fon);  
 
end;


c'est pas readln(m) plutot?[/quotems
 
Avec seulement readln(m) je ne peux même pas écrire le nombre binaire dans l'exécution !!

n°1663848
Flagad'awa​re
c pô moi, j'ai pas touché!
Posté le 29-12-2007 à 00:37:52  profilanswer
 

Salut
 
désolé mais c'est forcément faux ton truc, meme si ton val renvoie bien 0 ou 1
 
déja tu fait ta boucle à l'envers et tu ne peut pas te contenter de s:=s*2+result;

n°1663864
Flagad'awa​re
c pô moi, j'ai pas touché!
Posté le 29-12-2007 à 01:45:11  profilanswer
 

j'oubliais, si tu créé une fonction, ton result doit être le resultat de cette fonction donc à la fin result:=s; ou result:="autrechose" en fonction de ton code; sinon t'auras rien de clair
 
 
après soit y a des fonctions qui permettent de convertir en bin to decimal soit tu doit tout découper
 
admettons que t'ai m='1011'
 
donc dans ton string m t'as:
m[1]=1
m[2]=0
m[3]=1
m[4]=1
 
et bien ton bintodec DOIT faire:
 
result:=(m[1]*8)+(m[2]*4)+(m[3]*2)+(m[4]*1);
donc (1*8)+(0*4)+(1*2)+(1*1);
 
voici un autre exemple pris d'une page que je retrouve plus :
 
Binaire --> Décimal
Pour convertir %10010110, procédez comme suit :
 
Binaire 1 0 0 1 0 1 1 0
Facteur 128 64 32 16 8 4 2 1
Résultat 128 0 0 16 0 4 2 0
 
Le résultat est donc égal à : 128 + 0 + 0 + 16 + 0 + 4 + 2 + 0 = 150

 
 
 
enfin voila pour quelques explications mais ne compte pas sur ton val pour faire tout  
 
 
 
 

n°1663891
breizhbugs
Posté le 29-12-2007 à 11:33:23  profilanswer
 

Flagad'aware a écrit :

j'oubliais, si tu créé une fonction, ton result doit être le resultat de cette fonction donc à la fin result:=s; ou result:="autrechose" en fonction de ton code; sinon t'auras rien de clair
 


 
c'est n'est pas en utilisant le nom de la fonction que l'ion peut renvoyer le resultat? donc bintoint:=s est correct selon moi!
 
Sinon voici ton exemple avec ma fonction:
s = 0;
for i:=1 to long do
begin
     val(m[i],result,code);
     s:=s*2+result;
end;
bintoint:=s;
 
bintoint("1011" ) avec mon code cela donne:
dans la boucle: (i le compteur de lettre; result, la lettre transformée en chiffre (donc 0 ou 1))
- i = 1; result = 1;
s = 0*2+1 = 1
- i = 2; result = 0;
s = 1*2+0=2;
- i = 3; result = 1;
s = 2*2+1 = 5;
- i = 4; result = 1;
s = 5*2+1 = 11
Donc en sortie, s vaut 11 et c'est bien la representation binaire de 1011?

Message cité 1 fois
Message édité par breizhbugs le 29-12-2007 à 11:34:13
mood
Publicité
Posté le 29-12-2007 à 11:33:23  profilanswer
 

n°1664014
Flagad'awa​re
c pô moi, j'ai pas touché!
Posté le 29-12-2007 à 21:13:47  profilanswer
 

effectivement ça marche parfaitement (à part le result) désolé  
 

breizhbugs a écrit :


c'est n'est pas en utilisant le nom de la fonction que l'on peut renvoyer le resultat? donc bintoint:=s est correct selon moi!


 
 :heink: déja en utilisant result comme variable , j'ai une erreur 'result' redéclaré
 
excuses-moi si je me trompe mais ça me parrait plutôt tordu d'appeler une fonction dans cette meme fonction, on peut le faire vu que ça marche mais si une fonction sort un result autant l'utiliser, enfin j'ai jamais fais ça :/
 
oui bintoint:=s est ok pour utiliser cette fonction mais ailleurs dans le code, dans un autre évènement ou une autre fonction
 
maintenant que ton code marche c'est facile de critiquer mais juste ça , ça suffit:
 

function tform1.bintoint (m: string): integer;
var i,s: integer;
begin
  s:=0;
 
  for i:=1 to length(m) do s:=s*2+strtoint(m[i]);
 
  result:=s;
end;

n°1664018
breizhbugs
Posté le 29-12-2007 à 22:17:14  profilanswer
 

Nan, mais je t'explique: il y a longtemps que je ne fais plus de pascal/delphi alors dans mes souvenirs je croyais que la valeur de retour d'une fonction se transmettais uniquement en assignant le resultat au nom de cette fonction, j'ignorais pour pour le 'result'. Moi je faisais surtout attention à l'algorithme. :sweat:

n°1664026
Flagad'awa​re
c pô moi, j'ai pas touché!
Posté le 29-12-2007 à 23:58:04  profilanswer
 

ah oké, y a de quoi se perdre avec tout ces langages :)
 
pas de soucis et ça servira à Capshane

n°1665541
capshane
Posté le 03-01-2008 à 23:26:37  profilanswer
 

Salut merci pour toutes ces réponses qui m'ont beaucoup aidé, voila le code final qui marche à merveille...
 

Code :
  1. program Conversion;
  2. uses wincrt;
  3. var i,n,t,q1,fon:integer;
  4. sol,m: string;
  5. choix: char;
  6. function inttobin (n,q:integer): string;
  7. var s,r: integer;
  8.     solution,sol:string;
  9. begin
  10. solution:='';
  11. repeat
  12.       r:=n mod q;
  13.       s:=n div q;
  14.       str(r,sol);
  15.       solution:=sol+solution;
  16.       n:=s;
  17. until s=0;
  18. inttobin:=solution;
  19. end;
  20. function puissance (b,k:integer):integer;   {Cette fonction sera appelée dans la fonction bintoint}
  21.   var p,j:integer;
  22.       begin
  23.        p:=1;
  24.        if k<>0 then
  25.        for j:=0 to k-1 do
  26.            begin
  27.             p:=p*b
  28.            end;
  29.        puissance:=p;
  30.       end;
  31. function bintoint (v: string; z: integer): integer;    {La fonction qui }
  32.                                            {Conversion du binaire au décimale}
  33. var result,code,i,s,long,puis: integer;
  34.      begin
  35.       long:=length(v);
  36.       s:=0;
  37.        for i:=1 to long do
  38.        
  39.           begin
  40.            val(v[i],result,code);
  41.            puis:=puissance(z,long-i);
  42.            s:= s + result * puis;
  43.        
  44.           end;
  45.          
  46.          bintoint:=s;
  47.        end;
  48. begin
  49. m:='';
  50. writeln('*******************************  Menu  ******************************');
  51. writeln;
  52. writeln('Tapez:');
  53. writeln('         1:Conversion décimale en binaire');
  54. writeln('         2:Conversion binaire en décimale');
  55. writeln('         3:Conversion d''une base donnée vers une autre base donnée');
  56. writeln('         0:Quitter');
  57. repeat
  58. writeln;writeln;writeln;
  59. write('Entrez votre choix:');
  60. read(choix);
  61. case choix of
  62. '1':
  63. begin
  64. writeln;
  65. write('Le nombre à convertir: ');
  66. readln(n);
  67. writeln;
  68. write('Le résultat est: ');
  69. sol:=inttobin(n,2);
  70. write(sol);
  71. end;
  72. '2':
  73. begin
  74. writeln;
  75. write('Le nombre en binaire: ');
  76. readln; {sans ce readln le programme ne va pas lire la varriable m qui suit ;-) }
  77. readln(m);
  78. writeln  ;
  79. write('Le résultat est: ');
  80. fon:=bintoint(m,2);
  81. write(fon);
  82. end;
  83. '3':
  84. begin
  85. writeln;
  86. write('Donnez le nombre écrit dans la base choisie : ');
  87. readln;
  88. readln(m);
  89. write('Donnez la base de votre choix: ');
  90. readln(t);
  91. writeln  ;
  92. fon:=bintoint(m,t);
  93. write('Donnez la base dans laquelle vous voulez convertir votre nombre: ');
  94. readln(q1);
  95. writeln;
  96. write('Le résultat est: ');
  97. sol:=inttobin(fon,q1);
  98. write(sol);
  99. end;
  100. end;
  101. until choix = '0';
  102. writeln;writeln;writeln;
  103. writeln('                                              ***Fin***');
  104. end.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  ma fonction ne fonctionne pas

 

Sujets relatifs
Masquage de div qui ne fonctionne pas sur IE 6[Resolu] Update ADODB ne fonctionne pas
Fonction remplacement ne fonctionne pas !Comment fonctionne cette fonction "port_b_pullups (value)"
[SQL] Mais comment fonctionne la fonction ENCRYPTFonction Validation Email qui ne fonctionne pas alors qu'elle devrait
Fonction js qui ne fonctionne plus soudainementurgent : La Fonction Win32::MsgBox ne fonctionne pas correctement
Pourquoi la fonction mail fonctionne pas chez moi?[C/C++] Comment fonctionne la fonction "free" ?
Plus de sujets relatifs à : ma fonction ne fonctionne pas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR