Initiation aux algorithmes

Algorithme et langage de programmation

Le rôle de l'algororithmique est de proposer pour un problème donné, une solution qui peut, après traduction, être exécutée ou réalisée sur un ordinateur.

D'un problème, on détermine les intervenants et leurs relations à travers une analyse afin d'énoncer une solution (l'algorithme) qui, traduit, donnera le programme exécutable sur un ordinateur.

  • définir des instructions pour résoudre un problème
  • algo = écrire une recette / programmation = faire la recette
  • abstraction de langue
  • organigramme vs pseudo-code
Algorithme en organigramme

La schématisation des algorithmes par des organigrammes est peu utilisée car elle amène deux problèmes :

  • une lourdeur quand il y a beaucoup d'instructions
  • l'apprentissage d'une programmation dite non structurée

Familles d'instructions

  • affectation
  • lecture/écriture
  • test
  • boucle

Ordinateur ("Je est un autre")

Entrées / sorties

Un ordinateur dispose de ports d'entrées et de ports de sorties qui lui permettent respectivement, d'acquérir des données, des informations et de transmettre d'autres données ou informations.
Les données provenant d'un scanner seront des entrées alors que les données transmises à une imprimante, seront des sorties.

Périphériques d'entrées/sorties

Exercice n°1

Indiquez s'il s'agit d'un périphérique d'entrées ou de sorties dans les cas suivants :

  1. imprimante
  2. scanner
  3. écran
  4. haut-parleurs
  5. webcam
  6. souris
  7. micro
  8. clavier
  9. clef usb
  10. disque dur

Lire et écrire 1/2

De la même manière, un programme est une série d'instructions destinées à un ordinateur. Les instructions de lecture/écriture doivent se comprendre comme des actions réalisées par le programme (et non le développeur).
Dès lors :

  • l'instruction lire correspond à l'acquisition de données (entrée)
  • l'instruction écrire correspond à l'affichage d'une information (sortie)

Variables

Les variables permettent de stocker une information susceptible d'évoluer durant l'exécution du programme.

Le nom de la variable respecte les règles suivantes :

  1. doit commencer par une lettre ou le caractère underscore ( _ )
  2. ne peut pas commencer par un chiffre
  3. doit contenir une ou plusieurs lettres, un ou plusieurs chiffres et/ou un ou plusieurs underscores
  4. ne doit contenir aucun espace
  5. est sensible à la casse (minuscule / majuscule)
  6. évite l'usage de caractères accentués

Le nom d'une variable doit être défini de manière à aider à la compréhension des instructions / du programme : compteur, ville.

Déclaration de variables

Types de variables

  • numériques :
    • entier
    • réel
  • alphanumériques :
    • caractère
    • chaîne de caractères
  • booléens (vrai / faux)

Les caractères et chaînes de caractères doivent être placés entre quotes.

Pour les dates, on crée 3 variables de type entier pour le jour, le mois et l'année.

Déclaration

Celle-ci est faite au début de l'algorithme, avant toutes autres instructions.

Variable taille_panier : entier
Variables montant, tva, montant_tva, montant_total : réel
Variables nom_client : chaîne de caractères
Variables
    taille_panier : entier
    montant, tva, montant_tva, montant_total : réel
    nom_client : chaîne de caractères
Déclarer n'est pas initialiser !

Une variable déclarée est vide de tout contenu tant qu'elle n'a pas été initialisée. Tant que l'initialisation n'a pas été faite vouloir connaître son contenu entraine une erreur (lecture, comparaison, etc.).

Exercice n°2

Lors de la réalisation d'un programme pour aider au suivi client, on vous demande de vous charger de déclarer les variables suivantes :

  1. une variable contenant le nom du client
  2. une variable contenant son genre (h/f)
  3. une variable contenant sa ville
  4. une variable contenant son âge
  5. une variable contenant le montant total de tous ses achats

Type et contenu

Une fois déclarée, une variable ne peut contenir que le type qui lui a été attribué.

Une variable déclarée avec un type ne peut contenir que des valeurs de ce même type.

Vouloir stocker une valeur de type chaîne de caractères dans une variable déclarée en type entier est une erreur d'écriture.

Affectation

L'affectation est l'instruction de base concernant une variable : on attribue un contenu/une valeur à notre variable. L'affectation se fait en utilisant l'opérateur de la manière suivante :

ma_variable  ma_valeur

Une instruction de type affectation stocke dans la variable placée à gauche de l'opérateur le résultat situé à droite de l'opérateur.

prix_panier  12.95

L'intérêt de créer une variable est de lui faire stocker une information que l'on souhaite conserver dans le but de l'utiliser plus tard dans le cours du programme (un calcul, un affichage, etc.)
Par exemple, le nom d'un acheteur connecté sur un site e-commerce est stocké ainsi pour servir à divers endroits du site ("Bienvenue Untel", "Si vous n'êtes pas Untel, merci de vous déconnecter", etc.)

Exercice n°3

Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?

Exo A :

Variables A, B : entier
Début
    A  1
    B  A + 3
    A  3
Fin

Exo B :

Variables A, B, C : entier
Début
    A  5
    B  3
    C  A + B
    A  2
    C  B – A
Fin

Exo C :

Variables A, B, C : entier
Début
    A  3
    B  10
    C  A + B
    B  A + B
    A  C
Fin

Exo D :

Variables A, B : entier
Début
    A  5
    B  2
    A  B
    B  A
Fin

Les deux dernières instructions permettent-elles d’échanger les deux valeurs de B et A ? Si l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?

Structure d'un algorithme

  • nom du programme, de la fonction ou de la procédure
  • déclaration de variables
  • mot clé "début" indiquant le début des instructions du programme, de la fonction ou de la procédure
  • instructions
  • mot clé "fin" indiquant la fin des instructions du programme, de la fonction ou de la procédure
Programme Calcul_montant_tva
Variable montant, tva, montant_tva, total : réel
Début
    montant  100
    tva  20
    total  montant * (1 + tva/100)
    montant_tva  total - montant
Fin

Lire et écrire 2/2

Une autre méthode pour réaliser une affectation consiste à demander une valeur (à un utilisateur par exemple).
Pour cela, il faut utiliser les mots clefs lire et écrire. L'instruction "écrire" indique au programme quand envoyer une information vers une interface de sortie (généralement, un écran), et "lire", quand récupérer une information via une interface d'entrée (généralement via un clavier).

Au moment où le programme exécute une instruction "lire", il s'arrête en attendant que lui soit fourni ce qu'il attend.

Variable age : entier
Début
    écrire "Merci d'indiquer votre âge"
    lire age
    écrire "Vous avez "
    écrire age
    écrire " ans"
Fin

Exercice n°4

Rédigez les algorithmes suivants :

  1. un algorithme qui demande son nom à l'utilisateur et inscrit "bonjour " suivi du prénom
  2. un algorithme qui demande son nom et son prénom à l'utilisateur et inscrit "bonjour" suivi du nom et du prénom
  3. un algorithme qui demande à la suite, le jour, le mois et l'année de naissance et inscrit la date de naissance au format jj/mm/aaaa

Pour chaque algorithme, pensez à déclarer vos variables, à indiquer le début et la fin de votre algorithme.

Opérateurs

Parmi les opérateurs, il y a les opérateurs arithmétiques classiques :

  • addition : +
  • soustraction : -
  • multiplication : *
  • division : /

Il y a également :

  • l'opérateur de puissance : ^
  • l'opérateur de concaténation : &
  • les opérateurs logiques : ET, OU et NON
écrire "La ville est : " & ville

Exercice n°5

Qu'obtient-on après exécution des instructions suivantes ?

Exo A :

Variables A, B, C : chaîne de caractères
Début
A  "423"
B  "12"
C  A + B
Fin

Exo B :

Variables A, B, C : chaîne de caractères
Début
A  "423"
B  "12"
C  A & B
Fin

Opérateur de comparaison

La condition nécessite l'utilisation d'opérateurs de comparaison :

  • égal à : =
  • différent de : != ou <>
  • strictement plus petit que : <
  • strictement plus grand que : >
  • plus petit ou égal à : <=
  • plus grand ou égal à : >=

Ordre alphabétique

Pour ordonner des caractères ou chaînes de caractères, ce qui est communément admis sont les règles suivantes (basées sur les tables ASCII):

  • A est inférieur à B
  • a est inférieur à b
  • A est inférieur à a
  • Z est inférieur à a

Donc l'ordre est le suivant : A..Za..z.

Structures alternatives ou tests

Il est possible, en fonction d'un élément (le contenu d'une variable, le résultat d'une opération, etc.) de faire en sorte que notre programme réalise des instructions différentes. Pour cela, on utilise la structure suivante :

si booléen alors
    instructions
finsi

ou la suivante :

si booléen alors
    instructions
sinon
    instructions
finsi
Pour distinguer ce qui est mot clé de ce qui ne l'est pas, soit on inscrit en majuscule le mot clé, soit on le souligne.

A la place du "booléen", il y aura soit une expression dont la valeur est VRAI ou FAUX :

  • soit une variable de type booléen
  • soit une condition
Variable temp : entier
Début
	écrire "Entrez la température de l’eau :"
	lire temp
	Si temp <= 0 Alors
  		écrire "C’est de la glace"
	FinSi
	Si temp > 0 Et temp < 100 Alors
  		écrire "C’est du liquide"
	Finsi
	Si temp > 100 Alors
  		écrire "C’est de la vapeur"
	Finsi
Fin

Une simplification avec l'utilisation de Sinon :

Variable temp : entier
Début
    écrire "Entrez la température de l’eau :"
    lire temp
    Si temp <= 0 Alors
        écrire "C’est de la glace"
    Sinon
        Si temp < 100 Alors
            écrire "C’est du liquide"
        Sinon
            écrire "C’est de la vapeur"
        Finsi
    Finsi
Fin

Une autre simplification en utilisant SinonSi

Variable temp : entier
Début
    écrire "Entrez la température de l’eau :"
    lire temp
    Si temp <= 0 Alors
        écrire "C’est de la glace"
    SinonSi temp < 100 Alors
        écrire "C’est du liquide"
    Sinon
        écrire "C’est de la vapeur"
    Finsi
Fin

Enfin en utilisant des variables booléenes :

Variable temp : entier
Variables est_glace, est_vapeur : booléen
Début
    écrire "Entrez la température de l’eau :"
    lire temp
    est_glace  temp <= 0
    est_vapeur  temp < 100
    Si est_glace Alors
        écrire "C’est de la glace"
    SinonSi est_vapeur Alors
        écrire "C’est du liquide"
    Sinon
        écrire "C’est de la vapeur"
    Finsi
Fin

Exercice n°6

En utilisant le programme ci-dessous et en le complétant, demander à l'utilisateur d'indiquer sa date de naissance (d'abord le jour, puis le mois, enfin l'année). En comparant avec les informations la date du jour, souhaitez un bon anniversaire à l'utilisateur ou une bonne journée.

  1. déclarez 3 variables supplémentaires
  2. demandez à l'utilisateur de leur attribuer des valeurs
  3. comparez
  4. affichez le texte qui convient en fonction des valeurs
Variables jour, mois, annee : entier
...
Début
jour  aujourdhui('jour')
mois  aujourdhui('mois')
annee  aujourdhui('annee')
...
...
Fin
                    

Opérateurs booléens ou opérateurs logiques

Les opérateurs logiques servent dans les tests de logique. Les tests de logique permettent d'orienter l'exécution d'un programme vers une série d'instruction ou une autre : si l'utilisateur connecté est une femme, il faut lui proposer les promotions sur des vêtements féminins, si c'est un homme, les promotions sur ceux masculins.
Dans certains cas, plusieurs critères (~ tests logiques) sont nécéssaires pour décider d'une action (~ série d'instructions) à réaliser :

  • S'il fait plus de 17°C ET qu'il y a le soleil, je vais en ville à pied;
  • si Pierre me prête sa voiture OU que je peux en louer une, je vais au ski cet hiver.

Le ET et le OU inscrits ci-dessus sont des opérateurs de logique ; les tests de logique de part et d'autre de ces opérateurs vont avoir un résultat (vrai ou faux) et, en fonction de l'opérateur, la valeur de l'ensemble des tests va être déterminé (là aussi, soit vrai, soit faux).

Il existe 4 opérateurs servant aux opérations de tests :

  • ET
  • OU (dans le sens : l'un ou l'autre, peu importe)
  • XOR à considérer comme "ou bien" (dans le sens : l'un ou l'autre, pas les deux en même temps)
  • NON (dans le sens "n'est pas")

Attention lors de la création d'une variable booléenne, il ne faut pas mettre les quotes au niveau de la valeur

Variable frais_port_offert : booléen
Début
frais_port_offert  "vrai"  ---- ERREUR de type
frais_port_offert  vrai
Fin

Avec ces opérateurs, il existe des règles ou tables dites de Boole, du nom du mathématicien les ayant déterminées.

Doodle de Google pour George Boole - 2 nov 2015

Table du ET

Il faut que les 2 opérandes soient vrais pour que l'ensemble retourne vrai.

ET vrai faux
vrai V F
faux F F
S'il fait plus de 17°C et qu'il y a le soleil, je vais en ville à pied.
  1. il fait 21°C et le soleil est présent, alors ?
  2. il fait 15°C et le soleil est présent, alors ?
  3. il fait 21°C et il pleut, alors ?
  4. il fait 7°C et il pleut, alors ?

Table du OU

Il faut que l'un des 2 opérandes soit vrai pour que l'ensemble retourne vrai.

OU vrai faux
vrai V V
faux V F
Si Pierre me prête sa voiture OU que je peux en louer une, je vais au ski cet hiver.
  1. Pierre me prête sa voiture et je peux en louer une, alors ?
  2. Pierre ne me prête pas sa voiture et je peux en louer une, alors ?
  3. Pierre me prête sa voiture et je ne peux pas en louer une, alors ?
  4. Pierre ne me prête pas sa voiture et je ne peux pas en louer une, alors ?

Table du XOR

Il faut que les opérandes soient de valeur opposée pour que l'ensemble retourne vrai.

XOR vrai faux
vrai F V
faux V F

Table du NON

Renvoie la valeur opposée de l'opérande.

NON vrai faux
non F V

Exercice n°7

Déterminez le résultat des tests suivants :

  1. vrai ET vrai
  2. vrai ET NON(faux)
  3. faux OU faux
  4. NON(vrai)
  5. vrai ET faux
  6. faux ET NON(faux)
  7. faux OU vrai
  8. vrai OU (vrai OU faux)
  9. NON(faux) ET (vrai OU faux)
  10. vrai ET NON(vrai OU faux)

Des simplifications de test sont possibles en utilsant les opérateurs booléens.

Exercice n°8

Simplifiez les deux tests suivants pour n'en obtenir qu'un seul

Si il fait trop chaud Alors
    Ouvrir la fenêtre
Sinon
    Fermer la fenêtre
Finsi

Si il ne pleut pas Alors
    Ouvrir la fenêtre
Sinon
    Fermer la fenêtre
Finsi

ET et OU sont interchangeables

Selon la transformation de De Morgan :

  • NON(A ET B) = NON(A) OU NON(B)
  • NON(A OU B) = NON(A) ET NON(B)

De ses règles, la transformation suivante :

Si A ET B Alors
    Instructions 1
Sinon
    Instructions 2
Finsi

équivaut à :

Si NON(A) OU NON(B) Alors
    Instructions 2
Sinon
    Instructions 1
Finsi
Remarquez l'inversion des instructions

Exercice n°9

Remplacez ET par OU en conservant la validité du code :

Si il fait trop chaud ET il ne pleut pas Alors
    Ouvrir la fenêtre
Sinon
    Fermer la fenêtre
Finsi

Conditions composées

Vérifier si un montant est compris entre 0 et 50 euros, revient à tester deux conditions :

  • montant est supérieur (ou égal) à 0
  • montant est inférieur (ou égal) à 50
Il n'est pas possible de vérifier si x est compris entre 10 et 100 en une seule condition.

Pour lier les deux conditions, il faut utiliser un opérateur logique.

Exercice n°10

Exo A :

Ecrire les algorithmes suivants :

  1. un algorithme qui demande un nombre à l’utilisateur, et l’informe ensuite si ce nombre est positif ou négatif
  2. un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si la multiplication donnera une valeur négative ou positive. Faire cela sans faire la multiplication mais en testant les deux valeurs.

Exo B :

Créer un algorithme qui lira au clavier l’heure et les minutes, et affichera l’heure qu’il sera une minute plus tard.
Par exemple, si l'utilisateur tape 19 puis 25, l'algorithme doit répondre :
"Dans une minute, il sera 19 heure(s) 26".

Exo C :

Pour déterminer qu'une année est bissextile, il faut qu'elle respecte les règles suivantes : elle doit être divisible par 4 ; une année divisible par 100 n'est pas bissextiles, mais les années divisibles par 400 le sont.
Ecrivez l'algorithme capable de déterminer si une année est bissextile.


Exercice n°11

Exo A :

Un magasin de reprographie facture 0,10 E les dix premières photocopies, 0,09 E les vingt suivantes et 0,08 E au-delà. Ecrivez un algorithme qui demande à l’utilisateur le nombre de photocopies effectuées et qui affiche la facture correspondante.

Exo B :

Une assurance a besoin d'un programme pour calculer le montant des cotisations annuelles de ses assurés. Pour déterminer le montant, elle utilise les critères suivant :
- si 3 ou plus incidents durant les 3 dernières années, refus d'assurer
- une base fixe de 500 euros
- si moins de 25 ans, 80 euros en plus
- si homme et 25 ans ou moins, 15 euros en plus
- si femme et 25 ans ou moins, 5 euros en plus
- si homme et plus de 25 ans, aucune majoration ou minoration
- si femme et plus de 25 ans, 10 euros en moins
- si permis >= 3 ans, alors reduction de 10 euros par année (-0 pour la 3ème année, -10 pour la 4ème, etc.)
- si un incident durant les 3 dernières années, 30 euros en plus.
Faites un programme qui demande à l'utilisateur (l'assureur) les informations nécessaires et lui indique le montant.

Boucle

  • instruction(s) répétée(s) un certain nombre de fois
  • instruction(s) itérative(s)
  • nombre connu de répétition ou non

Tant que

TantQue booléen Faire
  …
  Instructions
  …
FinTantQue

Un exemple d'utilisation :

Variable rep : caractère
Début
    rep  ""
    écrire "Comptez vous partir en vacances ? (O/N)"
    TantQue rep != "O" et rep != "N" Faire
        lire rep
    FinTantQue
Fin

Exercice n°12

Exo A :

Créez un algorithme qui demande à l'utilisateur un nombre qui doit être positif. L'utilisateur ne peut inscrire qu'une valeur numérique mais celle-ci peut être positive ou négative. Tant que l'utilisateur donne une valeur négative, le programme le lui redemande.

Exo B :

Créez un algorithme qui demande à l'utilisateur un nombre compris entre 1 et 100 inclus. Tant que l'utilisateur ne donne pas une valeur correcte, le programme le lui redemande.

Exo C :

Même programme que précédemment mais cette fois, le programme indique si le nombre donné est pair ou impair.

Pour déterminer si un nombre est pair, utilisez "modulo" tel que :
reste mon_nombre modulo 2 //retourne le reste de mon_nombre divisé par 2

Exo D :

Créez un algorithme qui demande à l'utilisateur deux nombres compris entre 1 et 100 inclus. Le programme réalise une multiplication avec ces deux nombres et indique si le produit est un pair ou impair. Tant que l'utilisateur ne donne pas deux valeurs correctes, le programme le lui redemande.

Exo E :

Même programme que précédemment mais cette fois, le programme indique si le produit trouvé est divisible (=le reste est égal à 0) par 2 ou par 3.

Exo F :

Quelle modification(s) doi(ven)t être faite(s) pour vérifier que le produit trouvé est divisible par 2 et par 3 cette fois-ci ?

Pour

Une boucle tant que ayant un compteur qui est incrémenté à chaque passage de boucle

Variable compteur : entier
Début
    compteur  0
    TantQue truc < 15 Faire
        compteur  compteur + 1
        écrire "Passage numéro : " & compteur
    FinTantQue
Fin

devient :

Variable compteur : entier
Début
    Pour compteur de 1 à 15
        écrire "Passage numéro : " & compteur
    FinPour
Fin

ou, en indiquant le pas de l'incrémentation :

Variable compteur : entier
Début
    Pour compteur de 1 à 15 par 1
        écrire "Passage numéro : " & compteur
    FinPour
Fin

La structure de la boucle Pour est donc la suivante :

Pour compteur de Initial à Final Par ValeurDuPas
…
Instructions
…
FinPour

Exercice n°13

Exo A :

Créer un algorithme qui pour un nombre donné par l'utilisateur, affiche les 10 nombres suivants.

Exo B :

Ecrire un algorithme qui demande un nombre de départ, et qui ensuite écrit la table de multiplication de ce nombre, présentée comme suit :
Table de 6
6 x 1 = 6
...

Les boucles imbriquées sont possibles mais il faut tenir compte de leur complexité d'exécution

Exercice n°14

Exo A :

Variables compteur_1, compteur_2 : entier
Début
    Pour compteur_1 De 1 à 10
        écrire "Il est passé par ici"

        Pour compteur_2 De 1 à 6
            écrire "Il repassera par là"
        FinPour
    FinPour
Fin

Combien de fois seront affichés :

  • "Il est passé par ici"
  • "Il repassera par là"

Exo B :

En utilsant les boucles imbriquées, affichez les tables de multiplications pour les tables de 2, 3, 4 et 5.

Tableau

Tableau à longueur connue

Les tableaux sont des conteneurs et comme toutes les variables, ils peuvent contenir divers types de valeur mais à leur déclaration, le type qui leur est associé doit être indiqué :

Tableau nom_tab(taille_tab) : type_valeur_contenue

Exemple :

Tableau note(10) : entier
Variable compteur : entier

Dans le cas ci-dessus, un tableau de 10 éléments de type entier est déclaré : il ne pourra contenir que des entiers et sa longueur est fixée à 10 éléments, pas plus. La position dans un tableau est appelée "indice".

Le premier indice d'un tableau est 0

L'indice d'un tableau va de 0 à n-1, avec n indiquant la taille du tableau.

Tableau note(10) : entier

L'indice maximum de ce tableau sera 9.

La lecture et l'écriture dans un tableau nécessite d'indiquer une position dans le tableau en placant celle-ci entre crochet :

note[0]  15
écrire "Vous avez eu la note de " & note[0]
Toute cellule d'un tableau doit être initialisée avant d'être utilisable

L'accès à un indice d'un tableau qui n'a pas été initialisée entrainera une erreur.
C'est pourquoi il est recommandé d'initialiser chaque emplacement d'un tableau avec une valeur par défaut.

Pareillement, l'accès à un indice qui n'existe pas entrainera une erreur :

Tableau note(10) : entier
note[10]  12

Exercice n°15

Exo A :

Ecrire un algorithme qui déclare et remplisse un tableau contenant les six voyelles de l’alphabet latin.

Exo B :

Ecrire un algorithme qui déclare et remplisse un tableau de taille 7 pouvant stocké des valeurs réelles. En utilisant une boucle, initialisez tous les emplacements à zéro.

Exo C :

  1. déclarez un tableau de taille 20 qui doit contenir des mots
  2. quelle valeur d'initialisation est la plus pertinente par défaut pour ce tableau ? pourquoi ?
  3. écrivez l'algorithme réalisant cette initialisation
  4. déclarez un tableau de taille 15 qui doit contenir des entiers

Exo D :

Vous devez déclarer un tableau note de taille 5, ce tableau contiendra des notes d'un examen

  1. quelle est l'indice maximal du tableau note ?
  2. quel est le type de valeur que contiendra ce tableau ?
  3. quelle valeur est la plus pertinente par défaut pour le tableau note ? pourquoi ?
  4. initialisez toutes les cases de ce tableau avec la valeur par défaut
  5. créez une boucle demandant à l'utilisateur de saisir les notes
  6. faites la moyenne des notes et affichez la

Exo E :

Vous devez créer un programme capable, à partir de deux tableaux d'entiers de taille 3, de remplir un 3ème tableau de même taille que les deux autres, stockant la somme des valeurs contenus dans chaque tableau pour un même indice.
Si test_a contient [1, 5, 6] et test_b contient [3, 5, 2] alors somme contiendra [4, 10, 8].

Tableau à longueur inconnue

Certaines fois, la taille du tableau n'est pas connue à l'avance ou il vaut mieux laisser l'utilisateur définir la taille. Dans ces cas là, il faut utiliser le mot clé "redim" pour définir la taille du tableau :

Tableau participant() : chaîne de caractères
Début
    écrire "Combien de participants ?"
    lire nb
    redim participant(nb)
Fin

La modification d'un tableau existant peut entraîner des erreurs et doit donc être utilisée avec sagesse.

Pour connaître la taille d'un tableau, il faut utiliser la fonction taille qui retourne la taille du tableau transmis en argument.

Tableau test(10) : entier
Variable compte : entier
Début
    compte  taille(test)
Fin

Exercice n°16

Exo A :

Ecrivez un algorithme qui permette la saisie d’un nombre quelconque de valeurs, en demandant à l'utilisateur la taille du tableau. L'utilisateur renseigne alors les différentes valeurs du tableau. Une fois que l'utilisateur a fini, les valeurs sont affichées en parcourant le tableau.

Exo B :

Créez un algorithme qui fusionne deux tableau en un seul contenant toutes les valeurs.
Faites en sorte que l'algo fonctionne quelque soit la taille des deux tableaux donnés.
Si test_a contient [1, 5, 6] et test_b contient [3, 5, 2, 4] alors test_c contiendra [1, 5, 6, 3, 5, 2, 4].

Exercices sur la manipulation des tableaux

Exercice n°17

Les exercices suivants sont réalisés en utilisant un tableau d'entier.

Exo A :

Créez un algorithme dont le but est de décaler le 1er élément d'un tableau pour le mettre tout à la fin.
Si test contient [4, 8, 1, 5, 6] alors test contiendra [8, 1, 5, 6, 4].

Exo B :

Créez un algorithme dont le but est de renverser un tableau.
Si test contient [4, 8, 1, 5, 6] alors test contiendra [6, 5, 1, 8, 4].

Exo C :

Créez un algorithme, qui, à partir d'un tableau ne contenant que des 0 ou des 1 en valeurs, l'ordonne en placant toutes les valeurs 1 en fin du tableau .
Si test contient [0, 1, 1, 0, 0, 1, 0] alors test contiendra [0, 0, 0, 0, 1, 1, 1].

Exo D :

Ecrivez un algorithme qui permette à l’utilisateur de supprimer une valeur d’un tableau saisi. L’utilisateur donnera la valeur qu’il souhaite supprimer. Attention, la taille du tableau final devra être moins grande d'une case par rapport à tableau de départ.

Exo E :

Modifiez l'algorithme précédent de manière que l'utilisateur ait le choix entre indiquer une valeur à supprimer ou un emplacement à supprimer. Par exemple, il peut vouloir supprimer la valeur 9 du tableau ou la valeur à l'indice 3 du tableau.

Exo F :

Écrivez un algorithme qui demande à l'utilisateur différentes valeurs et vérifie si l'une ou plusieurs des valeurs proposées sont présentes en double ou plus dans un tableau donné.
L'algorithme indiquera les doublons trouvés

"Flag" ou gestion asymétrique de variable booléenne

La recherche d'un élément d'un tableau peut se faire en utilisant un flag ou drapeau, indiquant que l'élément a été trouvé ou non. Il s'agit d'une valeur de type booléenne initialisée à faux et si lors du parcours du tableau, la valeur est trouvée, la valeur vrai est affectée à la variable.

Exercice n°18

Créez un algorithme qui indique si un élément existe dans un tableau ou non :

  1. déclarez les éléments suivants :
    • une variable de type entier nommée "recherche"
    • un tableau d'entier
    • une variable de type booléene nommée "est_trouvé"
  2. parcourez le tableau
  3. affichez si l'élément recherché est présent ou non

Déterminer le but

Le but d'un algorithme est de résoudre un problème ou de répondre à une question.
Comment déterminer le plus petit multiple entre deux chiffres ? Quelle est la valeur la plus grande d'un tableau ?

L'auteur n'est pas toujours soi-même et il faut parfois "décoder" ce qu'un autre à fait.
Pour y parvenir, la solution la plus simple est d'imaginer un jeu d'entrées simples (des variables, des tableaux... ce que le programme manipule) et de déterminer comment ce jeu est modifié.

Exercice n°19

Déterminer ce que fait l'algorithme suivant :

tableau t(10) : entier
variable v, i, j : entier

Debut
	pour i de 0 à 9 par 1
		lire t[i]
	finpour

	lire v

	j <- 0
	pour i de 0 à 9 par 1
		si t[i] = v alors
			j <- j + 1
		finsi
	finpour
	ecrire j
Fin

Les valeurs suivantes sont entrées :

  • 2 6 5 8 2 3 5 4 2 3
  • 2
  1. Que fait ce programme ?
  2. Que va-t-il afficher à la fin ?

Exercice n°20

Déterminer ce que fait l'algorithme suivant :

tableau t(10) : entier
variable v, i : entier
variable j : booléen

Debut
	pour i de 0 à 9 par 1
		lire t[i]
	finpour

	lire v

	j <- faux
	i <- 0
	tantque j = faux ET i <= 9 faire
		si t[i] = v alors
			j <- vrai
		finsi
		i <- i + 1
	fintantque

	si j = vrai alors
		ecrire 1
	sinon
		ecrire 0
	finsi
Fin

Les valeurs suivantes sont entrées :

  • 5 3 6 8 4 1 2 7 6 9
  • 7
  1. Que fait ce programme ?
  2. Que va-t-il afficher à la fin ?
  3. Quel est le rôle de la variable j ?

Exercice n°21

Déterminer ce que fait l'algorithme suivant :

tableau t(10) : entier
variable v, i, c : entier

Debut
	pour i de 0 à 9 par 1
		v <- 0
		tantque v <= 0 OU v > 100 faire
			lire v
		fintantque
		t[i] <- v
	finpour

	c <- 0
	pour i de 0 à 9 par 1
		si t[i] < 50 alors
			c <- c + 1
		finsi
	finpour

	ecrire c
Fin

Les valeurs suivantes sont entrées :

  • 52 35 65 202 84 48 19 252 0 125 22 72 64 9
  1. Que fait ce programme ?
  2. Que va-t-il afficher à la fin ?

Exercice n°22

Déterminer ce que fait l'algorithme suivant :

tableau t(10) : entier
variable k, v, i, c : entier
variable m : réel

Debut
	lire k
	redim t(k)

	pour i de 0 à k-1 par 1
		v <- 0
		tantque v < 0 OU v >= 60 faire
			lire v
		fintantque
		t[i] <- v
	finpour

	c <- 0
	pour i de 0 à k-1 par 1
		c <- c + t[i]
	finpour

	m <- c / 3 / k

	ecrire m
Fin

Les valeurs suivantes sont entrées :

  • 5
  • 51 32 69 81 42 19 72 67 106 49
  1. Que fait ce programme ?
  2. Que va-t-il afficher à la fin ?
  3. Pourquoi avoir créer la variable m et non pas utiliser la variable c à sa place ?

Tri d'un tableau

Tri par sélection/extraction

L'algorithme parcourt le tableau à la recherche de l'élément le plus petit.
1 - 2 - 7 - 10 - 8 - 5 - 6 - 3 - 4 - 9
1 - 2 - 7 - 10 - 8 - 5 - 6 - 3 - 4 - 9
1 - 2 - 3 - 10 - 8 - 5 - 6 - 7 - 4 - 9
1 - 2 - 3 - 4 - 8 - 5 - 6 - 7 - 10 - 9
1 - 2 - 3 - 4 - 5 - 8 - 6 - 7 - 10 - 9
1 - 2 - 3 - 4 - 5 - 6 - 8 - 7 - 10 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 10 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 10 - 9
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10

Pour réaliser cela, 2 boucles imbriquées sont nécessaires, la première permettant de sélectionner l'élément à comparer et la seconde permettant de comparer l'élément avec les autres.

Exercice n°23

Sachant que pour réaliser le tri par sélection, il faut utiliser 2 boucles imbriquées, la première permettant de sélectionner l'élément à comparer et la seconde permettant de comparer l'élément avec les autres, réalisez l'algorithme de ce tri.

Tri à bulle

L'algorithme parcourt le tableau t en intervertissant les indices i et i+1 si t[i] est plus grand que t[i+1]. En avançant ainsi, le plus grand élément trouvé est repoussé à droite.
2 - 4 - 7 - 8 - 5 - 6 - 3 - 1 - 9 - 10
2 - 4 - 7 - 5 - 6 - 3 - 1 - 8 - 9 - 10
2 - 4 - 5 - 6 - 3 - 1 - 7 - 8 - 9 - 10
2 - 4 - 5 - 3 - 1 - 6 - 7 - 8 - 9 - 10
2 - 4 - 3 - 1 - 5 - 6 - 7 - 8 - 9 - 10
2 - 3 - 1 - 4 - 5 - 6 - 7 - 8 - 9 - 10
2 - 1 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10

Exercice n°24

Réalisez l'algorithme du tri à bulle.

Il existe une variante de ce tri appelée tri à bulle amélioré qui va procéder de la même manière avec la différence que, étant donné que le plus grand élément trouvé est placé en bout, on réduit la taille d'un cycle à chaque passage : on réduit ainsi le nombre de comparaisons réalisées.
2 - 4 - 7 - 8 - 5 - 6 - 3 - 1 - 9 - 10
2 - 4 - 7 - 5 - 6 - 3 - 1 - 8 - 9 - 10
2 - 4 - 5 - 6 - 3 - 1 - 7 - 8 - 9 - 10
2 - 4 - 5 - 3 - 1 - 6 - 7 - 8 - 9 - 10
2 - 4 - 3 - 1 - 5 - 6 - 7 - 8 - 9 - 10
2 - 3 - 1 - 4 - 5 - 6 - 7 - 8 - 9 - 10
2 - 1 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
(en gras les éléments comparés lors du cycle)

Exercice n°25

Réalisez l'algorithme du tri à bulle amélioré.

Tri fusion (pour information)

L'algorithme réalise deux opérations qui sont la découpe d'un tableau en deux et la fusion de tableaux ordonnés.
** 4 - 2 - 7 - 8 - 5 - 6 - 3 - 1
-> 4 - 2 - 7 - 8 | 5 - 6 - 3 - 1
-> 4 - 2 | 7 - 8 | 5 - 6 | 3 - 1
-> 2 - 4 | 7 - 8 | 5 - 6 | 1 - 3
-> 2 - 4 - 7 - 7 | 1 - 3 - 5 - 6
-> 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8

  1. si la taille du tableau est supérieure à 2 :
    1. le tableau est coupé en 2 tableaux
    2. chaque nouveau tableau obtenu est testé sur sa taille et réalise le point 1 ou 2
  2. si la taille du tableau est inférieure ou égale à 2:
    1. les éléments du tableau sont triés
    2. le tableau est fusionné avec le tableau dont il a été séparé précédemment

Tri rapide (pour information)

L'algorithme choisit aléatoirement une position dans le tableau et la valeur trouvée (appelée pivot) sert à organiser les autres valeurs par rapport au pivot en ayant d'un coté les valeurs inférieures au pivot et d'un autre, les valeurs supérieures. Une fois fait, un pivot est choisi pour chacune des sous listes et le processus précédent est à nouveau réalisé.
** 4 - 2 - 7 - 8 - 5 - 6 - 3 - 1
-> 4 - 2 - 7 - 8 - 5 - [6] - 3 - 1
-> 4 - 2 - 5 - 3 - 1 - [6] - 7 - 8
** 4 - 2 - 5 - [3] - 1 - 6 - [7] - 8
-> 2 - 1 - [3] - 4 - 5 - 6 - [7] - 8
...

Recherche dans un tableau

Recherche basique

L'algorithme parcourt le tableau en comparant chaque valeur de case avec l'élément recherché. Il s'agit là de la méthode la plus simple mais la moins efficace, car plus il y a de données et plus la recherche sera longue.

Recherche séquentielle dans un tableau trié

L'algorithme parcourt le tableau en comparant chaque valeur de case avec l'élément recherché. Mais cette fois-ci, si l'élément recherché est plus grand (recherche croissante) que l'élément comparé, la recherche peut s'arrêter : l'élément recherché est absent.

Exemple : on recherche la lettre D dans la série de lettre ABEFG. Dès qu'on atteint E, on peut s'arrêter, la lettre n'est pas dans la série.

Recherche par dichotomie (ou recherche dichotomique)

Cet algorithme de recherche nécessite également un tableau trié.
Le principe appliqué est celui qu'on utilise lorsqu'on recherche un mot dans un dictionnaire. L'algorithme compare la valeur recherchée avec la valeur trouvée au centre du tableau : si la valeur recherché est inférieure, la recherche va se poursuivre à l'intérieur de la première moitié du tableau ; sinon dans la seconde moitié. Quel que soit la moitié choisie, l'algorithme, va à nouveau couper en deux le jeu des possibilités. Etc.

Exercice n°26

Exo A :

Ecrivez un algorithme qui réalise la recherche séquentielle sur un tableau trié de manière croissante.

Exo B :

Ecrivez un algorithme qui réalise la recherche dichotomique sur un tableau trié de manière croissante.