Programmation en C: Examen intermédiaire

A la station César-Roux à Lausanne, on mesure la concentration de plusieurs polluants chimiques dans l'air. Dans cet examen, on travaille avec les mesures de NO2 (dioxyde d'azote) du 12 septembre 2019 à 10:30 au 10 octobre 2019 à 10:30 (28 jours).

Préparation

Télécharge les fichiers suivants, et enregistre-les dans le même répertoire:

Le fichier lausanne-no2 contient 9964 mesures. Chaque mesure comporte deux valeurs:

Les mesures sont triés par temps.

Il n'est pas nécessaire de modifier la fonction lireFichier dans les fichiers exercicei.c.

Le temps en millisecondes

En informatique, on exprime le temps souvent en millisecondes depuis le 1er janvier 1970 à 00:00 (UTC), car les calculs sont particulièrement simples. On utilise des entiers 64 bits.

Pour les calculs, les constantes suivantes sont utiles:

			int64_t SECONDE = 1000;
			int64_t MINUTE = 60 * SECONDE;
			int64_t HEURE = 60 * MINUTE;
			int64_t JOUR = 24 * HEURE;
		

Avec printf, il faut utiliser %ld:

			printf("Temps: %ld\n", temps);
		

L'heure du jour en millisecondes depuis minuit peut être calculée comme suit:

Minuit
			int64_t msDepuisMinuit = (temps + 2 * HEURE) % JOUR;
		

Les deux heures correspondent à notre décalage horaire par rapport à UTC. L'opérateur % calcule le modulo (reste de la division entière).

Temps en millisecondes Date Date UTC

Exercice 1: Les trous
15 points

Le capteur envoie une mesure toutes les 4 minutes environ. Par contre, il y a quelques trous dans les données, où le capteur a raté une mesure, ou était en panne.

A. Nombre de trous

Compte et affiche le nombre de trous de plus de 10 minutes.

B. Le trou le plus long

Cherche le trou le plus long, et affiche sa longueur en heures, minutes, secondes, et millisecondes.

Vérification

Il y a 17 trous.
Le plus grand trou fait 1 h, 47 min, 50 s, et 966 ms.
#load solutions/trou.c

Exercice 2: Les concentrations les plus élevées
15 points

Cherche les 10 concentrations les plus élevées, et affiche-les avec deux chiffres après la virgule. L'ordre n'est pas important.

Vérification

113.78 ug/m3
114.94 ug/m3
116.14 ug/m3
120.21 ug/m3
121.01 ug/m3
123.83 ug/m3
130.54 ug/m3
135.96 ug/m3
184.22 ug/m3
242.88 ug/m3
#load solutions/maximum10-enlever.c
#load solutions/maximum10-insertion.c
#load solutions/maximum10-compter.c
#load solutions/maximum10-code.c
#load solutions/maximum10-tri.c
#load solutions/maximum10-qsort.c

Exercice 3: Moyennes par jours
35 points

On aimerait calculer les concentrations moyennes de chaque jour. Mais puisque le temps entre deux mesures varie, on doit tenir compte de la largeur d'une mesure. On calcule la moyenne selon le schéma suivant:

Calcul de la moyenne

Chaque mesure résulte en un rectangle de hauteur no2 et de largeur b - a. a se trouve au milieu des mesures i et i - 1, tandis que b est au milieu des mesures i et i + 1. Pour calculer la moyenne, on additionne l'aire de ces rectangles, et divise par le temps total (la largeur cumulée).

Lorsqu'il y a un trou de plus de 10 minutes, on étend les rectangles avant et après de 5 minutes maximum. Le premier et le dernier rectangle du jour sont coupés à minuit.

Calcule la moyenne de chaque jour — de minuit à minuit. Affiche pour chaque jour:

Vérification

JOUR           DEBUT      MOYENNE    TROUS
   0   1568239200000     50.15094    37677
   1   1568325600000     44.56093        0
   2   1568412000000     35.35122        0
   3   1568498400000     37.05522        0
...

Toute la liste avec un diagramme ...

#load solutions/moyenne.c
#load solutions/moyenne-trapezes.c

Exercice 4: Concentrations par heure du jour
35 points

On s'intéresse aux concentrations par heure du jour. Pour chaque tranche de 15 minutes (96 tranches), détermine:

Affiche ces résultats sous forme d'un tableau, avec l'heure de début et l'heure de fin de chaque tranche horaire. Affiche ces heures au format HH h MM, avec deux chiffres pour les heures et les minutes.

Vérification

DE     A     NOMBRE  MOYENNE      MIN      MAX
00h00  00h15    111   23.485     0.02    75.38
00h15  00h30    109   21.773     0.45    88.64
00h30  00h45     96   21.526     0.15    90.80
00h45  01h00     96   18.433     0.13    61.09
01h00  01h15    112   16.862     0.04    52.71
01h15  01h30    111   17.620     0.40    56.26
...
23h45  24h00     99   24.016     0.09    86.05

Toute la liste avec un diagramme ...

#load solutions/histogramme.c

Rendre les fichiers

Rends le fichiers

sur Moodle.