0% ont trouvé ce document utile (0 vote)
73 vues7 pages

TP 7

Transféré par

z.laflahi9525
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 DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
73 vues7 pages

TP 7

Transféré par

z.laflahi9525
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 DOCX, PDF, TXT ou lisez en ligne sur Scribd

Ecole Supérieure de Technologie d'Essaouira D.U.

T Info & IDSD


Année 2023-2024
Matière : Programmation (Langage C)
TP N°:7

1. Soit le programme :
int main()
{
int *ptr, x;
ptr = &x;
*ptr = 0;
printf(" x = %d\t *ptr = %d\n", x,*ptr );
*ptr += 5;
printf(" x = %d\t *ptr = %d\n", x,*ptr );
(*ptr)++;
printf(" x = %d\t *ptr = %d\n", x,*ptr );
return 0;
}
Quels résultats fournit ce programme?

2. Soit le programme:

main(){
int a=10;
int *pa;
int **ppa;
pa = &a;
ppa = &pa;
}
Que valent les expressions suivantes &a, *pa, &pa, *ppa, **ppa , &ppa?
Parmi les expressions précédentes, les quelles désignent la même la valeur que celle contenue
dans a, pa et ppa?

3. Soit le programme :
int main()
{ int arr[10] = {10,1,2,3,5,7,8,9,0};
int *p = arr;
printf("*p=%d\n", *p);
++*p;
printf("*p=%d\n", *p);
p += 2;
printf("*p=%d\n", *p);

int*ptr=p;
while(ptr<p+5){
printf("*ptr=%d\t", *ptr);
ptr++;}
return 0;
}
Quels résultats fournit ce programme?
4- Dans le programme suivant, rayez les lignes illégales (erreurs). Qu'est ce qui s'affiche ?
main( ) {
int i = 0; int *p;
float x = 3.14;
float *f;
p = &i;
*f = 666;
f = &x;
*f = *p;
*p = 34;
p=f;
*p = *p + 1;
printf( "%d %f\n", i, *f ); }

5. Soit le programme :
#include <stdio.h>
int main()
{ float a[4] = {2.2,1.5,1,3};
float*p = &a[1];
printf(" p= %d\t*p=%.2f\n", p,*p);
p++;
printf("*p = %.2f\n", *p);
p--;
printf("*p= %.2f\n", *p);
char str[10] = "Bonjour";
char *q =str+3 ;
printf("*q= %c\n", *q);
q++;
printf("*q= %c\n", *q);
q--;
printf("*q= %c\n", *q);
char c = 'a';
char *r = &c;

return 0;}

Quels résultats fournit ce programme?

Exercice 0 :
Ecrire un programme dans lequel vous :
• Déclarez un entier i et un pointeur p sur un entier,
• Initialisez l’entier i par une valeur arbitraire et pointez le pointeur p sur i,
• Modifiez l’entier pointer par p (en utilisant p et non i)
• Imprimez la valeur de i et de p

Exercice 1 : On considère que les déclarations suivantes ont été faites :


int a;
char tab[10];
Une expression avec pointeurs (resp. sans pointeurs) vous est donnée, vous devez la réécrire
sans (respectivement avec) l’usage explicite des pointeurs.
1. *(&a)
2. *tab
3. *(tab + 0)
4. (*tab) + 1
5. &(tab[0])
6. &(tab[i])
7. ++tab[i]

Exercice 2: Il est demandé dans cet exercice de représenter en mémoire les données
déclarées dans un programme, ainsi que leurs différentes valeurs, à un moment donné de
l’exécution. Pour cela, vous représenterez l’occupation des données en mémoire dans un
tableau à 3 colonnes comme montré ci-dessous :
identificateur adresse valeur
a ? ?
... ... ...

Pour déterminer les adresses, on fera les approximations suivantes :


– les données sont réservées en mémoire dans l’ordre de leur déclaration
– la première adresse démarre à 10001
– l’architecture est 32 bits
Le programme est donné ci-dessous. Notez que le programme fait une utilisation abusive des
pointeurs, l’objectif étant simplement de vous familiariser avec la syntaxe et la sémantique
des instructions manipulant des pointeurs.

#include <stdlib.h>
#include <stdio.h>

main(){
int a = 10;
int b = 5;
int tab[3] = {1,2,3};
int *p_tab;
}
• Représentez l’occupation mémoire ?
• On ajoute au programme les instructions suivantes :
tab[0] = a;
*(tab + 1) = b;
p_tab = tab + 2;
Représentez l’occupation mémoire ?
3) Maintenant on ajoute au programme les instructions suivantes :
*p_tab = *(p_tab - 1);
- -p_tab;
*p_tab = *(p_tab- 1);
- - p_tab;
*p_tab= *(p_tab + 2);
Représentez l’occupation mémoire ?

Exercice 3 : Soit le programme :


main{
int A = 1, B=2, C=3;
int *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
P1=&A;
*P2=*P1/=*P2;
}
Quels résultats fournit ce programme? Donnez la valeur de chaque
variable?

Exercice 4 : Soit le programme :


#include <stdio.h>

void Echange0 (int*x, int*y)


{ int *t = x;
x = y;
y = t;}

void Echange1 (int*x, int*y)


{ int t = *x;
*x = *y;
*y = t;}

void Echange2 (int*x, int*y)


{ int *t = x;
*x = *y;
*y = *t;}

int main()
{ int a,b; a=10; b=13;

Echange0(&a, &b);
printf("%d %d\n", a, b);
Echange1(&a, &b);
printf("%d %d\n", a, b);
Echange2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}

Que fait ce programme?


Exercice 5 : Ecrire de deux façons différentes, un programme qui lit 10
nombres entiers dans un tableau avant d’en rechercher le plus grand et le
plus petit :
• En utlisant le formalisme tableau
• En utilisant le formalisme pointeur

Exercice 6 : Soit le programme :

#include<stdio.h>
#define dim 10
main (){
int tab[dim] = { 6,7,8,9,1,0,3,2,5,4 };
int i,j,tmp;
for(i=0;i<dim-1;i++)
for (j=i;j<dim;j++)
if (tab[i]>tab[j]) {
tmp=tab[i];
tab[i]=tab[j];
tab[j]=tmp; } }

• Que fait ce programme?


• Quel résultat fournit ce code ?
• Réécrire ce programme en utilisant, dans le corps de la boucle de tri, un pointeur p
pointant sur le premier élément du tableau tab, au lieu de tab[x]. Le programme devra
contenir la déclaration ainsi que l’instruction suivantes:
int *p;
p=tab;

Exercice 7 : Écrire une fonction qui permet de rechercher dans un tableau d’entiers tab une
valeur val.
void chercherVal (int tab[], int n, int val, 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 8: É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.

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.
NB: utiliser nb_occurrence pour trouver nb, nombre de répétition de zéro dans le tableau, puis
appeler supprimer_nul nb fois.

Exercice 9:
É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 10 : Soit le code


main(){
char msg[]="Bonjour !";
char *p;
for (p=msg; *p!=’\0’;p++) printf("%c",*p);
}
Que fait ce programme ?

Exercice 11:
1) Ecrire une fonction qui fournit en retour la somme des valeurs d’un tableau de
flottants dont la dimension est fournie en argument.
• Ecrire une fonction qui fournit en retour la somme des valeurs d’un tableau de
flottants deux indices dont les dimensions sont fournies en argument

Exercice 12: 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 13 : 1) Soit le programme :


main(){
int i;
char *chaine;
chaine = "chaine de caracteres";
for (i = 0; *chaine != '\0'; i++)
chaine++;
printf("nombre de caracteres = %d\n",i);
}
Quels résultats fournit ce programme?

2) Ecrire un programme qui affiche le code ASCII de chaque lettre de votre prénom.
3) Ecrire un programme qui saisit successivement chaque caractère de votre prénom puis les
affiches.

Vous aimerez peut-être aussi