Vous êtes sur la page 1sur 3

Langage C

TD/TP n° 3: Vecteurs, tableaux, pointeurs et chaînes de caractères


Dr KENMOGNE EDITH BELISE

Exercice 1: Questions de cours sur les tableaux


1) Schématiser chaque déclaration suivante : int vect[5] ; int tab[4][5] ;
char voyelles[6]={'a', 'e', 'i', 'o', 'u', 'y'} ; int matrice2D[2][2]={1, 2, 3, 4}

Exercice 2 : What does each of the following program calculate (or do) ?
#include <stdio.h> #include <stdio.h> #include <stdio.h>
#define SIZE 5 #define SIZE 5 #define SIZE 5
int main () { int main () { int main () {
int i , j; int i , j; int i ;
int A[SIZE][SIZE] ; int A[SIZE] ; int A[SIZE], B[SIZE], C[SIZE] ;
printf("Enter the values of A\n");
for(i=0; i<SIZE; i++) for(i=0; i<SIZE; i++) for(i=0; i<SIZE; i++) scanf("%f", &A[i]) ;
for(j=0;j<SIZE;j++) A[i]=i ; printf("Enter thev alues of B\n");
A[i][j]=0 ; for(i=0; i<SIZE; i++) scanf("%f", &B[i]) ;
} } for(i=0; i<SIZE; i++) C[i]=A[i] + B[i] ;
return 0;
Program a Program h } Program c

Exercice 3: Affichage des valeurs d'un vecteur dans l'ordre inverse


Ecrire un programme qui lit vingt nombres flottants (float) et les stocke dans un vecteur, puis
les affiche dans l'ordre inverse.

Exercice 4 : Nombre d'occurrences des chiffres


Ecrire un programme qui lit une suite de chiffres terminée par le marqueur -1 et affiche le
nombre d'occurrences de chaque chiffre. On utilisera un vecteur de taille 10 (il y dix
chiffres!) pour faire le décompte du nombre d'occurrences de chaque chiffre.

Exercice 5 : Nombre d'occurrences des lettres de l'alphabet français


Ecrire un programme qui lit une suite de lettres terminée par le marqueur 1 et affiche le
nombre d'occurrences de chaque lettre de l'alphabet français. On utilisera un vecteur oc de
taille 26 pour faire le décompte du nombre d'occurrences de chaque lettre. On rappelle que
dans le langage C, un code est affecté à chaque caractère de manière unique. Le code d'un
caractère est un entier. Ainsi, dans le langage C, l'expression 'a' + 'b' représente la somme
des codes des caractères 'a' et 'b'. Ainsi, le décompte du nombre d'occurrences de la lettre 'o'
pourrait se faire dans oc['o' – 'a'].

Exercice 6 : Produit scalaire


Ecrire un programme qui lit les coefficients de deux vecteurs de taille N=5 et retourne la
valeur de leur produit scalaire.

Exercice 7 : Matrice identité


Déclarer une matrice carrée d'ordre N=10 et l'initialiser à la matrice identité.

Exercice 8 : Egalité matricielle


Ecrire un programme qui lit les coefficients de deux matrices carrées d'ordre N=3 et dit si
elles sont égales. Deux matrices sont égales si elles ont exactement les mêmes coefficients.

Exercice 9 : Produit matrice-vecteur


Ecrire un programme qui lit les coefficients d'une matrice carrée A d'ordre N=10 et d'un
vecteur X de taille N et affiche le résultat du produit matrice-vecteur AX.

Exercice 10 : Produit matrice-matrice


Ecrire un programme qui lit les coefficients de deux matrices carrées A et B d'ordre N=10 et
affiche le résultat du produit matriciel AB.

Exercice 11 : Nombre de coefficients égaux


Ecrire un programme qui lit les coefficients de deux matrices carrées A et B d'ordre N=10 et
affiche le nombre de coefficients égaux.

Exercice 12 : Questions de cours sur les pointeurs


1) Donner la différence entre les deux opérateurs préfixés * et &.
2) Donner la différence entre les deux déclarations suivantes : « int *pt ; int val »
3) Sur la base de la déclaration « float *ptf1, *ptf2 ; float x» schématiser x, ptf1 et ptf2 après
l'exécution de la séquence d'instructions suivante : « x=14.15 ; ptf1=&x ; ptf2=ptf1 ; »
4) Donner la valeur (le contenu) de val après l'exécution du bout de code suivant : « int *pt ;
int val ; val=4 ; pt=&val ; *pt=10 ;»
5) Sur la base de la déclaration « int *pt », laquelle des deux instructions, *pt=4 et pt=4, est
elle correcte ?

Exercice 13 : Questions de cours sur le doublet pointeur-vecteur


On suppose que vect est déclaré comme suit : int vect[5]
1) Schématiser la déclaration « int vect[5]» 2) Quelle est la nature de vect[i] ?
3) Quelle est la nature du contenu de vect? 4) Quelle est l'adresse de vect[i] (0<=i<=4) ?
5) Que désigne *(vect+i), où 0<=i<=4 ? 6) Que désigne (vect+i), où 0<=i<=4 ?
7) Que désigne &(vect[i]), où 0<=i<=4 ? 8) Peut on modifier la valeur de vect[i](0<=i<5)?
9) Peut on modifier le contenu de vect ? 10) Donner la différence entre int *t1 et int t2[5]

Exercice 14 : Expressions équivalentes sur le doublet pointeur-vecteur


1) On suppose que vect est déclaré comme suit : int vect[5]
1.1) Donner deux syntaxes différentes pour désigner l'adresse de la case i de vect.
1.2) Donner deux syntaxes différentes pour désigner le contenu de la case i de vect.
2) Donner une expression équivalente à chacune des expressions suivantes sachant que les
variables i et tab sont déclarées comme suit:
int i;
char tab[10];
2.1) *tab 2.2) *(tab + 0) 2.3) (*tab) + 1 2.4) &(tab[0]) 2.5) &(tab[i]) 2.6) ++tab[i]

Exercice 15 : Questions de cours sur le doublet pointeur-tableau-2D


On suppose que tab est déclaré comme suit : int tab[4][5]
1) Schématiser la déclaration « int tab[4][5]» 2) Quelle est la nature du contenu de tab ?
2) Que désigne tab[i][j], 0<=i<4 et 0<=j<5 ? 3) Que désigne tab[i] ?
4) Que désigne (tab[i]+j), 0<=i<4 et 0<=j<5 ? 5) Que désigne *(tab[i]+j) ?
6) Peut on modifier la valeur de tab[i][j] ? 7) Que désigne &(tab[i][j]) ?
8) Peut on modifier la valeur de tab[i] ? 9) Peut on modifier la valeur de tab ?
Exercice 16 : Expressions équivalentes sur le doublet pointeur-vecteur
On suppose que tab est déclaré comme suit : int tab[4][5]
1) Donner deux syntaxes pour désigner l'adresse de début de la ligne i (c'est à dire l'adresse
de la première case de la ligne i).
2) Donner deux syntaxes différentes pour désigner l'adresse de la case située à l'intersection
de la ligne i et de la colonne j de tab.
3) Donner deux syntaxes différentes pour désigner le contenu de la case située à
l'intersection de la ligne i et de la colonne j de tab.

Exercice 17 : Questions de cours sur les chaînes de caractères


On rappelle que dans le langage C, une chaîne est représentée par un tableau de caractères
terminé par le caractère nul '\0'.
1) Schématiser chaque déclaration suivante : char voyelles1[6]={'a', 'e', 'i', 'o', 'u', 'y'} ;
char voyelles2[10]=''aeiouy'' ; char voyelles3[ ]=''aeiouy'' ;
2) Detecter et corriger les erreurs dans les déclarations suivantes: char str[ ]='123'; char
str1[ ]={ ''1'', '2'' , '3''}
3) Donner ce que le bout de code suivant affiche à l'écran.
char str1[ ]= '' abc'' ;
char str2[ ]= ''abc'' ;
if (str1==str2) printf(''elles sont égales'') ;
else printf(''elles ne sont pas égales'') ;
4) L'opérateur de comparaison == permet-il de tester l'égalité de deux chaînes de caractères ?
5) Donner une fonction prédéfinie qui dit si deux chaînes de caractères sont égales.
6) Quel est le type de la valeur retournée par la primitive malloc ?
7) Un seul des deux bouts de code suivant contient une erreur : « char *pt_char ;
pt_char[1]='a' ; » et « char str[5] ; str[1]='a' ;». Détecter cette erreur et expliquer comment
corriger le bout de code erroné.
8) Le tableau voyelles1 de la question 1 respecte-il la syntaxe d'une chaîne de caractères ?
Sinon, corriger cette déclaration pour que voyelles1 respecte ladite syntaxe.
9) On considère les tableaux voyelles1 et voyelles2 déclarés à la question 1. Pourquoi le
bout de code « strlen(voyelles1) » ne peut pas s'exécuter correctement ? Le bout de code
« strlen(voyelles2) s'exécute-il correctement ?
10) Pourquoi le bout de code suivant ne peut pas s'exécuter correctement : « char *str ;
scanf(''%s'', str);». Expliquer comment corriger ce bout de code.
11) Déclarer un tableau 2D tab de manière que les sous-tableaux tab[0], tab[1] et tab[2]
correspondent respectivement aux chaînes de caractères ''jean'', 'paul'' et 'claude''.

Exercice 18 : Nom le plus long


Ecrire un programme qui lit une serie de noms terminée par le marqueur "fin" et affiche le
nom le plus long.

Exercice 19 : Création dynamique d'un vecteur


1) Ecrire un programme qui lit la valeur d'un entier n au clavier, crée dynamiquement un
vecteur de taille n et initialise ses composantes 0. On rappelle que malloc retourne un
pointeur (char*) sur un tableau de caractères. Ici, il faut faire un cast pour le convertir en un
pointeur (int*) sur un tableau de int.
2) Donner la routine permettant de libérer un espace mémoire obtenu par allocation
dynamique.

Vous aimerez peut-être aussi