0% ont trouvé ce document utile (0 vote)
41 vues5 pages

Pointeurs en C : Exercices pratiques

Le document présente un TP sur les pointeurs en C, comprenant des exercices sur la compréhension des pointeurs, la détection de palindromes, la manipulation de tableaux et une introduction à l'opération de convolution en traitement d'images. Chaque exercice inclut des instructions de programmation et des explications sur l'utilisation des pointeurs. Les exercices visent à renforcer la compréhension des pointeurs et leur application dans différents contextes de programmation.

Transféré par

amengueleanouchka
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
41 vues5 pages

Pointeurs en C : Exercices pratiques

Le document présente un TP sur les pointeurs en C, comprenant des exercices sur la compréhension des pointeurs, la détection de palindromes, la manipulation de tableaux et une introduction à l'opération de convolution en traitement d'images. Chaque exercice inclut des instructions de programmation et des explications sur l'utilisation des pointeurs. Les exercices visent à renforcer la compréhension des pointeurs et leur application dans différents contextes de programmation.

Transféré par

amengueleanouchka
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

C embarqué - Systèmes à Microprocesseurs

FI - 2022-2023

TP3 : Pointeurs

Exercice 1 : Compréhension des pointeurs

a) On considère les lignes de code suivantes :

int A[] = {2, 27, 3, 13, 28, 17, 31, 9, 20, 6};
int x; int *P;
P=A;

Compléter le tableau ci-dessous, en indiquant ce que donne l’affichage de la variable x


(de type int) par la fonction printf, après exécution de chacune des instructions de la
colonne de gauche (de haut en bas). Compléter par les explications utiles dans le tableau, puis
conclure sur les opérations arithmétiques portant sur des variables ou sur des pointeurs.
expression valeur explications
x=*P 2 On recupère la valeur de la première case car notre
pointeur pointe sur cette case
x=*(P+3) 13 On a incrémenté notre pointeur de 3 positions donc
on avance de 3 cases pour récupérer la valeur de
case p+3
x=*P+1 3 Car notre pointeur recupère la valeur contenue
dans la première case du tableau et lui ajoute 1
x=P 6487520 On constate qu’on récupère l’adresse d’une case et
non le contenu de la case car on a pas utilisé le
pointeur *. Cette adresse correspondrait à celle de
la première case du tableau
x=P+1 6487524 L’adresse de la première case a été augmenté de 1 ;
on passe à la case suivante
x=A[4]-2 26 A[4] en lui-même est déjà un pointeur et récupère
la valeur de la case numéro 4 du tableau à laquelle
on soustrait 2
x=&A[4]-2 6487528 Qui correspond à l’adresse recupérée à cause de
l’opérateur &
x=A+4 6487536 Qui correspond à l’adresse du premier indice du
tableau + 4 (+ 16 octets)
x=&A[9]-P 9 Qui correspond à l’adresse du neuvième élément du
tableau – l’adresse de P (adresse du premier
élément du tableau), indique donc l’indice de
l’élément du tableau
x=P+(*P-1) 6487524 Qui correspond à l’adresse du premier élément du
tableau + (premier élément du tableau (2) – 1) =

1
adresse du premier élément du tableau – 1 (-4
octets)

Exercice 2 : Pointeurs et chaînes de caractères

Un palindrome est un texte ou un mot dont l'ordre des lettres reste le même qu'on le lise
de gauche à droite ou de droite à gauche. Exemple : «Engage le jeu, que je le gagne».
Pour détecter un palindrome, le principe peut être basé sur deux pointeurs, le 1 er
parcourant la chaîne dans le sens direct et le 2e dans le sens inverse. On peut comparer le
contenu de ces 2 pointeurs entre eux à chaque itération d’une boucle, et dès qu’on détecte
une différence, on peut conclure qu’il ne s’agit pas d’un palindrome (et arrêter le traitement).
On souhaite développer une fonction retournant la valeur 1 si une chaîne contient un
palindrome, 0 sinon. Cette fonction devra être basée sur l’utilisation de pointeurs. Son
prototype devra être :
int mot_palindrome(char *chaine);
a) Développer cette fonction et un petit programme principal permettant de la tester. Pour
simplifier le développement, on se limitera dans un premier temps aux cas où la chaîne de
caractères est composée d’un seul mot.
b) Adapter la fonction pour gérer les cas où la chaîne de caractères contient des espaces et
des apostrophes.

Informations utiles :
- Pour sortir prématurément d’une boucle, on peut utiliser l’instruction break
- Pour saisir une chaîne de caractères au clavier, on peut utiliser la fonction gets()définie dans le fchier
d’entête string.h
- Pour connaître la longueur d’une chaîne de caractères, on peut utiliser la fonction strlen() (également de
string.h)
- Pour passer directement à l’itération suivante d’une boucle, on peut utiliser l’instruction continue
a.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mot_palindrome(char chn[100]){


//char chn[100];
char *p,*b;
printf("entrez votre mot");
gets(chn);
int x=strlen(chn);
int a=1;
while(p!='\0'){
p++;
}
--p;
for(p=chn;p<x;p++){
if(*p==*b)
{
*p++;
--*b;
a=0;
}else
2
break;
}

if (a==1)
printf("%s est un palindrome",chn);
else
printf("%s n'est pas un palindrome",chn);
return 0;
}
int main()
{char chain[100];
mot_palindrome( chain);
}

b.

Exercice 3 : Pointeurs et tableaux

a) Écrire un programme qui :


- saisisse au clavier les n éléments d’un tableau de type int ;
- inverse l’ordre de ces éléments (le 1er devient le dernier, etc), sans utiliser un 2e tableau.
La saisie et la réorganisation des éléments du tableau devront utiliser des pointeurs.
Rm : le tableau devra être dimensionné dans le code source à une taille maximale N (ex.
10), et le nombre d’éléments choisi n devra être ≤ N.
b) Ecrire un programme qui lise au clavier un entier x à retirer d’un tableau, c’est-à-dire que
toutes les occurrences de x devront être éliminées, en "tassant" (=déplaçant vers la gauche)
les éléments restants. Le programme devra utiliser des pointeurs et ne pas utiliser un 2e
tableau.
L’opération de "tassement" pourra être basée sur 2 boucles while imbriquées :
- la 1ère pour le parcours de tous les éléments du tableau à traiter
- la 2e pour le décalage du reste du tableau quand l’élément à enlever x est détecté.
Remarque : pour simplifier la conception du programme, on pourra procéder en 2 étapes :
version 1 qui ne traite que les cas où il n’y a pas deux éléments x consécutifs dans le tableau
version 2 pour le cas général.

Exercice 4 : Filtrage d’images (bonus)

En ce moment on parle beaucoup de "Deep Learning". Il s’agit de réseaux de neurones


artificiels dits convolutionnels.
L’opération de convolution est également très utilisée dans le traitement des images,
pour en extraire des éléments caractéristiques. Dans cet exercice nous nous proposons de
programmer cette opération.
L’opération de convolution consiste à effectuer un calcul pour chaque élément d’une
matrice d’entrée (constituée par exemple par une image, et dont chaque élément est un
pixel), prenant en compte les éléments du voisinage (par exemple de taille 3 x 3, cf annexe).

3
Compléter le programme fourni avec cet énoncé pour qu’il réalise cette opération de
convolution (faire une version sans pointeur et version avec pointeurs). Pour l’image donnée
en exemple on doit obtenir le résultat suivant :

Le tester avec l’image fournie en exemple et une autre image de votre choix.
Comment pourrait-on définir la fonction réalisée par la convolution avec cet exemple de
filtre ?

Annexe : opération de convolution

Exemple de convolution d’une image :

[Link]

En traitement d’images, l’opération de convolution permet par exemple de faire ressortir


les contours des objets (cf figure ci-dessous). Le type de traitement effectué dépend du noyau
de convolution ("convolution kernel") utilisé.

4
[Link]

L’opération de convolution est définie par :


M 1M 1

p'x,y hi,j px M/2 i,y M/2 j où j 0i 0

• px,y est la valeur du pixel de l’image de coordonnées (x,y)


• p’x,y la valeur de ce pixel après convolution
• hi,j la valeur du noyau de convolution d’indices (i,j)
• M la taille du masque (celui-ci étant carré), et M/2 une division entière

Exemple pour M=3 (filtre de taille 3x3) :


2 2

p'x,y hi,j px 1 i,y 1 j

j 0i 0

Vous aimerez peut-être aussi