Mesures Physiques et Informatique, MPI, page 2

Page modifiée le 4 / 4 / 2005
Contenu : Delphi troisième leçon, Delphi quatrième leçon, algèbre de Boole, Delphi cinquième leçon, Delphi sixième leçon, Delphi 7ème leçon, numération, Delphi 8ème leçon,  opérations logiques sur les octets, Delphi 9ème leçon, réalisation d'un logiciel d'acquisition de données, FFT, Delphi 10ème leçons, erreurs ; réalisation d'un site Internet, première leçon, aspiration d'une page d'un site Internet ; travail de recherche sur Einstein

Rappel d'une note importante : Le programme officiel de MPI n'évoque la pratique de la programmation que dans sa partie thématique. Il y est dit : "Cette partie... pourra être l'occasion... d'utiliser quelques notions de programmation (algorithme élémentaire : analyse d'un problème simple, instruction conditionnelle alternative ; langage de programmation associé au tableur utilisé en classe.).

Les leçons de Delphi qui suivent vont donc largement au-delà du programme. Le professeur pourra se contenter de montrer comment écrire une macro dans Excel. S'il préfère travailler en Delphi, il retiendra le code nécessaire pour tracer un graphique (transfert des valeurs d'un tableau dans le composant graphique par une boucle, For i := 1 To...) et un exercice sur une instruction conditionnelle(If ... Then...). Le reste pourra être mis à disposition des élèves les plus avancés, afin qu'ils n'aient pas l'impression de perdre leur temps.

Cours de Delphi, 3ème leçon


Note importante : Le programme officiel de MPI n'évoque la logique que dans sa partie thématique. Il y est dit : "Cette partie... pourra être l'occasion... d'utiliser... des portes logiques, de montrer le principe de l'additionneur...
Pour pouvoir progresser, nous allons nous plonger quelque peu dans la logique de l'algèbre de Boole.
Les fonctions logiques mathématiques dont nous allons vous parler peuvent être réalisées (selon la complexité du montage et la rapidité attendue) avec des interrupteurs électriques ou des vannes pneumatiques, des circuits intégrés spécialisés appelés circuits logiques, des microprocesseurs programmables, des logiciels informatiques...

1. Variable binaire ou booléenne

On appelle proposition une expression qui ne peut prendre que deux valeurs, vrai ou faux, True ou False.
Exemples : La lampe de la salle est allumée ; l'interrupteur ferme le circuit.
A chaque proposition, on associe une variable binaire.
Exemple : Interrupteur 1 <-> a
a = 1 <-> l'interrupteur ferme réellement le circuit,
a = 0 <-> l'interrupteur ouvre le circuit.

2. Fonctions logiques à une variable

Il en existe quatre, dont seules deux présentent de l'intérêt. Quelles sont les deux autres ?

2.1. Fonction identité


// Note : Il serait préférable d'appeler s la variable correspondant à la lampe (s comme solution).

a -> I -> b
qui s'écrit a = b ou s = a
exemple :
L'action sur un interrupteur est toujours supposée du haut vers le bas. L'interrupteur est toujours représenté dans sa position de repos. Imaginez un petit ressort sous l'interrupteur.

Un interrupteur, fonction logique Identité

2.2. Fonction Non (Not)

a -> NON -> b
qui s'écrit b = a, ou s = a
exemple :

Un interrupteur, fonction logique Non

3. Fonctions logiques à deux variables

Il en existe 16 possibles. Envisageons les deux plus importantes.

3.1. Fonction ET à deux variables (And)

c = a ET b
Schéma électrique permettant de réaliser cette fonction, à l'aide de deux boutons poussoirs :
Interrupteurs en série, fonction logique ET
Remarquez que les interrupteurs sont montés en série.
Table de vérité :
a b c
0 0 0
0 1 0
1 0 0
1 1 1
Autre présentation :
a
0 1
b 0 0 0
1 0 1

Opération équivalente : la multiplication. a ET b <-> a * b.
Exemple : La tondeuse ne démarre que si je tire le démarreur ET si je serre la poignée.

3.2. Fonction OU (non exclusif) à deux variables (Or)


Schéma électrique permettant de réaliser cette fonction, à l'aide de deux boutons poussoirs, montés en parallèle :
Interrupteurs montés en parallèle, fonction logique OU
c = a OU b qui s'écrit aussi c = a + b (en admettant que 1 + 1 = 1, puisque la valeur 2 n'existe pas)


a
0 1
b 0 0 1
1 1 1

Exemple : La lampe de l'escalier s'allume si j'agis sur l'interrupteur du premier OU du deuxième étage (ou sur les deux en même temps).

Haut de cette page 
 


Cours de Delphi, 4ème leçon

1. Ce que vous devez faire


Réalisez un exécutable Delphi, comportant une Form, et trois Edit. Les Edit 1 et 2 doivent avoir le comportement suivant : Chaque fois que l'on clique dessus, ils passent du vert au rouge et réciproquement. Si Edit1 et Edit2 sont rouges (simultanément), alors Edit3 est rouge ; sinon, il reste vert. Vous pouvez employer d'autres couleurs.

2. Associer aux trois Edit leur événement OnClick


Attention, si vous faites un double clic sur un Edit, Delphi croit que vous voulez écrire du code pour un événement OnChange. Si vous avez commis cette erreur (source de longues difficultés pour un élève distrait, distrait car le OnChange est bel et bien inscrit dans le titre de la procédure), pas de problème : n'écrivez pas de code et à la prochaine compilation, la procédure vide sera effacée. Voici l'erreur classique commise par les distraits :

procedure TForm1.Edit3Change(Sender: TObject);
begin
//c'est faux, car le changement de l'Edit appelle un nouveau changement.
end;

Donc sélectionnez l'Edit et dans l'inspecteur d'objets, Onglet Méthodes, faites un double clic en face de OnClick.

3. Ecrire une procédure passant d'une couleur à l'autre, pour les Edit1 et 2


Voici du code qui marcherait :
procedure TForm1.Edit1Click(Sender: TObject);
begin
If (Edit1.Color = clRed) Then Edit1.Color := clLime Else Edit1.Color := clRed ;
C'est efficace, mais lourdaud.

Une façon plus élégante de résoudre ce problème pourrait être celle ci :

procedure TForm1.Edit1Click(Sender: TObject);
Var // Ne marche pas, car la variable est créée et mise à zéro à chaque appel de la procédure
a : Boolean ;
Begin
a := Not(a) ;
If a Then Edit1.Color := clRed Else Edit1.Color := clLime ;

Nous employons une variable booléenne, a. Vous découvrez qu'en Delphi sa déclaration est obligatoire. Ici, elle est déclarée en tant que variable locale à la procédure, c'est à dire que sa valeur est inconnue en dehors du code de cette procédure. C'est un peu long, mais cela évite des erreurs colossales de programmation. A chaque appel de la procédure, Not(a) est calculé. Problème : quelle est la valeur de a à l'appel de la procédure ?
Cela ne marche donc pas. Il est possible de déclarer la variable a globale pour l'Unit1, mais cela aggrave les risques d'erreur, si la même lettre a est employée pour représenter des gradeurs différentes.
Il est plus prudent de procéder ainsi :

procedure TForm1.Edit1Click(Sender: TObject);
Const // Ce n'est pas une vraie constante, elle peut changer, mais elle est créée une fois pour toutes.
a : Boolean = True ;
Begin
a := Not(a) ;
If a Then Edit1.Color := clRed Else Edit1.Color := clGreen ;

La variable a (ne vous laissez pas impressionner par Const) est déclarée et sa valeur fixée lors du premier appel de la procédure ; ensuite, à chaque nouvel appel de la procédure, c'est sa nouvelle valeur qui est employée. Donc True -> False -> True ...

4. Changer la couleur de l'Edit3


Problème ! Comment connaître les couleurs des deux premiers Edit, sans tester Edit1.Color, ce qui est un peu lourd ? Il faudrait que les variables a (et b du deuxième Edit) soient globales.

Deuxième problème : A quel événement associer le changement de couleur de l'Edit3 ? Deux solutions semblent possibles :
L'associer aux deux événements OnClick, ce qui revient à dupliquer le code, chose à éviter car les modifications en deviennent plus complexes, avec des risques d'erreur supplémentaires. Ou créer une procédure commune appelée par les 2 EditClick. Ou encore utiliser un composant Timer (dans l'onglet Système) qui testera à intervalles réguliers a et b et décidera de la couleur de Edit3. Le changement se produira avec un peu de retard, en ce cas.

Décidons d'employer deux variables globales. Ne les appelons pas a, ni x, y ... car il apparaît un risque d'erreur grave. Si dans un programme (plus long que celui ci), nous nommons a deux grandeurs différentes, le programme se comportera de manière chaotique et incompréhensible, ce qui est très difficile à corriger.
Donc, il faut sortir
Const
a : Boolean = True ;
de sa procédure, et écrire à la place juste après Implementation :
Const
etatEd1 : Boolean = True ;

ce qui donne dans l'Unit :

implementation

{$R *.DFM}
Const
etatEd1 : Boolean = True ;
etatEd2 : Boolean = True ;

Procedure ChangerEdit3 ;
Begin If (etatEd1 And etatEd2) Then Form1.Edit3.Color := clRed Else Form1.Edit3.Color := clLime End ;

procedure TForm1.Edit1Click(Sender: TObject);
Begin
etatEd1 := Not(etatEd1) ;
If etatEd1 Then Edit1.Color := clRed Else Edit1.Color := clLime ;
ChangerEdit3 ;
End ;

Et même chose pour procedure TForm1.Edit2Click, pour la méthode employant une procédure commune. Sinon, placer sur la Form un Timer, composant non visuel, c'est à dire représenté par un petit dessin en phase de conception, mais qui disparaît en mode exécution. Le Timer a une propriété intéressante, Interval exprimée en millisecondes. Windows est incapable de gérer des intervalles plus courts que 50 ms ; de plus ceux ci ne sont pas très réguliers (incertitude d'environ 5%). Pas mal avec des processeurs tournant à plusieurs centaines de méga hertz. C'est la rançon de la gestion en parallèle des différents événements, et d'un certain laxisme, voire d'un laxisme certain, dans sa programmation. Nous avons acheté des logiciels destinés à l'éducation nationale qui manifestement employaient ce Timer pour faire des mesures. Nous tairons leur nom par charité, mais ils sont juste bons à finir à la poubelle !
Par un double clic sur le timer, ouvrir la procédure procedure TForm1.Timer1Timer(Sender: TObject);
et y inscrire :

If (coulEd1 And coulEd2) Then Edit3.Color := clRed Else Edit3.Color := clLime ;
qui signifie si (coulEd1 Et coulEd2) est vrai, ce qui nécessite que les deux soient vraies, alors ... sinon ...

Pour les plus rapides, exercice plus complexe :

5. Réalisez une simulation de va et vient


Vous avez certainement chez vous un éclairage monté en va et vient, par exemple dans un couloir. L'action sur un des 2 interrupteurs provoque un changement de l'état allumé ou éteint de la lampe. Celle-ci sera simulée par l'Edit 3. Si vous voulez réaliser un va et vient, sachez qu'il vous faut acquérir 2 interrupteurs spéciaux pour va et vient ; ils réalisent simultanément les fonctions a et a. Ils devraient donc comporter 4 bornes, mais les 2 bornes d'entrée sont reliées pour simplifier. Un interrupteur pour va et vient a donc 3 bornes ; il peut servir d'interrupteur ordinaire ; le contraire n'est pas possible.

// Indications : La fonction logique réalisée par un va et vient comportant les interrupteurs a et b est : s = a . b + a . b, ou s = (a Et b) Ou (a ET b).
Donc, dans Procedure ChangerEdit3 ;
il faudrait remplacer
If (etatEd1 And etatEd2), par

If ((etatEd1 AND etatEd2) OR (Not(etatEd1) AND Not(etatEd2)))
ou plus simplement, en appelant a et b les variables booléennes :
If ((a AND b) OR (Not(a) AND Not(b)))

Vérifiez ce qui se passe si s = a . b + a . b.

Essayez, ça marche ! Vous pourrez remplacer les couleurs, le vert par du noir, le rouge par du jaune.

Haut de cette page 
 


Cours de Delphi, 5ème leçon


Il n'est pas question ici de donner l'ensemble de la syntaxe de Delphi ; cela prendrait des centaines de pages et vous disposez de l'aide en ligne équivalente à plusieurs milliers de pages, accessible par appui sur la touche F1. Sélectionnez un objet, faites F1, vous aurez l'aide correspondante. Dans le code source que vous écrivez, sélectionnez un mot, faites F1, vous obtenez les propriétés de l'objet concerné.

1. Le langage Pascal


Il a été créé en 1970 par le Suisse N.Wirth. Il est rigoureux, clair, structuré. Il est un peu moins rapide que le C, mais plus facile. Le compilateur Delphi est très rapide. De plus Delphi nous aide lors de l'écriture du code. Nous avons vu une première façon de faire, qui consiste à écrire le nom d'un objet suivi d'un point et d'attendre une seconde. Il en existe d'autres.
Pascal n'est pas sensible à la casse (majuscules ou minuscules).

2. Identificateur


Tout identificateur, nom de variable, de fonction, de procédure ... doit être déclaré. Chaque identificateur a un type, déclaré lui aussi. Cela évite de graves erreurs fréquentes avec des langages moins rigoureux (nous en verrons un exemple dans le cours sur la réalisation d'un site Internet, lors de l'emploi du langage JavaScript). Il est possible de changer un type, cela se nomme un transtypage, mais c'est une action raisonnée et le compilateur vérifie qu'il n'y a pas d'erreur.

Exemples de déclaration :
Var x : Real ;
Const k : Integer = 3 ; (voir leçon 4, car il ne s'agit pas réellement d'une constante)

Note importante : l'usage du mot clé Const a changé avec les nouvelles versions de Delphi. Il peut maintenant s'agir réellement d'une constante dont la valeur ne peut changer, mais cela dépend des directives de compilation. En fait ce type de déclaration était employé pour forcer l'initialisation des variables locales à une procédure.

3. Quelques types courants

entier Integer
réel Real
booléen Boolean
chaîne de caractères String

L'utilisateur peut créer de nouveaux types.
Le type Variant est capable de représenter des valeurs qui changent de type ; il a été créé pour transmettre des données à Windows. Il est recommandé si vous aimez les logiciels qui "plantent".

4. Opérations


Les opérations classiques sont possibles. Juste une remarque : si vous faites c := a / b ; avec a et b entiers, c doit être de type réel. S'il est déclaré en tant qu'entier le compilateur détecte immédiatement l'erreur.

c := 25 Div 7 donne 3 (division entière)
c := 25 Mod 7 donne 4 (reste de la division entière)

5. Quelques instructions


Affectation : x := 8 range la valeur 8 dans la variable (en fait une adresse) x

test logique : x = 8 donne True si 8 est effectivement dans x, False dans le cas contraire

instruction composée : Begin instruction1 ; instruction2 ; End ;

instruction conditionnelle : If (test) Then InstructionA Else InstructionB

instruction conditionnelle, variante si de nombreux choix sont possibles : Case ... Of (voir l'aide en ligne)

itération, boucles : For compteur := 1 To 100 Do InstructionC

boucles imbriquées : For i := 1 To 10 Do Begin
For j := 1 To 5 Do Begin
InstructionD ; InstructionE ;
End ; End ;

6. Procédure


Procedure Afficher(texteAffichage : String) ;
Begin
Form1.Edit2.Text := texteAffichage ;
End ;

Cette procédure doit être écrite AVANT toute fonction ou procédure qui l'appellera (l'utilisera). Si c'est impossible, voir l'aide en ligne au mot clé Forward.
Naturellement, elle n'est correcte que si la fenêtre s'appelle Form1 et porte un Edit2.

7. Fonction


Function Doubler(x : Real) : Real ;
Var
y : Real ;
Begin
y := 2 * x ;
Result := y ;
End ;

Cette fonction se contente de doubler la valeur du Real qu'on lui transmet. Le résultat en retour est un Real. Nous aurions pu simplifier un peu en supprimant la variable locale y et en écrivant :
Result := 2 * x ;

8. Appel (utilisation) de fonctions et procédures


Voici un exemple : Un clic sur le Button1 appelle les deux exemples précédents.

procedure TForm1.Button1Click(Sender: TObject);
Var
z : Real ;
begin
Afficher('L''essai a donné satisfaction') ;
z := Doubler(7) ;
Form1.Edit1.Text := FloatToStr(z) ;
end;

Cela pourrait être plus simple, sans la variable locale z, en écrivant :
Form1.Edit1.Text := FloatToStr(Doubler(7)) ;

Cette nouvelle procédure doit obligatoirement être écrite après les deux autres. FloatToStr permet le transtypage du Real z au String qui s'affiche dans l'Edit.

9. Autres instructions


Vous venez de voir comment on place une apostrophe dans une chaîne : texte : String ;

 texte := 'C''est un essai' ;
Il faut doubler l'apostrophe, pour que cela ne soit pas compris comme une fin de chaîne.

Voici quelques instructions de transtypage :

 IntToStr ; StrToInt ; FloatToStr ; StrToFloat ; FloatToStrF( ... ), F signifiant que le nombre réel sera formaté (nombre de chiffres, place de la virgule ... ). Voir l'aide en ligne pour ce dernier cas, offrant de nombreuses variantes.

Haut de cette page 
 

Cours de Delphi, 6ème leçon


Nous allons apprendre à ajouter un menu déroulant à une interface. La description qui suit peut laisser à penser qu'il s'agit d'une tache compliquée, mais il n'en est rien, c'est au contraire très intuitif.

1. Le composant MainMenu


C'est un composant non visuel, disponible dans l'onglet Standard.
Placez en un sur votre Form, n'importe où, puisqu'il sera invisible.
Effectuez un double clic dessus, la boîte d'édition s'ouvre.
Cliquez sur le rectangle noir puis dans l'inspecteur d'objets, onglet Propriétés, cliquez sur Caption. Dans la boîte d'édition, entrez le texte suivant :
&Fichier
Validez, un nouveau rectangle noir apparaît, à droite du précédent. Faites de même en donnant à la propriété Caption la valeur &Edition, puis validez.
Revenez sur Edition, et cliquez. Un rectangle apparaît au-dessous, sur lequel vous cliquez. Donnez à Caption la valeur Cou&per, puis aux deux Caption suivantes &Copier, Co&ller.
 

2. Ajouter des touches de raccourci


Lorsque vous avez entré le texte &Copier, il s'est affiché dans le menu déroulant (en mode conception pour l'instant) en tant que Copier, le C étant souligné. Vous avez créé ainsi (Delphi vous a un peu aidé) une touche de raccourci. Lorsque le programme sera en mode exécution, vous déroulerez le menu Edition par Alt + E (E étant la lettre soulignée) et déclencherez Copier par appui sur C. Donc Alt + E, puis C déclenchent une copie. Pensez à inclure systématiquement ces touches de raccourci dans vos programmes : cela peut être utile en cas de panne de la souris, et certains utilisateurs adorent ces touches de raccourci. Respectez les conventions Windows dans vos choix ; pour cela, guidez vous sur Delphi, Word, Excel ...

3. Ajouter des Raccourcis clavier


Il s'agit d'une autre méthode, encore plus directe, d'accéder aux menus, puisque le déclenchement d'un sous menu ne nécessite pas de dérouler le menu principal. Sélectionnez Couper, puis dans l'inspecteur d'objets, onglet Propriétés, allez à ShortCut, cliquez dessus et déroulez la liste à droite. Sélectionnez la bonne valeur. La aussi respectez les conventions de Windows, car beaucoup d'utilisateurs les connaissent par coeur.

Un programme bien conçu doit toujours offrir à son utilisateur plusieurs façons de déclencher une action.

4. Associer des procédures aux menus


Maintenant, vous disposez d'un superbe menu à l'allure professionnelle, mais qui ne fait rien !
Reprenez chacun des sous menus, et dans l'onglet Evénement, sélectionnez OnClick, et par double clic dans le rectangle à sa droite, ouvrez la procédure correspondante. Vous pouvez aussi dérouler une liste des procédures compatibles, et choisir l'une d'elles.

Haut de cette page 
 

Cours de Delphi, 7ème leçon, numération


Note : Le programme officiel de MPI demande d'aborder dans la partie 'culture scientifique et technique' quelques éléments de l'histoire de la numération. Il ajoute : 'Les systèmes à base 12 et 60 seront évoqués.

Nous allons étudier la numération, c'est à dire l'écriture des nombres, dans les bases 10, 2 et 16. D'autres bases ont été employées, 12, 60, dont il reste quelques traces dans notre vie de tous les jours. Pouvez-vous citer des cas où vous employez ces bases ? Quel est (encore aujourd'hui) leur intérêt ?

1. La numération en base 10


Elle est appelée ainsi parce qu'elle emploie 10 chiffres différents, de 0 à 9.
Considérons le nombre 1789. 1 est le chiffre des milliers ou 103 , 7 celui des centaines ou 102, 8 celui des dizaines ou 101 et enfin 9 celui des unités ou 100.
Banal direz vous ! Pas si sur. Si cela vous semble évident, c'est parce que pendant des années vous avez appris à compter dans cette base, tables d'addition, de soustraction, de multiplication.

En résumé, 1789 = 1 x 1000 + 7 x 100 + 8 x 10 + 9 x 1.

Comment feriez vous pour retrouver les différents chiffres de ce nombre ?
Il suffit de diviser 1789 par 10, autant de fois que c'est possible.
1789 / 10 = 178 reste 9 ; 178 / 10 = 17 reste 8 ; 17 / 10 = 1 reste 7. Il suffit maintenant de lire ces chiffres à l'envers : 1 puis 7, puis 8 et enfin 9.

Base 10

Inutile direz vous ? C'est tout à fait exact, mais cela vous permettra, par analogie avec cet exemple trivial, de retrouver les chiffres d'un nombre dans une base quelconque. Car au fait, pourquoi donc travaillons nous en base 10 ? Un lointain ancêtre se serait il un jour servi de ses doigts pour compter ?

2. La numération en base 2


Pour un grand nombre de raisons, les ordinateurs n'emploient que deux chiffres pour compter. Ces deux états différents sont notés 0 et 1.
Examinons le nombre écrit 1000011 en base 2. Comment s'écrit il en base 10 ?
Le premier 1 à droite correspond aux unités, ou 20. Le deuxième 1 correspond aux "deuzaines", soit 21 soit encore 2 (en base 10). Le dernier 1 correspond à 26, soit encore 64.
Donc 1000011 en base 2 vaut en base 10 : 1 x 64 + 1 x 2 + 1 x 1 = 67.

Remarque : L'expression "deuzaine" n'est pas encore admise par l'Académie Française.

Comment retrouver les chiffres en base 2, à partir de l'expression en base 10, 67 ?
La encore, par divisions successives, par 2 cette fois, et en prenant le dernier quotient, puis tous les restes, de droite à gauche.

Base 2

3. Bit et octet


Bit vient de l'américain binary digit, chiffre binaire.
Un octet est formé de huit bits. Attention, les informaticiens appellent souvent un octet Byte ; ne confondez pas avec Bit.
L'intérêt ? Le nombre 1000011, ou 01000011 en base 2, ou 67 en base 10, est peu commode à lire, d'où l'idée de regrouper les bits, par 8 car 8 est une puissance de 2.
Le chiffre 1 tout à droite, rang des unités est appelé bit de poids faible, ou bit 0 (comme l'exposant de 2).
Le chiffre 0 tout à gauche, rang des 27 = 128 est le bit de poids fort, ou bit 7.
La mémoire vive de votre ordinateur, celle de sa carte vidéo, celle de son disque dur sont mesurées en octets.
Un octet permet d'écrire les nombres de 0 à 255 (base 10), soit 256, ou 28 valeurs différentes.
Deux octets (16 bits) permettent de stocker 216 soit 65 536 valeurs, et trois octets 224 ou 16 777 216 valeurs.
Exemples :

4. La numération en base 16


Elle emploie 16 chiffres, 0 1 2 3 4 5 6 7 8 9 A B C D E F. F vaut 15 en base 10.
Elle permet d'écrire de façon plus commode les nombres en base 2, puisqu'un octet correspond à 2 chiffres en base 16.
1000011 = 0100 0011 en base 2. 0100 vaut 1 x 22 soit 4. 0011 vaut 1 x 21 + 1 x 1 soit 3.
Donc 0100 0011 en base 2, s'écrit 43 en base 16 (et 67 en base 10).
Vérification : 43 en base 16 vaut 4 x 16 + 3 x 1, soit 67 en base 10.

Haut de cette page 
 

Cours de Delphi, 8ème leçon, opérations logiques sur les octets


Nous allons étudier les opérations logiques sur les octets, indispensables pour utiliser les cartes d'acquisition.

1. OU logique


Problème : Sur le Port A configuré en sortie, nous avons branché 8 lampes. Un camarade de classe en a allumé certaines et d'autres pas, par un programme en Delphi, en écrivant le nombre n1 sur le Port A. Il vous demande d'allumer la lampe 4 (qu'elle soit précédemment éteinte ou allumée, peu importe), sans rien changer aux autres, en écrivant un nombre sur le Port A.
n1 et n2 sont des entiers, écrits sur 1 octet, donc des entiers compris entre 0 et 255 (valeurs incluses).
La solution la plus simple est la suivante :
Le nombre n2 allumant uniquement la lampe 4 est 1 x 24 soit 16 en base 10.

n2 := 16 ;
Candibus.EcrireDansA( n1 OR n2) ;

n2 est le masque ; ceci s'appelle forcer à 1 le bit 4.

Vérifiez, quelle que soit la valeur de n1, c'est à dire quelles que soient les lampes allumées, que toutes restent allumées et que la lampe 4 s'allume (si elle était allumée, elle le reste).
Cette méthode exige que la valeur précédente n1 du nombre envoyé sur le Port A ait été mémorisée.

2. ET logique


Il s'agit cette fois d'éteindre la lampe 4 (si elle était allumée, sinon elle reste éteinte), sans modifier l'état des autres.
Vérifiez que le bon code est celui ci :

n2 := 16 ;
Candibus.EcrireDansA( n1 AND n2) ;

n2 est le masque ; ceci s'appelle forcer à 0 le bit 4.
 

3. Application : Réalisez un chenillard


Vous emploierez un composant Timer et un code qui pourrait contenir les instructions suivantes : Const x : Byte = 1 ; Begin If x = 0 Then x := 1 ; P.EcrireDansA(x) ; x := x*2 ; End ;

Haut de cette page 
 

Cours de Delphi, 9ème leçon


Nous nous proposons de faire réaliser par nos élèves un logiciel d'acquisition de données. De bons élèves auront terminé leur travail en moins d'une heure. Nous aurons le temps de faire encore d'autres choses dans cette séance.

1. préparation du travail


Créez un nouveau dossier nommé "acquisition" ; dans ce dossier, ouvrir un sous dossier nommé acquisition1. Tout votre travail devra impérativement être rangé dans ce sous dossier.

2. Interface du logiciel


Nous voulons une interface composée d'un panneau de boutons et d'éditeurs de texte, pour contrôler l'acquisition, et de deux graphiques, l'un représentant l'évolution au cours du temps des deux tensions d'entrée, l'autre le spectre de Fourier de la tension appliquée à la voie 1.

  1. Créez une nouvelle Form,
  2. placez sur cette Form un composant StatusBar, puis un Panel1, occupant le bas de la fenêtre. Dans l'inspecteur d'objets, mettez leur propriété Align à Bottom,
  3. placez un Panel2, destiné à accueillir le premier graphique, avec Align Left,
  4. placez un Splitter | Align | Left,
  5. placez un Panel3 | Align | Client,
  6. sur le Panel2, placez un TChart1 et un TChart2 sur le Panel3,
  7. modifiez le TChart1, pour qu'il puisse tracer 2 courbes, et le TChart2 pour 1 courbe,
  8. sur le Panel1, placez un Button nommé Acquérir,
  9. sur le Panel1, placez deux Edit destinés à recevoir la fréquence d'acquisition et le nombre de points de mesure.
Pour modifier un Tchart, il faut : Sélectionner | Clic droit | Menu déroulant | Modifier le graphe, ou bien
double clic, puis
Onglet Séries | Ajouter | Onglet Standard | Choisir le mode traits et Décocher 3D | OK | Onglet Séries | Fermer.
Lorsqu'on dit qu'un Button est nommé Acquérir, il ne peut s'agir de sa propriété Name qui n'accepte pas les lettres accentuées, mais bien évidemment de sa propriété Caption, celle qui est inscrite dessus.

3. Acquisition, FFT, affichage


Ajoutez sur votre Form un composant PhyJiC et nommez-le P.

Nous supposons que vous employez une carte Candibus, et ainsi la librairie nécessaire à la piloter a été chargée.

Par double clic sur le Button Acquérir, ouvrez une procédure et ajoutez y le code suivant : (Attendez une seconde après avoir tapé Candibus., pour voir apparaître les fonctions et procédures disponibles).
nPoints := StrToInt(Edit2.Text) ;
frequence := StrToFloat(Edit1.Text) ;
P.Acquerir(nPoints, frequence) ;

Remarquez qu'une seconde après l'ouverture de la parenthèse suivant Acquerir, Delphi vous indique le nom et le type de variables attendus. S'il ne le fait pas, c'est qu'il a déjà détecté une erreur. Pour trouver cette erreur faites Compiler. Au fait avez vous pensé à déclarer vos variables ? Cela doit ressembler à :
Var
nPoints : Integer ; frequence : Real ;
Begin ...

Il faut maintenant transférer les résultats des mesures, mesure1 et mesure2, dans Series1 et Series2 qui sont les objets employés par Chart1. Il ne faut pas déclarer ces tableaux, car c'est déjà fait.
Series1.Clear ; Series2.Clear ; Series3.Clear ;
For i := 0 To (nPoints - 1) Do Begin
Series1.Add(mesure1[i], '', clGreen) ;
Series2.Add(mesure2[i], '', clRed) ; End ;
Candibus.FFT(1, nPoints) ;
For 1 := 0 To (Trunc(nPoints/2)-1) Do
Series3.Add(module[i], '', clLime) ;

Les Series sont des objets, sous forme de tableau, comprenant un nombre, ici un résultat de mesure, un texte de type String, ici vide, d'où les guillemets ouvrant et fermant '', et une couleur. Il est inutile d'afficher le tableau complet obtenu par FFT, puisqu'il présente une symétrie (vous pouvez facilement vous en convaincre). Trunc permet d'obtenir à coup sur un entier, quel que soit le nombre de points.

Il nous restera à améliorer ce logiciel, au cours de la leçon suivante.

Haut de cette page 
 

Cours de Delphi, 10° leçon

4. Détection des erreurs


Remarquez que nous n'avons pas testé les textes tapés par l'utilisateur dans les deux Edit. Ce pourrait être n'importe quoi ; en ce cas Delphi affichera un message d'erreur, puisqu'il sait ce qu'il doit trouver, un entier, et un réel. C'est le grand avantage de la déclaration préalable des variables. Mais on pourrait envisager un traitement plus spécifique.
Nous n'avons pas vérifié le sérieux de la demande. 1 000 points de mesure à 1 Hz, cela fait long ; 2 000 000 Hz, ou 15 000 points c'est beaucoup. A vous de voir.
La bibliothèque Candibus dispose d'une fonction simplifiée de détection des erreurs : elle retourne un message, dans la variable avertissement, de type String. Libre à vous d'en faire ce que vous voulez. Ajoutez à votre code :

StatusBar1.SimpleText := Candibus.avertissement ;

Delphi dispose de fonctions beaucoup plus sophistiquées de gestion des erreurs ; voir l'aide en ligne à Try, Except, Raise et Finally.

5. Amélioration des représentations graphiques


Pour l'instant, les axes des abscisses comportent le numéro du point de mesure, et non la date, ou la fréquence. La fréquence d'acquisition ne peut pas toujours être rigoureusement égale à ce qui est demandé. Candibus.frequenceVraie donne la vraie valeur employée. Le spectre de Fourier complet s'étend de la fréquence 0 à la frequenceVraie, le tout sur nPoints. Le pas est donc frequenceVraie/nPoints. Le pas sur l'axe des dates est t := 1/frequenceVraie. Modifiez votre code ainsi :

Series1.AddXY(i * t, mesure1[i], '', clGreen) ;

Series3.AddXY(i * frequenceVraie/nPoints, module[i], '', clLime) ;

Cette façon de programmer n'est pas astucieuse, car elle risque de faire faire 1000 fois le même calcul frequenceVraie/nPoints à Delphi, s'il y a 1000 points mesurés. Mais Delphi est très malin et lors de la compilation, s'il s'aperçoit de l'erreur, il effectuera le calcul une seule fois et le mettra en mémoire. Cela peut se retrouver en mettant un point d'arrêt sur la ligne de code, par clic dans la gouttière, à gauche du code, en lançant l'exécution et lors de l'arrêt en faisant Clic droit | Menu déroulant | Déboguer | Menu déroulant | Voir le CPU. Le mieux est de faire quotient := frequenceVraie/nPoints, puis
Series3.AddXY(i * quotient, module[i], '', clLime) ;

6. Menus déroulants


Pour donner au logiciel un aspect plus professionnel, il faut lui adjoindre des menus déroulants. Signalons que la bibliothèque Candibus possède des fonctions ou procédures pour :


Haut de cette page 
 

Réalisation d'un site Internet scientifique, 1ère page

Contenu : Réalisation d'un site Internet scientifique, conseils généraux, liens hyper texte, images, exercices


Note importante : Le programme officiel de MPI indique dans la colonne 'Culture scientifique et technique' :


Les recommandations précisent : Quelques fonctionnalités d'un traitement de texte seront utilisées pour réaliser de courts comptes-rendus écrits (quelques dizaines de lignes au plus) en incluant des images, des graphiques, des tableaux...

Ce qui est proposé ci-dessous va au-delà. Il s'agit de créer un petit site Internet à contenu scientifique de 3 pages (dont deux peuvent être quasiment vides) et de découvrir la réalisation de liens hyper texte ainsi que la difficulté à transmettre des lettres grecques et des formules. La partie traitant des feuilles de style peut être utile à un navigateur confirmé. Cela lui permettra de télé charger des pages html et de les modifier légèrement, pour obtenir une meilleure qualité d'impression, avec du texte justifié.

La technique d'enseignement proposée consiste à donner le minimum aux élèves débutants en informatique et beaucoup plus à ceux qui travaillent déjà très vite, soit sous forme de tirages, soit en conseillant la visite de ce site.
 

1. Conseils d'ordre général


La réalisation d'un site Internet nécessite plusieurs étapes, que nous allons aborder dans les pages qui suivent.

  1. Choisir un contenu
  2. Établir un plan du site, avec les relations entre documents
  3. Entrer le texte
  4. Convertir ce texte en langage HTML
  5. Ajouter des images, des liens hyper texte
  6. Ajouter les mots clés et tout ce qui peut être utilisé par les moteurs de recherche
  7. Améliorer la présentation du site, par emploi du DHTML (feuilles de style), de JavaScript ...
  8. Publier le site
  9. Référencer le site

2. Plan du site


Nous créerons un site comportant 3 pages.

puce La première doit obligatoirement se nommer index.html. C'est la convention retenue par beaucoup de fournisseurs d'accès.
Ainsi, lorsque le visiteur entrera dans son navigateur l'adresse de votre site, par exemple http://perso.wanadoo.fr/jussiaux.software/, c'est la première page qui s'ouvrira, ce qui correspond à http://perso.wanadoo.fr/jussiaux.software/index.html.

Sinon, votre visiteur verra l'arborescence de votre site, ce que vous ne souhaitez pas toujours !

puce ATTENTION ! Contrairement à Windows, les gestionnaires de sites Internet font la différence entre majuscules et minuscules, pour les noms des fichiers. Donc il se peut qu'un site testé sur votre disque dur ne fonctionne plus une fois chez votre hébergeur. Certaines versions de l'explorateur de Windows proposent de faire la différence majuscules, minuscules.
Prenez l'habitude d'écrire tous les noms de fichiers en minuscules (la vérification est plus facile), exemple page2.htm, image1.gif ... Certains logiciels de dessin sauvegardent parfois en image1.GIF Corrigez dans l'explorateur de Windows tout de suite, avant d'inclure image1 dans votre document.

3. Entrer le texte


Vous pouvez employer un traitement de texte comme Word, mais inutile de formater le texte (gras, souligné, retrait de première ligne ...), donc WordPad, ou NotePad suffisent. Ils seront utiles pour retoucher "à la main" des détails du code HTML.

4. Convertir ce texte en code HTML


Vous pouvez pour ce faire employer Netscape Composer, fourni avec Netscape Communicator. DreamWeaver 2 est aussi disponible gratuitement (la version payante doit être la 4, mais pour ce que nous allons faire, celle-ci suffit. Elle permet d'inclure automatiquement des formulaires dans une page, possibilité que n'offre pas Netscape Composer).

Ouvrez Composer et votre traitement de textes, et transférez par copier coller votre texte. Vous pouvez aussi entrer le texte directement dans Composer. La conversion est automatique.

Procédez maintenant à la mise en page et à l'enrichissement du texte. Dans la barre d'outils, vous disposez d'une liste déroulante Normal, En-Tête1 ... qui permet de formater les titres, sous-titres ...

Utilisez cette technique, plutôt que de changer la taille des caractères. Car dans un usage avancé, avec des feuilles de style, vous pourrez personnaliser très précisément les différents en-têtes, pour tout un ensemble de pages, ce qui conduira à un code plus compact, plus élégant et plus efficace : une modification se répercutera partout à la fois.

5. Ajouter des images


Dans Composer, faites Image | Onglet Image | Choisir le fichier, puis Cliquer sur Taille d'origine (ne vous occupez pas de ce qui se passe), puis Cliquer sur Autre texte | Entrer votre texte.
En cliquant sur taille d'origine, Composer écrit dans le code HTML la taille de l'image insérée. Ainsi, le chargement de la page sera beaucoup plus rapide, car le texte se placera en premier, les images (évitez de dépasser une taille de 40 kilo-octets) arrivant par la suite. Le texte alternatif apparaîtra préalablement à l'image. Un outil utile est l'outil d'alignement, pour centrer votre image.

6. Créer des liens


Une fois vos pages prêtes, placez y des cibles. Placez votre curseur au bon endroit, cliquez sur Cible dans la barre d'outils et entrez un nom. Si une page ne comporte pas de cible, on pourra arriver uniquement en haut de page.

Ensuite placez les liens : Sélectionner une image, ou une portion de texte | Clic droit | Créer un lien en utilisant la sélection, dans le menu qui s'ouvre | Onglet Lien | Choisir un fichier | Si ce fichier contient des cibles, cliquer sur celle qui vous convient | OK.

7. Améliorer la présentation


Le langage HTML met à votre disposition des outils pour améliorer la présentation de votre site. Au départ, ce langage a été conçu pour transmettre des rapports scientifiques, d'où le nombre d'en-têtes disponibles (6). Vous disposez aussi de tableaux, bien utiles pour ordonner la page, lorsque celle ci contient des images. Avec un tableau, il devient possible de placer cote à cote deux images débordant la largeur de l'écran.

Pour créer un tableau, faites dans Composer Tableau | Propriétés du nouveau tableau | Nombre de lignes ... | Nombre de colonnes ... | Largeur des bords ...

Le tableau peut être rendu invisible (c'est plus discret), avec une largeur des bords égale à 0.

Vous pouvez aussi ajouter à votre page différents composants graphiques, pour créer un formulaire (form), bouton (input type="button"), bouton de validation (input type="submit"), bouton d'effacement des saisies du formulaire (input type="reset"), boîte d'édition (input type="text"), boîte déroulante d'options (select ... option), case à cocher (input type="checkbox"), boutons radio (input type="radio").

Voici un exemple de code, créé en "automatique" à l'aide de DreamWeaver 2 (Composer ne le permet pas). Collez le dans WordPad, sauvegardez le en tant que texte, avec l'extension .htm et examinez la page dans Communicator.

<html>
<head>
<title>Document sans-titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF">
<form method="post" action="" name="">
<input type="button" value="Bouton" name="Bouton">
<input type="text" name="textfield" value="" maxlength="7">
<select name="select" size="1">
<option>Ouvrir</option>
<option>Fermer</option>
<option>Quitter</option>
</select>
<font color="#FFFFFF">
<input type="radio" name="radiobutton" value="Essai1">
<input type="radio" name="radiobutton" value="Essai2" checked>
</font>
</form>
</body>
</html>

8. Examiner le code HTML


Vous avez sauvegardé votre document. Ouvrez le avec WordPad ou Write, ou même NotePad. Le code créé par Netscape Composer apparaît. Remarquez qu'il est formé de balises, par exemple <h2>.......</h2> définit un en-tête de type 2.

Haut de cette page 
 

9. Aspirer une page d'un site Internet


Mise en garde : Vous devez respecter les droits de propriété intellectuelle des auteurs des sites que vous visitez. Lorsque vous aspirez une page, par exemple pour en extraire des informations, la courtoisie veut que vous citiez l'auteur du document original. Un travail personnel encadré ne peut se résumer à une compilation (forcément disparate) de pages Internet et d'extraits d'encyclopédies.

Il existe des logiciels permettant l'aspiration d'un site entier. Les mêmes règles de respect des droits intellectuels et de courtoisie s'appliquent naturellement.

Avec Netscape, la récupération d'une page, avec les images associées se fait de la manière suivante :

Netscape enregistre alors dans le dossier que vous lui avez proposé, le texte de la page html et les images associées. Il modifie les adresses des images dans la page, pour que tout fonctionne. C'est pour cette raison que, même si on ne modifie rien soi-même, il faut passer par Composer.
Les dernières versions d'Internet Explorer proposent les mêmes possibilités.

En vous inspirant des pages qui suivent, dans ce chapitre, vous pourriez modifier le code html, en ajoutant des feuilles de style, pour obtenir une meilleure qualité d'impression (justification du texte... ).
 

10. Exercices

10.1. Exercice 1


Réalisez un site Intranet comportant 3 pages (index.htm, page1.htm et page2.htm) communiquant entre elles.
Veillez à sauvegarder soigneusement votre travail.

Lorsque vous modifiez une page dans Netscape Composer, la modification est-elle immédiatement prise en compte dans le navigateur, Netscape navigator ? Pourquoi ? Comment faire pour provoquer une mise à jour de l'affichage ?

Lorsque vous cliquez sur un lien dans Netscape Composer, que se passe-t-il ? cela vous paraît-il logique ?

10.2. Exercice 2


Ajoutez à votre site quelques images, soignez la présentation à l'aide de tableaux (dont les bordures peuvent être invisibles). Vous pouvez inclure des tableaux à l'intérieur d'autres tableaux.

Quels sont les formats d'images utilisables ? Quels sont les avantages et inconvénients de chacun ? Quelles possibilités d'affichage des images offre Netscape Composer ? La taille, les proportions sont elles variables, est-il possible d'afficher un texte d'attente, y-a-t il des possibilités d'alignement du texte et des images ?

10.3. Exercice 3


Ajoutez à l'une des pages de votre site une formule simple employant des lettres grecques (fonte Symbol) et une formule plus complexe, sous forme d'image. Ajoutez un graphique créé à l'aide d'un tableur.

// Le format qui convient le mieux est le format compressé Gif. Eventuellement, essayez d'attribuer à votre formule un fond transparent (cela ne sera pas exigible en devoir surveillé).

11. travail de recherche sur Einstein

11.1. Recherche individuelle


Notez sur une feuille tout ce que vous savez au sujet d'Einstein.
// Ces connaissances seront mises en commun. Celles qui comportent de graves erreurs seront critiquées immédiatement. Non Einstein ne se prénommait pas Franck !

11.2. Recherche en groupe sur Internet


Regroupez sur un document les connaissances initiales de chaque membre du groupe. Puis recherchez et énoncez clairement les réponses aux questions suivantes :

11.3. Visitez l'exposition "Les violons d'Einstein'

Complétez, ou corrigez vos réponses. Indiquez les éventuelles idées fausses que l'exposition vous a permis de corriger.

Haut de cette page