0% ont trouvé ce document utile (0 vote)
9 vues18 pages

Exercices de Programmation en C

Ce document contient une série d'exercices de programmation en C, couvrant des concepts tels que les pointeurs, les opérations sur les tableaux, la gestion de la mémoire, et les structures de données. Chaque exercice présente des questions ou des tâches spécifiques à réaliser, allant de la simple sortie de programme à la manipulation de polynômes et de listes chaînées. Les exercices sont organisés par année et incluent des défis variés pour tester les compétences en programmation C.

Transféré par

princiliaperle
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)
9 vues18 pages

Exercices de Programmation en C

Ce document contient une série d'exercices de programmation en C, couvrant des concepts tels que les pointeurs, les opérations sur les tableaux, la gestion de la mémoire, et les structures de données. Chaque exercice présente des questions ou des tâches spécifiques à réaliser, allant de la simple sortie de programme à la manipulation de polynômes et de listes chaînées. Les exercices sont organisés par année et incluent des défis variés pour tester les compétences en programmation C.

Transféré par

princiliaperle
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

Fiche de TD Programmation en C

EXERCICE I (2020)
1- Quelle est la sortie du programme suivant ?
#/ include < stdio.h >
main()
{
int *p, *q, l;
p = (int*)100;
q = (int*)200;
i = q - p;
printf(“% d", i);
}
2- Définir une fonction pointeur qui prend en argument un caractère du type pointeur qui ne
retourne rien.

3- Comment inclure un fichier d'entête appelé sysheader.h dans le fichier source dans C ?

4- Qu'affiche le programme suivant après exécution ?

int y[4] = {6,7,8,9};


int *ptr = y+2;
printf("% d\n ", ptr[1]);
/*ptr + 1 = ptr[1]*/

5- Lorsqu'il est appliqué à une variable, que produit l'opérateur unaire "&" ?

6- Quelle est la différence entre "printf( ... ) " et "sprintf( ... )"?

7- Donner l'équivalence de l'expression pointeur pour référencer le même élément

a[i][j][k][l].
EXERCICE 2 (2023)

1. Quel est le résultat de l'opération suivante ?

main()

int a=20, b=35;

a = b++ + a++;

b = ++b + ++a;

printf("%d %d\n", a, b);

2. Quelle est la sortie du programme C suivant ?

#define AREA (x)(3.14*x*x)

main()

float rl = 6.25. r2 = 2.5, a;

a = AREA(rl):

printf("\n Area of the circle is %f",a);

a = AREA( r2);

printf(" \n Area of the circle is %f", a);

3. Quelles sont les différences entre "calloc( ... )" et "malloc( ... )"?

4. Quels sont les avantages et les inconvénients de la classe de stockage externe ?

5. Quel est le pointeur valeur et adresse ?


6. Quelles sont les différences classes de stockage dans C ?

7. Quelles sont les caractéristiques des tableaux dans C ?

EXERCICE 3 (2024)

1. Trouver le résultat du programme en C suivant :

main()

int x=20, y = 35;

x= y++ + x++;

y=++y + ++x;

printf("%d%d\n",x,y);

2. En quoi les spécificateurs de format %e et %f de printf( ) diffèrent-ils dans leur traitement


des nombres à virgule flottante ?

3. Quel est le problème avec le programme suivant en supposant que l'appel à malloc n'échoue
pas ?

char prt1 [ ] ="Hello World";

char ptr2 = malloc(5);

prt 2 = ptr1;

4. Comment accéder à une variable à partir d'un autre fichier ?

5. En quoi la définition de la variable diffère-t-elle de la déclaration de variable ?

6. Qu'est-ce qu'une fonction statique ?

7. Qu'est-ce qu'un opérateur de module ?


EXERCICE 4 (2011)

Écrire un programme en C qui demande un nombre compris entre 10 et 20, jusqu'à ce que la
réponse convienne. En cas de réponse supérieur à 20, on fera apparaître un message : « Plus
petit ! », et inversement, « Plus grand ! » si le nombre est inférieur à 10.

Exercice 5 (2011)

Écrire un programme en c qui demande successivement 20 nombres à l'utilisateur, et qui lui


dise ensuite quel était le plus grand parmi ces 20 nombres :

Entrez le nombre numéro 1 : 12

Entrez le nombre numéro 2 : 14

Entrez le nombre numéro 20 : 6

Le plus grand de ces nombres est 14

Modifiez ensuite le programme pour que le programme affiche de surcroît en quelle position
avait été saisi ce nombre :

C'était le nombre numéro 2.

Exercice 6 (2011)

Réécrire le programme précède, mais cette fois-ci on ne connaît pas d'avance combien
l'utilisateur souhaite saisir de nombres la saisie des nombres s'arrête lorsque l'utilisateur entre
un zéro.

Exercice 7 (2011)

En utilisant le langage c, lire la suite des prix (en FCFA entiers et terminée par zéro) des achats
d'un client. Calculer la somme qu'il doit, lire la somme qu'il paye, et simuler la remise de
monnaie en affichant les textes "500FCFA", "200FCFA" et "100FCFA" autant de fois qu'il y a
de coupures de chaque sorte à rendre.
Exercice 8 (2011)

Écrire un programme c qui permet de connaître ses chances de gagner au tiercé, quarté, quinté
et autres impôts volontaires. On demande a l'utilisateur le nombre de cheveux partants, et le
nombre de chevaux joués. Les deux messages affiches devront être :

 Dans l'ordre : une chance sur X de gagner,


 Dans le désordre : une chance sue Y de gagner

X et Y nous sont données par la formule suivante, si n est le nombre de chevaux partants et p
le nombre de chevaux joues (on rappelle que le signe « ! » signifie "factorielle") :

!
 𝑋
!
!
 𝑌
! !

NB : ce programme peut être écrit d'une manière simple, mais relativement peu performante.
Ses performances peuvent être singulièrement augmentées par une petite astuce. Vous
commencerez par écrire la manière la plus simple, puis vous identifierez le problème, et écrirez
une deuxième version permettant de la résoudre.

Exercice 9 (2010)

Écrire un programme en c permettant à l'utilisateur de saisir un nombre quelconque de valeurs


qui devrons être stockées dans un tableau. L'utilisateur doit donc commencer par entrer le
nombre de valeur qu'il compte saisir. Il effectuera ensuite cette saisi. Enfin, une fois la saisie
terminer, le programme affichera le nombre de valeurs négatives et le nombre de valeurs
positives.

Exercice 10 (2010)

Écrire un programme C fact prenant en entrée un entier n et renvoyant en sortie le factoriel du


nombre tel que illustrer comme suit n! = n . (n-1) ... 2 . 1

$ fact 5 = 120
Exercice 11 (2006)

Le but de cet exercice est d'implémenter les polynômes à cœfficients entiers sous la forme de
lis teschaînées en regardant un polynôme comme la liste de ses monômes non nuls, rangés dans
l'ordre décroissant de leurs degrés.

Pour cela, on définit un type monome à l'aide d'une structure :

struct Struct Monome

int coef ;

int deg ;

struct Struct Monome* suivant ;

Typedef StructMonome*suivant ;

Un polynôme sera vu comme un pointeur sur son monomer de plus haut degré (le polynôme
nul sera représenté par le pointeur NULL). D'ou la définition du type polynome :

typedef monome*polynome ;

Ainsi, par exemple, le polynôme P = - X à la puissance 12 + 5 X à la puissance 3 + 3 sera


représenté par la liste chaînée :

(Schéma à faire à la main)

a) Ecrire une fonction CreerMonome qui prend en argument deux entiers a et n, qui crée un
monôme de coefficient de valeur a, de degré n et dont le champ suivant vaut NULL et qui
retourne un pointeur sur ce monôme.

b) Ecrire une fonction Deriver qui prend en argument un polynôme et retourne le polynôme
dérivé.

c) Ecrire une fonction Somme qui prend en argument deux polynômes P et Q, et qui retourne
le polynôme somme de P et Q.
d) Ecrire une fonction ProduitMonome qui prend en argument deux entiers a et n et un
polynôme P et qui retourne le polynôme produit du monôme

e) Ecrire une fonction Produit qui prend en argument deux polynôme P et Q, et qui retourne le
polynôme produit de P et Q.

Remarque : si P <>0(P non nul), il s'écrit ; deg (R) < n et on a :

P x Q = ( a fois X à la puissance n + R ) x Q = a fois X à la puissance n fois Q + R x Q

Exercice 12 (2006)

On voudrait présenter un module générique curliste traitant des listes avec curseur. Un curseur
désigne une position entre deux éléments d'une liste. Les fonctionna lités de ce module sont :

- La création et la destruction d'une liste avec curseur.


- La gestion du déplacement du curseur (aller au début ou à la fin de la liste, avancer ou
reculer d'un cran dans la liste) ;
- L'insertion d'un élément devant le curseur et la suppression de l'élément suivant le
curseur ;
- De donner la valeur de l'élément suivant le curseur ;
- De donner les renseignements sur la position du curseur (être au début, être à la fin) ;
- De donner le cardinal de la liste.

1- En appliquant le principe de masquage de l'implémentation, définir l'interface du module


curliste.

2- En supposant que le programme listing.c fasse appel au module curliste, écrire. Son
module making file. On souhaite implémenter les curlistes à l'aide de liste circulaire
doublement chaînée. Au départ, la liste sera composée d'un élément initial ayant pour
successeur le début de la liste (initialement lui-même) et pour prédécesseur la fin de la liste
(initialement lui-même).

3- Après avoir dessiné la structure de données implémentant une curliste à 4 éléments (ne pas
oublier la curseur), écrire les déclarations des types du fichier source du module curliste.

4- Ecrire le code des fonctions créations et de destruction d'une curliste.


5- Ecrire le code de la fonction d'insertion d'un élément devant le curseur.

6- Ecrire le code de la fonction de suppression de l'élément suivant le curseur.

7- On désire travailler avec plusieurs curseurs. Préciser les algorithmes de suppression d'un
élément et de destruction d’une curliste.

Exercice 13 (2012)

Écrire un programme en c qui prend un entier n > 0 de l'utilisateur, et donne comme résultat la
somme :

2 4 6 ⋯ 𝑛 𝑠𝑖 𝑛 𝑒𝑠𝑡 𝑝𝑎𝑖𝑟
𝑆
1 3 5 ⋯ 𝑛 𝑠𝑖 𝑛 𝑒𝑠𝑡 𝑖𝑚𝑝𝑎𝑖𝑟

Le programme ne doit pas accepter une valeur négative de n et doit afficher un seul résultat
selon la valeur de n et non pas les 2 sommes.

Exercice 14 (2012)

Une classe contient 200 places réparties en 10 rangées et 20 colonnes. Chaque élève possède
un numéro entre 1 et 200. Lors d'un examen, on place les élèves sur les places selon leur numéro
en commençant par la première rangée puis la deuxième et ainsi de suite comme le montre le
tableau suivant :
Écrire un programme c qui prend de l'utilisateur un entier entre 1 et 200 puis affiche dans quelle
rangée et dans quelle colonne élève doit se placer. Par exemple, si n=35, l'élève doit se placer
sur la 2e rangée de la 15e colonne.

Exercice 15 (2012)

a. Écrire une procédure LireTab qui permet de remplir un tableau T de n éléments entiers
donnés par l'utilisateur de sorte que les éléments soient donnés par ordre croissant. La procédure
ne doit pas accepter des valeurs inférieures aux valeurs déjà introduites. On suppose en plus
que n > 1.

b. Écrire une procédure ErireTab qui permet d'afficher les éléments d'un tableau de n éléments.

c. Écrire une procédure Fusion qui permet de prendre les éléments de deux tableaux triés et de
les mettre dans un troisième tableau de sorte que ce dernier soit encore trié. (Il ne faut pas
remplir le tableau puis le trier après).

d. Utiliser les procédures précédentes pour écrire un programme en c permettant de prendre de


l'utilisateur deux tableaux de 100 entiers triés puis afficher l'ensemble formé par les éléments
des deux tableaux d'une manière triée.

Exercice 16 (2012)

1. La langage C est un langage

(a) Typé

(b) Compilé

(c) Semi-compilé

(d) Interprété

2. Parmi les langages suivants, lequel est orienté « objet » ? :

(a) Pascal
(b) C

(c) C++

(d) JAVA

3. En langage C parmi les identificateurs suivants, quels sont ceux qui sont invalides :

(a) $ un-prix

(b) -une-somme

(c) une somme

(d) ? 1prix

4. Considérons la portion de code suivante :

int n=5;

print("%d",n);

(a) Le résultat de l'exécution de ce code produit l'affichage du nombre 5.

(b) Le résultat de l'exécution de ce code produit l'affichage du nombre .5E+01.

(c) Le résultat de ce code produit un résultat indéterminé.

(d) Le résultat de ce code produit l'affichage de la lettre

5. Considérons la portion de code suivant :

int n=5;

printf("%d",&n);

(a) le résultat de l'exécution de ce code produit l'affichage du nombre 5.

(b) Le résultat de l'exécution ce code produit l'affichage du nombre .5E+01.

(c) Ce code produit une erreur à la compilation.

(d) Le résultat de ce code produit l'affichage de la lettre n


6. Considérons la portion de code suivante :

int n=5;

Scanf(« %d fg,&n)

(a) Ce code provoque toujours une erreur à l'exécution.

(b) Dans des conditions raisonnables ce code réalise correctement la saisie de l'entier
taper par l'utilisateur

(c) Ce code provoque une erreur lors de la compilation.

(d) Ce code provoque une erreur qui peut passer inaperçue.

7. Soient deux tableau t1 et t1 déclarés ainsi :

float t1[10], t2[10]

Les instructions suivantes permettent de recopier, dans t1, tous les elements positifs de t2, en
complétant éventuellement t1 par des zéros.

(a) int ij:for (i=0;i<10;i++)t1[i]=0; for (i=0j=0;j<10;j++) if(t2[j]>0)t1[i++]=t2[i];

(ok)

(b) int i,j : for (i=0;i<10;i++)t1[i]=0; for (j=0;j<10;j++) if (t2[j]>0)t1[i]=t2[i];

(ok)

(c) int ij: for (j=0;j<10;j++)t1[i]=0; for (j=0;i=0;i<10;i++) if (t2[i]>0)t1[j++]=t2[i];

(ok)

(d) int i,j: for (i=0;i <= 10;i++)t1[i]=0; for (i=0;j=0;j <= 10;j++) if(t2[j]>0)t1[i++]=t2[i];

(ok)

8. Soit le portion d'instruction suivante :

Int n=10, p=5, q=10, r


r=n=(p=q);

printf("n=%d p=%d r=%d\n",np,q,r);

Quels résultats fournira ce bout de code ?

(a) n=10 p=10 q=10 r=1

(b) n=10 p=10 q=10 r=10

(c) n=10 p=5 q=10 r=10

(d) n=10 p=10 q=10 r=0

9. Qu'affirme les instructions suivantes :

int x=9;

int y=x+10;

printf("%d : %d : %d,x,y,y);

(a) 9:19

(b) [Link]

(c) 9 : 19 : %d

(d) %d : %d : %d

10. Quelle est la valeur affichée par le programme suivant :

void fonction (int a[]) {

a[1]=10;

int main(void) {

int Tll={1,2,3};

fonction(T);
print(%d",T[1]);

return 0;

(a) 10

(b) 1

(c) 2

(d) 4

Exercice 17 (2008)

On donne le programme suivant :

#include<stdio.h>

Void main() {

float a,b;

Scant("%f%f",&a,&b);

b= a+b;

a= b-a;

b= b-a;

printf ("Les valeurs actuelles de a est: %f et b est: %f", a,b);

1 Si l'utilisateur saisie au clavier les valeurs successives 12,5 et 5. Que verra -t-il à l'écran à la
fin de l'exécution du programme.

Exercice 18 (2008)

Etant donnée une chaîne de caractères s=C1C2 ... Cn de longueur quelconque neN* ou

Ci e{a,b,c, ... ,z}. On désire calculer la valeur v dite de hachage en utilisant


h(s)=En1 G 2. Ecrire en langage C la fonction h en utilisant les opérations élémentaires addition,
multiplication et décalage.

Exercice 19 (2008)

1. Ecrire un programme qui affiche les éléments d'un tableau d'entiers sur 5 colonnes et autant
de lignes que possible.

2. Compléter ce programme afin qu'il affiche également les adresses de chaque élément.

Exercice 20 (2008)

On souhaite réaliser un programme permettant d'effectuer un certain nombre d'opérations en


calcul matriciel et vectoriel. Concevoir un algorithme en C ou Matlab ou en pascal pour
effectuer chacune des opérations suivantes :

- Produit de 2 matrices
- Somme de 2 matrices
- Produit scalaire de 2 vecteurs

Exercice 21 (2008)

On désire simuler le comportement d'une pile à l'aide d'un tableau à une dimension dont le
contenu est du type « Element ». On limitera la taille maximale de la pile à 100 données.

Indication : vous utiliserez une variable ps qui indiquera à chaque instant le nombre de données
contenues dans la pile. Dans toute la suite, on veillera à la prise en compte des situations
d'exception. Tous les seront écrits en C.

1. Donner l'index du dernier élément mis dans la pile.

2. On se donne un certain nombre de fonctions pour manipuler la pile. Le travail à faire consiste
à écrire toutes ces fonctions qui sont énumérées ci-dessous.
2.1 Donnez les déclarations du tableau qui vont contenir les données et ps l'indicateur de pile.

2.2 Ecrire la fonction pile vide qui remet l'indicateur à O pour montrer qu'il n'y a aucun élément
dans la pile.

2.3 Ecrire la fonction Est Vide qui retourne vrai si la pile ne contient aucun élément et faux
dans le cas contraire.

2.4 Ecrire la fonction Sommet qui retourne l'élément au sommet sans supprimer l'élément en
question.

2.5 Ecrire la fonction Depiler qui retourne l'élément au sommet en le supprimant de la pile.

2.6 Ecrire la fonction Empiler qui place l'élément fourni en paramètre au sommet de la pile.

2.7 En supposant que le type « Element » correspond en fait au type « int », écrit la fonction
main () qui permet de tester toutes les fonctions écrites plus haut. Le corps de main doit
respecter le schéma ci-après :

- Initialiser la pile en la vidant


- Lire les elements au clavier et les mettre dans la pile
- Dépiler progressivement les 4 derniers éléments et les affichés à l'écran
- Affiché le sommet actuel de la pile.

2.8 Simuler (en montrant ce qui sera affiche sur l'écran) l'exécution de votre programme en
supposant qu'entrée l'utilisateur saisie 3 valeurs : 10 ; 5 ; 9

Exercice 22 (2007)

NOTE : On attachera une grande importance à la clarté, à la précision, à la concision de


rédaction. On écrira les programmes en langage C.

La Société Météorologique Nationale (SMN) désire évaluer l'impact des changements


climatiques sur le territoire. Pour cela elle procède à des relevés dans n stations
météorologiques. Chaque station porte un numéro i (0< i < n) et la valeur relevée au cour de la
période est ti. Les valeurs ti > O sont rangées dans un tableau T de n éléments.
Question préliminaire.

Si le problème revient à trouver les k plus grandes valeurs, expliquer littéralement (en français)
les étapes nécessaires pour obtenir le résultat.

Partie I

1. Ecrire la fonction qui donne comme résultat la plus grande valeur relevée.

2. Pour trouver les k stations ayant les valeurs les plus élevées, une bonne approximation du
seuil à dépasser consiste à calculer le barycentre entre le minimum m et le maximum M des ti
(i € [0 ... n]) avec les poids respectifs (n-k) et k.

Ecrire la fonction qui retourne le barycentre.

3. Donner un exemple de tableau de relevées de taille 10 dont plus de 6 valeurs sont supérieures
au barycentre.

On traite le cas général en supposant que tous les ti sont éventuellement distincts.

Partie II

4. Ecrire la fonction qui retourne la k-ième plus grande valeur (on travaillera dans le tableau T
pour des raisons d'efficacité de l'algorithme)

5. Après avoir dégagé les opérations dominantes, donner la complexité de la fonction


précédente.

Partie III

Le nombre de stations etant grand, on cherche a optimiser le calcul des k plus grandes valeurs,
en faisant toujours l'hypothèse que tous les ti sont distincts.

6. On procède comme suit : on choisit une station ; soit v = ti; on essaie de la valeur de cette
station à sa position /en réordonnant le tableau de telle manière que tjest supérieur à ti pour j
supérieur à i; si k = i on a terminé, sinon on recommence à chercher le k-ième à gauche ou à
droite et i selon le cas. Comment appelle-t-on cette opération ?

7. Soient g et d deux entiers tels que 0<g<d<n, soit v = tg . Ecrire une fonction qui reordonne
le tableau T entre les indices g et d et retourne la position i de v. A la fin la de l'opération tj> v
pour g

g≤j<iet tj< v pour i< j <d.

8. Ecrire une fonction qui donne la k-ième plus grande valeur en se servant de la fonction de la
question précédente.

9. Donner la complexité dans le meilleur des cas (on supposera que le résultat retourné à
chaque appel de la fonction (question7) est toujours proche de la moitié de la portion à
traiter).
Cette fonction est-elle toujours plus efficace que celle de la partie 2 ? Indication : calculer la
complexité dans le pire des cas.

PARTIE IV

10. Adapter les algorithmes de la partie III pour trier un vecteur de taille n. Donner la
complexité dans le meilleur des cas et le pire des cas.

Exercice 23 (2023 AHN-1)

On désire écrire un programme C de calcul de pgcd (plus grand commun diviseur) de deux
nombres nbrl et nbr2.
Q1) Quelle est la bibliothèque C d'entrée/sortie nécessaire, écrire l'instruction C
correspondante.
Q2) Les variables déclarées pour ce programme sont nbr1, nbr2, pgcd et i. Ecrire l'instruction
C de ces variables
Q3) Quelle est l'instruction C qui permettra de lire les variables nbr1 et nbr2, correspondant
aux deux nombres dont vous voulez trouver le pgdc ?
Q4) Pour calculer le pgdc de nbr1 et nbr2, il faut invoquer le bout de code suivant
for(i=1;i <= nbr1&&i <= nbr2;++i)
{
if(nbr1%i=0&& nbr2%i=0)
pgcd= i;
}

Compléter le programme suivant qui calcul le pgdc de 2 nombres.


…………………………………..//Bibliothèque

int main()
{
…………………………………..//Déclaration variables
…………………………………..//Entrez deux entiers
…………………………………..// Lire deux entiers

//Calcul du pgcd
…………………………………..
//Affichage du pgcd

printf("PGCD de %d et %d = %d", nbr1, nbr2, pgcd);


…………………………………..;
}

Vous aimerez peut-être aussi