15 janvier 2023
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.
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
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 tuyaux qui interviennent dans un “pipeline” de commandes, en les ouvrant ou fermant ni trop tôt, ni trop tard. Tous en évitant les fuites de descripteurs, etc.
Document : pipeline
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
assert
;sur un exemple classique : quelques exercices sur les listes chaînées.
Document : methodo-c-tests-listes
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 , if for each letter occurring in , there exists non-trivial morphism such that the word obtained by erasing all the occurrences of in is a fixed point of , then there exists a non-trivial morphism such that is a fixed point of .
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
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
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
On montre comment
Exemples :
Document : additionneur-verilog
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
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.
qsort_r
qui est une extension GNU.qsort
, mais ça donne du code non réentrant.Document : calculs-elections.html
Dans de nombreux cours de programmation en C on demande aux élèves
Je montre comment
Document : bib-dynamique-linux.html
Sujet dans https://eduscol.education.fr/document/33193/download :
Document : corrige-22-NSI-07.html
Sujet dans https://eduscol.education.fr/document/33202/download :
Document : corrige-22-NSI-08.html
Sujet dans https://eduscol.education.fr/document/33193/download :
Document : corrige-22-NSI-06.html
Sujet dans https://eduscol.education.fr/document/33190/download :
Document : corrige-22-NSI-05.html
Sujet dans https://eduscol.education.fr/document/33187/download :
Document : corrige-22-NSI-04.html
Sujet dans https://eduscol.education.fr/document/33184/download :
Document : corrige-22-NSI-03.html
Janvier 2022.
Sujet dans https://eduscol.education.fr/document/33181/download :
Document : corrige-22-NSI-02.html
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
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
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.
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 Makefile
s qui vont avec.
Document : makefile-sous-projet.html
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
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 .
Document : enumeration-mots-dyck-en-c.html
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
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
-MMD
de gcc
évite d’avoir à le faire manuellement.Makefile
.Novembre 2021. On montre sur un exemple détaillé comment réaliser du polymorphisme en C
Le code suivant :
Animal * animals[] = {"Medor"),
(Animal *) new_Dog("Yellow"),
(Animal *) new_Fish("Rex")
(Animal *) new_Dog(
};
for (int i = 0; i < 3; i++) {
Animal_Talk(animals[i]);"the kibbles"); // croquettes
Animal_Feed(animals[i], }
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
Novembre 2021. Cette note explique en détail un algorithme classique pour passer d’une permutation, par exemple à la suivante dans l’ordre lexicographique .
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
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
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
Document : reseau-local.html
Document : routage.html
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
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
Le strict minimum, pour les débutants.
Document : bases-markdown.html