demande d'aide pour programme en turbopascal

demande d'aide pour programme en turbopascal - Algo - Programmation

Marsh Posté le 11-12-2006 à 14:28:17    

Bonjour,  
mon petit frère me demande de l'aider à trouver l'erreur qu'il a fait dans son programme (apparemment il ne marche pas!) j'en suis maintenant incapable.
Pourriez-vous l"aider?
Il s'agit du Codage binaire sur 16 bits d'un nombre entier relatif
Voilà son programme:
 
{$APPTYPE CONSOLE}
 
uses
SysUtils;
 
const  
taille=16;
 
type  Tabcode=array[1..taille] of integer;    
 
function LIRE_ENTIER:integer;
var nombre:integer;
begin
Writeln ('Quel nombre veux tu convertir en binaire?');  
Readln (nombre);
 
 While (nombre>32767) or (nombre<-32768) do
        begin
        Writeln ('Error!!! :-( Please try again!! Please enter another number!!!');
        Readln (nombre);
        end;
 
If nombre=0 then   //si l'entier à coder est nul, on donne directement le résultat
        begin
        Writeln ('Le nombre binaire est egal a 0000 0000 0000 0000');
        Readln;
        end;
 
Var
i : integer ;  
(puissance): integer;
(somme): integer;
 
Begin
i :=1;
(puissance) :=0;
(somme) :=0;
 
Repeat
i :=i*2  
(puissance) :=(puissance)+1
Until i>(nombre)
 
If i>(nombre) do
i :=i/2
(puissance) :=(puissance)-1
tabcode[puissance] :=1
 
tabcode[1;i]:=0
 
 
 
If i<(nombre) do
(somme) := i +i/2
 
 
Repeat
 
begin
If (somme)<(nombre)
then do tabcode[puissance] :=1
else        tabcode[puissance] :=0
 
(puissance) :=(puissance)-1
 
until (somme)=(nombre)
 
end
 
 
Merci de votre aide
 
 
 
 

Reply

Marsh Posté le 11-12-2006 à 14:28:17   

Reply

Marsh Posté le 11-12-2006 à 15:00:52    

Bonjour guigui97, je ne fait que rajouter la balise code=pascal pour que ce soit plus lisible.
Ceci dis, bien que je ne connaise pas grand chose au pascal, ça ne m'etonne  pas qu'il ne marche pas, qu'il ne compile pas, qu'il ne passe même pas la premiere epreuve que va lui infliger le compilateur.
 
J'ai retaper un peu la mise en page, l'indentation, et il y à des truc louche, amoins que je fabule
 
regarde !

Code :
  1. {$APPTYPE CONSOLE}
  2.  
  3. uses SysUtils;
  4.  
  5. const taille=16;
  6.  
  7. type  Tabcode=array[1..taille] of integer;    
  8.  
  9. function LIRE_ENTIER : integer;
  10. var nombre : integer;
  11. begin
  12.   Writeln ('Quel nombre veux tu convertir en binaire?');  
  13.   Readln (nombre);
  14.  
  15.   While (nombre>32767) or (nombre<-32768) do
  16.      begin
  17.         Writeln ('Error!!! :-( Please try again!! Please enter another number!!!');
  18.         Readln (nombre);
  19.      end;
  20.  
  21.      If nombre=0 then   //si l'entier à coder est nul, on donne directement le résultat
  22.         begin
  23.            Writeln ('Le nombre binaire est egal a 0000 0000 0000 0000');
  24.            Readln;
  25.         end;
  26.  
  27.   Vari : integer ;  
  28.   (puissance) : integer;
  29.   (somme) : integer;
  30.  
  31.   Begin
  32.      i :=1;
  33.      (puissance) :=0;
  34.      (somme) :=0;
  35.  
  36.      Repeat
  37.         i :=i*2  
  38.         (puissance) :=(puissance)+1
  39.      Until i>(nombre)
  40.  
  41.      If i>(nombre) do
  42.         i :=i/2
  43.         (puissance) :=(puissance)-1
  44.         tabcode[puissance] :=1
  45.         tabcode[1;i]:=0
  46.  
  47.      If i<(nombre) do
  48.         (somme) := i +i/2
  49.  
  50.      Repeat
  51.         begin
  52.            If (somme)<(nombre)  then do
  53.               tabcode[puissance] :=1
  54.            else
  55.               tabcode[puissance] :=0
  56.               (puissance) :=(puissance)-1
  57.      until (somme)=(nombre)
  58.         end


 
en plus, je ne sais si c'est normal, mais il y à des if avec des then et d'autre sans, bon, tu me dira, nous somme dans algo  [:dawa_neowen] , et en fin de code le end doit etre mal placé si je suis la logique du début de code.
 
N'y aurait-il pas moyen de faire un tableau de booléen au lieu d'un tableau d'entier comme resulta ? ce serais tout de même plus representatif.
 
Pour l'algo en lui même, je repasse dans un moment, si tu me permé.

Reply

Marsh Posté le 11-12-2006 à 15:59:38    

Merci Jovalise, j'ai fait du turbopascal il y a déjà un petit moment; j'ai cru que je pourrai l'aider mais vraiment je n'arrive pas du tout à me remettre dedans. :??:  

Reply

Marsh Posté le 11-12-2006 à 16:07:10    

Je n'ai pas terminé, mais voici un code qui compile cher moi avec fpc (Free Pascal compiler)
j'ai fait quelque correction de bon sens à priori, tu refera les modifications que tu souhaitera ! ;)  

Code :
  1. //{$APPTYPE CONSOLE}
  2.  
  3.  
  4. program main;
  5. uses SysUtils;
  6. const taille  = 16;
  7. type  Tabcode = array[1..taille] of integer;    
  8.  
  9.  
  10. var nombre : integer;
  11. i      : integer ;
  12. puissance : integer;
  13. somme      : integer;
  14.   tab      : tabcode;  
  15.  
  16. begin      
  17.   Writeln ('Quel nombre veux tu convertir en binaire?');  
  18.   Readln (nombre);
  19.   While (nombre>32767) or (nombre<-32768) do
  20.      
  21.      Writeln ('Error!!! :-( Please try again!! Please enter another number!!!');
  22.      Readln (nombre);
  23.   ;
  24.   If nombre = 0 then   //si l'entier à coder est nul, on donne directement le résultat
  25.  
  26.      Writeln ('Le nombre binaire est egal a 0000 0000 0000 0000');
  27.      Readln;
  28.  
  29.   i :=1;
  30.   puissance :=0;
  31.   somme :=0;
  32.   Repeat
  33.      i :=i*2;
  34.      puissance :=puissance+1;
  35.   Until i>nombre;
  36.   If i>nombre then
  37.      i :=i div 2;
  38.   puissance :=puissance-1;
  39.   tab[puissance] :=1;
  40.   tab[i]:=0;
  41.  
  42.   If i<nombre then
  43.      somme := i + i div 2;
  44.   Repeat
  45.      If (somme)<nombre  then
  46.         tab[puissance] :=1
  47.       else
  48.         tab[puissance] :=0 ;
  49.      puissance :=puissance-1;
  50.  
  51.   until somme=nombre;
  52. end.


 
je me met à l'algo. ... mois aussi, ça fait 10 ans que je n'ai pas fait de Pascal  :lol:

Reply

Marsh Posté le 11-12-2006 à 16:08:40    

Ah, au fait, que doit faire ce petit programme exactement ?

Reply

Marsh Posté le 11-12-2006 à 17:18:56    

C'est pas evident à corriger pour un beaotien, mais j'en suis la, le programme donne des resultats divers en fonction du nombre entré. Peut-tu regardé si ça correspond à peut près à ce que tu as voulu ecrire ?

Code :
  1. //{$APPTYPE CONSOLE}
  2. program main;
  3. uses SysUtils;
  4. const taille     = 16;
  5. type  Tabcode    = array[1..taille] of integer;    
  6.  
  7. var
  8.   nombre    : integer;
  9.   i         : integer ;
  10.   puissance : integer;
  11.   somme     : integer;
  12.   tab         : tabcode;  
  13.  
  14. begin      
  15.   Write ('Quel nombre veux tu convertir en binaire?');
  16.   Readln (nombre);
  17.   While (nombre > 32767) or (nombre<-32768) do
  18.      begin
  19.      Writeln ('Error!!! :-( Please try again!! Please enter another number!!!');
  20.      Readln (nombre);
  21.      end;
  22.   ;
  23.   If nombre = 0 then   //si l'entier à coder est nul, on donne directement le résultat
  24.      Writeln ('Le nombre binaire est egal a 0000 0000 0000 0000')
  25.   else
  26.     begin
  27.       i :=1;
  28.       puissance :=0;
  29.       somme :=0;
  30.       Repeat
  31.         i :=i*2;
  32.         puissance :=puissance+1;
  33.  
  34.       Until i>nombre;
  35.  
  36.       If i>nombre then
  37.         begin
  38.           i :=i div 2;
  39.           puissance :=puissance-1;
  40.           tab[puissance] :=1;
  41.      end;
  42.  
  43.       tab[i]:=0;
  44.  
  45.       If i<nombre then
  46.       begin
  47.         somme := i + i div 2;
  48.         Repeat
  49.           If somme < nombre  then
  50.              tab[puissance] :=1
  51.            else
  52.              tab[puissance] :=0
  53.            ;
  54.            puissance :=puissance-1;
  55.      until somme=nombre;
  56.       end;
  57.       Write ('; Le nombre binaire est egal a : ');
  58.       for i := 0 to 15 do
  59.         write (tab[i]);
  60.     end;
  61.   ;
  62. end.

Reply

Marsh Posté le 11-12-2006 à 17:42:40    

Voici les 16 resultats pour les 16 premiers entier naturel 1..16
les ligne vide corresponde à un ctrl-C pour interrompre le programme qui tourne dans le vide ou plante. Le resultat pour 3, 6  est stupefiant  :lol: Quant à celui du 12 c'est de la moquerie je crois  :lol:  :lol:  
 


manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?1
; Le nombre binaire est egal a : 1000 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?2
; Le nombre binaire est egal a : 0100 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?3
; Le nombre binaire est egal a : 3000 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?4
; Le nombre binaire est egal a : 0010 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?5
     
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?6
; Le nombre binaire est egal a : 6000 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?7
     
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?8
; Le nombre binaire est egal a : 0001 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?9
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?10
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?11
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?12
; Le nombre binaire est egal a : 12000 0000 0000 0000
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?13
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?14
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?15
 
manuel@gandalf:~$ ./main
Quel nombre veux tu convertir en binaire?16
; Le nombre binaire est egal a : 0000 1000 0000 0000


 
Pour la representation des negatifs, je suis pas sur que ce code le preine en concideration  :heink:


Message édité par Profil supprimé le 11-12-2006 à 17:44:18
Reply

Marsh Posté le 11-12-2006 à 20:01:37    

C'est vraiment sympa d'avoir travaillé sur ce programme  :bounce: Merci
Je ne peux pas le tester ici.
Si je comprends bien, il ne marche pas pour tous les nombres :whistle:

Reply

Marsh Posté le 11-12-2006 à 20:08:23    

Non, en effet, mon algo est incorrecte.
Si tu pouvais relire mon code pour voir si je ne me suis pas planté à la premiere retouche ??
j'ai traduit tout simplement par exemple "Tabcode[1;i] := 0" par "Tab[i] := 0;" car je ne connais pas, comme mon compilateur, l'expression '[1;i]'. Vas y de bon coeur sur tes remarques éventuelles.

Reply

Marsh Posté le 11-12-2006 à 20:14:18    

Je pense en effet que ce n'est tabcode[1;i] mais peut être tabcode[1..i]

Reply

Marsh Posté le 11-12-2006 à 20:14:18   

Reply

Marsh Posté le 11-12-2006 à 20:15:33    

C'est pour initialisation ? n'est-ce pas ?

Reply

Marsh Posté le 11-12-2006 à 20:39:55    

Enfin pour introduire des valeurs dans un tableau

Reply

Marsh Posté le 11-12-2006 à 20:44:47    

Comme je ne pensais pas que ton algo calculait la valeur de plusieur bit à la fois, et que tu souhaitais affecter le tableau de 1 à i, je me disais que c'était pour l'initialiser
ça s'écrit ainsi à priori ::=

Code :
  1. tab       : tabcode  = (false,false,false,false,false,false,false,false,false,false,false,
  2. false,false,false,false,false);


Message édité par Profil supprimé le 11-12-2006 à 20:45:30
Reply

Marsh Posté le 11-12-2006 à 22:07:12    

mon algo ne calcule pas plusieurs bit à la fois, mais il les calcule bit par bit. En commencant par le premier bit à 1. En partant vers la droite il complète soit par 0 soit par 1. Et à la fin, ce serait bien que chaque case vide corresponde à un 0.

Reply

Marsh Posté le 12-12-2006 à 00:52:57    

Voila, donc, en initialisant le tableau avec des 0, nous n'avons pas à nous soucier des bits non traité et même, nous pouvons ne rien faire lorsque le bit doit rester à 0.
 
Mais à vrai dire, l'algorithme en lui même me pose problème,
j'ai oublier comment convertir une representation base10 en représentation base2 [:dawa_neowen]  

Reply

Marsh Posté le 12-12-2006 à 10:22:22    

Désolé de ne pouvoir répondre, je n'arrive pas à joindre mon frère....il doit être en cours.
Avec un peu de chance, il aura avancé!

Reply

Marsh Posté le 12-12-2006 à 13:10:29    

Bonjour guigui97, bonjour à tous
Petite question ... sais-tu ... ou quelq'un pourait-il dire, quelles sont les representations binaire possibles de nombre signé ?
je sais qu'il y a grand et petit boutiste, mais je ne sais pas exactement comment est codé un nombre negatif.
Comment s'ecrive 32767 et -32768 en binaire en notation signée ?
 
Merci,

Message cité 1 fois
Message édité par Profil supprimé le 12-12-2006 à 15:29:09
Reply

Marsh Posté le 12-12-2006 à 15:28:13    


La question reste entiere !!
 
 
 
A part ça, j'ai fais ça en Ada ::=  

Code :
  1. for I in reverse 0..15 loop
  2.     if Nombre_A_Convertir - 2**I >= 0 then
  3.         Resultat(I+1) := True;
  4.         Nombre_A_Convertir := Nombre_A_Convertir - 2**I;
  5.     end if;
  6. end loop;


 
Ce qui colle avec ça (que je viend de decouvrir, c'est cool  :sol: , merci djobidjoba et consort)::=

_darkalt3_ a écrit :

J'ai fait une erreur:

valeur;
chaine[16]; // pour un binaire sur 16 bits
 
pour i=15 à 0
   si (valeur - 2^i >= 0)
      alors
         chaine[i] = 1
         valeur = valeur - 2^i
      sinon chaine[i] = 0
fin pour



 
 
Il n'y a plus qu'à l'ecrire en Pascal  [:dawa_neowen]


Message édité par Profil supprimé le 13-12-2006 à 10:10:26
Reply

Marsh Posté le 12-12-2006 à 16:04:48    

Donc, voila pour les positif en notation non signé à priori
 

Code :
  1. repeat  
  2.          begin
  3.            if (nombre - 2**i) >= 0 then
  4.              begin
  5.                tab[i+1] := true;
  6.                nombre := nombre - 2**i;
  7.              end;
  8.          end;
  9.          i := i - 1;
  10.       until i < 0;
  11.       ;

Reply

Marsh Posté le 14-12-2006 à 09:45:12    

Bonjour, c'est pour une representation !  [:dawa_neowen]  
 
Comment représente t-on un entier relatif en binaire petit et/ou gros boutiste ?  [:dawa_neowen]  
 
(j'ai prèté mon bouquin ... à une copine  [:dawa_neowen] )  
 
Merci  :jap:
 
Edit ::= je vous prie de bien vouloir m'excuser, j'ai pas encore pris la bonne abitude de demander à google ...
 
je vien de trouver ça donc ::=


nous aurions, sur 4 bits, 0011 qui code toujours la valeur 3 et 1011 qui représenterait la valeur -3.


 
Mais alors, on perd un bit  :??:


Message édité par Profil supprimé le 14-12-2006 à 09:57:08
Reply

Marsh Posté le 14-12-2006 à 10:28:37    

Ce qui nous amène à ça "finalement" (si je ne m'abuse):=
 

Code :
  1. // Pour un entier relatif codable sur 15 bits (16 moins 1 bit de perdu, bref)
  2.    i := 13
  3.    repeat  
  4.            if nombre < 0 then
  5.              begin
  6.                tab[1] := true;
  7.                nombre := nombre * (-1);
  8.              end;
  9.            if (nombre - 2**i) >= 0 then
  10.              begin
  11.                tab[i+3] := true;
  12.                nombre := nombre - 2**i;
  13.              end;
  14.          end;
  15.          i := i - 1;
  16.    until i < 0;


 
Mais c'est louche parce que 2**14 (16 - 1 bit de perdu - 1 bit de signe) = 16384 et non 32767.
En plus je n'ai jamais compris pourquoi sur 16 bits nous pouvions, a priori, coder 32767 max ou -32768 min  :??: , c'est que je ne suis pas une fleche en math peut-etre  [:dawa_neowen]

Reply

Marsh Posté le 14-12-2006 à 14:46:58    


 
Sur 16 bits on a 2**16 valeurs (nb pair) donc avec le zéro, tu ne peux pas avoir autant de valeurs supérieures et inférieures à zéro.
Il faut donc choisir de quel côté tu en met un de plus, et ça c'est le boulot des commités de normalisation.
Dans ce cas précis, en complément à 2, tu as un négatif de plus que les strictements positifs.
 
ps: ce topic, c'est plus du pascal que de l'algo...

Reply

Marsh Posté le 14-12-2006 à 15:01:42    

Merci apprentitux !
le zero, je n'y pensais pas  :heink: .
 

apprentitux a écrit :


ps: ce topic, c'est plus du pascal que de l'algo...


 
C'est de l'algo Pascalien  [:dawa_neowen]  

Reply

Marsh Posté le 09-01-2007 à 00:44:59    

en C:

Code :
  1. /* le buffer doit faire au moins b caractères */
  2. /* n est un entier de b bits */
  3. void ito_bin(int n, char* buffer, unsigned int b)
  4. {
  5.   unsigned int mask=1<<(b-1);
  6.   for(unsigned int i=b;i>0;i--,mask>>=1,buffer++)
  7.     *buffer= ((unsigned int)n&mask)?'1':'0';
  8. }
  9. /* programme de test */
  10. #include <stdio.h>
  11. int main()
  12. {
  13.   const unsigned int numbitsperint=sizeof(int)*8;
  14.   int n=0;
  15.   char bin[numbitsperint+1];
  16.   printf("Donner un nombre: " ); scanf("%d", &n); printf("\n" );
  17.   ito_bin(n, bin, numbitsperint); bin[numbitsperint]=0;
  18.   printf("En binaire: %s\n", bin);
  19.   return 0;
  20. }


Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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