Le robot avance dans un couloir. Écris une fonction qui détecte si les murs gauche et droit sont à peu près à la même distance (couloir centré) ou non.
Indices :
Calcule la moyenne des colonnes 0-1 (mur gauche) et 6-7 (mur droit)
Compare les deux moyennes : si la différence est < 100 mm, le robot est centré
Retourne -1 (décentré à gauche), 0 (centré), ou +1 (décentré à droite)
Indices :
Solution :
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
bool couloir_centre(uint16_t matrix[64])
{
/* Moyenne des colonnes 0-1 (gauche) et 6-7 (droite) */
uint32_t somme_gauche = 0, somme_droite = 0;
for (int ligne = 0; ligne < 8; ligne++) {
somme_gauche += matrix[ligne * 8 + 0];
somme_gauche += matrix[ligne * 8 + 1];
somme_droite += matrix[ligne * 8 + 6];
somme_droite += matrix[ligne * 8 + 7];
}
int moy_gauche = (int)(somme_gauche / 16);
int moy_droite = (int)(somme_droite / 16);
printf("Moyenne gauche : %d mm\n", moy_gauche);
printf("Moyenne droite : %d mm\n", moy_droite);
/* Tolérance de 10% de la moyenne globale, min 50 mm */
int diff = abs(moy_gauche - moy_droite);
int seuil = (moy_gauche + moy_droite) / 20;
if (seuil < 50) {
seuil = 50;
}
printf("Difference : %d mm, seuil : %d mm\n", diff, seuil);
return diff < seuil;
}
int main(void)
{
uint16_t matrix[64];
/* Cas 1 : couloir centré (murs à 500 mm des deux côtés) */
printf("\n=== Test couloir centré ===\n");
for (int i = 0; i < 64; i++) {
int col = i % 8;
if (col <= 1) {
matrix[i] = 500;
} else if (col >= 6) {
matrix[i] = 520;
} else {
matrix[i] = 2000;
}
}
printf("-> Robot %s\n",
couloir_centre(matrix) ? "CENTRÉ dans le couloir" : "DÉCENTRÉ");
/* Cas 2 : robot décentré (plus proche du mur droit) */
printf("\n=== Test robot décentré ===\n");
for (int i = 0; i < 64; i++) {
int col = i % 8;
if (col <= 1) {
matrix[i] = 800;
} else if (col >= 6) {
matrix[i] = 200;
} else {
matrix[i] = 2000;
}
}
printf("-> Robot %s\n",
couloir_centre(matrix) ? "CENTRÉ dans le couloir" : "DÉCENTRÉ");
return 0;
}