• Aucun résultat trouvé

TP de programmation en C

N/A
N/A
Protected

Academic year: 2022

Partager "TP de programmation en C"

Copied!
22
0
0

Texte intégral

(1)

TP de programmation en C

J.-L. Bienvenu

Ecole Nationale Sup´erieure d’Electronique, Informatique et Radiocommunications de Bordeaux

(2)

1 Hello world!

Saisir le programme suivant:

int main() {

printf("Bonjour le monde") return EXIT_SUCCESS;

}

Compiler jusqu’`a ce qu’il n’y ait plus d’erreurs. Ajouter l’option -Wall `a la ligne de compilation.

Remplacerprintf parPrintf. En quoi l’erreur est-elle d’un type diff´erent ?

2 Entiers et tests

2.1 La formule de Zeller

La formule de Zeller (1885) permet de d´eterminer le jour j de la semaine `a partir de la date.

j = (E(2.6∗mois−0.2) +jour+annee+ (annee/4) + (siecle/4)−2∗siecle)modulo7 Avec :

mois : 1..12 (voir ci dessous)

annee : 0..99 (num´ero de l’ann´ee dans le si`ecle)

siecle : un de moins que la numerotation courante (soit : millesime/100) Remarque:

Le calendrier Gr´egorien, pour lequel cette formule est correcte, n’a ´et´e adopt´e qu’en 1582 par la plupart des pays europ´eens, mais l’Angleterre (d´ej`a !) a mis 170 ans de plus pour s’y mettre. Pour simplifier, le calcul ne sera fait qu’`a partir de 1753.

A l’´epoque de Zeller, l’ann´ee commen¸cait en mars et se finissait en f´evrier. Pour les mois de janvier et de f´evrier, il faut enlever 1 `a l’ann´ee.

-a- Ecrire un programmezeller contenant une fonctionzeller prenant pour argument le jour, le mois et l’ann´ee

(3)

-b- Placer votre fonctionmainentre commentaires, puis copier tous les fichiers du r´epertoire bienvenu/Public/E1/Ressources/Zeller Tapermake, puis ex´ecuter./Zeller.

2.2 Date de Pˆ aques

La fˆete chr´etienne de Pˆaques est c´el´ebr´ee le premier dimanche apr`es la pleine lune qui suit l’´equinoxe du printemps. Au plus tˆot, elle arrive le 22 mars et au plus tard, le 25 avril. Elle s’´etale sur une p´eriode de 35 jours. Le math´ematicien allemand Carl Friedrich Gauss (1777-1855) a imagin´e une formule permettant de trouver la date `a laquelle est c´el´ebr´ee la fˆete de Pˆaques pour une ann´ee donn´ee. Voici comment la calculer pour la p´eriode de 1900 `a 2099 dans le calendrier gr´egorien :

Soit m, l’ann´ee. On calcule successivement :

le reste de m dans la division par 19 : c’est la valeur de a.

le reste de m dans la division par 4 : c’est la valeur de b.

le reste de m dans la division par 7 : c’est la valeur de c.

le reste de (19a + 24) dans la division par 30 : c’est la valeur de d.

le reste de (2b + 4c + 6d + 5) dans la division par 7 : c’est la valeur de e.

La date de Pˆaques est le (22 + d + e) mars ou le (d + e - 9) avril.

Pour trouver la date de Pˆaques dans le calendrier julien, on remplace 24 par 15 `a l’´etape 4, et 5 par 6 `a l’´etape 5.

Voici deux exemples dans le calendrier gr´egorien :

En 1996, on trouve : a = 1, b = 0, c = 1, d = 13, e = 3. Pˆaques eut lieu le (13 + 3 - 9) = 7 avril.

En 2020, on trouve : a = 6, b = 0, c = 4, d = 18, e = 3. Pˆaques aura lieu le (18 + 3 - 9) = 12 avril.

Marcel Simard a d´ecouvert que la formule de Gauss am`ene deux erreurs entre 1900 et 2078. En 1954, Pˆaques eut lieu le 18 avril alors que la formule donne le 25 avril. En 1981, cette fˆete eut lieu le 19 avril alors que la formule pr´evoit le 26 avril. Dans certains cas quand mˆeme rares, la date de la pleine lune eccl´esiastique diff`ere l´eg`erement de la pleine lune astronomique.

T. H. O’Beirne, en s’inspirant des travaux de Gauss, a donn´e cette formule qui s’applique aussi aux ann´ees 1900

` a 2099.

Soit m l’ann´ee, on fait les calculs suivants :

On soustrait 1900 de m : c’est la valeur de n.

(4)

On divise n par 19 : le reste est la valeur de a.

On divise (7a + 1) par 19 : la partie enti`ere du quotient est b On divise (11a - b + 4) par 29 : le reste est c.

On divise n par 4 : la partie enti`ere du quotient est d.

On divise (n - c + d + 31) par 7 : le reste est e.

La date de Pˆaques est le (25 - c - e) avril si le r´esultat est positif. S’il est n´egatif, le mois est mars. Le quanti`eme est la somme de 31 et du r´esultat. Par exemple, si le r´esultat est -7, le quanti`eme est 31 + -7 = 24.

Ecrire un programme affichant la date de Pˆaques. (ici, il ne vous est pas demand´e d’´ecrire une fonction car il y a 2 r´esulats `a retourner).

2.3 Calcul

Ecrire une fonction ayant pour arguments 2 entiers et un op´erateur et retournant le r´esultat du calcul.

Objectifs :

• langage C : utilisation du type int; conversion des r´e´els; instruction if

• programmation :

d´ecoupage en fonctions.

une fonction est charg´ee de retourner un valeur et non de l’afficher.

3 La r´ ep´ etition, la r´ ecursivit´ e

3.1 puissance

Ecrire une fonction ayant pour argument 2 entier a et n et retournant an. (On pourra donner une version it´erative et une version r´ecursive).

Quel est le r´esultat de 233 ? pourquoi ?

3.2 PGCD

Ecrire une fonction calculant le pgcd avec l’algorithme d’Euclide. (On pourra donner une version it´erative et

(5)

3.3 suite de Fibonacci

Ecrire une fonction calculant le nieme terme de la suite de fibonacci.

Pourquoi la fonction r ˜A c#cursie ve st-elle si lente?

3.4 nombres parfaits

Un nombrenest parfait si et seulement si la somme de ses diviseurs est 2n

-a- Ecrire une fonction indiquant si un nombre est parfait.

-b- Rechercher les nombres parfaits inf´erieurs `a 15000.

-c- On a d´emontr´e que les nombres parfaits pairs ´etaient de la forme 2n1(2n−1). (l’existence de nombres parfaits impairs reste un probl`eme non r´esolu).

Quel est le plus grand nombre parfait que l’on puisse ´ecrire avec le type int , le type long, le type long long ?

3.5 Etoiles

Ecrire une proc´edure affichant un triangle d’´etoiles de taille n

3.6 Table de pythagore

Ecrire une proc´edure affichant la table de pythagore de la multiplication.

3.7 Racine carr´ ee

La m´ethode dite ”babylonienne” pour calculer la racine carr´ee d’un r´eelautilise la suiteud´efinie par : un+1=1

2(un+ a

un) etu0>0. On peut montrer queuconverge (rapidement) vers√ a.

- on pose : vn =un−√a un+√

a et on montre quevn+1=v2n, donc quevn =v20n. vconverge donc (rapidement) vers 0.

- En remarquant queun=√ a1 +vn

1−vn, on prouve queuconverge

Reste `a d´eterminer la condition d’arrˆet des it´erations. En principe, on choisitεet on arrˆete lorsque%un−√

a%< varepsilon , mais, ne connaissant pas√

a, cette m´ethode est inapplicable. En revanche, on peut remarquer que, si on pose δ=un−√

aet δ"= u2n−a

2un (pourquoi ?), alorsδ" =δ+ 0(δ2)

Ecrire une fonction calculant la racine carree d’un reel par la methode dite ”babylonienne”

(6)

3.8 Equation

Ecrire un programme r´ealisant la r´esolution d’une ´equation du second degr´e. (

3.9 Table de Pythagore

Ecrire une proc´edure affichant la table de Pythagore de la multiplication

3.10 Etoiles

Ecrire une proc´edure affichant un triangle d’etoiles de taille n

3.11 Racine carr´ ee

Ecrire une fonction racine calculant la racine carr´ee par cette m´ethode. (on utilisera le type long double ( format d’affichage :

Dans le fichier pr´ec´edent (racine.c), supprimer la fonction main et ajouter en tˆete:

#include "racine.h"

Cr´eer un fichierracine.h contenant

long double racine (long double);

Cr´eer un fichierequation.c pour r´esoudre une ´eqution du second degr´e en utilisant la fonctionracine.

3.12 Jeu

Ecrire un programme demandant a l’utilisateur de deviner en 10 coups au plus un entier entre 1 et 1000. A chaque essai, le programme indique si le nombre est trop petit ou trop grand (prevoir les erreurs de saisie)

3.13 Rendu de monnaie

Ecrire une fonction calculant le nombre de facons d’obtenir la somme de N euros avec des pieces de 1, 2 et 5 euros.

(7)

3.14 Les tours de Hano¨ı

Ecrire une proc´edureHanoi telle que l’appel deHanoi(n,a,b)affiche les d´eplacements n´ecessaires pour transferer ndisques de l’emplacementavers l’emplacementb.

4 Tableaux et structures

4.1 longueur d’une chaˆıne

Ecrire une fonction ayant pour argument une chaˆıne de caract`eres et retournant la longueur de cette chaˆıne.

(cette fonction existe et s’appellestrlen)

4.2 comparaison de chaˆınes

Ecrire une fonction ayant pour argument deux chaˆınes de caract`eres et retournant 0 si ces chaˆınes sont ´egales et la diff´erence des premiers caract`eres diff´erents sinon. (cette fonction existe et s’appellestrcmp)

4.3 saisie d’un tableau

Ecrire une fonction r´ealisant la saisie d’un tableau sur l’entr´ee standard. Celle-ci s’arrˆete si la taille du tableau est atteinte ou si l’entr´ee standard se termine. (comment ?)

4.4 Chaˆıne de chiffres

Ecrire une fonction ayant pour argument une chaˆıne de caract`eres form´ee de chiffres et retournant l’entier ainsi represent´e. Au cas ou l’entr´ee serait erron´ee, retourner 0 (cette fonction existe et s’appelleatoi) On peut aussi envisager le calcul dans une base quelconque.

4.5 Notion de taille d’un tableau

On consid`ere le programme suivant :

\#include <stdio.h>

void afficherTableau(int t[]) {

(8)

int i;

for (i=0;i<sizeof(t)/sizeof(int);i++) printf("%d\n",t|i]);

}

int main() {

int a[]={10,20,30,40,50};

printf("la taille est %d\n",sizeof(a)/sizeof(int));

afficher(a);

}

Que constatez-vous ? Expliquer le comportement de ce programme.

4.6 Copie d’un tableau vers un autre

T1 et T2 ´etant 2 tableaux d’entiers de mˆeme taille, ´ecrire une fonction recopiant dans T2 les ´el´ements positifs de T1 et retournant le nombre d’´el´ements copi´es. (la fonction appelante devra pouvoir utiliser les entiers copi´es)

4.7 Min et max

Ecrire une fonction calculant le minimum et le maximum d’un tableau d’entiers de taille n (et pas 2 fonctions

!!!).

4.8 Tris

Ecrire deux fonctions triant un tableau d’entiers , l’une effectuant un tri par s´election-permutation, l’autre un tri rapide.

4.9 Nombre en chiffres

(c’est le probl`eme r´eciproque de l’exerciceChaˆıne de chiffres )

4.10 Chiffres romains

Ecrire une fonctionromains transformant un nombre en son ´ecriture en chiffres romains.

(9)

4.11 Pour remplir un ch` eque

Ecrire une fonction ayant pour argument une chaˆıne de caract`eres form´ee de chiffres et ´ecrivant en toutes lettres le nombre form´e. (exemples : ”381” donne ”trois cent quatre-vingt-un” , ”2021” donne ”deux mille vingt et un” ) (eh oui!, c’est compliqu´e)

4.12 Triangle de Pascal

Ecrire une procedure calculant les coefficients binomiaux (triangle de Pascal).

4.13 Crible d’Eratosth` ene

Ecrire une fonction permettant de d´eterminer les nombres premiers inf´erieurs `a n en utilisant la m´ethode du crible :

- 1 n’est pas premier

- pour chaque nombre premier rencontr´e, on ”barre” ses multiples inf´erieurs `an.

- les nombres restant ”non barr´es” sont alors premiers.

4.14 Encore des nombres premiers

Ecrire une fonction permettant de d´eterminer lesnpremiers nombres premiers.

On proc´edera de la fa¸con suivante:

- On d´efinit un tableau de tailleninitialement vide destin´e `a stockerles nombres premiers.

- pour chaque nombre, on teste sa divisibilit´e par les nombres premiers du tableau; si aucun ne le divise, alors il est premier et on l’ajoute au tableau.

4.15 Le solitaire bulgare

On veut illustrer l’exp´erience suivante :

1. On prend un paquet deN cartes (N est un nombre triangulaire, c’est `a dire de la formep(p+ 1)/2 ) que l’on partage en un nombre quelconque de tas.

2. On prend une carte sur chaque tas et on forme un nouveau tas.

3. On recommence l’´etape 2 jusqu’`a ce que les nombres de cartes des tas soient d´ecroissants dep`a 1, ce qui constitue une suite stable. (cela se produit en un nombre fini de manipulations(*)).

(10)

Exemple : avec 10 cartes , on fait 2 tas de 6 et 4 cartes .

Les situations successives sont (6 4) , (5 3 2) , (4 2 1 3) , (3 1 2 4) , (2 1 3 4) , (1 2 3 4).

Ecrire un programme illustrant cette exp´erience.

(faire autant de fonctions que n´ecessaire)

(*)Probl`eme ´etudi´e par Martin Gardner - Scientific American - 1983

5 Allocation

5.1 Mise en majuscules d’une phrase

- Ecrire une fonctionmaj ayant pour argument un caract`erec et retournant le caract`ere majuscule corre- spondant. (dans le cas o`uc n’est pas une minuscule, il reste inchang´e)

- Ecrire une fonction strMaj ayant pour argument une chaˆıne de caract`eres s et transformant chaque caract`ere en majuscule.

- Mˆeme question, mais, dans ce cas,strMaj laissesinchang´ee et retourne une copie desen majuscules.

Indication: les caract`eres ’a’,’b’, ... ’z’ et ’A’,’B’, ... ’Z’ sont des nombres cons´ecutifs et il n’est pas n´ecessaire de connaˆıtre leur valeur.

6 Acc` es aux fichiers (texte)

6.1 Palindromes

-a- Ecrire une fonction indiquant si une phrase est un palindrome (attention, seules les lettres et les majuscules comptent).

-b- Ecrire un programme lisant jusqu’`a ´epuisement chaque ligne de l’entr´ee standard (utiliserfgets)et indiquant si elle constitue un palindrome. (utiliser le fichierpalindromes.exemples )

-c- Charger en m´emoire le fichiergrand palindromeet v´erifier que son contenu est effectivement un palindrome.

6.2 Le mot le plus long

Dans ce jeu, on dispose d’un ensmble de lettres al´eatoires (le tirage) et d’un mot dont toutes les lettres doivent figurer dans le tirage ( la r´eponse).

(11)

- Ecrire une fonctionconvient ayant pour arguments 2 mots a et b et retournant vrai si toutes les lettres de a figurent dans b (avec le mˆeme nombre d’occurences)

- Ecrire un programme permettant de tester cette fonction. Le tirage et la r´eponse devront ˆetre pass´es en argument au programe ex´ecutable.

- Modifier le programme pour qu’il lise l’entr´ee standard jusqu’`a ´epuisement et affiche chaque mot convenant au tirage (`a condition qu’il soit au moins aussi long que la r´eponse).

- Pour tester r´eellement le programme, utiliser par redirection le fichierdico.txt et v´erifier en plus que la r´eponse est bien dans le dictionnaire.

- On d´esire jouer plusieurs fois, en ´evitant de lire le fichier `a chaque fois. Le fichier sera charg´e en m´emoire dans un tableau cr´e´e par allocation. (Il faudra parcourir le fichier une premi`ere fois pour connaitre le nombre de mots). Pour economiser la m´emore, on allouera ´egalement la place minimale pour chaque mot). Une fois le dictionnaire charg´e, on lira le tirage et la proposition sur l’entr´ee standard, et on affichera les r´esultats comme pr´ec´edemment.

6.3 Cent mille milliards de poemes. (Raymond Queneau)

Principe : on fabrique al´eatoirement un sonnet (14 vers (4+4+3+3)) en choisissant au hasard chaque vers dans un ensemble de 10. Charger en m´emoire les 140 vers (fichier poeme.txt) et afficher un ou plusieurs po`emes selon le choix de l’utilisateur.

7 Ensemble De Mandelbrot et fichiers graphiques

7.1 l’ensemble De Mandelbrot

On consid´ere la suite complexe d´efinie par :

U(0) =Z;U(n+ 1) =U(n)2+Z

L’ensemble desZ tels que U(n) converge s’appelle l’ensemble de Mandelbrot. D`es qu’un terme a un module sup´erieur ou ´egal a 2, la suite diverge. En pratique, on calculera un nombre fixe de termes (entre 50 et 100 par exemple); si le dernier terme calcul´e a un module inf´erieur a 2, on consid`erera que la suite converge

1. Ecrire une fontionconvergence, dont les arguments sont deux r´e´elsxet y (Z=x+iy) et retournant 0 si la suite converge, le nombre d’it´erations sinon.

(12)

2. Ecrire une fontionmandelbrot ayant pour argument les abscisses et ordonnees limitant un rectangle dans lequel on testera la convergence. Les r´esultat seront ´ecrits dans un fichier image (voir ci-apr`es). Chaque point de l’ensemble sera noir, les autres blancs (ou de diff´erentes couleurs selon la vitesse de divergence).

les couleurs sont des triplets d’entiers non sign´es de 8 bits (RVB)

NB Pour repr´esenter la totalit´e de l’ensemble, choisir les abscisses entre -2 et 1, les ordonn´ees entre -1 et 1. ( on pourra prendre par exemple 600 points horizontalement et 400 points verticalement (ou 900x600))

Pour visualiser les fichiers sous Linux, utiliserevince

7.2 Fichiers PPM

le format PPM (Portable PixMap) permet d’enregistrer une image sans compression dans un format ind´ependant de la plateforme.

Les diff´erentes informations sont separ´ees par une espace, une tabulation ou un retour chariot. Les commentaires sont precedes par un #

Les informations `a stocker sont :

• le header comprenant : - la signature PPM

- le nombre de pixels horizontal et le nombre de pixels vertical - le nombre maximal de couleurs (ici 255)

• les donn´ees proprement dites : la couleur de chaque pixel est representee par 3 nombres entre 0 et 255 ( valeurs RVB, dans cet ordre)

les pixels sont stock´es ligne par ligne en commen¸cant en haut `a gauche)

7.3 Fichiers PPM texte

Tout le contenu est en mode texte (la signature ppm est form´ee de 2 caract`eres P et 3).

Votre fichier commencera donc (par exemple) par :

P3

# Ensemble de Mandelbrot sur [-2;1]x[-1;1]

600 400 255

0 0 0 0 0 0 255 255 255 ...

(13)

7.4 Fichiers PPM binaires

Seul l’entˆete est en texte (la signature ppm est P6). Tout le codage des couleurs est en binaire (avantages et inconv´enients ?)

Vous disposez en annexe d’informations sur la fonction d’´ecriture en binaire dans un fichier

7.5 Stockage compress´ e de fichiers PPM

Les fichiers cr´ees ´etant volumineux, on peut les ´ecrire en rempla¸cant les fonctions standard par celles de la ZLIB.

(voir annexe)

Quel est le gain obtenu ?

(pour qu’il soit exploitable, donnez `a votre fichier le suffixe.ppm.gz)

7.6 Fichiers BMP

7.7 BMP true color

Les fichiers BMP, issus de Windows, sont comparables aux PPM binaires, mais avec un param`etrage plus fin (donc plus compliqu´e). Le header comprend :

• la signature BMP (les caract`eres B et M)

• un bloc d’entˆete comprenant :

- la taille du fichier (sur 4 octets) - (champ r´eserv´e) (sur 4 octets)

- l’adresse du d´ebut des donn´ees (sur 4 octets)

• un bloc d’information comprenant :

- 1- la taille du bloc qui suit (40 octets ici) - 2- la largeur en pixels (choisir un multiple de 4) - 3- la hauteur en pixels

- 4- le nombre de plans (sur 2 octets) (toujours ´egal `a 1) - 5- le nombre de bits par pixel (sur 2 octets)(24 ici) - 6- le type de compression (0 ici)

- 7- la taille de l’image

- 8- la r´esolution horizontale (0 ici) - 9- la r´esolution verticale (0 ici)

-10- le nombre de couleurs ( 16777216 ici) -11- le nombre de couleurs principales (0 ici)

A part les champs 4 et 5, chacun de ces nombres occupe 4 octets.

• les donn´ees proprement dites : la couleur de chaque pixel representee par 3 nombres binaires entre 0 et 255 ( valeurs RVB, mais dans l’ordre BVR)

les pixels sont stock´es ligne par ligne en commen¸cant en bas `a gauche Dans cet exemple, l’adresse des donn´ees est 2+12+40=54 (en octets)

(14)

7.8 BMP avec palette

Lorsque le nombre de couleurs utilis´ees est petit (moins de 256), on peut d´efinir une palette, c’est `a dire une suite deN couleurs pr´ed´efinies (qui seront ´ecrites dans le fichier entre le header et les donn´ees. Chaque pixel sera alors d´efini comme un entier (8 bits) entre 0 etN−1.

Chaque couleur sera d´efinie comme un triplet d’octets (ordre BVR) suivi d’un octet nul.

NB : Il faudra penser `a ajouter 4∗N `a l’adresse de d´ebut des donn´ees et pr´eciser que le nombre de couleurs est N et que le nombre de bits par pixel est 8..

7.9 BMP compress´ e avec palette

Le format BMP compress´e utilise une compression exacte qui a l’avantage d’ˆetre simple: la compression RLE (Run Length Encoding). Cette compression consiste `a compter les pixels ayant la mˆeme valeur et de n’´ecrire dans le fichier que le nombre de pixels ´egaux, puis leur valeur commune (soit 2 octets par s´erie d’octets ´egaux) Il faudra donc stocker chaque ligne avant de l’´ecrire et veiller `a ne pas d´epasser 255 (exemple : pour une suite de 600 pixels de valeur 0, il faudra ´ecrire : 255 0 255 0 90 0).

Pour les fins de ligne, on ajoute les octets 0 et 0, pour la fin de l’image, on ajoute les octets 0 et 1.

Il faudra en outre calculer la taille des donn´ees au fur et `a mesure de l’ex´ecution, puis `a la fin du calcul, revenir au d´ebut du fichier pour y ´ecrire la taille du fichier et celle des donn´ees.

7.10 Fichiers JPEG

La compression JPEG n´ecessite des algorithmes tr`es complexes. Il existe une biblioth`eque fournissant des fonctions de manipulation.

Le seul travail `a effectuer ici est d’allouer une matrice (ou un tableau) pouvant contenir les triplets de couleur (RVB dans cet ordre) et de le transmettre `a la fonctionecrireJpeg qui vous est fournie.

Son prototype est :

void ecrireJpeg(FILE *f, int largeur, int hauteur, unsigned char *buffer);

cette fonction devra ˆetre appel´ee une seule fois, apr`es que la matrice est remplie.

Annexe

Ecriture binaire

la fonction `a utiliser est : fwrite. Son protoype est :

int fwrite ( void * buffer, int taille_element, int nb_elements, FILE *);

Le premier param`etre ´etant de type void* (pointeur g´en´erique), vous pouvez ´ecrire n’importe quel type de

(15)

Fonctions de la ZLIB

Elles permettent d’´ecrire les donn´ees de fa¸con compress´ee et sont simples d’emploi car elles ressemblent aux fonctions standard.

Il suffit de remplacerFILE * par gzFile, les fontions fopen et fclose par gzopen et gzclose avec, bien sˆur, un argument de typegzFile, de mˆeme avecgzprintf au lieu defprintf

La fonctiongzwrite, qui remplacefwrite a pour prototype :

int gzwrite (gzFile , void * buffer , int nb_octets);

NB : Vous devrez inclurezlib.h et ajouter une option -l pour linker.

8 Variables permanentes

8.1 Nombres pseudo-al´ eatoires

On g´en`ere des nombres pseudo-al´eatoires positifs avec les termes de la suite U definie par : Un+1= 808840516Un+ 1(mod232)

-a- On supposeU0=0. Ecrire une fonctionrandomsans argument et retournant un entier positif correspondant au terme suivant de la suite. (attention, chaque appel doit se contenter de calculer un terme `a partir du pr´ec´edent).

Modifier la fonction pour qu’elle prenne en argument un entier positifnet qu’elle retourne un entier entre 0 etn−1.

-b- On suppose que l’on peut obtenir l’heure du systeme grace a un appel a time(NULL) (time est declar´ee danstime.h) Donner une nouvelle version derandomprenant en compte l’initialisation deU grˆace a cette fonction.

8.2 Fibonacci : le retour

Ecrire une fonction fibonacci r´ecursive calculant le ni`eme terme de la suite, et le m´emorisant pour des usages ult´erieurs.

8.3 D´ ecoupage d’une phrase

- Ecrire une fonctiondecoupe ayant pour argument une chaˆıne de caract`eresS telle que les appels successifs

`

adecoupe retournent la suite des mots deS et NULL lorsqu’il n’y en a plus. (un mot est une suite form´ee de lettres, trait d’union ou apostrophe; tout autre caract`ere est consid´er´e comme s´eparateur) Rq : a partir du 2`eme appel, on utilisera NULL a la place deC, sauf pour recommencer un nouveau decoupage.

- Utiliserdecoupe pour ´ecrire une fonctionDecoupe retournant un tableau de mots.

(16)

9 Des fonctions comme argument

9.1 Map

On appelle fonction enti`ere toute fonction ayant un seul argument de typeint et retournant unint.

Ecrire une fonction map ayant pour arguments une fonction enti`ere f, un tableau T d’entiers et un entier n d´efinissant la taille du tableau, et transformant chaque ´el´ement deT en son image par f.

9.2 R´ esolution dichotomique

Ecrire une fonctioncherche zero ayant pour arguments une fonction r´eellef et deux r´eelsaetb, et retournant un r´eelxtel quef(x) = 0.

On utilisera la m´ethode de dichotomie en supposant quef est continue, quea < b(on v´erifiera quef(a) etf(b) sont de signes contraires, ce qui assure l’existence dex)

On repr´esentera les r´eels par le typedouble et on arrˆetera les calculs lorsqueb−a <106

9.3 trac´ e de courbe

Ecrire une fonction tracer ayant pour arguments une fonction r´eelle f et 4 r´eelsx1, x2, y1, y2 d´efinisant un rectangle dans lequel la courbe doit ˆetre trac´ee.

On linkera avec la biblioth´eque SDL et on utiliserasdl.c

10 Traitement du signal

On dispose d’un signal sonore sous forme d’un fichier .wav (non compress´e) correspondant `a un signal sinuso¨ıdal auquel on a ajout´e al´eatoirement du bruit.

1. Format du fichier Le fichier poss`ede une entˆete de 44 octets. Ceux-ci ne seront pas trait´es par le pro- gramme, mais seront simplement recopi´es dans le fichier r´esultant du traitement. Le reste est une suite d’entiers (positifs) sur un octet compris entre 0 et 255.

2. Visualisation des valeurs Utliser la commande od du shell : od -j 44 -t u1 < signal_bruite.wav

(17)

cut -c 9-

pour visualiser la courbe, on redirige le r´esultat (ou une partie seulement) vers un fichiervaleursqui sera exploit´e par gnuplot. Celui-ci devra comporter 1 seule valeur par ligne. Pour le cr´eer, on tape :

echo $(od -j 44 -t u1 < signal_bruite.wav|cut -c 9-|head -15) |tr ’ ’ ’\n’

>valeurs

lancer gnuplot et ex´ecuter la commande : plot "valeurs" with line

3. Traitement par un programme

(a) Lire le fichier et charger les valeurs dans un tableau (comment determiner la taille a allouer ?), ainsi que l’entˆete dans un autre tableau.

NB: Le tableau de valeurs devra ˆetre au format double pour les calculs ult´erieurs.

(b) Ecrire une fonctionmoyenne3 prenant en entr´ee le signal et calculant le signal moyenn´e sur 3 valeurs contigu¨es (pour les extr´emit´es, on recopiera la valeur d’origine).

(c) Ecrire une fonction ´ecrivant dans un fichier l’entˆete, puis les valeurs calcul´ees ci-dessus.(attention au format !)

(d) Plus g´en´eralement, on va traiter le signal par un filtre moyenneur, c’est `a dire qu’on va effectuer une convolution discr`ete. Celle-ci est d´efinie par la formule : yn=

!K

k=K

xnkhk o`u xet y sont respec- tivement les signaux d’entr´ee et de sortie ethle filtre d´efini par 2K+ 1 ´echantillons.

Attention, il n’est pas possible en C d’utiliser des indices n´egatifs, il faudra donc les translater.

Comme pour la moyenne sur 3 valeurs, le calcul n’est pas possible sur les bords. On conservera donc les valeurs d’origine.

Ecrire une fonctionconvolution calculant le signal de sortie `a partir du signal d’entr´ee et du filtre.

(e) Le filtre gaussienGσ est un moyenneur `a support infini caract´eris´e par son param`etreσet est d´efini par la formule : Gσ= 1

σ√ 2πe t

2 2σ2.

C’est un des filtres les plus utilis´es. Pour l’utiliser de fa¸con discr`ete, on l’´echantillonne sur l’intervalle [−3σ; 3σ] pour garantir la repr´esentativit´e du filtre obtenu. D’autre part, il faut que la somme des

´echantillons soit ´egale `a 1 pour assurer la conservation de la moyenne du signal trait´e.

Ecrire une fonction gaussienne retournant un ´echantillon contruit conform´ement aux indications ci-dessus.

(f) utiliser les deux dernieres fonctions pour traiter le signal (on prendra : σ= 3) et utiliser la fontion d’´ecriture pour enregistrer le r´esultat (`a ´ecouter)

Vous trouverez le ”squelette” du programme danssignal.sq.c. La fonctiongaussienne est d`eja ´ecrite.

Vous pourrez tester la convolution avec le programme suivant ( ou plutˆot un extrait de ce programme)

(18)

void convolution( double * signalIn, int taille, double * filtre, int t,

double * signalOut );

main() {

double signalIn[10] ={81,150,239,172,93,210,27,236,169,78}, signalOut [10],

filtre[5]={0.1,0.15,0.2,0.25,0.3}; // conserve bien la moyenne

convolution(signalIn, 10, filtre, 5, signalOut);

}

on obtient en sortie :

81 150 144 174 167 144 138 150 169 78

11 Impl´ ementation de types abstraits de donn´ ees

11.1 Pile

Pour r´ealiser une pile, on peut utiliser un tableau, mais sa taille devant ˆetre fix´ee `a l’avance, on risque, soit de manquer de place, soit d’en gaspiller.

Un alternative est la r´ealisation dynamique : chaque ´element est plac´e dans une structure, qui contient ´egalement l’adresse de la structure suivante. Pour ajouter un ´el´ement, il suffit d’allouer une nouvelle structure et de la chaˆıner avec les pr´ec´edentes.

Construire un module form´e d’un fichierpile.h d´efinissant le typePile et les op´erations classiques de ce type et d’un fichierpile.c fournissant le code de ces op´erations.

11.2 Liste

Il est ´egalement possible de proc´eder de fa¸con analogue pour r´ealiser une liste. Cependant, dans certains cas, on ne dispose que d’un sous-ensemble des fonctions du C ne permettant pas d’allocation. Dans ce cas, on r´eserve une partie de la m´emoire (dans un tableau (obligatoirement global si plusieurs modules l’utilisent)) et on proc`ede de mˆeme (mais il faut d´efinir soi-mˆeme l’allocation et la lib´eration)

(19)

11.3 Transvasements

On dispose de 3 bidons non gradu´es de contenances 18 litres, 11 litres et 5 litres. On se pose la question de savoir si on peut, par transvasements successifs, obtenir un bidon contenant 1 litre (ou 2 litres, 3 litres etc.) Ecrire un programme affichant tous les ´etats possibles afin de r´epondre `a cette question.

R`egle: Un transvasement n’est possible que si le bidon d’origine est vid´e ou si le bidon de destination est rempli.

12 Entr´ ees-sorties de ”bas-niveau”

12.1 Exercice pr´ eliminaire

Le but est d’´ecrire un programme affichant le contenu d’un fichier dont le nom est sp´ecifi´e sur la ligne de commande.

12.2 affichage normal

Ecrire le programme en n’utilisant que les fonctions open, read, writeet close (inclure fcntl.h et unistd.h) L’´ecriture se faisant sur la sortie standard, le fichier de sortie `a utiliser vaut 1. (et il ne doit pas ˆetre ouvert car il l’est d´ej`a).

12.3 affichage modifi´ e

Chaque caract`ere lu devra, avant affichage ˆetre modifi´e de la mani`ere suivante : si les 3 bits de poids fort ne sont pas tous nuls, le bit 5 (le 6e `a partir de la droite) sera positionn´e `a 1.

13 Lectures et ´ ecritures sur un p´ eriph´ erique HID

La norme HID (human interface device) d´efinit un protocole permettant le dialogue entre l’ordinateur et des p´eriph´eriques actionn´es par l’utilisateur (souris, clavier, joystick).

Le but du TP est de dialoguer avec une manette de jeux (un buzzer pour Playstation)

13.1 Acc` es

L’acc`es de fait par ouverture d’un fichier sp´ecial (en principe : /dev/hidraw1) en utilisant les acc`es de bas niveau (i.e. open).

(20)

Les donn´ees sont transmises par un buffer de taille 8.

• Ecriture

Le 1er octet est nul, le 2e inutilis´e. Les 4 octets suivants indiquent si le buzzer doit ˆetre allum´e (valeur 0xff) ou ´eteint (valeur 0)

• Lecture

Les 2 premiers octets sont inutilis´es. Les octets 2, 3 et la moiti´e de poids faible du 4 ont leurs bits indiquant l’´etat des boutons. Le tableau ci-dessous indique pour quel buzzer les bits sont positionn´es.

2 2 2 1 1 1 1 1 4 3 3 3 3 3 2 2 ? ? ? ? 4 4 4 4

Vous devez ´ecrire un programme indiquant quel buzzer a ´ete actionn´e (et quel bouton) et allumer ce buzzer pendant 0,2 s. si un seul a ´et´e actionn´e (utiliser usleep(200000)).

Le programme doit s’arrˆeter lorsque 2 buzzers sont actionn´es.

14 Entr´ ees/sorties sur une carte FPGA

Le but de la s´eance est de r´ealiser un dialogue avec la carte FPGA. Les sorties consisteront en un affichage sur les Leds ou sur l’afficheur, les entr´ees en lecture d’interrupteurs ou de boutons-poussoirs.

(21)

La carte doit ˆetre aliment´ee et reli´ee `a l’ordinateur par le port s´erie.

Pour qu’un programme puisse s’adresser `a la carte, il doit d’abord ouvrir le fichier sp´ecial associ´e au port USB (/dev/ttyUSB0 sous Linux). Les informations sont ensuite ´echang´ees en utilisant les fonctions de lecture et d’´ecriture de ”bas niveau”.

La communication utilise un protocole simple :

Pour ´ecrire un octet, il faut envoyer le caract`ere W, puis le num´ero de la commande, puis la valeur x

` a ´ecrire.

les valeurs des commandes sont les suivantes : (en hexad´ecimal) 10 : envoyer un octet vers les leds.

22: demande l’initialisation de l’afficheur ( la valeur x est quelconque) 20 : envoi d’un caract`ere vers l’afficheur

21 : rafraˆıchissement de l’afficheur ( la valeur x est quelconque)

N.B. Il n’y a pas d’effacement de l’afficheur et, si moins de 32 caract`eres sont envoy´es, l’affichage est compl´et´e avec des ’Z’

Pour lire un octet, il faut envoyer le caract`ere R, puis le num´ero de commande, puis faire une lecture pour obtenir le r´esultat.

les valeurs des commandes sont les suivantes :

2 : obtenir l’´etat des interrupteurs Les interrupteurs 1, 2, 3, 4 positionnent respectivement les bits 0, 1, 2 et 3 de l’octet obtenu.

3 : obtenir l’´etat des boutons-poussoirs. Les boutons-poussoirs 1, 2, 3, 4 positionnent respective- ment les bits 0, 2, 4 et 6 de l’octet obtenu.

Avant de commencer le dialogue, il est pr´ef´erable d’´ecrire la commande demandant la version. Envoyer ’V’

(sans compl´ement) ; la lecture doit donner 7; si la carte est mal synchronis´ee, elle enverra des caract`eres ’ ?’

qu’il faudra lire jusqu’`a l’obtention du 7.

Travail demand´e

-a- ´ecrire une fonctionalterneaffichant alternativement les leds de rangs pairs et impairs. Pour que le r´esultat soit visible, il faut laisser un d´elai d’attente entre deux ´ecritures; pour cela, vous utiliserez la fonctionusleep (usleep(n) provoque une attente denmicrosecondes)

tester cette fonction.

-b- ´ecrire une fonctionchenillard affichant les leds 0, 1, 2 .. 7, 0, 1, 2 . . . .

Remarquez quealterne et chenillard utilisent les mˆemes instructions; faites en sorte de factoriser votre code.

-c- ´ecrire une fonctionattente qui attendra que le 1er interrupteur soit pouss´e. Ex´ecuter ensuite la fonction alterne jusqu’`a ce que cet interrupteur soit `a nouveau commut´e. (mˆeme remarque que pr´ec´edemment).

-d- modifier ce qui pr´ec`ede pour tenir compte de l’appui sur le gros bouton, qui aura pour effet de commuter l’ex´ecution des fonctionschenillard etalterne. (un seul appui, pas d’appui continu)

-d- cr´e´ez un troisi`eme mode d’affichage, lui aussi commutable avec le bouton.

-e- S’il vous reste du temps, vous pourrez imaginer l’usage d’autres bouton ou interrupteurs ou des affichages sur l’´ecran lcd.

(22)

Références

Documents relatifs

(2) ´ Ecrire une fonction traitement qui prend pour arguments une image et une fonction puis applique cette fonction sur la valeur de chacun des pixels de l’image.. (3) Red´

ww.logicieleducatif.fr.[r]

En développant f (x) , montrer que c'est la somme d'un nombre réel et d'une combinaison d'expressions contenant des cosinus hyperboliquesb. En déduire une nouvelle preuve de

Seule l’utilisation du logiciel scilab et de sa rubrique d’aide est

Programmer cet algorithme sur votre calculatrice et le tester avec plusieurs valeurs. Ecrire un algorithme permettant de calculer les coordonnées du milieu

Le nombre d’or, souvent

Compétence : Ecrire des mots connus en lettres bâtons, avec

Ecrire l'algorithme d'une fonction qui convertit un nombre binaire, figurant dans un tableau de caractères sous forme ASCII, en un nombre entier qui sera retourné.