ma fonction ne fonctionne pas

ma fonction ne fonctionne pas - Delphi/Pascal - Programmation

Marsh Posté le 27-12-2007 à 13:33:13    

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
Reply

Marsh Posté le 27-12-2007 à 13:33:13   

Reply

Marsh Posté le 27-12-2007 à 15:00:41    

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 ...
Reply

Marsh Posté le 27-12-2007 à 16:30:34    

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
Reply

Marsh Posté le 28-12-2007 à 17:19:36    

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
Reply

Marsh Posté le 28-12-2007 à 17:36:05    

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
Reply

Marsh Posté le 28-12-2007 à 23:56:22    

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
Reply

Marsh Posté le 29-12-2007 à 00:34:17    

[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 !!

Reply

Marsh Posté le 29-12-2007 à 00:37:52    

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;

Reply

Marsh Posté le 29-12-2007 à 01:45:11    

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  
 
 
 
 

Reply

Marsh Posté le 29-12-2007 à 11:33:23    

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
Reply

Marsh Posté le 29-12-2007 à 11:33:23   

Reply

Marsh Posté le 29-12-2007 à 21:13:47    

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;

Reply

Marsh Posté le 29-12-2007 à 22:17:14    

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:

Reply

Marsh Posté le 29-12-2007 à 23:58:04    

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

Reply

Marsh Posté le 03-01-2008 à 23:26:37    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed