MP2I 2024-2025 Bases du Langage C (PDF)
Document Details
Uploaded by Deleted User
Gérard Rozsavolgyi
Tags
Summary
Ces notes fournissent un résumé des bases du langage C, y compris les structures de données et la programmation en C. Des exemples spécifiques sont inclus afin d’aider la compréhension des structures de données.
Full Transcript
MP2I — 2024 – 2025 Fiche Memo Bases du langage C- Gérard Rozsavolgyi Informatique MP2I Structures Déclaration de type : struct { ;...; Structures chainées };. Attention : struct fait p...
MP2I — 2024 – 2025 Fiche Memo Bases du langage C- Gérard Rozsavolgyi Informatique MP2I Structures Déclaration de type : struct { ;...; Structures chainées };. Attention : struct fait partie du nom du type. Son implémentation pile.c : — Initialisation désignée sur la pile : struct s = {. = ,...,. = }; #include "pile.h" — Allocation sur le tas : struct * p = malloc(sizeof(struct )); #include L’idée est de chainer des boites #include L’accès au champ s’écrit : s. pour une structure, p-> pour un poin- avec les contenus utiles et un poin- struct pil teur vers une structure. On peut désigner un type sous un nouveau nom avec la syntaxe teur vers la boîte suivante, le der- { typedef struct ;. nier pointeur s’arrêtant souvent sur int valeur; Attention ! NULL. struct pil *suivant; (Toutes sortes de chainages sont }; Par exemple, si l’on empile 42 et −5 : On peut également initialiser champ par champ la structure. Comme pour les implémentables…Cf TP5 et Cours.) pile *creer() autres types, on évitera de définir des variables non initalisées. Les structures { sont passées par valeur aux fonctions, elles sont donc recopiées. Ainsi, il faut p -5 42 NULL 1 fournir en argument un pointeur vers une structure pour pouvoir modifier une return NULL; } structure lors d’un appel de fonction. Sommet bool est_vide(const pile *p) struct Date { int jour, mois, annee}; Voici un exemple de de pile à com- { // création d'une date pléter en 3 fichiers, dont un fichier return p == NULL; struct Date aujourdhui = {.jour = 8,.mois = 10,.annee = 2024}; d’entête personnalisé pile.h : } // création d'un pointeur sur Date #ifndef PILE_H int sommet(pile *p) struct Date * pdate; #define PILE_H { (*pdate).jour = 1; if (est_vide(p)) (*pdate).mois = 1; #include { (*pdate).annee = 2025; // déclaration dans pile.c fprintf(stderr,"vide!"); // ou struct pil; exit(EXIT_FAILURE); pdate->jour = 1; typedef struct pil pile; } pdate->mois = 1; return p->valeur; pdate->annee = 2025; pile *creer(); } void saisir_date(struct Date *d) bool est_vide(const pile*); void push(pile **p, int valeur) { { printf("entrer jour\n"); void push(pile **, int); pile *nouveau = malloc(sizeof(pile)); scanf("%d", &d->jour); // A compléter printf("entrer mois\n"); int pop(pile **); nouveau->valeur = ? ; scanf("%d", &d->mois); nouveau->suivant = ? ; printf("entrer annee\n"); int sommet(pile *); *p = ? ; scanf("%d", &d->annee); } } void liberer_pile(pile* p); int pop(pile **p) void affiche_date(struct Date *d) #endif { { // A compléter printf("%d/%d/%d", d->jour, d->mois, d->annee); } } MP2I — 2024 – 2025 Fiche Memo Bases du langage C- Gérard Rozsavolgyi Informatique MP2I Et un petit main pour tester : Références pour aller plus loin — https://diveintosystems.org/book/ : explique en détail les bases du langage et son #include utilisation pour coder un OS ! void liberer_pile(pile *p) #include "pile.h" — gustedt.gitlabpages.inria.fr/modern-c/ : une référence complète sur la façon { int main() correcte de programmer en C. // A compléter { pile *p = creer(); // A compléter } return 0; } Pour compiler tout ça, on produit d’abord les fichiers objets d’extension.o avec gcc -c pile.c et gcc -c main.c, puis on compile le tout avec gcc -o main main.o pile.o. On peut également automatiser la compilation à l’aide d’un Makefile qui va spécifier les cibles (à gauche des :) et les dépendances (à droite) pour la compilation. # Variables CC = gcc # ou clang, compilateur CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined EXEC = main OBJS = pile.o main.o # Règle par défaut all: $(EXEC) # Compilation $(EXEC): $(OBJS) $(CC) $(CFLAGS) -o $(EXEC) $(OBJS) main.o: main.c pile.h $(CC) $(CFLAGS) -c main.c pile.o: pile.c pile.h $(CC) $(CFLAGS) -c pile.c # Nettoyage clean: rm -f $(OBJS)