Vous êtes sur la page 1sur 7

Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les

pointeurs

Pointeurs&Fonctions
Exercice 1
Écrire une fonction qui permet de rechercher dans un tableau d'entiers tab une valeur A.
void chercherVal (int tab[], int n, int A, int *pos, int *nb_occ);
Dans pos, la fonction sauvegarde l'indice de la dernière apparition et -1 si la valeur n'a pas été trouvée.
Dans nb_occ, elle sauvegarde le nombre d'occurence de A dans tab.

Exercice 2
On souhaite écrire une fonction qui permet de résoudre une équation du premier degré: ax+b=0. Voici
le prototype de la fonction:
int resoudre1(int a, int b, float *x);
la fonction retourne le nombre de solution trouvé (0: pas de solution, 1: une solution, -1: tout x est
solution). Dans le cas où l'équation a une solution, la fonction retourne la solution dans x.

Exercice 3
Écrire une fonction: void pos_car(char T[],int n, char c, int *p_occ, int *d_occ), qui étant donnés un
tableau T de n caractères et un caractère c, détermine les valeurs p_occ et d_occ qui désignent
respectivement les indices de la première et de la dernière occurrence du caractère c dans le tableau T.
Exemple :
Soit le caractère c = ‘a’ et le tableau T suivant contenant 10 caractères:
b a a a b a c a a b
0 1 2 3 4 5 6 7 8 9
alors p_occ recevra 1 et d_occ recevra 8. En effet, le caractère ‘a’ apparaît pour la première fois à la
position 1 et pour la dernière fois à la position 8.

Exercice 4
1. Écrire une fonction: supprimer_nul, qui permet de supprimer la première valeur nulle d'un
tableau d'entier passé en paramètre.
2. Écrire une fonction: nb_occurrence, qui étant donnés un tableau T de n entiers et un entier x,
détermine puis retourne le nombre d'occurence de x dans T.
3. Écrire une fonction: compacter, qui permet de compacter les éléments du tableau tab. Cette
opération consiste à supprimer toutes les valeurs nulles du tableau.
Astuce: utiliser nb_occurrence pour trouver nb, nombre de répétition de zéro dans le tableau,
puis appeler supprimer_nul nb fois.

Exercice 5
Écrire une fonction qui détermine les indices de la plus grande valeur dans imax et la plus petite valeur
dans imin d'un tableau d'entiers.
void maxima (int tab[], int n, int *imax, int * imin);
Si le tableau contient plusieurs maxima ou minima, la fonction retiendra la position du premier
maximum ou minimum rencontré.

Exercice 6
On considère un tableau d’entiers tab de n éléments tel que tous les éléments ont les valeurs 0 ou 1. On
appelle coupe et on note tab[i..j] (avec 0<=i<n), une partie du tableau commençant à l’indice i et se
terminant à l’indice j. Une coupe est dite équilibrée si elle comprend autant de 0 que de 1.

Exemple :
0 1 1 0 1 0 1 1 1 0 1 0
0 1 2 3 4 5 6 7 8 9 10 11
La coupe tab[0..1] est équilibrée
La coupe tab[0..3] est équilibrée (deux 1 et deux 0)

1/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs
La coupe tab[0..5] est équilibrée
La coupe tab[2..5] est équilibrée.
1. Écrire une fonction: int est_equilibree(int tab[], int i, int j) , qui, étant donné un tableau tab, et
deux entiers i et j, retourne vrai si la coupe tab[i..j] est équilibrée et faux sinon.
2. Écrire une fonction: void max_coupe(int tab[], int n, int *l, int *i, int *j) , qui, étant donnés un
tableau tab de n éléments, retourne la longueur l de la plus longue coupe équilibrée (celle qui a
le plus grand nombre d’éléments) ainsi que les indices i et j de début et de fin de cette plus
longue coupe.

Exercice 7
Écrire une fonction qui détermine si une matrice carrée est symétrique ou non. La fonction retourne 1
si oui et 0 si non.
Une matrice est symétrique si Mij = Mji pour 0<=i<n et 0<=j<n.
Voici le prototype de la fonction:
int estSymetrique (int M[MAX][MAX], int n);
avec MAX est une contstante.

Exercices d'entraînement
Exercice 8
Écrire une fonction qui permet de rechercher dans un tableau d'entiers tab une valeur A.
int chercherTab (int tab[], int n, int A, int *pos);
la fonction retourne le nombre d'occurence si A existe dans le tableau et 0 si non. Dans pos, elle
retourne l'indice de la dernière apparition de la valeur dans le tableau et -1 si la valeur n'a pas été
trouvée.

Exercice 9
Soit une matrice A à deux dimensions NxN. Un « point col » est un élément de la matrice qui
est minimum de sa ligne et maximum de sa colonne ou inversement.
1. Ecrire une fonction estMaxLigne qui retourne 1 si une valeur M est la plus grande
sur toute la ligne L.
2. Ecrire une fonction estMinColonne qui retourne 1 si une valeur M est la plus petite
sur toute la colonne C.
3. Ecrire une fonction chercherPointCol qui affiche les coordonnées de tous les
points cols d’une matrice A. La fonction retourne le nombre de point col trouver.

Voici les prototypes des fonctions demandées:


int estMaxLigne (int A[][], int N, int M, int L);
int estMinColonne (int A[][], int N, int M, int C);
int chercherPointCol (int A[][], int N);

Exercice 10
1. Écrire une fonction en langage C: int nb_occurrence(char T[],int n, char c), qui étant donnés
un tableau T de n caractères et un caractère c, détermine les valeurs p_occ et d_occ qui
désignent respectivement les indices de la première et de la dernière occurrence du caractère c
dans le tableau T. la fonction retourne le nombre d'occurence.
2. Écrire une fonction en langage C: int pos_car(char T[],int n, char c, int *p_occ, int *d_occ),
qui étant donnés un tableau T de n caractères et un caractère c, détermine les valeurs p_occ et
d_occ qui désignent respectivement les indices de la première et de la dernière occurrence du
caractère c dans le tableau T. la fonction retourne le nombre d'occurence.
Exemple :
Soit le tableau T suivant contenant 10 caractères: b a a a b a c a a b
et soit le caractère c = ‘a’

2/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs
alors la fonction retourne 6 avec p_occ=1 et d_occ=8 (c’est à dire que le caractère ‘a’ apparaît pour
lapremière fois à la position 1 et pour la dernière fois à la position 8).

Exercice 11
On souhaite écrire une fonction qui permet de résoudre une équation du second degré. Voici
leprototype de la fonction:
int resoudre2(int a, int b, int c, float *x1, float *x2);
la fonction retourne le nombre de solution trouvé (0: pas de solution, 1: une solution, 2: une
solutions,
-1: tout x est solution). Dans le cas où l'équation a une solution, la fonction retourne la solution
dansx1. Dans le cas où l'équation a deux solutions, la fonction retourne les solutions dans x1 et x2.

Exercice 12
Ecrire un programme qui permet de dessiner l’histogramme des éléments d’une
matrice d’entiers. Un histogramme est un diagramme qui détermine le nombre de fois
où chaqueélément est présent dans la matrice.

Exemple :
Soit la matrice : a b c a
c c b a
a b a c
c a a a

l’histogramme obtenu est :


a : * * * * * * * *b : * * *
c : * * * * *

Pour cela, on se propose de construire deux vecteurs (càd tableaux):


- un vecteur elements qui va contenir tous les éléments de la matrice une seule fois
chacun. (penser à écrire une fonction qui remplis le tableau elements)
- Un vecteur histo dans lequel chaque case d’indice i indique le nombre de fois où le
caractère elements[i] est présent dans la matrice. (penser à écrire une fonction qui
remplis le tableau histo à partir de la matrice et de tableau elements)

Problèmes :
Problème 1 :
Une image est représenté par un ensemble de couleurs, les couleurs d’une image sont
la combinaison de 3 couleurs de base (Rouge, Vert, Bleu). L’intensité de chaque pixel de
couleur de base est représentée par un entier compris entre 0 et 255.
On se propose de représenter une image par une matrice de pixels dont chaque case représente
la valeur du pixel (la valeur du pixel est obtenue par la moyenne des valeurs de couleurs de
base de ce pixel), pour ceci on vous demande de concevoir les procédures et fonctions
suivantes :

3/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs
1- Ecrire une procédure qui fait la saisie d’une matrice de pixels de taille N*N dont les
valeurs sont comprises entre 0 et 255
2- Ecrire une procédure qui affiche une image (afficher une image revient à afficher les
valeurs de pixels de la matrice constituant cette image)
3- Ecrire une procédure Image qui prend en paramètres 3 matrices des couleurs de base
et qui calcule dans une quatrième matrice la moyenne des pixels relatifs
24 2 1 0 2 1 34 0
3 193 61 8 0 19 71 18
32 7 88 3 4 6 121 7
1 1 2 9 3 41 25 96
Tableau 1: Rouge Tableau 3: Bleu

2 2 2 32 9 1 12 10
13 13 66 18 5 75 66 14
3 7 88 13 13 6 99 7
12 13 24 9 5 18 17 38
Tableau 2: Vert Tableau 4: Image (R, V, B)

Image [2,2] = (Rouge [2,2] + Vert [2,2] + Bleu [2,2]) Div 3 = 75


4- Procédure lissage qui permet de changer la valeur de chaque pixel d’une image par la
moyenne des éléments qui lui sont adjacents et dont les valeurs dépassent la valeur
du pixel en question au plus de 20 ou au moins de 20.
9 1 12 10
5 75 20 14
13 6 99 7
5 18 17 38
Image [2,2] = 75, admet 8 éléments adjacents mais seulement deux parmi ces 8 ont une
valeur ne dépassant pas 75 d’au plus de 20 et d’au moins de 20 (dans ce cas les valeurs
acceptés des voisins sont dans l’intervalle [55,95])
D’où Image [2,2] est remplacée par (66 + 99) Div 2 = 82
Notons bien qu’un élément à l’intérieur de la matrice admet 8 voisins et un élément au
bord admet moins que 8 voisins.
5- Procédure Cryptage : permet de changer l’image pour des raisons de sécurité, pour
ceci nous allons changer la valeur de chaque pixel de l’image par la moitié de sa
valeur afin de brouiller l’image.
6- Procédure décryptage : permet de récupérer la version originale de l’image en ayant
comme paramètre la version cryptée.
7- Procédure Clé_de_hachage : permet de créer un mot de passe pour accéder à cette
image, ce mot de passe est un tableau T d’entiers de dimension N pour une image de
taille N*N, ses valeurs sont calculés à partir de l’image selon la formule suivante :
n
T[j] = (∑ Image [i, j] *i) div 255
4/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs
i=1
8- Ecrire le programme principal permettant de déclarer les structures de données
nécessaires, saisit les trois couches d’image, calcule et affiche l’image, applique le
lissage, décrypte et décrypte l’image et enfin qui calcule le mot de passe de l’image

Problème 2 :
1. Ecrire une procédure qui compte le nombre d’occurrences de chaque chiffre dans un
tableau unidimensionnel passé en paramètre. Le résultat sera un tableau de 9 entiers.
Chaque case de ce tableau contiendra le nombre d’occurrences du chiffre
correspondant à l’indice. Par exemple, la case d’indice 1 du tableau résultat doit
contenir le nombre de 1 présents dans l’autre tableau, la case d’indice 2 compte le
nombre de 2 dans l’autre tableau, etc. (2 pts)
Exemple : soit le tableau :
1 2 1 5 6 9 4 1 3 6 9 5 6 2 7 6

La procédure doit renvoyer le résultat suivant :


3 2 1 1 2 4 1 0 2
1 2 3 4 5 6 7 8 9

2. On souhaite vérifier qu’une grille 3*3 possède les mêmes propriétés que les grilles du
sudoku : tous les chiffres de 1 à 9 sont présents une et une seule fois dans toute la
grille (2 pts)
Exemple :
1 3 2
4 7 6
5 9 8
Est une grille du sudoku
1 2 1
3 9 5
7 4 8
N’est pas une grille du sudoku

5/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs

En vous inspirant de la procédure précédente, écrire une procédure qui permet de vérifier si
une matrice de dimension 3*3 est bien de type sudoku.

Problème 3 :
On se propose dans ce problème de gérer les distances qui relient divers villes, pour
simplifier le travail chaque ville est représentée par un identificateur unique (numéro de ville de
type entier). On vous demande de concevoir les procédures ou fonctions suivantes :

1- Procédure Saisie_Matrice : permet la saisie d’une matrice carrée représentant les différentes
villes et les distances qui les séparent. (Indication : il suffit de saisir la moitié triangulaire
inférieure de la matrice et de déduire les valeurs de la moitié triangulaire supérieure)
Exemple : Matrice de distance entre 6 villes : avec M [i, j] est la distance séparant la ville
numéro i+1 et la ville numéro j+1

Ville 1 2 3 4 5 6
1 0 270 135 65 60 120
2 270 0 135 200 340 80
3 135 135 0 90 230 60
4 65 200 90 0 110 150
5 60 340 230 110 0 290
6 120 80 60 150 290 0

2- a) Procédure Plus_proche : qui affiche les couples de villes les plus proches en distance
parmi les villes représentées dans la matrice (« 1,5 » et « 3,6 » pour l’exemple de la
matrice représentée ci-dessus).
b) Procédure Plus_loin : qui affiche les couples de villes les plus éloignées en distance
parmi les villes représentées dans la matrice (« 5,2 » pour l’exemple de la matrice
représentée ci-dessus).
3- Une société de distribution désire distribuer ses produits dans 3 villes différentes à partir
de la ville numéro 1, proposez une procédure « Meilleur_itinéraire », qui accepte les
numéros des villes aux quelles il faut délivrer les produits et affiche le meilleur itinéraire
qu’il faut suivre.
Exemple : pour la matrice ci-dessus, Meilleur_itinéraire (2, 4, 5) affiche :
« Le meilleur itinéraire est d’aller de la ville 1 à la ville 5, puis de la ville 5 à la ville 4 et
enfin de la ville 4 à la ville 2 (1, 5, 4, 2) avec un coût total de 370 km ».
Indication : il existe 6 chemins possibles qu’il faut calculer et choisir le minimum (pour
l’exemple des villes 2, 4 et 5 les six chemins sont : « 1, 2, 4, 5 » ; « 1, 2, 5, 4 » ; « 1, 4, 2,
5 » ; « 1, 4, 5, 2 » ; « 1, 5, 2, 4 » ; « 1, 5, 4, 2 »)
4- L’itinéraire reliant les villes « i, j » est bloqué par le fait d’inondation, sachant qu’aucune
autre ville n’est située sur cet itinéraire bloqué proposez une procédure qui modifie la
valeur de distance entre ces deux villes prises en paramètre par la meilleure distance
qu’on peut trouver en allant par une seule ville intermédiaire.
Exemple : pour un itinéraire coupé entre les villes « 2,3 » la procédure remplace
dans la matrice ci-dessus la distance 135 par la valeur 140 car c’est le minimum de
kilométrage qu’on puisse faire pour aller de la ville 2 à la ville 3 et ce en passant par la
ville 6

6/3
Module : Programmation C STICL1 C 20212022 TP Recap N°2 : Les
pointeurs
5- Le poids de chaque ville est défini par la moyenne de distance le séparant des autres
villes et est donné par la formule suivante :
N
P(i) = (∑ d (i, j)) div (N-1). P(i) est le poids de la ville i, d (i, j) est la distance séparant
i=1

la ville i de la ville j.
Proposer une procédure qui permet de remplir un tableau de poids de distances à partir
d’une matrice de distance donnée (à la case i du tableau correspond la valeur de poids de
la ville i). (2 pts)
Tableau de poids dégagé de la matrice donnée ci-dessus :
130 205 130 123 206 140

6- Proposer une procédure permettant de créer un tableau d’indices de villes trié selon poids
à partir du tableau des poids de villes.
Le tableau engendré par cette procédure à partir de tableau de poids de la
question 5 :
5 2 6 3 1 4

7- Ecrire le programme principal dans lequel vous déclarez les structures de données
adéquates et qui fait appel à toutes les procédures précédentes.

7/3

Vous aimerez peut-être aussi