ma fonction ne fonctionne pas - Delphi/Pascal - Programmation
Marsh Posté le 27-12-2007 à 15:00:41
val(m[i],result,code);
=>
elle donne quoi comme résultat cette procédure ?
Marsh Posté le 27-12-2007 à 16:30:34
et ca ca marche pas?
Code :
|
(si ta procedure val() convertit bien le caractere m[i] (0 ou 1) en entier;
Marsh Posté le 28-12-2007 à 17:19:36
vttman2 a écrit : val(m[i],result,code); |
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 !
Marsh Posté le 28-12-2007 à 17:36:05
breizhbugs a écrit : et ca ca marche pas?
|
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!
Marsh Posté le 28-12-2007 à 23:56:22
capshane a écrit : |
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 |
c'est pas readln(m) plutot?
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 |
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 !!
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;
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
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?
Marsh Posté le 29-12-2007 à 21:13:47
effectivement ça marche parfaitement (à part le result) désolé
breizhbugs a écrit : |
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; |
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.
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
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 :
|
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