• Aucun résultat trouvé

TD : Programmation en C — semaine 3

N/A
N/A
Protected

Academic year: 2022

Partager "TD : Programmation en C — semaine 3"

Copied!
4
0
0

Texte intégral

(1)

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

(2)

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

(3)

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

(4)

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

Références

Documents relatifs

Compl´eter le programme pour d´eterminer le nombre de caract`eres de chacun des mots contenus dans ce texte. D`es que la longueur d’un mot est connue, affichez en

Ecrire un programme C qui demande ` ´ a l’utilisateur d’indiquer s’il parle francais, anglais, italien ou une autre langue et r´epond :.. – ”Salut !” s’il parle

Syntaxe de l’adressage indirect par registre.- Comme nous l’avons d´ej` a vu, pour d´esigner une valeur constante on ´ecrit cette valeur (en hexad´ecimal), pour une valeur se

Syntaxe de l’adressage indirect par registre en langage symbolique.- Comme nous l’avons d´ej` a vu, en langage symbolique, pour d´esigner une constante on ´ecrit celle-ci

– ´ Ecrire une fonction Python rang de param`etre c permettant de calculer le rang du carac- t`ere c dans l’alphabet minuscule.. – ´ Ecrire un programme Python permettant

d'avoir une balle plongeante Service Apprentissage de la position de départ, prise de balle haute, prise raquette. 3 Defendre une zone Jeu au filet Attitude d'attention

imprime toutes les lignes contenant le mot analyse suivi du mot lexical dans tous les fichiers de suffixe .tex. (L’option -i

les classes de mots variables (déterminants, noms, adjectifs, pronoms, verbes) et les classes de mots invariables (adverbes, conjonctions,