Notes diverses

Michel Billaud (michel.billaud@laposte.net)

15 janvier 2023

1 Licence

Cette collection de notes est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France.

2 Un mini-shell en C

Début de réalisation d’un shell très rudimentaire en C, capable de lancer des commandes externes et quelques commandes internes.

L’accent est mis sur le découpage du programme en modules, l’utilisation de tests unitaires, etc.

Document : mini-shell

3 Réalisation d’un pipeline en C

La réalisation d’un mini-shell (interprète de commandes) est un projet classique de programmation système en C.

Dans sa version la plus simpliste, un shell est une boucle qui

La réalisation d’un tel programme n’est pas très compliquée.

Là où ça se gâte un peu, c’est si on veut exécuter des “pipelines” de commandes, c’est-à-dire plusieurs commandes dont la sortie standard est redirigée vers l’entrée de la suivante, comme dans

ls -l | grep -v ^d | more

La difficulté est essentiellement d’utiliser correctement les n1n-1 tuyaux qui interviennent dans un “pipeline” de nn commandes, en les ouvrant ou fermant ni trop tôt, ni trop tard. Tous en évitant les fuites de descripteurs, etc.

Document : pipeline

4 Méthodologie de la programmation, tests, langage C

Le langage C n’est pas jeune, a plein de défauts, et est souvent très mal enseigné, surtout au regard des enjeux actuels : produire du code qui n’a pas trop d’erreurs.

Pour cela, il convient de sensibiliser les débutants qui découvrent la programmation en C. Un point qui est très souvent négligé, c’est l’idée de tester systématiquement le code que l’on écrit.

Mieux :

Pour enseigner ça, il n’est pas utile de montrer un “framework de test” à des débutants. Les bibliothèques industrielles c’est très utile pour les professionnels, mais là on s’adresse à des débutants qui sont déjà largement perdus dans les bases de C. Quand ils les maîtriseront ils apprendront à s’en servir si jamais ils en ont besoin. Et ils apprendront d’autant plus vite qu’ils auront maîtrisé les bases de la programmation, sans être ralentis par l’apprentissage d’une usine à gaz.

Bref, ce document montre

sur un exemple classique : quelques exercices sur les listes chaînées.

Document : methodo-c-tests-listes

5 Conjecture sur les mots

Il y a très longtemps (vers 1988), je m’étais posé un petit problème, que je n’ai pas réussi à résoudre. Rien d’étonnant, c’était pas dans mon domaine, et je n’y ai travaillé que mollement. Donc j’ai laissé tomber rapidement, mais après avoir appelé à l’aide sur Usenet, qui ne manque pas de gens plus compétents.

Given a word ww, if for each letter xx occurring in ww, there exists non-trivial morphism fxf_x such that the word obtained by erasing all the occurrences of xx in xx is a fixed point of fxf_x, then there exists a non-trivial morphism ff such that ww is a fixed point of ff.

Et bon, surprise, on est en 2022, mais apparemment c’est toujours pas résolu, et il y a des gens qui publient sur le sujet.

Document : conjecture

6 Arbres binaires quasi-complets

Suite à un exercice présenté sur Twitter, on veut connaitre la taille du sous-arbre gauche d’un arbre binaire de recherche quasi-complet à N sommets.

Quasi-complet : tous les niveaux de l’arbre sont remplis à part (éventuellement) le dernier, qui est rempli à partir de la gauche.

Note: je garde le terme “complet” pour ceux qui sont complètement complets.

Document : arbres-binaires

7 Génération en Verilog

Dans un épisode précédent on a vu comment obtenir un additionneur 2 x 4 bits + retenues à partir de 4 additionneurs 2 x 1 bit + retenues, en les listant explicitement.

Avec l’instruction generate de Verilog, nous allons éviter de construire ce type de code grâce à une boucle de génération, au lieu de faire du copier-coller-modifier.

Document : géneration-verilog

8 Description structurelle d’un additionneur en Verilog

On montre comment

Exemples :

Document : additionneur-verilog

9 Vérifier le résultat des élections

Sur les réseaux sociaux, on trouve régulièrement des messages promouvant l’usage des machines à voter, ou du vote en ligne.

Pour faire bref, je suis contre les deux, mais ce n’est pas le point. L’objet de cette note c’est de réfuter l’affirmation à propos du vote “papier” :

Ok, on peut surveiller le vote et le dépouillement (en étant présent dans les bureaux) , mais pour la totalisation nationale, on ne peut pas faire faire confiance.

en montrant

sur l’exemple du premier tour de la présidentielle 2022.

Pour ça, on verra comment

Pourquoi Python ? Parce que c’est un langage de programmation

Document : calculs-elections.html

10 Permutation qui ordonne un tableau, en C

On veut trouver la permutation qui ordonne un tableau.

Exemple : pour le tableau

int array[9] = { 66, 11, 44, 22, 88, 55, 77, 99, 33};

la suite d’indices {1, 3, 8, 2, 5, 0, 6, 4, 7}

parce que array[1]=11, array[3]=22, array[8]=33, etc.

  1. C’est facile à faire avec qsort_r qui est une extension GNU.
  2. Un bricolage permet de le faire avec qsort, mais ça donne du code non réentrant.
  3. On montre comment adapter un algo de tri en fonction de tri “réentrante” paramétrée par une fonction de comparaison.

Document : calculs-elections.html

11 Bibliothèque dynamique sous Linux, CodeBlocks

Dans de nombreux cours de programmation en C on demande aux élèves

Je montre comment

Document : bib-dynamique-linux.html

12 Corrigé sujet 7 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33193/download :

Document : corrige-22-NSI-07.html

13 Corrigé sujet 7 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33202/download :

Document : corrige-22-NSI-08.html

14 Corrigé sujet 6 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33193/download :

Document : corrige-22-NSI-06.html

15 Corrigé sujet 5 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33190/download :

Document : corrige-22-NSI-05.html

16 Corrigé sujet 4 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33187/download :

Document : corrige-22-NSI-04.html

17 Corrigé sujet 3 épreuves pratiques NSI

Sujet dans https://eduscol.education.fr/document/33184/download :

Document : corrige-22-NSI-03.html

18 Corrigé second sujet épreuves pratiques NSI

Janvier 2022.

Sujet dans https://eduscol.education.fr/document/33181/download :

Document : corrige-22-NSI-02.html

19 Corrigé du premier sujet d’épreuves pratiques NSI

Le sujet se trouve sur la page https://eduscol.education.fr/2661/banque-des-epreuves-pratiques-de-specialite-nsi, dans https://eduscol.education.fr/document/33178/download

Questions :

Document : corrige-22-NSI-01.html

20 Configurer CodeBlocks

Sur le Web, certains cours recommandent aux débutants en C/C++ d’utiliser l’IDE CodeBlocks pour leurs premiers pas en C ou C++

Cette note n’est pas là pour critiquer ce choix, ni les cours en question - malgré le mal que j’en pense - mais pour aider à le configurer correctement pour débuter. Ici on montre comment faire pour que le compilateur

Document: configurer-codeblocks.html

21 Une vieille conjecture

Janvier 2022. Il y a très longtemps (vers 88 je crois) je m’étais posé une question que je n’avais pas résolue. Ce n’était pas du tout mon domaine, et ça me paraissait plus dur que prévu. Apparemment ça a intéressé des gens (combinatoire des mots) et c’est toujours une question ouverte.

Si vous voulez tenter votre chance…

Document: conjecture.html

Todo: insérer la biblio des articles qui en causent.

22 Makefiles pour un projet en C avec un sous-projet

Quand un projet atteint une certaine taille, il arrive qu’on puisse en isoler une “bibliothèque” (sous-projet) qu’on espère réutiliser dans d’autres projets. Ici on montre comment organiser et compiler un projet (en C) qui contient un sous-projet. Et surtout, on explique les Makefiles qui vont avec.

Document : makefile-sous-projet.html

23 Sockets IPv4 et IPv6 en C

Janvier 2022. Les cours de programmation réseau/C utilisent obstinément une vieille API, en ignorant complètement IPv6, et les améliorations apportées au langage C depuis sa première normalisation en 1989.

On essaie de faire un peu mieux.

Document : sockets-ipv6.html

24 “Lambdas” en C

Novembre 2021. Comment simuler des “lambdas” en C dans un programme d’énumération des mots de Dyck (systèmes de parenthèses bien formés), qui se base sur un algorithme récursif, fondé sur la grammaire SϵaSbSS \rightarrow \epsilon \| a S b S.

Document : enumeration-mots-dyck-en-c.html

25 “Factory” en C

Novembre 2021. On montre comment mettre en oeuvre en C le patron de conception “factory”, dans lequel une fonction est utilisée pour fabriquer des objets de types distincts.

Document : factory-en-c.html

C’est une continuation de celui sur le polymorphisme en C

26 À propos des Makefiles

Novembre 2021. Récupération de quelques notes d’explication sur l’utilisation des Makefiles sur des projets de petite taille en C. Ces notes ont été écrite pour un cours C/Système en 2018.

Documents

27 Polymorphisme en C

Novembre 2021. On montre sur un exemple détaillé comment réaliser du polymorphisme en C

Le code suivant :

    Animal * animals[] = {
        (Animal *) new_Dog("Medor"),
        (Animal *) new_Fish("Yellow"),
        (Animal *) new_Dog("Rex")
    };

    for (int i = 0; i < 3; i++) {
        Animal_Talk(animals[i]);
        Animal_Feed(animals[i], "the kibbles"); // croquettes
    }

exécute, lors des appels d’Animal_Talk et Animal_Feed, du code différent, qui dépend du type effectif (Dog ou Fish) des objets. C’est réalisé grâce à une “table de fonctions virtuelles” propres à chaque type.

Document : polymorphisme-en-c.html

28 Génération des permutations

Novembre 2021. Cette note explique en détail un algorithme classique pour passer d’une permutation, par exemple (3,5,2,4,1)(3, 5, 2, 4, 1) à la suivante dans l’ordre lexicographique (3,5,4,1,2)(3, 5, 4, 1, 2).

La technique présentée peut se généraliser à des énumérations d’autres types (note à venir).

Le code est fourni en Fortran 95 (ça m’amusait de l’apprendre, j’en étais resté à la version 77) et en C.

Document : permutation-suivante.html

29 Vi, comment s’en sortir ? (et l’utiliser un peu)

L’éditeur de textes vi est apparu en 1976, il est présent sur la majorité des systèmes Unix (vim, version améliorée). C’est parfois le seul éditeur installé au départ, et souvent l’éditeur de textes par défaut. On peut en préférer d’autres, mais il est important de savoir en sortir si on est tombé dedans, et de connaître quelques commandes de bases pour l’utiliser, même si on référerait autre chose.

Document : vi-utilisation-basique.html

30 Les tris

D’où viennent les idées sur les algorithmes de tri “naïfs” qu’on présente souvent aux débutants : tri par sélection, tri par insertion, tri à bulles ?

Document : idees-tris-naifs.html

31 Réseau

Document : reseau-local.html

Document : routage.html

32 Développer à partir des tests

Quand on programme, on se trompe souvent. Il est intéressant de prévoir des tests automatisés dès le début.

Illustration avec C.

Document : dev-tests-c.html

33 Exercices “somme et moyenne d’un tableau”

Exercices très simples qu’on donne souvent à écrire aux débutants. Le problème est qu’ils sont souvent mal posés, sur le plan pédagogique.

On présente une formulation de ces exercices (pour C), et on explique les problèmes courants avec les autres formulations.

Document : exo-somme-tableau.html

34 Bases markdown

Le strict minimum, pour les débutants.

Document : bases-markdown.html