Aller au contenu principal

Variables, types et calculs

Ce que ce chapitre apporte

  • Déclarer une variable avec un nom valide et le type adapté à ce qu'elle contiendra.
  • Lire et écrire une affectation, y compris quand la variable apparaît des deux côtés de la flèche.
  • Prévoir la valeur d'une expression d'après les priorités, la division et le type de la variable qui la reçoit.
  • Assembler un message avec & et afficher un réel proprement avec ToFixed.
  • Suivre l'état des variables forme après forme, dans un tableau de trace et en pas à pas.

Un programme utile retient des valeurs, les transforme et affiche un résultat. Tout repose sur trois gestes : déclarer une variable du bon type, lui affecter une valeur, écrire une expression qui calcule juste. Ce chapitre les pose un par un, avec les pièges qui produisent un résultat faux sans aucun message : la moyenne rangée dans un entier, la priorité oubliée, l'échange qui écrase une valeur.

La variable : un nom, un type, une valeur

Définition

Une variable est un emplacement de mémoire désigné par un nom. Elle a un type, fixé à sa déclaration, et une valeur, qui peut changer au cours de l'exécution. Dans Flowgorithm, la forme Declare crée la variable ; la valeur arrive ensuite, par une saisie (Input) ou une affectation (Assignment).

Une forme Declare peut créer plusieurs variables du même type, noms séparés par des virgules. Une variable utilisée sans déclaration, ou lue avant d'avoir reçu une valeur, arrête l'exécution. En Python, il n'y a pas de déclaration : la variable naît à sa première affectation ; Flowgorithm oblige à décider du type avant d'écrire le calcul.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainString destinationInteger nbColisReal masseKgBoolean fragileInput destinationInput nbColisInput masseKgfragile = falseOutput nbColis & " colis pour " & destination & ", " & ToFixed(masseKg * nbColis, 1) &" kg au total"End

Quatre variables, une par type. Dérouler en pas à pas : chaque variable apparaît dans la fenêtre des variables dès sa déclaration, mais sans valeur jusqu'à sa saisie ou son affectation.

Les règles de nommage

Un identifiant commence par une lettre, suivie de lettres ou de chiffres. Il ne contient ni espace, ni tiret bas. Flowgorithm ignore la casse : volumeCuve, VolumeCuve et VOLUMECUVE désignent la même variable. Enfin, certains mots sont réservés : and, or, not, mod, true, false, pi, les noms de types (integer, real, string, boolean) et les noms des fonctions intégrées (Len, Sqrt, Int...).

Nom proposéAccepté ?Raison
volumeCuveouilettre d'abord, puis lettres
capteur2ouiun chiffre est admis après la première lettre
2emeCapteurnoncommence par un chiffre
volume cuvenoncontient un espace
volume_cuvenoncontient un tiret bas
real, pi, Lennontype, constante et fonction intégrée
Des noms parlants, sans accent

Un nom dit ce que contient la variable et, si besoin, son unité : volumeLitres, dureeMinutes, masseKg. Les noms x, a ou truc obligent à relire tout le programme pour comprendre un calcul. Ce cours écrit les identifiants sans accent (debit, temperature, etiquette) et marque les mots par une majuscule, puisque l'espace et le tiret bas sont exclus. Le texte affiché, lui, entre guillemets, garde ses accents.

Quatre types, quatre usages

TypeAccepteExemplesQuestion à se poser
Integerun entier ; un réel rangé dedans perd sa partie décimale0, 42, 1250compter : colis, pièces, minutes entières
Realun nombre à virgule1.5, 230.0, 0.25mesurer : volume, masse, température, débit
Stringdu texte, entre guillemets doubles"Cuve B2", "Lyon"nommer : un nom, une référence, un message
Booleantrue ou falsetruerépondre oui ou non : vanne ouverte, colis fragile

Le type se choisit d'après ce que la variable contiendra, pas d'après la première valeur imaginée. Un volume qui tombe juste aujourd'hui aura des décimales après la prochaine vidange partielle : c'est une mesure, donc un Real. Un nombre de colis ne sera jamais 3,5 : c'est un compte, donc un Integer. Un numéro de lot qui commence par des lettres, "AB-1250", est un texte. Dans le logiciel, la fenêtre de surveillance des variables (Variable Watch) colore chaque valeur selon son type : entiers en bleu, réels en violet, textes en rouge, booléens en bleu-vert. Un coup d'œil suffit pour repérer une mesure déclarée par erreur en Integer.

L'affectation : « reçoit »

La forme Assignment range le résultat d'un calcul dans une variable. Les organigrammes de ce cours l'écrivent avec une flèche, stock ← stock + 350, et elle se lit « stock reçoit stock + 350 ». Elle se lit de droite à gauche : d'abord calculer l'expression de droite, avec les valeurs que les variables ont à cet instant ; ensuite ranger le résultat dans la variable de gauche, dont l'ancienne valeur est perdue.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainInteger compteurcompteur = 0compteur = compteur + 1compteur = compteur + 1compteur = compteur + 1Output "Pièces comptées : " & compteurEnd

Un compteur de pièces sur un convoyeur. Dérouler en pas à pas et observer compteur dans la fenêtre des variables après chaque rectangle.

Ce n'est pas une équation

En mathématiques, compteur = compteur + 1 n'a pas de solution. Ici, ce n'est pas une affirmation mais une action : prendre la valeur actuelle, lui ajouter 1, ranger le résultat au même endroit. Le programme ci-dessus affiche Pièces comptées : 3. Pour la même raison, compteur + 1 ← compteur n'a pas de sens : à gauche de la flèche, il n'y a jamais qu'une variable.

Échanger deux valeurs

Sur une chambre froide, les deux capteurs ont été branchés à l'envers : la première saisie, censée être la température, reçoit l'humidité (62), et la seconde reçoit la température (18,5). Il faut échanger les contenus des deux variables.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainReal temperature, humidite, temporaireInput temperatureInput humiditecapteurs branchés à l'envers : on échange les deux valeurstemporaire = temperaturetemperature = humiditehumidite = temporaireOutput "Température : " & ToFixed(temperature, 1) & " °C"Output "Humidité : " & ToFixed(humidite, 1) & " %"End

Un échange en trois affectations. La variable temporaire met de côté la valeur qui serait écrasée par la première affectation.

La console affiche Température : 18.5 °C puis Humidité : 62.0 %. Sans temporaire, la première affectation écraserait le contenu de temperature avant qu'il ait été mis de côté : le deuxième exercice type montre ce qui se passe alors.

Écrire une expression

Une expression combine des valeurs, des variables, des opérateurs et des fonctions. Les opérateurs de calcul sont les suivants.

OpérateurRôleExemple métier
+, -addition, soustraction (nombres seulement)stock ← stock - expedition
*multiplicationpuissance ← tension * intensite
/division, toujours réelledebit ← volume / duree
% ou modreste de la divisionminutes ← dureeMinutes % 60
^puissancesurface ← pi * rayon ^ 2
&concaténation : colle texte et valeurs"Stock : " & stock

Les priorités

Une expression ne se lit pas de gauche à droite. La documentation de Flowgorithm fixe l'ordre suivant, de la priorité la plus forte à la plus faible : les opérateurs unaires (le signe moins) et not ; puis ^ ; puis *, /, % ; puis +, - ; puis & ; puis les comparaisons, and et or, qui servent au chapitre suivant. À priorité égale, le calcul se fait de gauche à droite.

ExpressionValeurPourquoi
12 + 8 / 414la division passe avant l'addition
(12 + 8) / 45les parenthèses forcent l'addition d'abord
60 / 3 * 240même rang : de gauche à droite
2 * 3 ^ 218la puissance ne porte que sur 3
(2 * 3) ^ 236la puissance porte sur le produit

Les pertes par effet Joule dans un câble valent R×I2R \times I^2. Avec resistance à 2 et intensite à 5, l'expression resistance * intensite ^ 2 vaut 50, ce qui est juste ; (resistance * intensite) ^ 2 vaut 100, ce qui est faux. Au moindre doute, des parenthèses rendent l'intention lisible sans rien coûter. Deux cas les exigent toujours dans ce cours : deux ^ qui se suivent, et un signe moins devant une puissance.

Le reste et la partie entière : convertir une durée

Un cycle de lavage industriel dure un certain nombre de minutes, et l'écran de la machine doit l'afficher en heures et minutes. La division donne un réel ; Int en garde la partie entière, les heures ; % donne le reste, les minutes. Le même couple Int(n / d) et n % d sert partout où une quantité se répartit en paquets : secondes en minutes, pièces en cartons, litres en bidons.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainInteger dureeMinutes, heures, minutesInput dureeMinutesheures = Int(dureeMinutes / 60)minutes = dureeMinutes % 60Output "Cycle : " & heures & " h " & minutes & " min"End

Pour 135 minutes, le programme affiche Cycle : 2 h 15 min. Changer la saisie (60, 59, 600) et prévoir l'affichage avant d'exécuter.

Division et types

Deux règles se combinent, et produisent l'erreur la plus sournoise du chapitre. La division / est toujours réelle : 7 / 2 vaut 3,5, même entre deux entiers. Un Integer jette la partie décimale de ce qu'il reçoit, sans arrondir et sans message : 3,2 rangé dans un Integer donne 3. (En Python aussi, / est une division réelle ; la division entière s'y écrit //.)

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainInteger nbBouteilles, dureeMinutesInteger cadenceEntierReal cadenceReelInput nbBouteillesInput dureeMinutescadenceEntier = nbBouteilles / dureeMinutescadenceReel = nbBouteilles / dureeMinutesOutput "Cadence rangée dans un Integer : " & cadenceEntier & " bouteilles/min"Output "Cadence rangée dans un Real : " & ToFixed(cadenceReel, 2) & "bouteilles/min"End

Une remplisseuse produit 45 bouteilles en 4 minutes. Le même quotient, 11,25, est rangé dans deux variables : c'est le rangement dans l'Integer qui perd les décimales.

La moyenne rangée dans un Integer

Une moyenne, un débit, un taux sont des quotients : ils se rangent dans un Real. Déclarer moyenne en Integer ne provoque aucune erreur : le programme tourne et affiche un nombre plausible, simplement faux. Le défaut ne se voit qu'en comparant avec un calcul à la main, ou en regardant la couleur de la variable dans la fenêtre de surveillance. Quand la partie entière est voulue, Int le dit explicitement, comme pour les heures du cycle de lavage.

Le texte

L'opérateur & colle des morceaux de texte et des valeurs en une seule chaîne. L'opérateur + est réservé aux nombres : l'employer sur un texte est une erreur qui arrête l'exécution.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainInteger numeroLotInput numeroLotOutput "Lot " + numeroLotEnd

Un + à la place du &. Exécuter : le programme s'arrête sur la sortie, car "Lot " est un texte. Remplacer + par & corrige le défaut.

Comme & passe après les calculs, "Total : " & 12 + 8 calcule d'abord la somme et affiche Total : 20. Les guillemets font la différence entre le mot et la valeur : "Volume : volume L" affiche le mot volume, quand "Volume : " & volume & " L" affiche le contenu de la variable. Trois fonctions servent à mettre en forme : ToFixed(r, i) écrit le réel r avec i décimales, ce qui s'impose dès qu'un réel n'est pas « rond » (un volume calculé avec pi, par exemple) ; ToString(n) convertit un nombre en texte, utile quand une fonction attend un texte ; Len(s) donne le nombre de caractères du texte s, espaces compris.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainString nomCuve, etiquetteInteger numeroLotInput nomCuveInput numeroLotetiquette = nomCuve & "-" & numeroLotOutput etiquetteOutput "Caractères de l'étiquette : " & Len(etiquette)Output "Chiffres du numéro de lot : " & Len(ToString(numeroLot))End

Une étiquette de lot. Len mesure un texte : le numéro passe par ToString avant d'être mesuré.

Les fonctions intégrées utiles au calcul

FonctionRôleExempleRésultat
Sqrt(x)racine carréeSqrt(2.25)1,5
Abs(x)valeur absolue, l'écart sans le signeAbs(18.5 - 21)2,5
Int(x)partie entièreInt(135 / 60)2
pila constante πpi * rayon ^ 2surface d'un disque
ToFixed(r, i)réel écrit avec i décimalesToFixed(pi, 2)le texte 3.14

Il n'existe pas de fonction minimum ou maximum : ce calcul s'écrit avec une condition, au chapitre suivant. Aucune variable ne peut porter le nom d'une de ces fonctions.

Suivre l'état des variables

Prévoir ce que fait un programme, c'est suivre la valeur de chaque variable forme après forme. Le tableau de trace le fait sur papier : une ligne par forme exécutée, une colonne par variable, et la valeur après la forme.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainInteger stock, expeditionInput stockstock = stock + 350expedition = stock / 4stock = stock - expeditionOutput "Stock restant : " & stockEnd

Un entrepôt reçoit 350 cartons, puis en expédie le quart. Dérouler en pas à pas et comparer la fenêtre des variables au tableau de trace.

Forme exécutéestockexpedition
Declaresans valeursans valeur
Input (saisie 1200)1200sans valeur
stock ← stock + 3501550sans valeur
expedition ← stock / 41550387
stock ← stock - expedition1163387
Output1163387

La quatrième ligne cumule deux règles du chapitre : 1550 / 4 vaut 387,5, et expedition, un Integer, n'en garde que 387. Le programme affiche Stock restant : 1163. Remplir le tableau avant d'exécuter, puis dérouler avec « Pas à pas » : la page surligne la forme en cours, comme le logiciel, et la fenêtre des variables montre les valeurs. Le premier écart entre le tableau et la fenêtre désigne la forme mal comprise. Dans Flowgorithm, une forme Breakpoint suspend l'exécution à l'endroit choisi, pour observer la fenêtre des variables sans dérouler tout le début.

Fil rouge : la cuve de traitement

La cuve cylindrique de la station a un rayon de 1,5 m et une hauteur de 4 m. Le programme saisit ces deux dimensions et le volume actuel en litres, calcule la capacité en m³ (πr2h\pi r^2 h) puis en litres, et le taux de remplissage en pourcentage.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainReal rayon, hauteur, capaciteM3, capaciteLitres, volumeLitres, tauxInput rayonInput hauteurInput volumeLitrescapaciteM3 = pi * rayon ^ 2 * hauteurcapaciteLitres = capaciteM3 * 1000taux = volumeLitres / capaciteLitres * 100Output "Capacité : " & ToFixed(capaciteM3, 2) & " m3, soit " & Int(capaciteLitres) & "litres"Output "Taux de remplissage : " & ToFixed(taux, 1) & " %"End

Étape 2 du fil rouge. Toutes les variables sont des mesures, donc des Real ; ToFixed et Int ne changent que l'affichage.

Pour 22000 litres, la console affiche Capacité : 28.27 m3, soit 28274 litres puis Taux de remplissage : 77.8 %. Trois décisions sont à relever. volumeLitres est un Real, car le volume est une mesure, même quand la saisie tombe juste. capaciteM3 garde toutes ses décimales en mémoire et seul l'affichage est raccourci : calculer le taux à partir d'une valeur tronquée fausserait le pourcentage. Enfin, volumeLitres / capaciteLitres * 100 est sans ambiguïté, puisque / et * ont le même rang et se calculent de gauche à droite. Exécuter le programme avec d'autres volumes saisis, en prévoyant chaque fois le taux avant de lancer : une cuve à moitié pleine, une cuve vide, une cuve pleine. Le chapitre suivant se servira de ce taux pour prendre une décision.

Exercices type

Un capteur de chambre froide mesure en degrés Celsius, le client exige des degrés Fahrenheit (F = C × 9 / 5 + 32). Écrire l'affectation, choisir les types, et donner la valeur affichée pour 4,5 °C.

Les deux températures sont des mesures : celsius et fahrenheit sont des Real. L'expression celsius * 9 / 5 + 32 respecte les priorités : produit et division de gauche à droite, addition en dernier.

Organigramme, tel que l'affiche Flowgorithm
Exécuter comme dans Flowgorithm, en continu ou forme par forme.
MainReal celsius, fahrenheitInput celsiusfahrenheit = celsius * 9 / 5 + 32Output ToFixed(celsius, 1) & " °C = " & ToFixed(fahrenheit, 1) & " °F"End

Le programme affiche 4.5 °C = 40.1 °F. Deux erreurs sont à écarter. Écrire celsius * 9 / (5 + 32) change le calcul, car les parenthèses forcent l'addition d'abord. Déclarer fahrenheit en Integer donnerait 40 : le résultat perdrait sa décimale sans message.

Organigramme, tel que l'affiche Flowgorithm
MainInteger piecesM1, piecesM2Input piecesM1Input piecesM2piecesM1 = piecesM2piecesM2 = piecesM1Output "M1 : " & piecesM1 & " pièces, M2 : " & piecesM2 & " pièces"End

Les compteurs de deux machines, saisis à l'envers (35 puis 20), et un échange à vérifier.

Ce programme doit échanger les compteurs des machines M1 et M2. Que valent piecesM1 et piecesM2 à la fin, et comment corriger ?

Tableau de trace : après les saisies, piecesM1 vaut 35 et piecesM2 vaut 20. piecesM1 ← piecesM2 range 20 dans piecesM1 : le 35 est perdu. piecesM2 ← piecesM1 range la valeur actuelle de piecesM1, c'est-à-dire 20. Le programme affiche M1 : 20 pièces, M2 : 20 pièces. La correction met la première valeur de côté avant de l'écraser, comme pour les capteurs de la chambre froide : déclarer temporaire en Integer, puis temporaire ← piecesM1, piecesM1 ← piecesM2, piecesM2 ← temporaire. Une affectation détruit l'ancienne valeur : toute valeur encore utile doit être sauvegardée avant.

Organigramme, tel que l'affiche Flowgorithm
MainInteger colisH1, colisH2, colisH3, colisH4, moyenneInput colisH1Input colisH2Input colisH3Input colisH4moyenne = (colisH1 + colisH2 + colisH3 + colisH4) / 4Output "Colis par heure en moyenne : " & moyenneEnd

Les colis traités par une ligne d'emballage pendant quatre heures (14, 15, 12 et 16) et leur moyenne horaire.

Le responsable de la ligne trouve la moyenne affichée par ce programme trop « ronde ». Quelle valeur s'affiche, laquelle est juste, et quelle forme corriger ?

La somme vaut 57 et la division 57 / 4 vaut 14,25, puisque / est toujours réelle. Les parenthèses sont correctes : sans elles, seul colisH4 serait divisé par 4. Le défaut est ailleurs : moyenne est déclarée Integer, et jette la partie décimale. Le programme affiche Colis par heure en moyenne : 14 au lieu de 14,25. La forme fautive est la Declare : les comptages restent des Integer, mais moyenne, un quotient, doit être déclarée à part en Real, et l'affichage devient ToFixed(moyenne, 2). Un résultat plausible mais trop rond désigne presque toujours un quotient rangé dans un entier.

Vérification

Vérification rapideon peut se reprendre

1.Après stock ← 40, puis stock ← stock - 15, puis stock ← stock * 2, que vaut stock ?

2.Que vaut 10 / 4 dans Flowgorithm ?

3.Que vaut 5 + 2 * 3 ^ 2 ?

4.Une variable Integer reçoit 2.7. Que contient-elle ?

5.Comment afficher le volume suivi de son unité ?

6.Quel identifiant Flowgorithm refuse-t-il ?

7.Un programme déclare taux, puis affecte une valeur à Taux. Que se passe-t-il ?

La méthode

  1. Choisir le type d'après le rôle : compter donne un Integer, mesurer un Real, nommer un String, répondre oui ou non un Boolean. Tout quotient va dans un Real.
  2. Nommer la variable par ce qu'elle contient, avec l'unité si elle compte, sans accent ni tiret bas.
  3. Lire chaque affectation de droite à gauche : calculer avec les valeurs du moment, puis ranger ; sauvegarder dans une variable temporaire toute valeur qui va être écrasée et reste utile.
  4. Parenthéser dès qu'il y a doute sur les priorités, et vérifier l'expression sur un cas calculable à la main.
  5. Assembler l'affichage avec &, obtenir une partie entière avec Int et un reste avec %, et passer par ToFixed pour tout réel qui n'est pas rond.
  6. Tracer avant d'exécuter, puis comparer le tableau de trace à la fenêtre des variables en pas à pas.

Synthèse

  • Une variable a un nom, un type et une valeur ; la forme Declare la crée avant tout usage. Integer pour compter, Real pour mesurer, String pour nommer, Boolean pour oui ou non.
  • Un identifiant commence par une lettre, sans espace ni tiret bas ; la casse est ignorée ; les mots réservés et les noms de fonctions sont exclus.
  • L'affectation se lit « reçoit », de droite à gauche ; compteur ← compteur + 1 est une action, pas une équation. Un échange passe par une variable temporaire.
  • Priorités : ^, puis * / %, puis + -, puis & ; à rang égal, de gauche à droite.
  • La division / est toujours réelle ; un Integer jette la partie décimale de ce qu'il reçoit. Int et % découpent une quantité en paquets.
  • & colle texte et valeurs, + est réservé aux nombres ; ToFixed affiche un réel proprement.
  • Le tableau de trace et le pas à pas montrent l'état des variables après chaque forme.

Mettre en pratique