EC-Prog_GL2020_blanc-Corrigé – Maths BTS
Retour aux ressources
Corrigés

EC-Prog_GL2020_blanc-Corrigé


INSTITUT UNIVERSITAIRE SIANTOU

Examen Blanc de Brevet de Technicien Supérieur - Session de juillet 2020

Filière : Génie Logiciel (GL) ; Durée : 4 heures ; crédit : 5

ÉPREUVE ÉCRITE DE PROGRAMMATION (GL16)

CORRECTION DÉTAILLÉE


PARTIE 1 : Programmation structurée (5 points)



1. Programme en C pour la gestion des notes


a) Programme complet avec lecture, calculs et affichage



#include <stdio.h>
#include <stdlib.h>

int main() {
int N, i;
float somme = 0, max, min, moyenne;

// Lecture du nombre d'élèves
printf("Entrez le nombre d'élèves : ");
scanf("%d", &N);

// Vérification que N est positif
if (N <= 0) {
printf("Le nombre d'élèves doit être positif.\n");
return 1;
}

// Déclaration du tableau POINTS
float POINTS[N];

// Lecture des points
for (i = 0; i < N; i++) {
printf("Entrez le point de l'élève %d : ", i + 1);
scanf("%f", &POINTS[i]);
}

// Initialisation des variables max et min avec la première valeur
max = POINTS[0];
min = POINTS[0];
somme = POINTS[0];

// Recherche du max, min et calcul de la somme
for (i = 1; i < N; i++) {
if (POINTS[i] > max) {
max = POINTS[i];
}
if (POINTS[i] < min) {
min = POINTS[i];
}
somme += POINTS[i];
}

// Calcul de la moyenne
moyenne = somme / N;

// Affichage des résultats
printf("\n=== RESULTATS ===\n");
printf("Note maximale : %.2f\n", max);
printf("Note minimale : %.2f\n", min);
printf("Moyenne des notes : %.2f\n", moyenne);

return 0;
}


b) Construction du tableau NOTES et graphique



#include <stdio.h>
#include <stdlib.h>

int main() {
// ... (code précédent pour la lecture et calculs de base)

// Déclaration et initialisation du tableau NOTES
int NOTES[7] = {0}; // Initialise tous les éléments à 0

// Remplissage du tableau NOTES
for (i = 0; i < N; i++) {
int note = (int)POINTS[i]; // Conversion en entier
if (note >= 0 && note <= 9) {
NOTES[0]++;
} else if (note >= 10 && note <= 19) {
NOTES[1]++;
} else if (note >= 20 && note <= 29) {
NOTES[2]++;
} else if (note >= 30 && note <= 39) {
NOTES[3]++;
} else if (note >= 40 && note <= 49) {
NOTES[4]++;
} else if (note >= 50 && note <= 59) {
NOTES[5]++;
} else if (note >= 60 && note <= 100) { // Supposons que 100 est le maximum
NOTES[6]++;
}
}

// Affichage du graphique de barreaux
printf("\n=== GRAPHIQUE DES NOTES ===\n");
printf("Légende: ### = 1 élève\n\n");

// Tableau des domaines de notes
char* domaines[7] = {
"0-9 ",
"10-19",
"20-29",
"30-39",
"40-49",
"50-59",
"60+ "
};

// Affichage vertical
printf("| Domaine | Nombre | Graphique\n");
printf("|---------|--------|----------\n");
for (i = 6; i >= 0; i--) {
printf("| %s | %3d | ", domaines[i], NOTES[i]);
for (int j = 0; j < NOTES[i]; j++) {
printf("###");
}
printf("\n");
}

return 0;
}

Explication : Le tableau NOTES[7] compte le nombre d’élèves dans chaque intervalle. Le graphique utilise ### pour chaque élève. L’affichage se fait verticalement pour une meilleure lisibilité.



PARTIE 2 : Programmation orientée objet (5 points)



Question de cours (1 point)


1. Qu’est-ce qu’une surcharge (overloading) ?

Surcharge (overloading) : Mécanisme permettant de définir plusieurs méthodes avec le même nom dans une même classe, mais avec des paramètres différents (type, nombre ou ordre). La surcharge est résolue à la compilation.


Exemple en Java :



public class Calcul {
public int addition(int a, int b) {
return a + b;
}
public double addition(double a, double b) {
return a + b;
}
public int addition(int a, int b, int c) {
return a + b + c;
}
}


2. Qu’est-ce qu’une redéfinition (overriding) ?

Redéfinition (overriding) : Mécanisme permettant à une classe fille de fournir une implémentation spécifique d’une méthode qui est déjà définie dans sa classe mère. La signature (nom et paramètres) doit être identique. La redéfinition est résolue à l’exécution (polymorphisme).


Exemple en Java :



class Animal {
public void faireDuBruit() {
System.out.println("L'animal fait du bruit");
}
}
class Chien extends Animal {
@Override
public void faireDuBruit() {
System.out.println("Le chien aboie");
}
}


Exercice 1 : Classes Bâtiment et Maison (4 points)



// Classe Bâtiment
class Batiment {
// Attribut
private String adresse;

// Constructeur par défaut
public Batiment() {
this.adresse = "Adresse inconnue";
}

// Constructeur avec paramètre
public Batiment(String adresse) {
this.adresse = adresse;
}

// Accesseur (getter) pour adresse
public String getAdresse() {
return adresse;
}

// Mutateur (setter) pour adresse
public void setAdresse(String adresse) {
this.adresse = adresse;
}

// Méthode toString
@Override
public String toString() {
return "Batiment [adresse = " + adresse + "]";
}
}

// Classe Maison qui hérite de Batiment
class Maison extends Batiment {
// Attribut spécifique
private int nbPieces;

// Constructeur par défaut
public Maison() {
super(); // Appel du constructeur de la classe mère
this.nbPieces = 0;
}

// Constructeur avec paramètres
public Maison(String adresse, int nbPieces) {
super(adresse); // Appel du constructeur de la classe mère
this.nbPieces = nbPieces;
}

// Accesseur pour nbPieces
public int getNbPieces() {
return nbPieces;
}

// Mutateur pour nbPieces
public void setNbPieces(int nbPieces) {
this.nbPieces = nbPieces;
}

// Redéfinition de la méthode toString
@Override
public String toString() {
return "Maison [adresse = " + getAdresse() + ", nbPieces = " + nbPieces + "]";
}
}

// Programme de test
public class TestBatimentMaison {
public static void main(String[] args) {
// Test de la classe Batiment
Batiment bat1 = new Batiment();
Batiment bat2 = new Batiment("123 Rue Principale");

System.out.println("=== Test Batiment ===");
System.out.println("Batiment 1: " + bat1.toString());
System.out.println("Batiment 2: " + bat2.toString());

// Modification de l'adresse
bat1.setAdresse("456 Avenue Secondaire");
System.out.println("Batiment 1 modifié: " + bat1.toString());

// Test de la classe Maison
Maison maison1 = new Maison();
Maison maison2 = new Maison("789 Boulevard Tertiaire", 5);

System.out.println("\n=== Test Maison ===");
System.out.println("Maison 1: " + maison1.toString());
System.out.println("Maison 2: " + maison2.toString());

// Modification des attributs
maison1.setAdresse("1010 Rue Quaternaire");
maison1.setNbPieces(3);
System.out.println("Maison 1 modifié: " + maison1.toString());

// Test du polymorphisme
Batiment batimentPoly = new Maison("1111 Rue Polymorphe", 4);
System.out.println("\n=== Test Polymorphisme ===");
System.out.println("Batiment polymorphique: " + batimentPoly.toString());
}
}

Explication : La classe Batiment a un attribut adresse et deux constructeurs. La classe Maison hérite de Batiment et ajoute l’attribut nbPieces. Les accesseurs et mutateurs permettent de lire et modifier les attributs. La méthode toString() est redéfinie dans Maison. Le programme de test montre l’instanciation, la modification et le polymorphisme.



PARTIE 3 : Programmation web (5 points)



1. Code HTML/CSS pour les figures


Hypothèse : Les figures (a), (b) et (c) semblent être des éléments HTML/CSS. Voici des exemples typiques.



Figure (a) – Boîte avec bordure et texte centré



<!DOCTYPE html>
<html>
<head>
<style>
.boite {
width: 300px;
padding: 20px;
border: 2px solid #333;
text-align: center;
margin: 20px;
}
</style>
</head>
<body>
<div class="boite">
<p>Ceci est une boîte avec bordure et texte centré.</p>
</div>
</body>
</html>


Figure (b) – Formulaire simple



<!DOCTYPE html>
<html>
<head>
<style>
.formulaire {
width: 400px;
padding: 20px;
border: 1px solid #ccc;
border-radius: 5px;
background-color: #f9f9f9;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="text"], input[type="email"] {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
button {
background-color: #4CAF50;
color: white;
padding: 10px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="formulaire">
<form>
<div class="form-group">
<label for="nom">Nom</label>
<input type="text" id="nom" name="nom">
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email">
</div>
<button type="submit">S'inscrire</button>
</form>
</div>
</body>
</html>


Figure (c) – Formulaire avec zone de texte



<!DOCTYPE html>
<html>
<head>
<style>
.formulaire-complet {
width: 400px;
padding: 25px;
border: 2px solid #7d3c98;
border-radius: 8px;
background-color: #f4ecf7;
margin: 20px;
}
h2 {
color: #7d3c98;
text-align: center;
margin-bottom: 20px;
}
.form-control {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
color: #555;
font-weight: bold;
}
input[type="text"], textarea {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-family: Arial, sans-serif;
}
textarea {
height: 100px;
resize: vertical;
}
.btn-submit {
background-color: #7d3c98;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
width: 100%;
font-size: 16px;
}
.btn-submit:hover {
background-color: #6c3483;
}
</style>
</head>
<body>
<div class="formulaire-complet">
<h2>Formulaire de contact</h2>
<form method="POST" action="traitement.php">
<div class="form-control">
<label for="nom">Nom complet</label>
<input type="text" id="nom" name="nom_complet" required>
</div>
<div class="form-control">
<label for="message">Message</label>
<textarea id="message" name="message_texte" placeholder="Votre message ici..." required></textarea>
</div>
<button type="submit" class="btn-submit">Envoyer le message</button>
</form>
</div>
</body>
</html>


2. Code PHP pour récupérer les données du formulaire



<?php
// Fichier: traitement.php

// Vérifier si le formulaire a été soumis
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Récupérer et sécuriser les données
$nom_complet = htmlspecialchars($_POST['nom_complet']);
$message_texte = htmlspecialchars($_POST['message_texte']);

// Vérifier si les champs ne sont pas vides
if (!empty($nom_complet) && !empty($message_texte)) {
// Afficher les données récupérées
echo "<!DOCTYPE html>";
echo "<html lang='fr'>";
echo "<head>";
echo "<meta charset='UTF-8'>";
echo "<title>Confirmation de réception</title>";
echo "<style>";
echo " body { font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; background-color: #f4f4f4; }";
echo " .container { max-width: 600px; margin: auto; background: white; padding: 20px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }";
echo " h1 { color: #333; border-bottom: 2px solid #7d3c98; padding-bottom: 10px; }";
echo " .info { background-color: #f9f9f9; padding: 15px; border-left: 4px solid #7d3c98; margin: 15px 0; }";
echo " .label { font-weight: bold; color: #7d3c98; }";
echo "</style>";
echo "</head>";
echo "<body>";
echo "<div class='container'>";
echo "<h1>Confirmation de réception</h1>";
echo "<p>Merci pour votre message. Voici les informations que vous avez soumises :</p>";
echo "<div class='info'>";
echo "<p><span class='label'>Nom complet :</span> " . $nom_complet . "</p>";
echo "<p><span class='label'>Message :</span><br>" . nl2br($message_texte) . "</p>";
echo "</div>";
echo "<p>Nous traiterons votre demande dans les plus brefs délais.</p>";
echo "<p><a href='javascript:history.back()'>Retour au formulaire</a></p>";
echo "</div>";
echo "</body>";
echo "</html>";
} else {
echo "<div style='color: red; padding: 20px;'>";
echo "<h2>Erreur</h2>";
echo "<p>Tous les champs sont obligatoires. Veuillez remplir tous les champs du formulaire.</p>";
echo "<p><a href='javascript:history.back()'>Retour au formulaire</a></p>";
echo "</div>";
}
} else {
// Redirection si l'accès n'est pas via POST
header("Location: formulaire.html");
exit();
}
?>

Explication : htmlspecialchars() est utilisé pour sécuriser les données et éviter les injections XSS. nl2br() convertit les retours à la ligne en balises <br>. La méthode POST est vérifiée avec $_SERVER["REQUEST_METHOD"]. Une interface utilisateur conviviale est générée pour afficher les données.



PARTIE 4 : Programmation pour terminaux mobiles (5 points)



1. Exemples de versions d’Android



  • Android Cupcake (version 1.5)

  • Android Donut (version 1.6)

  • Android Eclair (version 2.0-2.1)

  • Android Froyo (version 2.2)

  • Android Gingerbread (version 2.3)

  • Android Honeycomb (version 3.0)

  • Android Ice Cream Sandwich (version 4.0)

  • Android Jelly Bean (version 4.1-4.3)

  • Android KitKat (version 4.4)

  • Android Lollipop (version 5.0)

  • Android Marshmallow (version 6.0)

  • Android Nougat (version 7.0)

  • Android Oreo (version 8.0)

  • Android Pie (version 9.0)

  • Android 10 (version 10.0)

  • Android 11 (version 11.0)



2. Commande CLI pour créer un nouveau component Angular



ng generate component nom-du-composant

ou



ng g c nom-du-composant

Options courantes :

-skip-import : Ne pas importer dans le module

-flat : Ne pas créer de dossier

-spec false : Ne pas créer de fichier de test

-inline-template : Inclure le template dans le fichier TypeScript

-inline-style : Inclure les styles dans le fichier TypeScript



3. Syntaxe pour afficher une variable TypeScript dans le template



// Dans le fichier TypeScript (component.ts)
export class MonComponent {
name = 'BTS';
}


<!-- Dans le template (component.html) -->
<p>Bonjour {{ name }}!</p>
<!-- Résultat affiché : Bonjour BTS ! -->


4. Syntaxe pour désactiver un bouton selon une condition



// Dans le fichier TypeScript
export class MonComponent {
authenticated = false;
}


<!-- Dans le template -->
<button [disabled]="!authenticated">Cliquez ici</button>
<!-- ou avec une condition plus complexe -->
<button [disabled]="authenticated == false">Cliquez ici</button>


5. Code pour afficher une liste de produits



// Dans le fichier TypeScript
export class ProductListComponent {
products = [
{ id: 1, name: 'Ordinateur portable', price: 1200 },
{ id: 2, name: 'Smartphone', price: 800 },
{ id: 3, name: 'Tablette', price: 500 },
{ id: 4, name: 'Casque audio', price: 150 },
{ id: 5, name: 'Clavier', price: 80 }
];
}


<!-- Dans le template HTML -->
<ul>
<li *ngFor="let product of products">
{{ product.name }} - {{ product.price }} €
</li>
</ul>

Résultat affiché :



Ordinateur portable - 1200 €
Smartphone - 800 €
Tablette - 500 €
Casque audio - 150 €
Clavier - 80 €

Variante avec un tableau plus élaboré :



<!-- Template avec mise en forme -->
<div *ngIf="products.length > 0; else noProducts">
<h3>Liste des produits ({{ products.length }})</h3>
<ul class="product-list">
<li *ngFor="let product of products; let i = index"
[class.even]="i % 2 == 0"
[class.odd]="i % 2 != 0">
<span class="product-id">#{{ product.id }}</span>
<span class="product-name">{{ product.name }}</span>
<span class="product-price">{{ product.price | currency:'EUR' }}</span>
</li>
</ul>
</div>
<ng-template #noProducts>
<p class="no-products">Aucun produit disponible.</p>
</ng-template>





Résumé du document



Ce document est la correction détaillée d’un examen blanc de BTS (session juillet 2020) en programmation (GL16) pour la filière Génie Logiciel. Il comporte quatre parties.



La Partie 1 (programmation structurée) donne un programme complet en C pour gérer les notes d’élèves (lecture, calcul du max, min, moyenne) puis construit un tableau NOTES par tranches et affiche un graphique avec le symbole ###. Les deux programmes sont fournis avec explications.



La Partie 2 (programmation orientée objet) répond aux questions de cours sur la surcharge et la redéfinition (avec exemples Java). L’exercice demande de créer les classes Bâtiment et Maison (héritage, constructeurs, accesseurs, toString) et un programme de test. Le code complet est présenté.



La Partie 3 (programmation web) propose le code HTML/CSS pour trois figures (boîte simple, formulaire simple, formulaire avec zone de texte) et le code PHP (traitement.php) pour récupérer les données du formulaire (avec sécurisation et affichage de confirmation).



La Partie 4 (programmation mobile) liste seize versions d’Android avec leurs noms, donne la commande Angular pour créer un composant, montre comment afficher une variable TypeScript, désactiver un bouton conditionnellement, et afficher une liste de produits avec *ngFor.



Chaque section est accompagnée de commentaires explicatifs.


Pour plus de détails, consulter le PDF ci-joint.
Discuter sur le forum
Lien copié !