aide pascal

aide pascal - Programmation

Marsh Posté le 06-06-2001 à 14:45:21    

existe t-il (dans turbo pascal) une fonction, procedure ou instruction qui permette de convertir des nombres decimal en nombre binaire car j'ai un exercice a faire qui me demande :
   
  Ecrire une fonction qui recoit en parametre un entier inferieur a 256 et retourne son equivalent binaire.
a l'execution, vous devrez obtenir sur l'ecran:
 Entrz un nombre decimal <256 :255
 Equivalent decimal: 11111111
 Voulez vous continuez ? (o/n) :
 
 
Voici un autre exo
Ecrire une fonction utilisant la fonction predefinie RANDOM pour retourner un entier aleatoire compris entre 2 limites (min,max) passees en parametres.
  Testez la fonction en generant 1000 nombres aleatoires compris entre 1 et 10 et en affichant le nombre de fois que chaque nombre est sorti.
 Sur l'ecran, vous obtiendrez, par exemple :
   1:98
   2:104
   3:87
   ...
   ...
   10:99
 
Vous disposez pour ecrire ce programme de la fonction predefinie RANDOM .Cette fonction qui s'utilide sans argument (cas tout a fait exceptionnel) delivre comme resultat un reel compris entre 0 et1 .
 Vous avez lz droit d'ecrire:
   alea:= RANDOM;
alea etant une varible de type reel.
 
Quelqu'un pourrait m'expliquer la fonction RANDOM.comment fait-on pour definir les 2 limites.comment fait-on pour avoir des nombres 1;2;3;4;....10..1001025 alors que random nous fournit des nombres compris entre 0 et 1?MERCI
 
Je demande de l'aide car je suis des cours a distance en turbo-pascal et ces cours sont loin de tous expliquer  .merci

Reply

Marsh Posté le 06-06-2001 à 14:45:21   

Reply

Marsh Posté le 06-06-2001 à 15:01:28    

pour le point n° 2 :
alea:=min+ent(random*(max+1-min))
doit te donner un nombre compris entre min et max (inclus)
Pour le 1, je cherche 5 min
A+

Reply

Marsh Posté le 06-06-2001 à 15:03:12    

je ne crois pas qu'une telle fonction existe. il semble plutôt s'agir d'effectuer manuellement cette conversion (et vive les divisions!!!). :D

Reply

Marsh Posté le 06-06-2001 à 15:12:46    

bah c pas bien difficile de convertir un nb déci en bin.
Tu fais des divisions successives par 2 et tu gardes le quotient qqpart (0 ou 1). Ensuite tu affiches cette suite de chiffre et basta!

Reply

Marsh Posté le 06-06-2001 à 15:18:31    

Comme l'a dit prettysmile, cette fonction n'existe pas. Elle s'écrit facilement sans division :
définir 8 bytes :
Const
 B1 = 0001; {00000001 en binaire}
 B2 = 0002; {00000010 en binaire}
 B3 = 0004; {00000100 en binaire}
 B4 = 0008; {00001000 en binaire}
...
 B8 = 0128; {10000000 en binaire}
 
 
if(Variable AND B8) <> 0 imprime 1 sinon imprime 0;
if(Variable AND B7) <> 0 imprime 1 sinon imprime 0;
...
if(Variable AND B2) <> 0 imprime 1 sinon imprime 0;
if(Variable AND B1) <> 0 imprime 1 sinon imprime 0;
 
Dans tes tests tu peux bien sur créer une variable texte au lieu d'imprimer directement
Tu peux également faire un tableau de bytes
 
ce qui donnera :  
texte:='';
for i:= 8 downto 1 do
begin
  if (Variable AND B[i]) <> 0 then texte=texte+'1' else texte := texte + '0';
end;
A+

 

[edit]--Message édité par JPA--[/edit]

Reply

Marsh Posté le 06-06-2001 à 15:20:04    

tiens un ex: pour 15
15 div 2 = 7 , 15%2 = 1
bon tu as le quotient (7) et le reste (1)
ben tu fais 7 div 2 = 3 , 7%2 = 1
ensuite 3 div 2 = 1 , 3%2 = 1
bon ben tu as un quotient < 2 donc tu arrêtes et tu affiches à l'écran :  
1111.
Voilà, j'essaie de trouver un algo fastoche ensuite j'te le file.

Reply

Marsh Posté le 06-06-2001 à 15:31:30    

bon tu fais un truc du style :  
writeln ('entrez le nb à convertir');
readln (nb);
quot := nb;
rest := 0;
while (quot >= 2) do
{  
   quot := (quot div 2);
   rest := (quot % 2);
   write (rest);
   if (quot == 1) then  
      write ('1');
}
 
ça c'est un peu batard mais ça marche pour les nb impairs.
pour les nb pairs c différent ex: 8 c 1000
J'vis fait une fonction qui traitait bien les 2 mais à chaud peut pas te répondre.

Reply

Marsh Posté le 06-06-2001 à 15:36:06    

Je viens d'éditer mon post qui comportait des erreurs.  
J'ai pas testé, mais je pense que celà marche
A+

Reply

Marsh Posté le 06-06-2001 à 15:36:42    

ben en fait c la même chose, m'en étais pas rendu compte, au fait div c'est la commande qui effectue une division entière, et % celle qui te donne le reste de la division entière.

Reply

Marsh Posté le 06-06-2001 à 15:37:23    

bounga.. je crois ke ta oublié ke c par puissance de 2 :D
 
moi je suis pour la technique de jpa...
et hop, une boucle...


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 06-06-2001 à 15:37:23   

Reply

Marsh Posté le 06-06-2001 à 15:59:40    

ben justement 2^0 = 1
              2^1 = 2
              2^2 = 4
              2^3 = 8
 
15 = (2^0 + 2^2 + 2^3 + 2^4) = 1111
 
je ne dis pas que la méthode de jpa n'est pas bonne, j'essaie de donner un truc le plus simple possible. A ce que je sache, quand on t'apprends à convertir un nombre deci en nombre binaire, on te dis de faire des divisions successives par 2, c sur quoi je me base :  
quot := 15;
rest := 0;
 
1)
quot = 7
rest = 1
 
2)
quot = 3
rest = 1
 
3)
quot = 1
rest = 1
 
et à la fin tu as 1111
 
le pb c'est que les chiffres sont affichés à l'envers donc on fait comme jpa :
on crée un tableau de longueur 8 nommé binar qu'on initialise à 0, ensuite on fait :
 bon tu fais un truc du style :  
writeln ('entrez le nb à convertir');  
readln (nb);  
quot := nb;  
rest := 0;  
i:=1;
while (quot >= 1) do  
{  
   quot := (quot div 2);  
   rest := (quot % 2);  
   binar[i] := rest;  
   i := i+1;
}  
 
for i=8 downto 1 do
 write (binar[i];
 
il me semble que ça marche comme ça.

 

[edit]--Message édité par Bounga69--[/edit]

Reply

Marsh Posté le 06-06-2001 à 16:38:36    

voici une solution qui doit marche aussi et qui se rapproche des solutions deja proposée...
 

Code :
  1. n:byte; // c'est le nombre entre 0..255
  2. i:integer;
  3. s:string[8]; // je crois que c'est comme ca que ca s'ecrit mais j'ai un doute
  4. for i:=8 downto 1 do
  5.   begin
  6.     s[i]=chr(48 + (n and 1));
  7.     n:=n shr 1;
  8.   end;
  9. writeln('Equivalent decimal: '+n);

Reply

Marsh Posté le 06-06-2001 à 16:43:23    

darkoli a écrit a écrit :

voici une solution qui doit marche aussi et qui se rapproche des solutions deja proposée... sauf qu'elle est tres courte (peu de lignes).
 

Code :
  1. n:byte; // c'est le nombre entre 0..255
  2. i:integer;
  3. s:string[8]; // je crois que c'est comme ca que ca s'ecrit mais j'ai un doute
  4. for i:=8 downto 1 do
  5.   begin
  6.     s[i]=chr(48 + (n and 1));
  7.     n:=n shr 1;
  8.   end;
  9. writeln('Equivalent decimal: '+s);





Reply

Marsh Posté le 06-06-2001 à 16:45:30    

C'est à mon sens la solution la plus élégante.
Bravo Darkoli ! :jap:

Reply

Marsh Posté le 06-06-2001 à 17:06:49    

merci JPA :D

Reply

Marsh Posté le 06-06-2001 à 18:11:57    

je vous remercie tous.je vais essayer la methode de darkoli qui me semble la + clair.merci.@+

Reply

Sujets relatifs:

Leave a Replay

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