Module ISUP-2019sept TD 3 – page 1/4
TD : Programmation en C — semaine 3
18 Octobre 2019
Objectif(s)
O Structure de donn´ees : les tableaux.
O D´eclaration et appel de fonctions.
Exercice 1 – Remise en forme
Note: Pour tous vos programmes, vous utiliserez le script run.sh pour compiler.
1. Afficher un triangle rectangle avec des ´etoiles ; vous demanderez `a l’utilisateur la hauteur. Par exemple avec une hauteur de 4 :
*
**
***
****
2. Mˆeme question avec un ´echiquier de taille8×8. Pour afficher des cases blanches et noires, vous pouvez utiliser le caract`ere Unicode correspondant, dans notre cas\u25A1pour une case blanche et\u25A0pour une noire.
Exercice 2 – Fonctions simples
Note : A partir de cet exercice, vous testerez chaque fonction que vous d´efinissez en r´ealisant un (ou plusieurs)` appel(s) `a celle-ci depuis la fonctionmaindu programme.
1. ´Ecrivez une fonctionplus 1qui prend en param`etre un entiernet retourne son successeur (toujours un entier).
2. ´Ecrivez une fonctionplus fqui prend en param`etre deux flottantsuetvet retourne le r´esultat deu+v.
3. On peut repr´esenter un polynˆome du second degr´eax2+bx+csous la forme d’un triplet de valeurs(a, b, c).
Ecrivez une fonction´ discriminantqui prend en param`etre trois valeurs enti`eres (a,b, etc) et retourne ∆, le discriminant de l’´equationax2+bx+c= 0tel que∆ =b2−4×a×c
4. ´Ecrivez une fonctionnb solutionsqui prend en param`etre trois valeurs enti`eres (a,b, etc) et retourne le nombre de solutions de l’´equationax2+bx+c= 0. Cette fonction devra utiliser la fonction d´efinie pr´ec´edemment.
5. ´Ecrivez une fonctionest solutionqui prend en param`etre trois valeurs enti`eres (a,b, etc), ainsi qu’une valeur xet retourne1sixest une solution deax2+bx+c= 0, et0sinon.
Exercice 3 – Fonctions r´ecursives
Attention : Toutes les fonctions r´ealis´ees dans cet exercice feront usage d’appels r´ecursifs, et ne devront par cons´equent contenir aucune instructionwhile(oufor) !
1. ´Ecrivez une fonctionsommetelle quesomme(n)retourne la somme des entiers de 1 `an.
Sorbonne Universit´e/Master d’Informatique/ISUP-2019sept 18 Octobre 2019
Module ISUP-2019sept TD 3 – page 2/4 2. ´Ecrivez une fonctionfactorielletelle quefactorielle(n)retourne la valeurn!.
On rappelle la d´efinition de la fonction factorielle : n! =
1 sin= 0 n×(n−1)! sinon
3. Que se passe-t-il si on appellefactorielle(-1)? Comment pourrions-nous y rem´edier ?
4. ´Ecrivez deux fonctions mutuellement r´ecursivespairetimpairqui s’appellent l’une l’autre pour d´eterminer si un entiernest pair ou impair.
5. ´Ecrivez la fonctionpgcdtelle quepgcd(a,b)retourne le PGCD deaetb. On rappelle queP GCD(a,0) =aet queP GCD(a, b) =P GCD(b, a mod b)1.
6. ´Ecrivez une fonctionfibonaccitelle quefibonacci(n)retourne le n-i`eme de la suite de Fibonacci. Contrai- rement `a un exercice semblable du TD pr´ec´edent, votre solution ne devra pas faire intervenir de boucle.
On rappelle la d´efinition de la suite de Fibonacci (not´eeF) :
Fn=
0 sin= 0 1 sin= 1 Fn−1+Fn−2 sinon
7. Observer empiriquement le temps de calcul asymptotique de votre fonction Fibonacci. En utilisant une fonction r´ecursive auxiliairefibonacci auxutilisant 3 arguments entiers, proposer une implantation de Fibonacci ayant un coˆut lin´eaire en la valeur de son entr´ee plutˆot qu’exponentiel.
8. Proposer une implantation de la fonction d’Ackermann. Cette fonction a deux arguments entiers et satisfait la relation de r´ecurrence :
A(m, n) =
n+ 1 sim= 0
A(m−1,1) sim >0∧n= 0 A(m−1,A(m, n−1)) sim >0∧n >0
Exercice 4 – Tableaux
Les questions suivantes portent sur la manipulation de tableaux de valeurs. En C, un tableau est d´eclar´e en indiquant le type des ´el´ements qu’il contient, son nom, et sa taille entre crochets. Par exemple, la ligne suivante g´en`ere un tableau d’entiers nomm´etab, de taille 10 :
int tab[10];
L’acc`es et la modification du contenu d’une case d’un tableau sont r´ealis´es de la fac¸on suivante : int v = tab[2]; // acces a la 2e case du tableau
tab[3] = 42; // modification de la valeur dans la 3e case du tableau Les indices peuvent ˆetre eux-mˆemes des variables :
tab[i] = tab[j]; // la j-ieme valeur de tab remplace sa i-ieme valeur
Attention :les indices d’un tableau commencent par l’indice 0 : ainsi, les indices d’un tableau de 10 cases vont de 0
`a 9. Prenez donc bien soin, pour ´eviter un comportement compl´etement impr´evisible (et faux) de vos programmes, `a ne jamais acc´eder `a une case en dehors de la taille limite du tableau.
Une fonctionfqui rec¸oit un tableau d’entiers en param`etre a la signature suivante : void f(int tab[]);
ou bien2
1. mod´etant le modulo, c’est `a dire le reste de la division euclidienne :a mod b=a−(babc ×b) 2. on verra dans les semaines suivantes la signification de l’´etoile
Sorbonne Universit´e/Master d’Informatique/ISUP-2019sept 18 Octobre 2019
Module ISUP-2019sept TD 3 – page 3/4 void f(int *tab);
1. ´Ecrivez une fonctionvoid init tab(int t[], int n)qui prend en param`etre un tableautet sa taillen, et demande `a l’utilisateur de saisir une `a une les valeurs `a mettre dans le tableau.
2. ´Ecrivez une fonctionint somme tab(int t[], int n)qui prend en param`etre un tableautet sa taillen, et calcule la somme des ´el´ements contenus dans le tableau.
3. En d´eduire la fonctionfloat moyenne tab(int t[], int n)qui calcule la moyenne des valeurs situ´ees dans le tableaut(de taillen).
4. ´Ecrivez la fonctionvoid minmax tab(int t[], int n)qui affiche la valeur minimale et la valeur maxi- male contenues dans un tableau de flottantst(de taillen).
5. ´Ecrivez la fonctionvoid copie tab(int t1[], int t2[], int n)qui copie le contenu du tableaut1 dans le tableaut2(tous deux de taillen).
6. En C, une chaˆıne de caract`ere est repr´esent´ee par un tableau de caract`eres (char[]). Dans ce langage, un tableau ne connaˆıt pas sa taille, et c’est pour cela que toutes les fonctions pr´ec´edentes prenaient en argument la taille du tableau), mais pour ce qui est des chaˆınes de caract`ere, c’est un peu diff´erent : elles terminent syst´ematiquement par un caract`ere de fin de chaˆıne (invisible), not´e ’\0’. Ce dernier est donc situ´e g´en´eralement dans la derni`ere case du tableau qui repr´esente la chaˆıne de caract`eres.
Sachant ceci, d´efinissez une fonctionint longueur chaine(char str[]) qui calcule la longueur d’une chaˆıne de caract`ere (sans compter le caract`ere de fin de chaˆıne).
Exercice 5 – Matrices
Il est possible de repr´esenter une matrice en C par l’interm´ediaire d’un tableau `a deux dimensions (autrement dit : un tableau de tableaux) :
int matrix[10][20]; // une matrice 10 * 20
Contrairement aux tableaux, la taille de la matrice devra ˆetre pr´ecis´ee dans la signature des fonctions concern´ees. Par exemple, la fonctiongrec¸oit une matricemd’entiers (de taille 10*20) en param`etre :
void g(int m[10][20]);
1. ´Ecrivez une fonction qui affiche une matrice3×3.
2. Vous disposez d’une matrice 3×3. Demandez `a l’utilisateur de la remplir de chiffres entre 1 et 9 (chaque chiffre devra apparaˆıtre une et une seule fois), puis v´erifiez si c’est un carr´e magique (les sommes des chiffres sur les lignes, les colonnes et les diagonales sont ´egales).
3. ´Ecrivez une fonction qui affiche une matrice5×5.
4. ´Ecrivez une fonction qui met dans toutes les cases d’une matrice5×5la mˆeme valeurn.
5. ´Ecrivez une fonction qui prend en param`etre une matrice 5×5 (initialis´ee avec des 0), et la remplit avec les valeurs d’un triangle de Pascal de5lignes3.
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
3. https://fr.wikipedia.org/wiki/Triangle_de_Pascal
Sorbonne Universit´e/Master d’Informatique/ISUP-2019sept 18 Octobre 2019
Module ISUP-2019sept TD 3 – page 4/4 Exercice 6 – Challenges
1. (facile)Robot Instructions:https://uva.onlinejudge.org/external/125/12503.pdf Aide :
— scanf fonctionne aussi pour lire une chaˆıne de caract`ere, mais on n’a pas `a mettre le symbole “&” derri`ere la variable dans ce cas :
char a[30]; // un tableau de caracteres assez grand
scanf("%s",a); // la chaine entree par l’utilisateur est placee dans a
— utilisez la fonctionstrcmpcontenue dans la biblioth`equestring.hpour comparer deux chaˆınes de ca- ract`eres, et surtout pas le “==” qui va comparer juste leurs adresses. Voir dans le manuel le fonctionnement de strcmp avec la commandeman 3 strcmp.
2. (difficile)Extend to Palindromes:https://uva.onlinejudge.org/external/114/11475.pdf
Sorbonne Universit´e/Master d’Informatique/ISUP-2019sept 18 Octobre 2019