Aller au contenu
Télécharger l'application

Accueil › MP2I › Informatique

MP2I · Informatique · semaine 3

Programmer en C

Le noyau du langage C exigible : types, tableaux statiques, pointeurs, structures, allocation dynamique avec malloc et free, compilation et fichiers d'interface. Typage faible et sûreté de la programmation.

Sommaire

Le cours

Résumé en cinq points

  1. Typage statique faible, passage par valeur : modification de l'appelant et retours multiples par pointeurs.
  2. Sur nn bits : non signé 00 à 2n−12^n - 1 (modulo 2n2^n), signé −2n−1-2^{n-1} à 2n−1−12^{n-1} - 1 (dépassement indéfini).
  3. Accès t[i] non vérifiés ; tableau en paramètre = adresse sans taille ; chaîne terminée par '\0'.
  4. Pile pour les locales, tas pour malloc avec sizeof ; un free par malloc ; case (i,j)(i, j) en i×p+ji \times p + j.
  5. Module : .h avec garde, .c, objets .o puis édition de liens ; assertions comme garde-fous.

Classiques et HP

Méthodes et approfondissements du chapitre · le statut est précisé pour MP2I.

Classiques et HP réservés

Prolongements et démonstrations de Informatique.

Essayer 7 jours gratuitement Sans engagement · cours, exercices et fiches complets

Fin de l'aperçu gratuit

Encore 17 parties de cours et 10 corrigés.

Essayer 7 jours gratuitement Sans engagement · cours, exercices et fiches complets

Méthodes et exercices

Exercices classiques corrigés

Rangés par thème, du plus simple au plus exigeant. Difficulté et durée indicatives.

Parcours de tableau 3

Exercice 1. Minimum et maximum ★

Application du cours · 10 min · Khôlle

Calculer à la fois le minimum et le maximum d'un tableau d'entiers non vide.

Voir l'indice

Technique simuler deux valeurs de retour par des pointeurs.

Voir le corrigé offert
  1. Idée : on initialise les deux résultats avec t[0], puis on compare chaque case suivante.
/* n >= 1, mini et maxi non NULL. Écrit le min et le max de t[0..n-1]. */
void minmax(int t[], int n, int* mini, int* maxi) {
    assert(n >= 1 && mini != NULL && maxi != NULL);
    *mini = t[0];
    *maxi = t[0];
    for (int i = 1; i < n; i = i + 1) {
        if (t[i] < *mini) *mini = t[i];
        if (t[i] > *maxi) *maxi = t[i];
    }
}
  1. Invariant au début du tour i : *mini et *maxi sont le minimum et le maximum de t[0..i − 1]. À la sortie, i = n.
  2. Coût : 2(n − 1) comparaisons. Appel : int a, b; puis minmax(t, n, &a, &b).

piège : Déclarer int* a sans l'initialiser et passer a. On écrit alors à une adresse quelconque.

Exercice 2. Renverser un tableau ★

Application du cours · 10 min · Khôlle

Renverser un tableau en place, sans tableau auxiliaire.

Voir le début du corrigé
  1. Idée : on échange les extrémités, puis on resserre.

La suite du corrigé dans Sup et Spé+ : essai gratuit 7 jours.

Exercice 5 ★★

Classiques de khôlle et concours · 15 min · Niveau écrit CCINP

Une matrice n × p de flottants est linéarisée par lignes. Renvoyer sa transposée, matrice p × n linéarisée.

Voir le début du corrigé
  1. Idée : la case (i, j) de m devient la case (j, i) de la transposée, dont les lignes ont n colonnes, donc d'indice j × n + i.

La suite du corrigé dans Sup et Spé+ : essai gratuit 7 jours.

Allocation mémoire 3

Exercice 3 ★★

Classiques de khôlle et concours · 15 min · Niveau écrit CCINP

Écrire concat qui renvoie une nouvelle chaîne formée de s1 suivie de s2, sans modifier ses arguments.

Voir le début du corrigé
  1. Idée : il faut n1 + n2 caractères plus la sentinelle. …

La suite du corrigé dans Sup et Spé+ : essai gratuit 7 jours.

Exercice 4 ★★

Classiques de khôlle et concours · 15 min · Khôlle

Trouver et corriger les trois erreurs de cette fonction, censée lire n entiers au clavier et les renvoyer dans un tableau.

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.

Exercice 7 ★★★

Approfondissement · 25 min · Niveau oral Mines

Tableau dynamique. La structure struct tabdyn_s, nommée tabdyn par typedef, a trois champs : int* donnees, int taille et int capacite, avec 1 ≤ capacité et taille ≤ capacité. Écrire l'ajout en fin avec doublement de la capacité, et justifier le choix du paramètre.

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.

Listes chaînées 1

Exercice 6 ★★

Classiques de khôlle et concours · 20 min · Niveau écrit CCINP

Retourner une liste chaînée en place, sans allouer de maillon, et renvoyer la nouvelle tête.

Voir le début du corrigé
  1. Idée : on détache le premier maillon de la partie restante et on l'accroche devant la partie déjà retournée.

La suite du corrigé dans Sup et Spé+ : essai gratuit 7 jours.

Compilation modulaire 1

Exercice 8 ★★

Classiques de khôlle et concours · 20 min · Niveau écrit CCINP

Organiser une pile d'entiers en module pile.h et pile.c, au-dessus du module de listes de la fiche, et donner les commandes de compilation.

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.

Arithmétique entière 1

Exercice 9 ★★

Classiques de khôlle et concours · 15 min · Niveau écrit Mines

Écrire une addition d'int32_t qui détecte le dépassement sans jamais le provoquer, avec les constantes INT32_MAX et INT32_MIN de stdint.h. Que vaut 200 + 100 rangé dans un uint8_t ?

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.

Programme et fichiers 1

Exercice 10 ★

Application du cours · 10 min · Khôlle, après rappel

Écrire un programme lancé par ./somme donnees.txt qui affiche la somme des entiers du fichier. On rappelle que fscanf renvoie le nombre de valeurs lues.

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.

Approfondissement hors programme 1

Exercice HP. Détection, entrée et cas terminé par NULL ★★★

Approfondissement hors programme

Approfondissement facultatif · hors programme en MP2I

On considère dix maillons distincts a0,…,a9a_0,\ldots,a_9, tous valides pendant l’exécution. La tête est a0a_0. Pour 0≤i<90\leq i<9, le suivant de aia_i est ai+1a_{i+1}, et le suivant de a9a_9 est a4a_4. Aucun pointeur n’est modifié pendant les parcours.

On applique l’algorithme suivant : lent et rapide partent de la tête ; tant que rapide et son suivant sont non NULL, lent avance d’un maillon et rapide de deux, puis leurs adresses sont comparées. À la première rencontre, un pointeur est replacé à la tête et l’autre reste sur place ; ils avancent ensuite chacun d’un maillon jusqu’à leur première égalité, en commençant par comparer leurs positions initiales.

  1. Déterminer la longueur μ\mu de la partie initiale et la longueur λ\lambda du cycle.
  2. Pour chaque instant tt de 1 jusqu’à la première rencontre, donner les positions des deux pointeurs. Justifier que la rencontre trouvée est la première.
  3. Détailler la deuxième phase et déterminer le maillon retourné.
  4. Compter les déplacements de pointeurs effectués par les deux phases, en comptant une avancée le long d’une arête comme un déplacement. On ne compte pas les lectures des tests ni le replacement à la tête.
  5. On remplace maintenant le suivant de a9a_9 par NULL, en conservant tous les autres suivants. Combien d’itérations la première phase effectue-t-elle ? Justifier l’absence de rencontre. Préciser également le résultat pour une tête NULL et pour un maillon unique dont le suivant est lui-même.

Corrigé détaillé dans Sup et Spé+ : essai gratuit 7 jours.