Leçon 18 sur 20

Chapitre 18 — Traduction d’un algorithme en programme

Passer méthodiquement du pseudo-code à un programme correct, lisible et testable

 

Fiche pédagogique du chapitre

Objectifs d’apprentissage

À la fin de ce chapitre, l’étudiant devra être capable de :

  • faire correspondre les principales instructions du pseudo-code avec leur écriture dans un langage de programmation ;
  • déclarer et utiliser correctement des variables, des constantes et des types ;
  • traduire les opérations de lecture, d’affichage et d’affectation ;
  • transformer des conditions et des boucles en instructions exécutables ;
  • manipuler un tableau et écrire une fonction simple dans un programme ;
  • expliquer les caractéristiques générales de Python, C et Java ;
  • suivre une méthode progressive de traduction et de validation ;
  • identifier les erreurs de syntaxe, d’exécution et de logique ;
  • appliquer des règles de lisibilité, de modularité et de robustesse ;
  • tester un programme à l’aide de cas normaux, limites et incorrects.

Prérequis

  • structure générale d’un algorithme et instructions élémentaires ;
  • variables, constantes, types et expressions ;
  • structures conditionnelles et répétitives ;
  • tableaux, fonctions et procédures ;
  • tests, validation et jeux d’essai.

Plan du chapitre

Section

Contenu principal

18.1

Correspondances : variables, entrées-sorties, affectation, conditions, boucles, tableaux et fonctions

18.2

Choix d’un langage : Python, C et Java

18.3

Méthode de traduction : pseudo-code, vérification, exécution, tests et correction

18.4

Bonnes pratiques : nommage, indentation, modularité, commentaires et validation

Applications

Traductions complètes et exercices progressifs

Organisation pédagogique indicative

Activité

Durée indicative

Contenu

Cours

3 h

Correspondances syntaxiques et démarche de traduction

Travaux dirigés

3 h

Traduction et analyse de fragments de programmes

Travaux pratiques

4 h

Implémentation, exécution, tests et débogage

Évaluation

1 h

Programme court accompagné de jeux d’essai

Idée centrale : La traduction ne consiste pas à remplacer mécaniquement chaque mot du pseudo-code. Il faut respecter la syntaxe, les types, les bibliothèques et les conventions du langage choisi tout en préservant la logique de l’algorithme.

Introduction

Un algorithme décrit une méthode de résolution indépendamment d’un langage particulier. Un programme est la mise en œuvre exécutable de cette méthode dans un langage de programmation. Le passage de l’un à l’autre nécessite donc deux vérifications : la logique de l’algorithme doit être correcte et son écriture doit respecter les règles du langage choisi.

Le pseudo-code privilégie la compréhension. Il utilise des mots comme Lire, Écrire, Si, Pour ou Retourner. Un langage de programmation impose une syntaxe précise, des symboles particuliers, des règles de typage et une organisation du code. Python, C et Java expriment souvent la même idée de façons différentes.

Ce chapitre présente les correspondances les plus utiles, une méthode de traduction progressive et les bonnes pratiques permettant de produire un programme lisible, robuste et facile à tester.

À retenir : Toujours conserver le pseudo-code et les jeux d’essai pendant la programmation : ils servent de référence pour vérifier que le programme réalisé correspond bien à la solution conçue.

18.1 Correspondances principales

18.1.1 Du pseudo-code au langage de programmation

Les langages de programmation possèdent des constructions communes : variables, expressions, conditions, boucles, collections et sous-programmes. La syntaxe change, mais le rôle algorithmique reste comparable.

Pseudo-code

Rôle

Point d’attention lors de la traduction

Variables / Constantes

Mémoriser des données

Choisir un type et une valeur initiale adaptés

Lire / Écrire

Communiquer avec l’utilisateur

Convertir la saisie textuelle si nécessaire

Affecter une valeur

Ne pas confondre affectation et comparaison

Si / Sinon

Choisir un traitement

Respecter les opérateurs logiques du langage

Pour / TantQue

Répéter un traitement

Contrôler bornes, pas et condition d’arrêt

Tableau

Regrouper des valeurs

Vérifier les indices et la taille

Fonction

Isoler un calcul réutilisable

Définir paramètres et valeur de retour

18.1.2 Variable et type

Une variable possède un nom, une valeur et un type. En pseudo-code, le type est généralement déclaré explicitement. En C et en Java, cette déclaration est obligatoire. Python détermine dynamiquement le type de la valeur affectée, même si des annotations facultatives peuvent être utilisées.

Pseudo-code

Variables
     age : Entier
     moyenne : Réel
     admis : Booléen
     nom : Chaîne

Python

age = 20
moyenne = 14.5
admis = True
nom = "Salma"

C

#include <stdbool.h>
int age = 20;
double moyenne = 14.5;
bool admis = true;
char nom[] = "Salma";

Java

int age = 20;
double moyenne = 14.5;
boolean admis = true;
String nom = "Salma";

Attention : Le type choisi doit couvrir les valeurs possibles et les opérations prévues. Une division entre entiers peut produire un résultat différent d’une division réelle selon le langage.

18.1.3 Lecture et affichage

La lecture récupère une donnée provenant de l’utilisateur ou d’une autre source. L’affichage transmet un résultat. Dans de nombreux langages, une saisie au clavier est d’abord obtenue sous forme de texte puis convertie vers le type attendu.

Pseudo-code

Écrire("Donner votre âge : ")
Lire(age)
Écrire("Vous avez ", age, " ans")

Python

age = int(input("Donner votre âge : "))
print("Vous avez", age, "ans")

C

int age;
printf("Donner votre âge : ");
scanf("%d", &age);
printf("Vous avez %d ans\n", age);

Java

Scanner clavier = new Scanner(System.in);
System.out.print("Donner votre âge : ");
int age = clavier.nextInt();
System.out.println("Vous avez " + age + " ans");

En C, les formats comme %d ou %f doivent correspondre au type. En Java, la classe Scanner doit être importée. En Python, int(...) ou float(...) réalise la conversion de la chaîne saisie.

18.1.4 Affectation

L’affectation remplace la valeur actuelle d’une variable par le résultat d’une expression. Le symbole ← du pseudo-code devient généralement = dans les langages de programmation.

Opération

Pseudo-code

Python / C / Java

Valeur simple

x ← 5

x = 5

Calcul

somme ← a + b

somme = a + b

Incrémentation

compteur ← compteur + 1

compteur = compteur + 1

Forme abrégée

Non normalisée en pseudo-code

compteur += 1

Erreur fréquente : Dans la plupart des langages, = signifie « affecter ». L’égalité logique s’écrit généralement ==. Écrire x = 5 dans une condition n’a donc pas le même sens que x == 5.

18.1.5 Condition

Pseudo-code

Si note ≥ 10 Alors
     Écrire("Admis")
Sinon
     Écrire("Ajourné")
FinSi

Python

if note >= 10:
     print("Admis")
else:
     print("Ajourné")

C

if (note >= 10) {
     printf("Admis\n");
} else {
     printf("Ajourne\n");
}

Java

if (note >= 10) {
     System.out.println("Admis");
} else {
     System.out.println("Ajourné");
}

Opération logique

Pseudo-code

Python

C / Java

ET

ET

and

&&

OU

OU

or

||

NON

NON

not

!

Égalité

=

==

==

Différence

!=

!=

Python utilise l’indentation pour délimiter les blocs. C et Java utilisent généralement des accolades. Dans tous les cas, la structure visuelle doit rendre clairement visible la branche exécutée.

18.1.6 Boucle Pour

La boucle Pour convient lorsque le nombre de répétitions est connu. Il faut vérifier si la borne finale est incluse ou exclue dans le langage choisi.

Pseudo-code

Pour i allant de 0 à n - 1 Faire
     Écrire(i)
FinPour

Python

for i in range(n):
     print(i)

C

for (int i = 0; i < n; i++) {
     printf("%d\n", i);
}

Java

for (int i = 0; i < n; i++) {
     System.out.println(i);
}

En Python, range(n) produit les valeurs de 0 à n - 1. En C et en Java, la boucle rassemble l’initialisation, la condition de continuation et la mise à jour du compteur.

18.1.7 Boucles TantQue et Répéter…Jusqu’à

Pseudo-code : TantQue

TantQue valeur ≤ 0 Faire
     Lire(valeur)
FinTantQue

Python

while valeur <= 0:
     valeur = int(input("Nombre positif : "))

C

while (valeur <= 0) {
     scanf("%d", &valeur);
}

Java

while (valeur <= 0) {
     valeur = clavier.nextInt();
}

Le pseudo-code Répéter…Jusqu’à exécute le corps au moins une fois. C et Java possèdent une boucle do…while. Python ne propose pas directement cette structure ; on l’imite souvent avec while True et une instruction break.

Pseudo-code : Répéter…Jusqu’à

Répéter
     Lire(note)
Jusqu’à note ≥ 0 ET note ≤ 20

Python

while True:
     note = float(input("Note : "))
     if 0 <= note <= 20:
         break

C

do {
     scanf("%lf", &note);
} while (note < 0 || note > 20);

Java

do {
     note = clavier.nextDouble();
} while (note < 0 || note > 20);

18.1.8 Tableau

Un tableau regroupe des éléments de même type et utilise généralement des indices commençant à 0. La traduction doit respecter la taille, les limites des indices et la syntaxe propre au langage.

Pseudo-code

Variables
     notes : Tableau[0..4] de Réel

Pour i allant de 0 à 4 Faire
     Lire(notes[i])
FinPour

Python

notes = [0.0] * 5
for i in range(5):
     notes[i] = float(input("Note : "))

C

double notes[5];
for (int i = 0; i < 5; i++) {
     scanf("%lf", &notes[i]);
}

Java

double[] notes = new double[5];
for (int i = 0; i < 5; i++) {
     notes[i] = clavier.nextDouble();
}

Indice invalide : Un accès comme T[n] est hors limites pour un tableau de n éléments indexé de 0 à n - 1. Cette erreur peut provoquer une exception, un arrêt ou un comportement incorrect selon le langage.

18.1.9 Fonction

Une fonction reçoit des paramètres, exécute un traitement et retourne une valeur. Le type de retour est explicite en C et en Java. Python ne l’impose pas, mais une annotation peut être ajoutée.

Pseudo-code

Fonction Maximum(a : Entier, b : Entier) : Entier
     Si a > b Alors
         Retourner a
     Sinon
         Retourner b
     FinSi
FinFonction

Python

def maximum(a: int, b: int) -> int:
     if a > b:
         return a
     return b

C

int maximum(int a, int b) {
     if (a > b) {
         return a;
     }
     return b;
}

Java

static int maximum(int a, int b) {
     if (a > b) {
         return a;
     }
     return b;
}

L’appel maximum(x, y) peut être placé dans une affectation, un calcul ou un affichage. Les arguments doivent être compatibles avec les paramètres et la valeur retournée doit être utilisée de manière cohérente.

18.1.10 Programme complet minimal

Un fragment d’algorithme doit être placé dans la structure générale attendue par le langage. Python peut exécuter directement des instructions placées dans un fichier. C exige une fonction main. Java organise le programme dans une classe contenant généralement une méthode main.

Programme Python

def maximum(a: int, b: int) -> int:
     return a if a > b else b

x = int(input("x : "))
y = int(input("y : "))
print("Maximum :", maximum(x, y))

Programme C

#include <stdio.h>

int maximum(int a, int b) {
     return (a > b) ? a : b;
}

int main(void) {
     int x, y;
     scanf("%d %d", &x, &y);
     printf("Maximum : %d\n", maximum(x, y));
     return 0;
}

Programme Java

import java.util.Scanner;

public class MaximumApp {
     static int maximum(int a, int b) {
         return (a > b) ? a : b;
     }

     public static void main(String[] args) {
         Scanner clavier = new Scanner(System.in);
         int x = clavier.nextInt();
         int y = clavier.nextInt();
         System.out.println("Maximum : " + maximum(x, y));
         clavier.close();
     }
}

18.2 Choix d’un langage

18.2.1 Critères de choix

Le choix d’un langage dépend des objectifs pédagogiques et techniques. Il faut considérer la simplicité de la syntaxe, la gestion des types, le contrôle de la mémoire, les bibliothèques disponibles, les performances, les outils et le domaine d’application.

Critère

Question à se poser

Apprentissage

Le langage permet-il de se concentrer rapidement sur la logique ?

Typage

Souhaite-t-on rendre les types très visibles et contrôlés ?

Mémoire

Faut-il comprendre ou maîtriser finement l’allocation mémoire ?

Portabilité

Le programme doit-il fonctionner sur plusieurs plateformes ?

Écosystème

Les bibliothèques nécessaires sont-elles disponibles ?

Domaine

Le langage est-il adapté au Web, à la donnée, à l’embarqué ou aux applications métier ?

18.2.2 Python pour sa simplicité

Python utilise une syntaxe concise et lisible. L’indentation structure les blocs et de nombreuses opérations courantes nécessitent peu de lignes. Il permet aux débutants de tester rapidement un algorithme et d’observer son résultat.

  • écriture proche du pseudo-code ;
  • exécution interactive pratique pour les essais ;
  • nombreuses bibliothèques ;
  • gestion automatique de la mémoire ;
  • typage dynamique qui accélère l’écriture mais peut retarder certaines erreurs.

Usage pédagogique : Python est particulièrement adapté pour découvrir la programmation, automatiser des tâches, traiter des données et réaliser rapidement des prototypes.

18.2.3 C pour les types et la mémoire

C rend explicites les types, les adresses, les tableaux et une grande partie de la gestion de la mémoire. Sa syntaxe demande davantage de rigueur, mais elle aide à comprendre ce qui se passe à un niveau proche de la machine.

  • types statiques et compilation ;
  • contrôle précis de la mémoire ;
  • performances et faible surcoût ;
  • importance des pointeurs, des tailles et des limites ;
  • risque d’erreurs mémoire lorsque les contrôles sont insuffisants.

Usage pédagogique : C est fréquent dans les systèmes embarqués, les systèmes d’exploitation, les pilotes et les programmes nécessitant un contrôle fin des ressources.

18.2.4 Java pour la programmation structurée et orientée objet

Java possède un typage statique, une syntaxe structurée et un modèle orienté objet. La machine virtuelle Java facilite la portabilité et la gestion automatique de la mémoire évite de nombreuses manipulations manuelles.

  • types vérifiés lors de la compilation ;
  • organisation du code en classes et méthodes ;
  • bibliothèque standard riche ;
  • exceptions et contrôles d’exécution ;
  • syntaxe plus détaillée que Python pour un programme minimal.

Usage pédagogique : Java convient aux applications structurées de taille moyenne ou grande et constitue une transition naturelle vers la programmation orientée objet.

18.2.5 Comparaison synthétique

Aspect

Python

C

Java

Syntaxe initiale

Très concise

Rigoureuse

Rigoureuse et structurée

Typage

Dynamique

Statique

Statique

Exécution

Interprétée / machine virtuelle

Compilation native

Compilation vers bytecode / JVM

Mémoire

Automatique

Contrôle manuel important

Automatique

Tableaux

Listes dynamiques usuelles

Taille explicite

Tableaux et collections

Objet

Possible, non obligatoire au début

Non natif

Central

Débutant

Prise en main rapide

Très formateur mais exigeant

Formateur avec plus de structure

Aucun langage n’est meilleur dans tous les contextes. Pour un premier cours centré sur la logique, Python réduit la charge syntaxique. Pour comprendre la représentation des données et la mémoire, C est très instructif. Pour organiser des programmes structurés et introduire les objets, Java est pertinent.

18.3 Méthode de traduction

18.3.1 Étape 1 — Écrire d’abord le pseudo-code

Le pseudo-code doit préciser les entrées, les sorties, les variables, les traitements et les cas particuliers. Il est plus facile de corriger une logique indépendante du langage que de modifier simultanément la logique et la syntaxe.

Question

Exemple de réponse

Quelles sont les entrées ?

Un tableau de notes et sa taille

Quel est le résultat ?

La moyenne des notes

Quels cas particuliers ?

Tableau vide, note invalide

Quelles structures ?

Boucle, accumulateur et fonction

18.3.2 Étape 2 — Vérifier l’algorithme manuellement

Avant de programmer, il faut exécuter mentalement ou sur papier l’algorithme avec plusieurs jeux d’essai. Une table de trace permet de suivre les variables, les conditions et les répétitions.

Jeu d’essai

Résultat attendu

But

[10, 12, 14]

12

Cas normal

[20]

20

Taille minimale non vide

[]

Erreur ou traitement défini

Cas particulier

[0, 20]

10

Valeurs limites

18.3.3 Étape 3 — Préparer les correspondances

Il est utile d’identifier avant l’écriture les éléments dépendant du langage : types, fonctions de lecture, affichage, bornes de boucles, représentation du tableau et signatures des fonctions.

Élément algorithmique

Décision de programmation

Réel

float ou double selon le langage

Lire une note

input + conversion, scanf ou Scanner

Tableau de n notes

liste, tableau statique ou tableau alloué

Erreur si n = 0

message, valeur spéciale ou exception selon le contexte

18.3.4 Étape 4 — Traduire instruction par instruction

La traduction doit suivre la structure du pseudo-code tout en produisant des blocs cohérents. Il est préférable d’implémenter et de vérifier une petite partie à la fois : lecture, calcul, fonction, puis affichage.

Pseudo-code de référence

Fonction Moyenne(T, n) : Réel
     Si n = 0 Alors
         Retourner 0
     FinSi
     somme ← 0
     Pour i allant de 0 à n - 1 Faire
         somme ← somme + T[i]
     FinPour
     Retourner somme / n
FinFonction

Traduction Python

def moyenne(notes: list[float]) -> float:
     if len(notes) == 0:
         return 0.0
     somme = 0.0
     for note in notes:
         somme += note
     return somme / len(notes)

18.3.5 Étape 5 — Exécuter ou compiler le programme

L’exécution révèle les erreurs de syntaxe, de noms, de types et de bibliothèques. Python signale souvent l’erreur au moment d’exécuter la ligne concernée. C et Java passent généralement par une compilation qui détecte de nombreuses erreurs avant l’exécution.

Type de message

Exemple de cause

Réaction

Erreur de syntaxe

Parenthèse, deux-points ou accolade manquante

Lire la ligne et les lignes précédentes

Nom inconnu

Variable mal orthographiée ou hors portée

Comparer avec la déclaration

Type incompatible

Chaîne utilisée comme nombre

Ajouter une conversion ou corriger le type

Bibliothèque absente

Scanner ou fonction non importée

Ajouter l’import ou l’en-tête nécessaire

18.3.6 Étape 6 — Tester plusieurs cas

Un programme qui fonctionne sur un seul exemple n’est pas suffisamment validé. Les tests doivent couvrir les cas normaux, limites et incorrects, ainsi que les différentes branches des conditions.

  • valeurs ordinaires ;
  • valeurs minimales et maximales ;
  • zéro, tableau vide ou chaîne vide lorsque ces cas sont possibles ;
  • saisie de mauvais type ;
  • valeurs hors intervalle ;
  • cas qui exécutent chaque branche d’une condition.

18.3.7 Étape 7 — Corriger les erreurs

Le débogage doit être méthodique. Il faut reproduire l’erreur, observer les valeurs, localiser l’instruction fautive, formuler une hypothèse, appliquer une correction limitée puis relancer tous les tests utiles.

Erreur

Symptôme

Outil de diagnostic

Syntaxe

Le programme ne démarre pas ou ne compile pas

Message du compilateur ou de l’interpréteur

Exécution

Arrêt pendant le traitement

Trace d’erreur, débogueur, vérification des indices

Logique

Résultat faux sans arrêt

Table de trace, affichages temporaires, tests unitaires

Bonne pratique : Corriger une erreur ne doit pas en masquer une autre. Après chaque modification, relancer les anciens jeux d’essai afin d’éviter les régressions.

18.3.8 Exemple complet de démarche

Problème : lire cinq notes valides, calculer la moyenne et afficher la décision « Admis » si la moyenne est au moins égale à 10.

Pseudo-code validé

Constante N ← 5
Variables notes : Tableau[0..N-1] de Réel
          somme, moyenne : Réel

somme ← 0
Pour i allant de 0 à N - 1 Faire
     Répéter
         Lire(notes[i])
     Jusqu’à notes[i] ≥ 0 ET notes[i] ≤ 20
     somme ← somme + notes[i]
FinPour
moyenne ← somme / N
Écrire(moyenne)
Si moyenne ≥ 10 Alors
     Écrire("Admis")
Sinon
     Écrire("Ajourné")
FinSi

Programme Python robuste

N = 5
notes = []

for i in range(N):
     while True:
         try:
            note = float(input(f"Note {i + 1} : "))
            if 0 <= note <= 20:
                notes.append(note)
                break
            print("La note doit être comprise entre 0 et 20.")
         except ValueError:
            print("Veuillez saisir un nombre.")

moyenne = sum(notes) / N
print(f"Moyenne : {moyenne:.2f}")
print("Admis" if moyenne >= 10 else "Ajourné")

Cette version ajoute au pseudo-code initial le contrôle du type de saisie, nécessaire dans une application réelle. La logique principale reste toutefois identique : valider, stocker, additionner, calculer puis décider.

18.4 Bonnes pratiques de programmation

18.4.1 Utiliser des noms explicites

Un nom doit indiquer le rôle de la donnée ou du traitement. Des noms comme sommeNotes, nombreEtudiants ou calculerMoyenne rendent le programme plus compréhensible que s, n1 ou f.

À éviter

Préférer

Raison

x

nombreEtudiants

Le rôle est immédiatement visible

t

notes

Le contenu du tableau est identifié

f()

calculerMoyenne()

L’action de la fonction est explicite

b

estAdmis

Le nom exprime une valeur booléenne

18.4.2 Indenter correctement

L’indentation montre la structure des blocs et facilite la détection d’une condition ou d’une boucle mal placée. Elle est obligatoire en Python et fortement recommandée en C et en Java.

Structure lisible

if moyenne >= 10:
     print("Admis")
     if moyenne >= 16:
         print("Très bien")
else:
     print("Ajourné")

18.4.3 Éviter les répétitions

Lorsqu’un même traitement apparaît plusieurs fois, il doit souvent être placé dans une fonction ou une boucle. Cette factorisation réduit les erreurs et simplifie les modifications futures.

Répétition observée

Amélioration possible

Même formule copiée dans plusieurs endroits

Créer une fonction

Même saisie répétée cinq fois

Utiliser une boucle

Même contrôle pour plusieurs valeurs

Créer une fonction de validation

Même message construit manuellement

Créer une fonction d’affichage

18.4.4 Ajouter des commentaires utiles

Un commentaire explique une intention, une règle métier ou une décision non évidente. Il ne doit pas paraphraser chaque instruction. Un code bien nommé nécessite moins de commentaires descriptifs.

Exemples

# Correct : explique le choix
# On ignore la première ligne car elle contient les en-têtes du fichier.

# Peu utile : répète le code
compteur += 1  # Ajouter 1 à compteur

18.4.5 Créer des fonctions courtes

Une fonction devrait réaliser une responsabilité principale : lire une valeur valide, calculer une moyenne, rechercher un étudiant ou afficher un résultat. Les fonctions courtes sont plus faciles à comprendre, réutiliser et tester.

Signe de décomposition : Une fonction longue contenant lecture, validation, calcul, tri, affichage et sauvegarde doit généralement être décomposée en plusieurs fonctions spécialisées.

18.4.6 Vérifier les entrées

Les entrées externes ne doivent jamais être supposées correctes. Le programme doit vérifier le type, l’intervalle, la présence d’une valeur, le format et les contraintes du problème.

Entrée

Contrôles possibles

Note

Nombre compris entre 0 et 20

Âge

Entier positif dans une plage plausible

Identifiant

Non vide, longueur et caractères autorisés

Diviseur

Nombre différent de zéro

Indice

Compris entre 0 et taille - 1

18.4.7 Traiter les cas particuliers

Les cas particuliers doivent être définis dès l’algorithme : tableau vide, division par zéro, valeur absente, taille négative, dépassement de capacité ou résultat impossible. Le programme doit afficher un message clair, retourner une valeur prévue ou utiliser un mécanisme d’erreur adapté.

Distinction : Un cas particulier n’est pas nécessairement une erreur. Un tableau vide peut être autorisé, mais le résultat attendu doit être défini explicitement.

18.4.8 Cohérence du style

Un projet doit adopter des conventions cohérentes pour les noms, les espaces, les accolades, les commentaires et l’organisation des fichiers. Cette régularité améliore la lecture collective et facilite les outils automatiques de formatage et d’analyse.

Élément

Exemple de convention cohérente

Variables Python

snake_case : nombre_etudiants

Méthodes Java

camelCase : calculerMoyenne

Constantes

Majuscules : NOTE_MAXIMALE

Fonctions

Verbe indiquant l’action : rechercherEtudiant

Applications guidées

Application 1 — Maximum de deux nombres

Le pseudo-code est traduit en conservant la même condition et la même valeur de sortie.

Pseudo-code

Lire(a, b)
Si a > b Alors
     maximum ← a
Sinon
     maximum ← b
FinSi
Écrire(maximum)

Python

a = float(input("a : "))
b = float(input("b : "))
maximum = a if a > b else b
print("Maximum :", maximum)

Application 2 — Somme des nombres de 1 à N

Pseudo-code

Lire(N)
somme ← 0
Pour i allant de 1 à N Faire
     somme ← somme + i
FinPour
Écrire(somme)

Traduction C

# C
int n, somme = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
     somme += i;
}
printf("%d\n", somme);

La borne i <= n traduit le fait que N est inclus dans le pseudo-code. Remplacer cette condition par i < n omettrait la dernière valeur.

Application 3 — Rechercher une valeur dans un tableau

Pseudo-code

Fonction Rechercher(T, n, valeur) : Entier
     Pour i allant de 0 à n - 1 Faire
         Si T[i] = valeur Alors
            Retourner i
         FinSi
     FinPour
     Retourner -1
FinFonction

Traduction Java

static int rechercher(int[] tableau, int valeur) {
     for (int i = 0; i < tableau.length; i++) {
         if (tableau[i] == valeur) {
            return i;
         }
     }
     return -1;
}

Application 4 — Calculer une moyenne

Version Python concise et contrôlée

def calculer_moyenne(notes: list[float]) -> float:
     if not notes:
         raise ValueError("La liste des notes est vide")
     return sum(notes) / len(notes)

Le cas de la liste vide est traité avant la division. Selon le cahier des charges, on pourrait retourner 0, afficher un message ou signaler une erreur. Le choix doit être explicite.

Application 5 — Menu répétitif

Pseudo-code

Répéter
     Écrire("1. Ajouter")
     Écrire("2. Afficher")
     Écrire("0. Quitter")
     Lire(choix)
     Selon choix Faire
         Cas 1 : Ajouter()
         Cas 2 : Afficher()
         Cas 0 : Écrire("Fin")
         Sinon : Écrire("Choix invalide")
     FinSelon
Jusqu’à choix = 0

Traduction Python

while True:
     print("1. Ajouter\n2. Afficher\n0. Quitter")
     choix = input("Choix : ")
     if choix == "1":
         ajouter()
     elif choix == "2":
         afficher()
     elif choix == "0":
         print("Fin")
         break
     else:
         print("Choix invalide")

Travaux dirigés

Pour chaque exercice, écrire d’abord ou vérifier le pseudo-code, puis proposer une traduction dans le langage demandé. Préparer au moins trois jeux d’essai.

Exercice 1 — Correspondances

Traduire en Python, C et Java : x ← 5 ; y ← x × 2 ; Écrire(y).

Exercice 2 — Condition

Traduire un algorithme qui indique si un entier est pair ou impair.

Exercice 3 — Intervalle

Écrire un programme qui vérifie qu’un âge est compris entre 18 et 65.

Exercice 4 — Boucle Pour

Traduire l’affichage des nombres de 1 à N dans le langage de votre choix.

Exercice 5 — Validation

Demander une note jusqu’à ce qu’elle appartienne à [0, 20].

Exercice 6 — Tableau

Lire cinq entiers, calculer leur somme et afficher le maximum.

Exercice 7 — Fonction

Traduire une fonction qui retourne le carré d’un réel.

Exercice 8 — Recherche

Écrire une fonction qui retourne vrai si une valeur est présente dans un tableau.

Exercice 9 — Débogage

Corriger : if note = 10 print("Moyenne") en expliquant les erreurs.

Exercice 10 — Cas particulier

Écrire une fonction de moyenne qui traite explicitement le tableau vide.

Exercice 11 — Modularité

Décomposer un programme de gestion de notes en fonctions : saisie, validation, moyenne et affichage.

Exercice 12 — Comparaison de langages

Traduire le même algorithme de maximum en Python, C et Java, puis comparer les différences de syntaxe.

Corrigés indicatifs des travaux dirigés

Exercice 1

Python :
x = 5
y = x * 2
print(y)

C :
int x = 5;
int y = x * 2;
printf("%d
", y);

Java :
int x = 5;
int y = x * 2;
System.out.println(y);

Exercice 2

Exemple Python

nombre = int(input("Entier : "))
if nombre % 2 == 0:
     print("Pair")
else:
     print("Impair")

Exercice 3

La condition est age >= 18 ET age <= 65. En Python : 18 <= age <= 65. En C ou Java : age >= 18 && age <= 65.

Exercice 4

Python : la borne supérieure de range est exclue

for i in range(1, n + 1):
     print(i)

Exercice 5

while True:
     try:
         note = float(input("Note : "))
         if 0 <= note <= 20:
            break
     except ValueError:
         pass
     print("Saisie invalide")

Exercice 6

Initialiser somme à 0 et maximum avec la première valeur. Parcourir les cinq cases, ajouter chaque valeur à somme et mettre à jour maximum lorsqu’une valeur plus grande est rencontrée.

Exercice 7

Python

def carre(x: float) -> float:
     return x * x

Exercice 8

Python

def contient(tableau: list[int], valeur: int) -> bool:
     for element in tableau:
         if element == valeur:
            return True
     return False

Exercice 9

Il faut utiliser == pour la comparaison, ajouter les deux-points en Python et indenter le corps : if note == 10: puis print("Moyenne"). Le symbole = réalise une affectation.

Exercice 10

def moyenne(valeurs: list[float]) -> float:
     if len(valeurs) == 0:
         raise ValueError("Aucune valeur")
     return sum(valeurs) / len(valeurs)

Exercice 11

Une décomposition possible comprend lire_note_valide(), saisir_notes(), calculer_moyenne(notes) et afficher_resultat(moyenne). La fonction principale coordonne ces modules sans contenir tous les détails.

Exercice 12

La logique est identique dans les trois langages. Python est plus concis et utilise l’indentation. C déclare les types, utilise des accolades et une fonction main. Java ajoute une classe, une méthode main et des types statiques, avec une gestion automatique de la mémoire.

Synthèse du chapitre

Notion

Idée essentielle

Algorithme

Description logique et indépendante d’un langage.

Programme

Traduction exécutable respectant la syntaxe d’un langage.

Variable et type

Le type doit être compatible avec les valeurs et les opérations.

Entrée-sortie

La saisie nécessite souvent une conversion et une validation.

Affectation

Le symbole ← devient généralement = ; la comparaison utilise souvent ==.

Condition

La logique est conservée, mais les opérateurs et les blocs changent.

Boucle

Les bornes et la condition d’arrêt doivent être traduites avec précision.

Tableau

Les indices sont généralement compris entre 0 et taille - 1.

Fonction

Les paramètres, le type retourné et les cas particuliers doivent être définis.

Méthode

Concevoir, vérifier, traduire, exécuter, tester et corriger.

Qualité

Lisibilité, modularité, validation et cohérence complètent la correction.

Principe final : Une traduction réussie préserve la logique de l’algorithme, respecte les règles du langage et produit un programme vérifié par des jeux d’essai représentatifs.

Glossaire

Terme

Définition

Syntaxe

Règles d’écriture imposées par un langage.

Compilation

Transformation du code source avant son exécution.

Interprétation

Exécution du programme par un interpréteur ou un environnement dynamique.

Typage statique

Types vérifiés principalement avant l’exécution.

Typage dynamique

Types associés aux valeurs et vérifiés principalement pendant l’exécution.

Bibliothèque

Ensemble de fonctions et de classes réutilisables.

Débogage

Recherche et correction méthodique des erreurs.

Exception

Mécanisme signalant une situation anormale pendant l’exécution.

Régression

Erreur réintroduite dans une fonctionnalité auparavant correcte.

Convention de code

Règles communes de nommage et de mise en forme.

Auto-évaluation

Cochez les affirmations que vous êtes capable de réaliser sans aide :

Compétence

Je sais distinguer un algorithme d’un programme.

Je sais traduire une déclaration de variable et une affectation.

Je sais réaliser une lecture, une conversion et un affichage.

Je sais traduire une condition avec des opérateurs logiques.

Je sais traduire une boucle Pour et une boucle TantQue.

Je sais manipuler un tableau sans dépasser ses limites.

Je sais écrire et appeler une fonction simple.

Je peux expliquer les différences générales entre Python, C et Java.

Je sais vérifier un pseudo-code avant de programmer.

Je sais préparer des cas normaux, limites et incorrects.

Je sais utiliser les messages d’erreur pour déboguer.

Je sais améliorer les noms, l’indentation et la modularité d’un programme.

Conseil final : Commencer par une version simple et correcte. Ajouter ensuite la validation, les cas particuliers et les améliorations de structure, en relançant les tests après chaque modification.