Breaking News

TD Langage C

Ce TD suppose acquis les concepts de base de la programmation tels que les notions de constantes, de types, de variables, de tableaux, de structures, de fichiers et de découpage en fonctions d’un programme. Il présente des notions plus complexes très utilisées en conception de programmes performants sur ordinateur.

TD Langage C: TD1.TD2.TD3



Structure d’un programme en langage C 
se nomme un « en-tête ». Elle précise que ce qui sera décrit à sa suite est en fait le programme principal (main). Lorsque nous aborderons l’écriture des fonctions en C, nous verrons que celles-ci possèdent également un tel en-tête ; ainsi, en C, le programme principal apparaîtra en fait comme une fonction dont le nom (main) est imposé. Le programme (principal) proprement dit vient à la suite de cet en-tête. Il est délimité par les accolades « { » et « } ». On dit que les instructions situées entre ces accolades forment un « bloc ». Ainsi peut-on dire que la fonction main est constituée d’un en-tête et d’un bloc ; il en ira de même pour toute fonction C. Notez qu’un bloc peut lui-même contenir d’autres blocs (c’est le cas de notre exemple). En revanche, nous verrons qu’une fonction ne peut jamais contenir d’autres fonctions.

Avant-propos 
Les algorithmes présentés sont écrits en C et souvent de manière complète, ce qui permet au lecteur de tester personnellement les programmes et de jouer avec pour en comprendre toutes les finesses. Jouer avec le programme signifie être en mesure de le comprendre, de faire des sorties intermédiaires pour vérifier ou expliciter certains points et éventuellement être en mesure de l’améliorer en fonction de l’application envisagée. Les programmes présentés font un minimum de contrôles de validité de façon à bien mettre en évidence l’essentiel des algorithmes. 

Les algorithmes pourraient facilement être réécrits dans tout autre langage autorisant la modularité, la récursivité et l’allocation dynamique. Le codage est secondaire ; par contre la définition des fonctions de base pour chaque type de structures de données est fondamentale. 

Chaque structure de données se traduit par la création d’un nouveau type (Liste, Nœud, Table, Graphe) et de son interface sous la forme d’un jeu de fonctions d’initialisation, d’ajout, de retrait, de parcours de la structure ou de fonctions plus spécifiques de la structure de données. Des menus de tests et de visualisation permettent de voir évoluer la structure. Ils donnent de plus des exemples de mise en œuvre des nouveaux types créés.

Pour lire des informations : la fonction scanf
est un appel de la fonction prédéfinie scanf dont le rôle est de lire une information au clavier. Comme printf, la fonction scanf possède en premier argument un format exprimé sous forme d’une chaîne de caractères, ici :

ce qui correspond à une valeur flottante (plus tard, nous verrons précisément sous quelle forme elle peut être fournie ; l’exemple d’exécution du programme vous en donne déjà une bonne idée !). Notez bien qu’ici, contrairement à ce qui se produisait pour printf, nous n’avons aucune raison de trouver, dans ce format, d’autres caractères que ceux qui servent à définir un code de format

En fait, la nature même du langage C fait qu’une telle notation reviendrait à transmettre à la fonction scanf la valeur de la variable x (laquelle, d’ailleurs, n’aurait pas encore reçu de valeur précise). Or, manifestement, la fonction scanf doit être en mesure de ranger la valeur qu’elle aura lue dans l’emplacement correspondant à cette variable, c’est-à-dire à son adresse. Effectivement, nous verrons que & est un opérateur signifiant adresse de. Notez bien que si, par mégarde, vous écrivez x au lieu de &x,

le compilateur ne détectera pas d’erreur. Au moment de l’exécution, scanf prendra l’information reçue en deuxième argument (valeur de x) pour une adresse à laquelle elle rangera la valeur lue. Cela signifie qu’on viendra tout simplement écraser un emplacement indéterminé de la mémoire ; les conséquences pourront alors être quelconques.