Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Turbo Pascal
Turbo Pascal Le compilateur de Borland et ses dérivés (Borland Pascal, ...). Avant de poster -> Tout sur Turbo Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 15h03   #1
axel20012
Invité de passage
 
Femme
Inscription : octobre 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : octobre 2011
Messages : 1
Points : 0
Points : 0
Par défaut Conversion du décimal vers le DCB

Bonjour,

j'ai un problème : je veux un programme en Pascal qui convertit un nombre décimal vers le DCB (décimal codé en binaire) sur 4 bits. J'ai réfléchi mais je n'ai pas pu.
axel20012 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 01h04   #2
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 694
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 694
Points : 1 007
Points : 1 007
Bonjour !

Tu peux regarder cette discussion.

Sauf erreur de ma part, le plus grand nombre représentable avec 4 chiffres binaires est 15 (1111). La méthode de conversion consiste à rechercher les puissances de deux contenues dans le nombre.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 10h39   #3
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
Tu peux jeter un oeil ici aussi:
http://fr.wikipedia.org/wiki/Binary_coded_decimal

Je trouve néanmoins ce codage extrêmement débile, car on ne stocke que 100 nombres dans 8 bits, alors qu'on peut en mettre "naturellement" 256, d'où une énorme perte de place.
Et ca ne facilite pas forcément les algorithmes et la lecture/écriture de données... Mais comme cette méthode est encore enseignée......
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/12/2012, 20h35   #4
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 513
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

Informations professionnelles :
Activité : Ressources humaines
Secteur : Service public

Informations forums :
Inscription : mars 2003
Messages : 5 513
Points : 39 399
Points : 39 399
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
Bonjour,

Pour décomposer un nombre entier en chiffres décimaux, il faut le diviser successivement par 10 et récupérer les restes successifs dans un octet. Forcément, les 4 bits de poids faible de cet octet contiendront le chiffre extrait.

S'il s'agit de conversion en packed BCD (2 chiffres par octet), il faut appliquer un décalage de 4 bits pour un chiffre sur deux (les puissances impaires de 10).

Exemple : la conversion de 94 en packed BCD (à généraliser pour des nombres supérieurs à 99 ) :
  • Le résultat est mis à zéro ;
  • Division de 94 par 10 : quotient = 9 et reste = 4 --> le reste est additionné au résultat ;
  • Division du quotient (9) par 10 : quotient = 0 et reste = 9 --> le reste est décalé de 4 bits vers la gauche et additionné au résultat.
Il reste à transformer en pseudocode cette résolution faite sur papier puis à généraliser le principe dans une boucle. Des tests sur papier permettront de valider la solution ou d'en trouver une meilleure.
Pour terminer : on traduit le pseudocode en Pascal.
__________________
Règles du forum
Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
Mes tutoriels et sources Pascal
FAQ Assembleur

Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/12/2012, 13h17   #5
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 694
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 694
Points : 1 007
Points : 1 007
Citation:
Envoyé par Alcatîz Voir le message
le reste est décalé de 4 bits vers la gauche et additionné au résultat
N'est-ce pas plutôt : le résultat est décalé de 4 bits et le reste est additionné au résultat ?

Autrement, voici une procédure qui peut aider à comprendre et à mettre en œuvre la solution expliquée par Alcatîz.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
{ Ecrire en chiffres binaires la valeur d'une variable de type LongInt. }
 
program test;
 
procedure WriteBinaryDigits(li: longInt);
var
  i: integer;
  s: string;
begin
  s := '0000';
  s := s + s;
  s := s + s;
  s := s + s;
 
  {$Define Version1}
  for i := 32 downTo 1 do
  begin
    {$IfDef Version1}
    if li mod 2 = 1 then s[i] := '1';
    li := li div 2;
    {$Else}
    if li and 1 = 1 then s[i] := '1';
    li := li shr 1;
    {$EndIf}
  end;
 
  for i := 0 to 3 do
  begin
    Write(Copy(s, 8 * i + 1, 8));
    if i < 3 then Write(' ');
  end;
end;
 
begin
  WriteBinaryDigits(255);
  ReadLn;
end.
Citation:
00000000 00000000 00000000 11111111
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 09h49   #6
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 513
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

Informations professionnelles :
Activité : Ressources humaines
Secteur : Service public

Informations forums :
Inscription : mars 2003
Messages : 5 513
Points : 39 399
Points : 39 399
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
Citation:
Envoyé par Roland Chastain Voir le message
N'est-ce pas plutôt : le résultat est décalé de 4 bits et le reste est additionné au résultat ?
Non, puisque les digits sont déterminés de la droite vers la gauche : le premier digit trouvé est stocké dans les 4 bits de poids faible et le second dans les 4 bits de poids fort.
__________________
Règles du forum
Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
Mes tutoriels et sources Pascal
FAQ Assembleur

Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
Alcatîz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 16h14   #7
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 694
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 694
Points : 1 007
Points : 1 007
Citation:
Envoyé par Alcatîz Voir le message
Non, puisque les digits sont déterminés de la droite vers la gauche : le premier digit trouvé est stocké dans les 4 bits de poids faible et le second dans les 4 bits de poids fort.
Merci Alcatîz. Je ne sais pas à quoi je pensais.

L'auteur de la discussion ne s'étant plus manifesté, je me permets de poster ce que j'ai fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
program essaiDCB;
 
uses
  Crt;
 
procedure WriteLnBinaryDigits(l: longInt);
const
  s1 = '00000000000000000000000000000000';
var
  i: integer;
  s2: string;
begin
  s2 := s1;
  for i := 32 downto 1 do
  begin
    if l and 1 = 1 then s2[i] := '1';
    l := l shr 1;
  end;
  for i := 1 to 8 do
    Write(Copy(s2, 4*i-3, 4), ' ');
  WriteLn;
end;
 
function DCB(l: longInt; pckd: boolean): longInt;
var
  i: longInt; { résultat }
  r: longInt; { reste de la division }
  m: longInt; { plus grande valeur représentable }
  j: integer; { compteur }
  n: integer; { nombre de chiffres décimaux traités }
begin
  if pckd then
  begin
    n := 8;
    m := 99999999;
  end else
  begin
    n := 4;
    m := 9999;
  end;
  if l > m then l := m;
  i := 0;
  for j := 0 to n - 1 do begin
    r := l mod 10;
    l := l div 10;
    r := r shl ((32 div n) * j);
    i := i or r;
  end;
  DCB := i;
end;
 
var
  i: longInt;
 
begin
  ClrScr;
  Write('Veuillez saisir un nombre entier : ');
  ReadLn(i);
  WriteLn;
  WriteLnBinaryDigits(i);
  WriteLnBinaryDigits(DCB(i, false));
  WriteLnBinaryDigits(DCB(i, true));
  WriteLn;
  WriteLn('Appuyez sur une touche...');
  ReadKey;
end.
En suivant le lien donné plus haut par wormful_sickfoot j'ai appris comment fonctionnait un afficheur à 7 segments : ça ferait un beau sujet d'exercice. Quelqu'un du forum s'y est-il déjà essayé ?

Ce serait intéressant de refaire avec FlashPascal cette animation.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h36.


 
 
 
 
Partenaires

Hébergement Web