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

  FORUM HardWare.fr
  Programmation
  Algo

  demande d'aide pour programme en turbopascal

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

demande d'aide pour programme en turbopascal

n°1489551
guigui97
Posté le 11-12-2006 à 14:28:17  profilanswer
 

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
 
 
 
 

mood
Publicité
Posté le 11-12-2006 à 14:28:17  profilanswer
 

n°1489578
Profil sup​primé
Posté le 11-12-2006 à 15:00:52  answer
 

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

n°1489631
guigui97
Posté le 11-12-2006 à 15:59:38  profilanswer
 

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. :??:  

n°1489638
Profil sup​primé
Posté le 11-12-2006 à 16:07:10  answer
 

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:

n°1489640
Profil sup​primé
Posté le 11-12-2006 à 16:08:40  answer
 

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

n°1489715
Profil sup​primé
Posté le 11-12-2006 à 17:18:56  answer
 

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.

n°1489737
Profil sup​primé
Posté le 11-12-2006 à 17:42:40  answer
 

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
n°1489805
guigui97
Posté le 11-12-2006 à 20:01:37  profilanswer
 

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:

n°1489806
Profil sup​primé
Posté le 11-12-2006 à 20:08:23  answer
 

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.

n°1489810
guigui97
Posté le 11-12-2006 à 20:14:18  profilanswer
 

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

mood
Publicité
Posté le 11-12-2006 à 20:14:18  profilanswer
 

n°1489813
Profil sup​primé
Posté le 11-12-2006 à 20:15:33  answer
 

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

n°1489831
guigui97
Posté le 11-12-2006 à 20:39:55  profilanswer
 

Enfin pour introduire des valeurs dans un tableau

n°1489833
Profil sup​primé
Posté le 11-12-2006 à 20:44:47  answer
 

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
n°1489861
guigui97
Posté le 11-12-2006 à 22:07:12  profilanswer
 

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.

n°1489913
Profil sup​primé
Posté le 12-12-2006 à 00:52:57  answer
 

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]  

n°1490014
guigui97
Posté le 12-12-2006 à 10:22:22  profilanswer
 

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

n°1490178
Profil sup​primé
Posté le 12-12-2006 à 13:10:29  answer
 

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
n°1490330
Profil sup​primé
Posté le 12-12-2006 à 15:28:13  answer
 


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
n°1490382
Profil sup​primé
Posté le 12-12-2006 à 16:04:48  answer
 

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

n°1491135
Profil sup​primé
Posté le 14-12-2006 à 09:45:12  answer
 

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
n°1491155
Profil sup​primé
Posté le 14-12-2006 à 10:28:37  answer
 

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]

n°1491353
apprentitu​x
Posté le 14-12-2006 à 14:46:58  profilanswer
 


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

n°1491370
Profil sup​primé
Posté le 14-12-2006 à 15:01:42  answer
 

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]  

n°1500602
nargy
Posté le 09-01-2007 à 00:44:59  profilanswer
 

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


mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  demande d'aide pour programme en turbopascal

 

Sujets relatifs
[résolu] film le plus loué SQLprogramme dans la zone de notification
Aide Compteur Cota[ACCESS] Aide pour projet de fac...
Java Mysql besoin d'aideprogramme serveur /client
Aide sur un Arbre binaire containerAide MACRO (desole je suis vraiment un nul en macro)
[SQL] Besoin d'aide sur les attributs pour une requeteBesoin d'aide Curl
Plus de sujets relatifs à : demande d'aide pour programme en turbopascal


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