VB2005 affichage de 4 chiffres

VB2005 affichage de 4 chiffres - VB/VBA/VBS - Programmation

Marsh Posté le 20-11-2007 à 20:28:46    

Bonjour!
J'aurais besoin d'un petit coup de pouce.
Je suis en DUT GMP et on m'a demandé de créer un algorythme sous VB2005 qui serait un affichage digitale.
J'ai donc créé cela en gros :
_______
|         |
|         |
_______
|         |
|         |
_______
 
J'ai attribué a chacune des barres une couleur suivant le chiffre que l'on rentre.
(ex:pour le 1 il n'y a que celle de droite qui s'allume les autres reste grise)
Mon probléme est le suivant, on me demande de faire la même chose mais avec 4 chiffres.Ma méthode n'est plus applicable car cela me ferait rentrer 9999 combinaisons différentes
C'est pou quoi j'aimerais savoir si vous auriez une astuce


Message édité par nimjaben le 20-11-2007 à 20:54:27

---------------
Feed-Back
Reply

Marsh Posté le 20-11-2007 à 20:28:46   

Reply

Marsh Posté le 21-11-2007 à 09:39:21    

Je ne suis pas sûr d'avoir compris ton problème, mais tu peux coder tes barres de manière binaire (0=éteinte, 1=allumée).
Vu qu'un chiffre est composé de 7 barres, tu peux le coder sur un octet.
Le fait d'avoir 4 chiffres nécessitera donc 4 octets.
Est-ce que ça t'aide ?

Reply

Marsh Posté le 21-11-2007 à 10:14:05    

++ Je vois pas trop où ça bloque...
 
Tu traîtes chaque chiffre de ton nombre un à un (si tu sais pas faire un modulo et une division par 10, tu peux toujours passer par une chaîne de caractères)... Après que t'aie 1 chiffre ou 25000, ça changera rien à ton algo...

Reply

Marsh Posté le 21-11-2007 à 10:34:48    

Je ne suis qu'un débutant sur Visual Basic.
Mon probléme est le suivant, si j'écrit 2054, mon affichage digitale ne saura pas a quel digit il doit attribuer chaque chiffre.
Je vais essayer de voir vos proposition mais je n'ai pas tout compris


---------------
Feed-Back
Reply

Marsh Posté le 21-11-2007 à 14:45:37    

up!!


---------------
Feed-Back
Reply

Marsh Posté le 21-11-2007 à 14:47:21    

Ben explique ton problème, parceque y'a rien de plus à dire par rapport à ce que tu nous a dit de ton problème...
 
Pis là c'est pas un souci de VB2005 spécifiquement, mais de l'algo pur et dur...
 
Parcourir chaque chiffre d'un nombre dans une boucle c quand même pas la fin du monde :o

Reply

Marsh Posté le 21-11-2007 à 14:57:45    

En quoi ton affichage digital devrait « savoir » quoi que ce soit ?
Que je sache, en programmation c'est le codeur qui décide.

 

Là je te propose de coder 2054 par une suite de 4 octets (1 par chiffre pour faire simple)
Chaque bit d'un octet correspond à l'activation ou non d'une de tes barres.

 

Il suffit de convenir de l'ordre des barres par rapport à l'ordre des bits pour en faire une représentation graphique.
Par exemple 0010010 correspondrait à 1, suivant l'ordre :
vertical haut gauche, horizontal haut centre, vertical haut droit, vertical bas gauche, horizontal milieu, vertical bas droit, horizontal bas centre
Avec ce même ordre (et sauf erreur de ma part) on aurait 2 codé par 0111101
Évidemment pour le 8e bit de ton octet, tu choisis conventionnellement de mettre, soit 0, soit 1.
ps: ça n'est qu'une manière de faire parmi d'autres.


Message édité par tegu le 21-11-2007 à 14:58:21
Reply

Marsh Posté le 21-11-2007 à 15:14:37    

Ok je comprends ce que tu veux dire pour coder 1 (0010010) mais pour coder 2054 par exemple comment vais-je pouvoir faire?
En faite mon programme est le suivant: une personne rentre un nombre de 4 chiffres maximum et l'algorithme doit permettre d'afficher se nombre.


---------------
Feed-Back
Reply

Marsh Posté le 21-11-2007 à 15:28:06    

On m'a conseillé d'utiliser la fonction MID et Len..j'ai cherché dans l'aide de VB mais j'ai du mal a comprendre


---------------
Feed-Back
Reply

Marsh Posté le 21-11-2007 à 16:02:36    

Grrrrr !
 
TU N'AS PAS A CODER 2054 :o
 
La base de ton afficheur, c'est UN ET UN SEUL CHIFFRE qu'elle affiche.
 
Donc tu gères un et un seul chiffre à la fois.
 
Sauf que tu gères chacun des 4 chiffres l'un après l'autre.
 
En gros, actuellement, ton programme c'est :
 
Sasir un chiffre
Dessiner le chiffre
 
Maintenant ça devient
 
Saisir un nombre
Pour chaque chiffre du nombre
   Dessiner le chiffre
   Se décaller sur la droite de la largeur d'un chiffre
Fin pour
 
Spa compliqué...
 
t'as toujours qu'un et un seul chiffre à gérer :spamafote:
Même mieux, tu gardes ce que t'as fait, t'as juste à l'encapsuler dans une boucle, et gérer un décallage lors du dessin... C'est pas la mort quand même :o


Message édité par MagicBuzz le 21-11-2007 à 16:03:46
Reply

Marsh Posté le 21-11-2007 à 16:02:36   

Reply

Marsh Posté le 22-11-2007 à 10:25:50    

Illustration :o
 
http://img515.imageshack.us/img515/105/digitalxh8.png
 
Obtenu simplement comme ça :

Code :
  1. private void button1_Click(object sender, EventArgs e)
  2.        {
  3.            flowLayoutPanel1.Controls.Clear();
  4.  
  5.            for (int i = 0, cpti = maskedTextBox1.Text.Length; i < cpti; i++)
  6.            {
  7.                Digital d = new Digital();
  8.                d.SuspendLayout();
  9.                d.Height = flowLayoutPanel1.Height;
  10.                d.Width = d.Height / 2;
  11.                d.IntDigit = int.Parse(maskedTextBox1.Text.Substring(i, 1));
  12.                d.LedWidth = 4f;
  13.                d.OnColor = Color.Lime;
  14.                d.OffColor = Color.DarkGreen;
  15.                d.BackColor = Color.Black;
  16.                d.Lighted = true;
  17.                flowLayoutPanel1.Controls.Add(d);
  18.                d.ResumeLayout();
  19.            }
  20.        }


 
Digital est un petit contrôle que j'ai codé en vitesse histoire de faire l'exemple.
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace DigitalClock
  10. {
  11.    public partial class Digital : UserControl
  12.    {
  13.        public enum Digits
  14.        {
  15.            Zero = 119,
  16.            One = 20,
  17.            Two = 59,
  18.            Three = 62,
  19.            Four = 92,
  20.            Five = 110,
  21.            Six = 111,
  22.            Seven = 52,
  23.            Eight = 127,
  24.            Nine = 126
  25.        }
  26.  
  27.        private int digit = 128;
  28.        private Color onColor = Color.LightGreen;
  29.        private Color offColor = Color.DarkGreen;
  30.        private float ledWidth = 1f;
  31.        private bool canDraw = true;
  32.  
  33.        public Color OnColor
  34.        {
  35.            get
  36.            {
  37.                return onColor;
  38.            }
  39.            set
  40.            {
  41.                onColor = value;
  42.                Render();
  43.            }
  44.        }
  45.        public Color OffColor
  46.        {
  47.            get
  48.            {
  49.                return offColor;
  50.            }
  51.            set
  52.            {
  53.                offColor = value;
  54.                Render();
  55.            }
  56.        }
  57.        public float LedWidth
  58.        {
  59.            get
  60.            {
  61.                return ledWidth;
  62.            }
  63.            set
  64.            {
  65.                ledWidth = value;
  66.                Refresh();
  67.            }
  68.        }
  69.  
  70.        public new void SuspendLayout()
  71.        {
  72.            canDraw = false;
  73.        }
  74.  
  75.        public new void ResumeLayout()
  76.        {
  77.            canDraw = true;
  78.            Refresh();
  79.        }
  80.  
  81.        public Digital()
  82.        {
  83.            this.Digit = Digits.Zero;
  84.            this.Lighted = false;
  85.        }
  86.  
  87.        protected override void OnPaint(PaintEventArgs e)
  88.        {
  89.            Render();
  90.            base.OnPaint(e);
  91.        }
  92.  
  93.        protected override void OnBackColorChanged(EventArgs e)
  94.        {
  95.            Render();
  96.            base.OnBackColorChanged(e);
  97.        }
  98.  
  99.        private void Render()
  100.        {
  101.            if (!canDraw) return;
  102.  
  103.            Graphics g = CreateGraphics();
  104.            g.Clear(BackColor);
  105.  
  106.            Pen pon = new Pen(onColor, ledWidth);
  107.            Pen poff = new Pen(offColor, ledWidth);
  108.  
  109.            g.DrawLine(((digit & 128) == 0 || (digit & 64) == 0) ? poff : pon, ledWidth / 2f, ledWidth / 2f, ledWidth / 2f, (float)Height / 2f);
  110.            g.DrawLine(((digit & 128) == 0 || (digit & 32) == 0) ? poff : pon, ledWidth / 2f, ledWidth / 2f, (float)Width - ledWidth, ledWidth / 2f);
  111.            g.DrawLine(((digit & 128) == 0 || (digit & 16) == 0) ? poff : pon, (float)Width - ledWidth, ledWidth / 2f, (float)Width - ledWidth, (float)Height / 2f);
  112.            g.DrawLine(((digit & 128) == 0 || (digit & 8) == 0) ? poff : pon, ledWidth / 2f, (float)Height / 2f, (float)Width - ledWidth, (float)Height / 2f);
  113.            g.DrawLine(((digit & 128) == 0 || (digit & 4) == 0) ? poff : pon, (float)Width - ledWidth, (float)Height / 2f, (float)Width - ledWidth, (float)Height - ledWidth);
  114.            g.DrawLine(((digit & 128) == 0 || (digit & 2) == 0) ? poff : pon, ledWidth / 2f, (float)Height - ledWidth, (float)Width - ledWidth, (float)Height - ledWidth);
  115.            g.DrawLine(((digit & 128) == 0 || (digit & 1) == 0) ? poff : pon, ledWidth / 2f, (float)Height / 2f, ledWidth / 2f, (float)Height - ledWidth);
  116.        }
  117.  
  118.        public Digits Digit
  119.        {
  120.            get
  121.            {
  122.                return (Digits)(digit & 127);
  123.            }
  124.            set
  125.            {
  126.                digit &= 128 + (int)value;
  127.                this.Refresh();
  128.            }
  129.        }
  130.  
  131.        public int IntDigit
  132.        {
  133.            set
  134.            {
  135.                if (value > 9 || value < 0)
  136.                {
  137.                    throw new Exception(string.Format("{0} is not a digit", value));
  138.                }
  139.                switch (value)
  140.                {
  141.                    case 0:
  142.                        digit = (int)Digits.Zero;
  143.                        break;
  144.                    case 1:
  145.                        digit = (int)Digits.One;
  146.                        break;
  147.                    case 2:
  148.                        digit = (int)Digits.Two;
  149.                        break;
  150.                    case 3:
  151.                        digit = (int)Digits.Three;
  152.                        break;
  153.                    case 4:
  154.                        digit = (int)Digits.Four;
  155.                        break;
  156.                    case 5:
  157.                        digit = (int)Digits.Five;
  158.                        break;
  159.                    case 6:
  160.                        digit = (int)Digits.Six;
  161.                        break;
  162.                    case 7:
  163.                        digit = (int)Digits.Seven;
  164.                        break;
  165.                    case 8:
  166.                        digit = (int)Digits.Eight;
  167.                        break;
  168.                    case 9:
  169.                        digit = (int)Digits.Nine;
  170.                        break;
  171.                    default:
  172.                        throw new Exception(string.Format("Unexpected exception! The digit {0} is not reconized!", value));
  173.                }
  174.                this.Refresh();
  175.            }
  176.            get
  177.            {
  178.                switch (Digit)
  179.                {
  180.                    case Digits.Zero:
  181.                        return 0;
  182.                    case Digits.One:
  183.                        return 1;
  184.                    case Digits.Two:
  185.                        return 2;
  186.                    case Digits.Three:
  187.                        return 3;
  188.                    case Digits.Four:
  189.                        return 4;
  190.                    case Digits.Five:
  191.                        return 5;
  192.                    case Digits.Six:
  193.                        return 6;
  194.                    case Digits.Seven:
  195.                        return 7;
  196.                    case Digits.Eight:
  197.                        return 8;
  198.                    case Digits.Nine:
  199.                        return 9;
  200.                    default:
  201.                        throw new Exception(string.Format("Unexpected exception! The internal digit representation {0} is not reconized!", digit));
  202.                }
  203.            }
  204.        }
  205.  
  206.        public bool Lighted
  207.        {
  208.            get
  209.            {
  210.                if ((digit & 128) > 0)
  211.                {
  212.                    return true;
  213.                }
  214.                else
  215.                {
  216.                    return false;
  217.                }
  218.            }
  219.            set
  220.            {
  221.                if (value)
  222.                {
  223.                    digit |= 128;
  224.                }
  225.                else
  226.                {
  227.                    digit &= 127;
  228.                }
  229.                this.Refresh();
  230.            }
  231.        }
  232.    }
  233. }


 
Maintenant, vu comme t'as l'air fluent, pas de pot c'est loin d'être une solution toute faite pour toi... Déjà c'est pas le même langage, mais surtout vu le niveau que t'as, si tu sors le code de ma classe à ton prof t'es grillé direct :p


Message édité par MagicBuzz le 22-11-2007 à 10:32:25
Reply

Marsh Posté le 22-11-2007 à 10:31:11    

D'autant qu'en relisant, je me rend compte qu'il y a un mega bug dans mes accesseurs de la propriété "IntDigit" :D

Reply

Marsh Posté le 22-11-2007 à 12:55:34    

Oui et puis c'était hier :D
J'ai réussi en utilisant la fonction Mid
i=Mid(text_z,4,1)
j=Mid(text_z,3,1)
etc
J'ai donc décomposé le nombre ce qui m'a permis de tout afficher correctement :)
Merci quand même pour ton aide MagicBuzz


---------------
Feed-Back
Reply

Marsh Posté le 27-11-2007 à 19:53:35    

sinon
if nombre > 999 then goto routine_1000
if nombre > 99 and nombre < 1000 then goto routine_100
if nombre > 9 and nombre < 100 then goto routine_10
if nombre < 10 then goto routine_1
 
Routine_1000
Dim milliers, centaines, dizaines,unites, reste as integer
 
'on sait qu'on a forcement affaire à un nombre de 4 chiffres
 
' ici j'extraie le nombre representant les milliers
milliers = int(nombre/1000)
 
' ici je le soustraie au nombre initial
reste = nombre - milliers * 1000  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_100
'ici j'extraie le nombre representant les centaines
centaines = int(reste/100)
 
' ici je le soustraie au nombre initial
reste = nombre - centaines * 100  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_10
' ici j'extraie le nombre representant les dizaines
dizaines = int(reste/10)
 
' ici je le soustraie au nombre initial
reste = nombre - dizaines * 10  
 
'RECOPIER A PARTIR D'ICI LA FONCTION ROUTINE_1
'ici il ne me reste plus que les unités
unites = reste
 
'voila comme ça tu as tous les chiffres composant ton nombre
 
ensuite tu peux ecrire :
 
if notisnull(milliers) then goto FonctionAffichageDuChiffreDesMilliers
if isnull((milliers) and not isnull(centaines) then goto FonctionAffichageDuChiffreDesCentaines
if isnull((centaines) and not isnull(dizaines) then goto FonctionAffichageDuChiffreDesDizaines
if isnull((centaines) and not isnull(unites) then goto FonctionAffichageDuChiffreDesUnites
 
ensuite tu crées tes fonctions indiquées ci dessous, tu n'a plus qu'à coder une "ligne" pour l'affichage de chaque chiffre pour les milliers, une ligne pour l'affichage de chaque chiffre des centaines etc etc ... unités
10 possibilités d'affichage mais :  
 
quand tu veux afficher tes nombres à quatre chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesMilliers
FonctionAffichageDuChiffreDesCentaines
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à trois chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesCentaines
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à deux chiffres, tu devas appeler tout à tour les fonctions suivantes :  
FonctionAffichageDuChiffreDesDizaines
FonctionAffichageDuChiffreDesUnités
 
quand tu veux afficher tes nombres à un chiffre, tu devas appeler la fonction suivante :  
FonctionAffichageDuChiffreDesUnités
 
Voila voila voila, j'espère avoir aidé un peu...


---------------
http://www.ypikay.com
Reply

Marsh Posté le 27-11-2007 à 20:03:35    

ouais enfin là t'as un 0 pointé direct j'espère :o

Reply

Marsh Posté le 28-11-2007 à 18:35:13    

ben quoi ?


---------------
http://www.ypikay.com
Reply

Marsh Posté le 28-11-2007 à 18:59:53    

des goto toutes les deux lignes
et aucune refactorisation du code...
 
 
FonctionAffichageDuChiffreDesMilliers  
FonctionAffichageDuChiffreDesCentaines  
FonctionAffichageDuChiffreDesDizaines  
FonctionAffichageDuChiffreDesUnités  
 
=> 4 fonctions, 4 fois rigoureusement le même code (y'a au max une ligne de déclaration qui diffère)
 
et une série de tests inutiles en début de code (plus exactement, qui sont redondants)

Reply

Marsh Posté le 28-11-2007 à 19:02:29    

Pour résumé, tout ton paté est compressible en ça :
 

Code :
  1. for (int i = 0, cpti = maskedTextBox1.Text.Length; i < cpti; i++)
  2.            {
  3.                        DisplayDigit(maskedTextBox1.Substr(i, 0), i);
  4.            }


 
(cf mon code, sauf qu'au lieu de passer par une fonction, j'instancie un contrôle qui fait le rendu)

Reply

Sujets relatifs:

Leave a Replay

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