Informatique 2 : Programmation en langage C.
DL 0 : Les pointeurs et allocation dynamique
Exercice 1:
// création
int i;int *p;
// initialisation
i = 6;p = &i;
//afficher la valeur de i
printf("avant: %d \n", i);
//Modifier l'entier pointé par p (en utilisant p)
*p = 17;
//Afficher la valeur de i.
printf("Apres: %d \n", i);
[Link] Mourad
Exercice 2:
1-
int t[4] = {10, 20, 30, 40};
int *ad[4];
// t+i adresse de i eme element.. <==>&t[0]+i
for (int i = 0; i < 4; i++) ad[i] = t + i;
for (int i = 0; i < 4; i++) printf("%d\n", *ad[i]);
//10
//20
//30
//40
printf("%d %d \n", *(ad[1] + 1), *ad[1] + 1);
//30 21
2-
[Link] Mourad
Exercice 3:
Ecrire de deux façons différentes, un programme C qui lit 10 nombres entiers
dans un tableau avant d'en chercher le plus grand (Max) et le plus petit (Min).
a) en utilisant uniquement le formalisme tableau
//Déclarations
int A[10];//tableau donné de 10 éléments
int max; //valeur maximale à calculer.
int min; //valeur minimale à calculer.
//Saisie des données.
printf("Dimension N du tableau A : ");
for (int i=0; i<10; i++){
printf("Elément %d : ", i);
scanf("%d", &A[i]);
}
//calcul de Max et de Min de tableau A.
max=A[0];min=A[0];
for (int i=0; i<10; i++){
if (A[i]>max) max=A[i];
if (A[i]<min) min=A[i];
}
//Affichage de résultats
printf("Le min est %d\n",min);
printf("Le max est %d\n",max);
[Link] Mourad
b) en utilisant le formalisme pointeur à chaque fois que cela est possible
//Déclarations
int A[10]; //tableau donné de 10 éléments
int max; //valeur maximale à calculer.
int min; //valeur minimale à calculer.
int *P ; //pointeur
//Saisie des données.
printf("Dimension N du tableau A : ");
for (P=A; P<A+10; P++){
printf("Elément %d : ", P-A);scanf("%d", P);}
//calcul de Max et de Min de tableau A.
P=A;max=*P;min=*P;
for (P=A+1; P<A+10; P++){
if (*P>max) max=*P;
if (*P<min) min=*P;}
//Affichage de résultats
printf("Le min est %d\n",min);
printf("Le max est %d\n",max);
[Link] Mourad
Exercice 4:
Ecrire un programme C qui lit deux tableaux d'entiers A et B et leurs dimensions
N et M au clavier et qui ajoute les éléments de B à la fin de A.
//Déclarations
int A[100], B[50]; //tableaux
int N, M; //dimensions des tableaux */
int I; //indice courant
//Saisie des données
printf("Dimension du tableau A (max.50) : ");
scanf("%d", &N );
for (I=0; I<N; I++){
printf("Elément %d : ", I);
scanf("%d", A+I);}
printf("Dimension du tableau B (max.50) : ");
scanf("%d", &M );
for (I=0; I<M; I++){
printf("Elément %d : ", I);
scanf("%d", B+I);}
//Affichage des tableaux
printf("Tableau donné A :\n");
for (I=0; I<N; I++)printf("%d ", *(A+I));
printf("\n");
printf("Tableau donné B :\n");
for (I=0; I<M; I++){printf("%d ", *(B+I));}
printf("\n");
//Copie de B à la fin de A
for (I=0; I<M; I++){
*(A+N+I) = *(B+I);}
N += M;//Nouvelle dimension de A
//Edition du résultat
printf("Tableau résultat A :\n");
for (I=0; I<N; I++)
printf("%d ", *(A+I));
[Link] Mourad
Exercice 5:
Ecrire un programme C qui range les élément d'un tableau dans l'ordre inverse.
//Déclarations
int *A=NULL; //tableau donné
int N; //dimension du tableau
int temp; //pour la permutation
int *P1, *P2; //pointeurs d'aide
//allocation dynamique
printf("Dimension du tableau: ");
scanf("%d", &N);
A=malloc(N*sizeof(int));
//Saisie des données
for (P1 = A; P1 < A + N; P1++) {
printf("Elément %d : ", P1 - A);
scanf("%d", P1);}
//Inverser la tableau
for (P1=A, P2=A + (N - 1); P1 < P2; P1++, P2--) {
temp = *P1;
*P1 = *P2;
*P2 = temp;
}
//Affichage
for (P1 = A; P1 < A + N; P1++){
printf("%d ", *P1);
}
free(A);
[Link] Mourad