C1 Premiers pas en langage C ¶
"The only way to learn a new programming language is by writing programs in it"
(in the C programming language 1978)
Cours¶
Attention
Ce diaporama ne vous donne que quelques points de repères lors de vos révisions. Il devrait être complété par la relecture attentive de vos propres notes de cours et par une révision approfondie des exercices.
Exemples du cours¶
Travaux dirigés¶
Travaux pratiques¶
Exercice 1 : Premières compilations¶
-
Lancer VS Code et dans le menu
Fichier > Ouvrir le dossier(raccourci Ctrl+K, Ctrl+O) ouvrir un répertoire de travail pour ce premier TP (par exemple~/LangageC/TP1).Note
Une bonne habitude de travail avec VS Code est d'ouvrir directement un répertoire de travail (celui à partir duquel les compilations seront faites).
-
Dans l'onglet extension (accessible via le raccourci clavier Ctrl+Shift+X), chercher "C" et installer "C/C++ IntelliSense, debugging, and code browsing.". Cette extension permet de bénéficier de la coloration syntaxique et de la détection des erreurs dans VS Code.
-
Pour chacun des trois programmes vus en cours et disponibles ci-dessus :
- Le copier dans VS Code et l'enregistrer (la coloration syntaxique devrait être visible).
-
Dans le terminal de VS Code, le compiler avec
gcc:Attention
On rappelle qu'il est très fortement recommandé de toujours compiler avec les options
-Wallet-Wextraet que l'option-opermet de spécifier un nom pour l'exécutable produit lors de la compilation. -
Lancer l'exécution.
Aide
Il faut spécifier le chemin vers l'exécutable, ici
./.
Exercice 2 : Premiers programmes¶
-
Écrire un programme qui affiche à l'écran
"Mon tout premier programme en C". -
Ajouter dans votre programme les déclarations des variables entières
avalant 2024 etbvalant 42. -
Faire afficher à l'écran la valeur de \(2024 \times 42\).
-
Écrire une instruction conditionnelle qui affiche dans le terminal
divisiblesi 2024 est divisible par 42 etnon divisiblesinon. -
Déclarer une variable entière
svalant 0. Écrire une boucle qui permet de calculer la somme des entiers compris entre 1 et 2024 et qui sont divisibles par 7 et par 13.
Vérifier votre réponse :
Exercice 3 : Quelques fonctions pour démarrer¶
Note
Pour chaque question, écrire le code de la fonction puis la tester dans le main en saisissant éventuellement les arguments au clavier à l'aide de scanf.
-
Écrire une fonction
aire_disquequi prend en argument un flottantret renvoie l'aire du disque de rayonr. On définira une constante flottantepide valeur3.14159qui sera utilisée dans le calcul. -
Écrire une fonction
valeur_absoluequi prend en argument un flottantxet renvoie sa valeur absolue.Aide
On rappelle que :
\(|x| = \left\{ \begin{array}{rl} -x & \mathrm{\ si\ } x<0 \\ x & \mathrm{\ sinon} \end{array}\right.\) -
Écrire une fonction
est_trianglequi prend en argument trois entiersa,betcet qui renvoietruesi ces trois entiers peuvent être les longueurs des trois côtés d'un triangle.Aide
Cela revient à vérifier que les trois entiers vérifient l'inégalité triangulaire ou encore que le plus grand des trois est inférieur à la somme des deux autres.
-
On considère le programme de calcul suivant :
- choisir un nombre entier
- ajouter 3 à ce nombre
- multiplier par le nombre choisi au départ
- soustraire 9
Écrire une fonction
calculqui prend en entrée le nombre choisi au départ et renvoie le résultat du programme de calcul. -
On appelle factorielle d'un entier \(n\) et on note \(n!\) le produit de cet entier par tous ceux qui le précèdent à l'exception de zéro. Et on convient d'autre part que \(0!=1\). Par exemple \(5! = 5 \times 4 \times 3 \times 2 \times 1 = 120\). Écrire une fonction
factoriellequi prend en argument un entiernet renvoie sa factorielle. -
Écrire une fonction
bissextilequi prend en argument un entieranneeet renvoietruesi cette année est bissextile etfalsesinon.Aide
Une année est bissextile si elle est divisible par 4 mais pas par 100 ou si elle est divisible par 400.
-
Écrire une fonction
maxintqui prend en argument deux entiersaetbet renvoie le maximum de ces deux entiers. -
Écrire une fonction
xorqui prend en argument deux booléensxetyet renvoietruesixouyest vrai mais pas les deux à la fois. -
Écrire une fonction qui prend en argument un entier et renvoie
truesi cet entier est divisible par 7 et qu'il se termine par 9.
Exercice 4 : Écrire quelques boucles¶
- Écrire une fonction prenant en entrée un entier
net qui affiche la table de multiplication de cet entier. - La coupe du monde de football se déroule tous les quatre ans et sa première édition date de 1930. D'autre part, à cause de la Seconde Guerre mondiale, la compétition n'a pas eu lieu en 1942 et en 1946. Écrire un programme qui liste toutes les années où la coupe du monde s'est déroulée de 1930 à nos jours. Compléter ce programme de façon à afficher le numéro de l'édition pour chaque année.
- Écrire une fonction prenant en entrée un entier \(n\) et renvoyant le plus petit entier \(k\) tel que \(2^k \geq n\).
- Écrire un programme permettant de calculer la somme suivante :
\(\displaystyle{\sum_{k=1}^{100} k^2}\).
Exercice 5 : Un peu de dessin¶
-
Écrire une fonction
carre_pleinprenant comme paramètre un entiercoteet un caractèrecaret permettant d'afficher un carré de côtécoterempli de caractèrescar. Par exemple,carre_plein(5, 'C')produit l'affichage suivant : -
Écrire une fonction
rectangle_creuxprenant trois paramètres : deux entierslargeuretlongueuret un caractèrecarpermettant d'afficher un rectangle creux de dimensionslargeursurlongueurdont la bordure est constituée de caractèrescar. Par exemplerectangle_creux(3, 7, '~')devrait produire l'affichage suivant : -
De la même façon, écrire une fonction
triangleprenant comme paramètre un entierhauteuret un caractèrecartelle quetriangle(6, '*')produise l'affichage suivant :
Exercice 6 : Puissance¶
- En supposant
nentier et positif, écrire une fonctionpuissance_positifqui prend en entrée un nombrexet un entiernet renvoie \(x^n\). -
Écrire une nouvelle fonction
puissancequi prend en argument un nombrexet un entiernet renvoie \(x^n\).Aide
Attention à bien traiter tous les cas possibles.
Exercice 7 : Nombres premiers¶
-
Écrire une fonction
racinequi prend en entrée un entiernpositif et renvoie le plus grand entierktel quek * k <= n. Par exemple,racine(9)renvoie 3 etracine(18)renvoie 4. -
Écrire une fonction qui prend en argument un nombre et renvoie
truelorsque ce nombre est premier etfalsesinon.Aide
On rappelle qu'un nombre est premier s'il possède exactement deux diviseurs : 1 et lui-même. On peut donc se contenter de tester si les entiers \(k\) compris entre 2 et la partie entière de \(\sqrt{n}\) inclus divisent \(n\) et utiliser la question 1.
-
Écrire une fonction
somme_premiersqui prend en entrée un entiernet calcule la somme des nombres premiers inférieurs ou égaux àn. Par exemplesomme_premiers(10)vaut2 + 3 + 5 + 7 = 17. -
Tester votre fonction en calculant
somme_premiers(10000):
Exercice 8 : Conjecture de Syracuse¶
La conjecture de Syracuse est l'hypothèse selon laquelle la suite \((u_n)_{n \in \mathbb{N}}\) définie par son premier terme \(u_0\) et la relation de récurrence :
\(u_{n+1} = \left\{ \begin{array}{ll} \dfrac{u_n}{2} & \mathrm{\ si\ } u_n \mathrm{\ est \ pair} \\ 3u_n+1 & \mathrm{\ sinon} \\ \end{array} \right.\)
atteint 1. Dans la suite de cet exercice, on supposera cette conjecture vérifiée (bien qu'elle n'ait pas été mathématiquement prouvée, la conjecture a été vérifiée numériquement pour tous les entiers jusqu'à \(2^{58}\)).
- Écrire la fonction
terme_suivantqui prend en argument un entier \(n\) et renvoie \(\dfrac{n}{2}\) si \(n\) est pair et \(3n+1\) sinon. -
Écrire une fonction
duree_volqui prend en argument un entier \(u_0\) et renvoie le plus petit entier \(n\) appelé durée de vol tel que \(u_n=1\). Par exempleduree_vol(7)doit renvoyer 16, en effet les termes successifs de la suite sont7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.
Tester votre fonction en calculant la durée de vol de 123456789 :
Vérifier votre réponse : -
Quelle est la plus grande durée de vol lorsque \(1 \leq u_0 \leq 10000\) ?
Vérifier votre réponse : -
Vérifier que cette durée de vol maximale est atteinte pour une seule valeur de \(u_0\), quelle est cette valeur ?
Vérifier votre réponse : -
L'altitude maximale est la valeur maximale atteinte par la suite de Syracuse. Écrire une fonction prenant \(u_0\) et renvoyant l'altitude maximale atteinte. Par exemple l'altitude maximale de \(u_0 = 7\) est \(52\) (voir les termes de cette suite à la question 2.).
-
Quelle est l'altitude maximale de \(9331\) ?
Vérifier votre réponse :
Exercice 9 : Simulation d'un lancer de dé¶
Au jeu des "petits chevaux", le joueur doit lancer un dé à six faces et obtenir 6 pour "sortir un de ses chevaux de l'écurie". On se demande en moyenne combien de coups il faut pour obtenir un 6 sur un lancer de dé.
-
Écrire une fonction
lancer_dequi ne prend aucun argument et renvoie un nombre choisi au hasard entre 1 et 6.Aide
- La fonction
rand()du langage C renvoie un entier aléatoire, entre 0 et le plus grand entier représentable. On peut ensuite utiliser un modulo pour se ramener dans un intervalle de longueur 6. - Une méthode possible d'initialisation du générateur de nombres aléatoires est d'utiliser le temps :
srand(time(NULL));disponible après#include <time.h>.
- La fonction
-
Écrire une fonction
obtenir6qui ne prend aucun argument et qui renvoie le nombre de lancers effectués pour obtenir une première fois 6. -
Calculer la moyenne du nombre de coups nécessaires pour obtenir un six pour un grand nombre de parties (par exemple 10000). Pouvez-vous retrouver ce résultat en utilisant vos connaissances en probabilités ?
Exercice 10 : Somme des éléments d'un tableau¶
-
Écrire une fonction
sommequi prend en argument un tableau ainsi que sa taille et renvoie la somme des éléments de ce tableau. -
Créer un tableau
carresde taille 100 et grâce à une boucle l'initialiser de façon à ce quecarres[i]=i*i. -
Calculer la somme des carrés des entiers de 1 à 100.
Exercice 11 : Appartient à un tableau¶
-
Écrire une fonction
appartientqui prend en argument un tableautab(et sa taillet) ainsi qu'un entiernet qui renvoietruesinest dans le tableautabetfalsesinon. -
En utilisant cette fonction et le tableau
carresde la fonction précédente, vérifier que 5041 est un carré parfait mais pas 6726.
Exercice 12 : Longueur d'une chaîne de caractères¶
Écrire une fonction my_strlen qui prend en argument une chaîne de caractères et renvoie sa longueur.
Aide
On rappelle qu'une chaîne de caractères en C se termine par le caractère nul '\0'.
Exercice 13 : Manipulation des chaînes de caractères¶
-
Écrire une fonction
retournequi prend en argument une chaîne de caractères et affiche cette chaîne écrite à l'envers. Par exempleretourne("Bonjour")affiche"ruojnoB". -
Écrire une fonction
palindromequi prend en argument une chaîne de caractères et renvoietruesi cette chaîne est un palindrome (c'est-à-dire qu'elle se lit indifféremment de gauche à droite ou de droite à gauche) etfalsesinon. Par exemplepalindrome("radar")renvoietrue.
Exercice 14 : Nombre parfait¶
Un nombre parfait est un entier positif égal à la somme de ses diviseurs stricts (c'est-à-dire autres que lui-même). Par exemple, 6 est un nombre parfait car \(6 = 3 + 2 + 1\).
- Écrire une fonction
parfaitqui renvoietruesi l'entier positif donné en argument est parfait etfalsesinon. - Utiliser cette fonction pour vérifier que \(8128\) est un nombre parfait mais pas \(2023\).
Exercice 15 : Triangle de Pascal¶
Écrire un programme qui prend en argument un entier \(1 \leq n \leq 10\) et affiche les \(n\) premières lignes du triangle de Pascal. Par exemple pascal(4) affiche :
Aide
- On rappelle que le coefficient situé ligne \(n\) et colonne \(k\) noté \(\displaystyle{\binom{n}{k}}\) se déduit de ceux de la ligne précédente grâce à la formule de Pascal : \(\displaystyle{\binom{n}{k} = \binom{n-1}{k-1} + \binom{n-1}{k}}\).
- On pourra utiliser deux tableaux, l'un représentant la ligne précédente et un second la ligne en cours de construction.
Exercice 16 : Tableau trié¶
Écrire une fonction est_trie qui prend en argument un tableau d'entiers (et sa taille) et renvoie true si ce tableau est trié (dans l'ordre croissant ou décroissant) et false sinon.
Aide
On pourra dans un premier temps s'aider de deux fonctions est_trie_croissant et est_trie_decroissant.
Exercice 17 : Nombre d'occurrences¶
-
Écrire une fonction
nb_occurrencesqui prend en argument un tableau d'entierstab(et sa taille) ainsi qu'un entiernet renvoie le nombre d'apparitions dendans le tableautab. Par exemple sitabest le tableau{2, 18, 7, 2, 11, 7, 4, 7, -1, 3}(de taille10) alorsnb_occurrences(tab,10,7)renvoie 3 etnb_occurrences(tab,10,13)renvoie 0. -
Écrire une fonction similaire
compte_caracterequi prend en argument une chaîne de caractèreschaineet un caractèrecaret compte le nombre d'apparitions decardanschaine. A-t-on besoin cette fois de passer en argument la taille de la chaîne ? Pourquoi ?
Exercice 18 : Affichage en zigzag¶
Écrire en C une fonction de signature void zigzag(char s[], int n) qui prend en argument une chaîne de caractères s et un entier n et affiche en zigzag et sur n lignes la chaîne de caractères s. Par exemple, l'affichage de "BONNE RENTREE AUX MP2I !" sur 4 lignes doit produire l'affichage suivant dans le terminal :
Aide
On pourra définir dans la fonction une matrice de caractères qu'on remplira correctement avec les lettres de la chaîne de caractères avant de l'afficher.
Exercice 19 : Tri par insertion¶
L'algorithme du tri par insertion permet de trier en place un tableau de taille \(n\). Le principe est de considérer qu'à l'étape \(i\), la partie du tableau située avant l'indice \(i\) est déjà triée et on insère l'élément situé à la position d'indice \(i\) à la bonne position dans cette partie. Pour réaliser cette insertion, on échange l'élément d'indice \(i\) avec son voisin de gauche tant qu'il lui est inférieur et que le début de liste n'est pas atteint.
Par exemple sur le tableau \(\{12, 10, 18, 11, 14\}\) et en délimitant la partie triée par le symbole \(\color{red}{|}\):
- Étape 0 : la partie située avant l'indice 0 est vide (donc déjà triée), on y insère le 12 : \(\{\textcolor{green}{12}, \textcolor{red}{|} 10, 18, 11, 14\}\)
- Étape 1 : on insère l'élément d'indice 1 dans la partie triée, pour cela on l'échange avec son voisin tant qu'il lui est inférieur (et que le début de la liste n'est pas atteint) :
- \(\{12, \textcolor{green}{10} \textcolor{red}{|} , 18, 11, 14\}\) échange car \(10<12\)
- \(\{\textcolor{green}{10}, 12 \textcolor{red}{|} , 18, 11, 14\}\) on s'arrête car le début de liste est atteint
- Étape 2 : on répète le processus avec l'élément d'indice 2 :
- \(\{10, 12 , \textcolor{green}{18} \textcolor{red}{|}, 11, 14\}\) aucun échange à réaliser car \(12<18\)
- Étape 3 : on répète le processus avec l'élément d'indice 3 :
- \(\{10, 12 , 18, \textcolor{green}{11}\textcolor{red}{|}, 14\}\) échange car \(11<18\)
- \(\{10, 12 , \textcolor{green}{11}, 18 \textcolor{red}{|}, 14\}\) échange car \(11<12\)
- \(\{10, \textcolor{green}{11}, 12 , 18 \textcolor{red}{|}, 14\}\) arrêt car \(11>10\)
- Étape 4 : on répète le processus avec l'élément d'indice 4 :
- \(\{10, 11, 12 , 18 , \textcolor{green}{14}\textcolor{red}{|}\}\) échange car \(14<18\)
- \(\{10, 11, 12 , \textcolor{green}{14}, 18 \textcolor{red}{|}\}\) arrêt car \(14>12\)
Le but de l'exercice est de programmer cet algorithme de tri en C.
-
Écrire une fonction
echangequi prend en argument un tableautab, deux entiersietjet qui échange les éléments d'indiceietjde ce tableau. On pourra dans un second temps passer aussi en argument la taille du tableau et vérifier queietjsont bien inférieurs à cette taille avant de procéder à l'échange. -
Écrire une fonction
inserequi prend en argument un tableautabet un indiceiet qui insère l'élément d'indiceià la bonne place dans la partie du tableau située avant l'indiceien supposant que cette partie est triée. On rappelle que cette insertion s'effectue en échangeant l'élément avec son voisin de gauche tant qu'il lui est inférieur et que le début du tableau n'est pas atteint.
Par exemple sitab={5,7,11,6,19,7}alors aprèsinsere(tab,3)tab={5,6,7,11,19,7}. -
Écrire une fonction
tri_insertionqui prend en argument un tableau et sa taille et le trie à l'aide de l'algorithme du tri par insertion.
Exercice 20 : Crible d'Ératosthène¶
On rappelle qu'un nombre premier est un entier naturel ayant exactement deux diviseurs : 1 et lui-même, ainsi 13 est premier mais pas 15. Le crible d'Ératosthène est un algorithme permettant de trouver tous les nombres premiers inférieurs ou égaux à un entier n donné.
Algorithme
- on crée un tableau de booléens
premiersde taillen+1; - on initialise le tableau à
truesaufpremiers[0]etpremiers[1]qui sont àfalsepuisque 0 et 1 ne sont pas premiers ; - on parcourt ce tableau : si
premiers[i]est àtrue, alors on met tous ses multiples (sauf lui-même) àfalse; - le parcours s'arrête dès que l'entier
iest supérieur à \(\sqrt{n}\).
-
Écrire en C une fonction
criblequi prend en paramètre un entiernet implémente cet algorithme. L'utiliser pour afficher les nombres premiers inférieurs à 100.Aide
Vous devriez obtenir :
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 -
Écrire en C une fonction
somme_premiersqui prend en argument un entierseuilet renvoie la somme de tous les nombres premiers inférieurs ou égaux àseuil. Par exemplesomme_premiers(100)renvoie1060.
Pour aller plus loin
Les élèves ayant fait la spécialité nsi ou connaissant un minimum le langage Python peuvent coder ce même algorithme en Python et comparer les temps de calcul dans les deux langages sur par exemple somme_premiers(5000000).
Humour d'informaticien¶
