0% ont trouvé ce document utile (0 vote)
29 vues116 pages

Langage C

Wissen Corporation est un groupe d'étudiants qui vise à partager des connaissances en informatique et en mathématiques à travers des formations gratuites. Le document présente un recueil de 63 exercices, dont plus de 50 résolus, pour aider les étudiants à se préparer aux évaluations. Il encourage le partage des connaissances et souligne l'importance de l'apprentissage actif.

Transféré par

kayembeemmanuel472
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)
29 vues116 pages

Langage C

Wissen Corporation est un groupe d'étudiants qui vise à partager des connaissances en informatique et en mathématiques à travers des formations gratuites. Le document présente un recueil de 63 exercices, dont plus de 50 résolus, pour aider les étudiants à se préparer aux évaluations. Il encourage le partage des connaissances et souligne l'importance de l'apprentissage actif.

Transféré par

kayembeemmanuel472
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

LANGAGE

C
AVANT PROPOS
Wissen Corporation

C’est un groupe formé essentiellement de meilleurs étudiants de nos groupes


d’étude et d’encadrement qui se sont fixés plusieurs objectifs dont le premier
est celui du partage de la connaissance en Informatique et en
mathématiques. Ainsi, pour atteindre notre premier objectif, nous organisons
des formations essentiellement gratuites pour partager le peu que nous
connaissons avec les autres. Car la connaissance, c’est comme un
chandelier, sa lumière ne diminue pas s‘il allume un autre chandelier.

Pour faire partie de Wissen, l’étudiant doit démontrer son savoir-faire et son
amour pour la connaissance pendant les cours d’encadrement etc… Pour
les externes désirant intégrer Wissen, ils doivent passer pas un test, car ne
suivant pas régulièrement les cours avec nous, c’est le seul moyen
d’apprécier leur savoir-faire et leur amour pour la connaissance.

Le cerveau est bien une richesse que nous avons tous en commun, mais c’est
son utilisation qui distingue les hommes …Parfois, il n’existe pas de gens plus
intelligents que les autres, mais c’est le travail qui nous différencie. Pour bâtir
haut, il faut creuser profond et tu seras fort dans ce que tu te donnes.

Il y a une naissance en toute connaissance, Thucydide a dit : « Avoir des


connaissances sans les partager, c’est se mettre au niveau de celui qui n’a
pas d’idées ». Wissen Corporation est là pour assurer votre formation, votre
encadrement suivant vos désirs.

1|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
L’amour de la connaissance et de la réussite nous rassembla ici,
agissons en conséquence….
Connectez-vous à votre espace membre pour retrouver les batts,
batts résolus, tps et des cours en vidéos.

[Link]

2|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
DEDICACE

Maman Daudine DIONYO


André KONGA DIKOLO
Julie APAMI DIKOLO
Chadrack SHAKO DIKOLO
Pauline TSHULU DIKOLO
Joël YOMBOLA DIKOLO
Thérèse OTAKOTSHA DIKOLO
Jérémie OMELONGA DIKOLO
Moïse ALOMBA DIKOLO
Albertine MBOHELAKA DIKOLO
Mardochée MUKANGA DIKOLO
Junior OMELONGA ALOMBA
Joseph OSONGO OMELONGA
Bony WOLAWATO

3|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
REMERCIEMENTS

Sincères remerciements à
Tous les Erudits et alliés
Hermans IMBALEVA
Kevin MAYOMBO
Jonas KATEMBO KATEMBO
Issa KANZA
Marcus KABEYA
Andy BINAKI
Cephée MBAYA
Moïse ILUNGA
Adéo KWEKWE
Smith
John HESHIMA
John MINGA
Jérémie OMELONGA DIKOLO
Moïse ALOMBA DIKOLO

4|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
INTRODUCTION
Ce livre vous présente 63 exercices dont plus de 50 résolus. Les questions sont
essentiellement des interrogations, examens et tps des années antérieures.

L’objectif poursuivi n’est pas de rendre l’étudiant faible ou paresseux mais


plutôt de mettre à sa disposition un outil d’aide pour la préparation des
évaluations et la bonne compréhension du cours. C’est pourquoi à la fin de
chaque chapitre, nous proposons une série d’exercices d’auto-évaluation. La
meilleure méthode serait de faire un effort de comprendre la logique utilisée
pour la résolution de chaque problème et cela peut vous aider devant des cas
similaires et il est conseillé de ne pas bloquer les résolutions ou utiliser ce recueil
pendant les évaluations.

Il y a une naissance en toute connaissance, Thucydide a dit : « Avoir des


connaissances sans les partager, c’est se mettre au niveau de celui qui n’a pas
d’idées ». L’objectif que je poursuis n’est pas de se prévaloir supérieur à vous
qui me lisez, mais de partager le peu que je connais à ceux qui veulent. Si vous
lisez ce livre pour chercher de failles, vous les trouverez certainement mais si
vous le lisez pour apprendre, vous apprendrez surement : Vous trouverez ce
que vous cherchez. Je ne suis en compétition avec personne.

L’œuvre humaine n’est jamais parfaite et celle-ci ne fait pas exception, ainsi
vos remarques et suggestions seront les bienvenues et m’aideront à améliorer
les éditions futures.

Bonne lecture

Aimé DIUMI DIKOLO

+243 81 083 46 16
+243 89 44 37 902
aimediumi2@[Link]

5|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 1
𝑎) Quelles seront les valeurs lues dans les variables 𝑛, 𝑝, 𝑐 et Compte ( c est de
type char et les autres de type int), par l’instruction suivante ?

Compte=scanf("%d^%d^%c", &n,&p, &c) ;

Lorsqu’on lui founit les données suivantes (le symbole ^ représente un espace
et le symbole @ représente une fin de ligne, c’est-à-dire une validation) ?

10^20^a@

10a@

a@

𝑏) Soit les déclarations suivantes

𝑖𝑛𝑡 𝑚 = 10, 𝑝 = 4;

𝑙𝑜𝑛𝑔 𝑟 = 3 ;

𝑓𝑙𝑜𝑎𝑡 𝑥 = 0.25 ;

Donner le type et démontrer le résultat obtenu après l’exécution de


l’expression suivante :

!( !((m%r)-x)) && ((r/p)==((p>r)-x)) || ((m *=x)-r)

(Interro 2019-2020)

Solution

𝑎) Compte=scanf("%d^%d^%c", &n,&p, &c) ;

Pour 10^20^a@ : 𝑛 = 10, 𝑝 = 20 , 𝑐 = "𝑎" 𝑒𝑡 𝑐𝑜𝑚𝑝𝑡𝑒 = 3

Pour 10a@ : 𝑛 = 10, 𝑝 = 0 , 𝑐 = "" 𝑒𝑡 𝑐𝑜𝑚𝑝𝑡𝑒 = 1

Pour a@ : 𝑛 = 0, 𝑝 = 0 , 𝑐 = "" 𝑒𝑡 𝑐𝑜𝑚𝑝𝑡𝑒 = 0

𝑏) ! ( ! ((𝑚%𝑟) − 𝑥)) && ((𝑟/𝑝) == ((𝑝 > 𝑟) − 𝑥)) || ((𝑚 ∗= 𝑥) − 𝑟)

! (! ((10 % 3) − 0.25)) && ((3/4) == ((4 > 3) − 0,25)) || ((𝑚 ∗= 0,25) − 3)

! (! (1 − 0,25)) && (0 == (1 − 0,25)) || (2 − 3)

! (! (0.75)) && (0 == 0.75) || (−1)

! (0) && (0) || (−1)

6|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
1 && 0 || − 1
(1 && 0) || − 1

0 || − 1

EXERCICE 2
Compléter par les instructions qui manquent de (a) à (g)
#include <stdio.h>
int main(){
int T[50], i, N,prod;
do{
printf("\n Donner la taille du tableau (50 maximum)");
.......(a).....
}while(....(b)....);
printf("Donner les éléments du tableau: ");
for(i=0;i<N;i++){
.....(c)....
.....(d)....
}
.......(e)......
for(i=0;i<N;i++){
if(......(f).....){
prod=.....(g)......:
}
}
printf("le produit des éléments non nuls du tableau est : %d",prod);
return
}

N.B. : Le code ci-haut a pour objectif de calculer le produit des éléments non
nuls d’un tableau d’entiers. La taille du tableau est saisi au début. A chaque
fois que l’utilisateur introduit une taille inférieure à 0 ou supérieure à 50, le
programme lui redemande de donner la taille. L’utilisateur saisi ensuite les
éléments du tableau. Ensuite, le programme calcule, puis affiche le produit des
éléments non nuls du tableau.
(Examen 2020-2021)

7|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
int main(){
int T[50], i, N,prod;
do{
printf("\n Donner la taille du tableau (50 maximum)");
scanf("%d",&N);
}while(N<0 || N>50);
printf("Donner les éléments du tableau: ");
for(i=0;i<N;i++){
printf("Saisir l'element n° %d",i);
scanf("%d",&T[i]);
}
prod=1;
for(i=0;i<N;i++){
if(T[i] !=0){
prod=prod* T[i];
}
}
printf("le produit des éléments non nuls du tableau est : %d",prod);
return
}

EXERCICE 3
𝑎) Soit la configuration suivante :

Objet Adresse Valeur


a 7854368700 13
b 7854368704 31
c 7854368708 10
P1 7854367894 7854368704
p2 7854367902 /
p3 7854368100 7854368708

Que devienne le tableau ci-haut après l’exécution des instructions suivantes :


p2=&a ; *p2=*p1 ; b=--*p1% *p3; *p3 =*p1<*p2 ? *p1++ : *p2++ ;
𝑏) Complétez les pointillés

- La directive #include permet …………………………


- L’indicateur de conversion s permet ………………………….. lu permet
………………………………et g permet ……………………………………….

8|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
- Un tableau est implicitement converti en un pointeur sur son premier
élément, sauf lorsqu’il est ………………………………..
- Il n’y a pas en C d’opérateur effectuant l’élévation à la puissance, il faut
utiliser …………………………. De la libraire ………………
(Examen 2019-2020)
Solution
𝑎) Analysons instruction par instruction

Au début
𝑎 = 13 𝑏 = 31 𝑐 = 10 𝑝1 = &𝑏 𝑝2 = 𝑁𝑈𝐿𝐿 𝑝3 = &𝑐

 p2=&a :
𝑎 = 13 𝑏 = 31 𝑐 = 10 𝑝1 = &𝑏 𝑝2 = &𝑎 𝑝3 = &𝑐
 *p2=*p1
𝑎 = 31 𝑏 = 31 𝑐 = 10 𝑝1 = &𝑏 𝑝2 = &𝑎 𝑝3 = &𝑐
 b=--*p1% *p3
𝑎 = 31 𝑏 = 0 𝑐 = 10 𝑝1 = &𝑏 𝑝2 = &𝑎 𝑝3 = &𝑐
 *p3 =*p1<*p2 ? *p1++ : *p2++
𝑎 = 31 𝑏=1 𝑐=0 𝑝1 = &𝑏 𝑝2 = &𝑎 𝑝3 = &𝑐
Le tableau deviant:

Objet Adresse Valeur


a 7854368700 31
b 7854368704 1
c 7854368708 0
P1 7854367894 7854368704
p2 7854367902 7854368700
p3 7854368100 7854368708

𝑏)

- La directive #include permet d’insérer les fichiers en-tête indiqués


comme arguments dans le texte du programme au moment de la
compilation
- Il n’y a pas en C d’opérateur effectuant l’élévation à la puissance, il faut
utiliser la fonction pow De la librairie math.h

9|Page
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 4
𝑎) Encerclez les qualificateurs de type
1) double 2) short 3) const 4) signed 5) volatile
𝑏) Donnez la librairie, le prototype et l’action de chacune des fonctions
suivantes :
1) gotoxy 2) isupper 3) strncat 4) fmod 5) freopen

𝑐) Lequel des énoncés suivants n’est pas une déclaration de nom de variable
valide ?
1) int _a7 ; 2) int a_7 ; 3) int 7_a ; 4) int _7a
𝑑) Dans le code suivant :

Char txt[ ]= "Bonjour" , *jk=txt ;


While (*jk) jk++ ;

Que vaut jk après l’exécution de l’instruction while ? Vers quel caractère


pointe-t-il ?
(Interro 2019-2020)
Solution
𝑎) 1, 2 𝑒𝑡 4
𝑏) 1) Gotoxy

Librairie : conio
Prototype: void gotoxy (unsigned int C, unsigned int L );
Action : déplace le curseur à la ligne L et à la colonne C

2) isupper
Librairie : ctype

Prototype : int isupper( int character );


Action : permet de tester si un caractère donné est une lettre majuscule ou
non
3) strncat
Librairie : String

Prototype : char * strncat( char * restrict destination, const char * restrict source,
size_t size );

10 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Action : permet de concaténer à une chaîne de caractères le contenu d’une
autre chaîne.
4) fmod
Librairie : Math
Prototype : double fmod(double a,double b);
Action : renvoie le reste d’une division de deux nombres
5) freopen
Librairie : stdio

Prototype : FILE * freopen( const char * restrict filename, const char * restrict
accessMode, FILE * restrict stream );
Action : permet de réutiliser la structure FILE, spécifiée en dernier paramètre,
pour ouvrir un nouveau flux
𝑑) jk pointe vers le caractère \0

EXERCICE 5
On souhaite gérer une base de données d’inscriptions pour l’organisation d’un
séminaire qui dure une journée. Les organisateurs proposent aux participants
de s’inscrire pour des repas, ainsi que pour l’hébergement à l’hôtel. Un
participant peut s’inscrire indépendamment aux 2 repas proposés : déjeuner
(12 dollars) et/ou diner (25 dollars) ou aucun. Il n’est pas obligé de prendre un
hôtel. S’il en prend un, il peut obtenir parmi 2 types d’hôtels différents : 2 étoiles
(65 dollars) ou 3 étoiles (100 dollars). Un participant peut venir accompagné
de son conjoint. Dans ce cas, la réservation d’hôtel est identique mais lorsqu’un
repas est sélectionné alors il faut en compter 2.

1) Ecrire un nouveau type Participant qui inclut son nom (chaine de caractère :
tableau de 30 caractères), son prénom (chaine de caractères : tableau de 20
caractères), ainsi que toutes les autres informations nécessaires à son
inscription selon les critères définis ci-dessus. On privilégiera une structure
contenant un nombre minimal de champs.

2) Créer un nouveau type TablPart qui est un tableau de 100 éléments de type
Participant

3) Créer une fonction Nbr2Etoiles qui, pour un argument de type TablPart


donné, affiche le nom et le prénom des personnes qui ont choisi de réserver un
hôtel 2 étoiles. On pourra utiliser la fonction printf avec un format %s pour
l’affichage des chaines de caractères nom et prénom.

11 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
4) Créer une fonction NbrDej qui, pour un argument de type TablPart donné,
retourne le nombre de déjeuner à prévoir.

5) Créer une fonction Montant qui calcule pour un participant donné en


argument, le montant de sa facture.

(TP 2020-2021)

Solution
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

//Le type Participant


typedef struct Participant Participant;
struct Participant
{
char nom[30];
char prenom[20];
int repas;
int hotel;
int accompagne;
};

//Le type TablPart


typedef struct TablPart TablPart;
struct TablPart
{
Participant A[100];
};

//Prototypes des fonctions


void Nbr2Etoiles(TablPart liste);
int NbrDej(TablPart liste);
void Montant(char* nom, char* prenom,TablPart liste);

int i=0;
int main(int argc, char *argv[]) {
TablPart liste;
int choix=0;
label1: printf("Voici le menu\n");
printf("1. Enregistrer un participant\n");
printf("[Link] de participants a loger a 2 etoiles\n");
printf("3. Nombre de dejeuner a prevoir\n");
printf("4. Le montant total d'un participant\n'");

12 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("5. Quitter\n");
label2: printf("Faites votre choix\n");
scanf("%d",&choix);
while(choix !=5)
{
if(choix==1)
{

printf("Enregistrement du participant numero %d\n",i+1);


printf("son nom\n");
scanf("%s",liste.A[i].nom);

printf("son prenom\n");
scanf("%s",liste.A[i].prenom);

printf("Pour le logement, voici les possibilites offertes\n");


printf("[Link] 2 etoiles\n");
printf("[Link] 3 etoiles\n");
printf("[Link]\n");
label3: printf("Faites votre choix\n");
scanf("%d",&liste.A[i].hotel);
if(liste.A[i].hotel!=1 && liste.A[i].hotel!=2 && liste.A[i].hotel!=3)
{
printf("Logement incorrect, recommencez\n");
goto label3;

printf("Pour les repas, voici les possibilites offertes\n");


printf("[Link]\n");
printf("[Link]\n");
printf("[Link] et Diner\n");
printf("[Link]\n");
label4: printf("Faites votre choix\n");
scanf("%d",&liste.A[i].repas);
if(liste.A[i].repas !=1 && liste.A[i].repas!=2 && liste.A[i].repas !=3
&& liste.A[i].repas !=4)
{
printf("choix repas incorrect, recommencez\n");
goto label4;

printf("Le participant est-il accompagne?\n");


printf("1. Oui\n");
printf("2. Non\n");
label5: printf("Faites votre choix\n");

13 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
scanf("%d", &liste.A[i].accompagne);
if(liste.A[i].accompagne!=1 && liste.A[i].accompagne !=2)
{
printf("Choix incorrect, recommencez\n");
goto label5;
}
i++;
system("pause");
system("cls");
goto label1;

}
//Au cas où choix vaut 2
else if(choix==2)
{
Nbr2Etoiles(liste);
system("pause");
system("cls");
goto label1;
}
else if(choix==3)
{
int nbre=0;
nbre=NbrDej(liste);
printf("Il faut prevoir %d dejeuner\n",nbre);
system("pause");
system("cls");
goto label1;
}
else if(choix==4)
{
char nom[30];
char prenom[20];

printf("Saisir le nom du participant\n");


scanf("%s",nom);
printf("Saisir le prenom du participant\n");
scanf("%s",prenom);
Montant(nom,prenom,liste);
system("pause");
system("cls");
goto label1;

}
else
{
printf("Choix incorrect, recommencez\n");
goto label2;

14 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}

}
return 0;
}

//La fonction Nbr2Etoiles


void Nbr2Etoiles(TablPart liste)
{
int j=0;
int existe=0;
printf("Voici les participants qui ont choisi de reserver un hotel 2 etoil
es:\n");

for(j=0;j<i;j++)
{
if(liste.A[j].hotel==1)
{
printf(" %s %s\n",liste.A[j].nom, liste.A[j].prenom);
existe=1;
}
}
if(existe==0)
{
printf("Aucun participant n'a reserve un hotel 2 Etoiles\n");
}
}

//La fonction NbrDej


int NbrDej(TablPart liste)
{
int j=0, n=0;
for(j=0;j<i;j++)
{
if((liste.A[j].repas==1 || liste.A[j].repas==3) && liste.A[j].accom
pagne==1)

{
n+=2;
}
else if((liste.A[j].repas==1 || liste.A[j].repas==3) && liste.A[j].acc
ompagne==0)
{
n++;
}
}

return n;
}
15 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
//Fonction Montant
void Montant(char* nom, char* prenom,TablPart liste)
{
int hotel=0,repas=0,accompagne=0;
int MontantHebergement=0,MontantRepas=0,MontantTotal=0, j=0,existe=0;
//On vérifie si le participant se trouve dans le tableau
for(j=0;j<i;j++)
{
if(strcmp(liste.A[j].nom,nom)==0 && strcmp(liste.A[j].prenom,p
renom)==0)
{
existe=1;
hotel=liste.A[j].hotel;
repas=liste.A[j].repas;
accompagne=liste.A[j].accompagne;
}
}
if(existe==1)
{
//Le montant du repas
if(repas==1)
{
MontantRepas=12;
}
else if(repas==2)
{
MontantRepas=25;
}
else if(repas==3)
{
MontantRepas=37;
}
else
{
MontantRepas=0;
}

//Le montant de l'hebergement


if(hotel==1)
{
MontantHebergement=65;
}
else if(hotel==2)
{
MontantHebergement=100;
}
else

16 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
MontantHebergement=0;
}
//Si il est accompagné ou pas
if(accompagne==1)
{
MontantRepas=MontantRepas*2;
}
MontantTotal=MontantHebergement+MontantRepas;
printf("Le client doit payer %d\n",MontantTotal);
}
else
{
printf("Le participant est introuvable\n");
}
}

EXERCICE 6
𝑎) Quel est le point de départ de l’exécution d’un programme écrit en langage
C?
𝑏) Le compilateur a détecté 3 erreurs dans le code suivant. Quelles sont-elles ?

int nombbre
print("Donnez un nombre entier : ") ;
scanf("%d", nombre) ;
𝑐) Quelles seront les valeurs lues dans les variables n, p, c et compte par
l’instruction suivante :
Compte=scanf("%d^%d^%c",&n,&p,&c) ;/*^désigne un espace*/
Lorsqu’on lui fournit les données suivantes :
10b@
b@
(Interro 2015-2016)
Solution
𝑎) Le point de départ de l’exécution d’un programme en C est la méthode
main
𝑏)
Les 3 erreurs sont :

17 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Il manque point-virgule après la déclaration de la variable nombre
On affiche un message avec printf et non print
Il manque l’opérateur adresse (&) devant la variable nombre dans scanf
𝑐) Compte=scanf("%d^%d^%c",&n,&p,&c)

Pour 10b@, on a : 𝑛 = 10 , 𝑝 = , 𝑐 = 𝑒𝑡 𝑐𝑜𝑚𝑝𝑡𝑒 = 1


Pour b@, on a : 𝑛 = , 𝑝 = , 𝑐 = 𝑒𝑡 𝑐𝑜𝑚𝑝𝑡𝑒 = 0

EXERCICE 7
On propose d’écrire un programme « Gabin » qui joue le rôle de meneur de
jeu. L’exécution de ce programme vous fera tenir le rôle du joueur. Le
programme doit définir le prix du lot en tirant un entier aléatoire compris entre
1 et 1000 et dialoguer avec le joueur pendant le jeu.

N.B. : Le jeu consiste à découvrir par essais successifs le prix d’un lot. Pour
chaque essai, le programme affiche un message "Trop grand", "Trop petit" ou
"BRAVO" ! Vous avez trouvé en n essais".
Le jeu est fini quand le joueur a trouvé le prix du lot.
Ex. : Entrer un prix : 501
Trop grand
Entrer un prix : 400
Trop petit
Entrer un prix : 500
BRAVO ! Vous avez gagné à 3 essais
(TP à défendre)
Solution
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */

int main(int argc, char *argv[]) {


int prix_lot,n,i;
int max=1000,min=1;
//On génère le nombre aléatoire
srand(time(NULL));
prix_lot = (rand() % (max - min + 1)) + min;
18 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
//LE JEU
do{
printf("\n Entrer un prix : ");
scanf("%d",&n);
if(n>prix_lot){
printf("Trop grand\n");
}
else if(n<prix_lot){
printf("Trop petit\n");
}
i++;
}while(n !=prix_lot);

printf("BRAVO! Vous avez gagne a %d essais\n",i);


return 0;
}

Illustrations de l’exécution

19 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 8
Proposez un programme qui remplit un tableau de 10 cases par des valeurs
saisies au clavier. Dans un second temps, le programme inverse l’ordre des
éléments du tableau. Ainsi, si au départ, nous avions les dix valeurs suivantes
dans le tableau : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; à l’arrivée, nous aurons le tableau
suivant : 10, 9, 8, 7, 6, 5, 4, 3, 2, 1.
N.B. : Décomposer le problème sous forme de fonctions
(TP à défendre)

20 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */
//Prototypes des fonctions
void saisie(int *T);
void inverse(int *T);
int main(int argc, char *argv[]) {
int T[10],i;
saisie(T);
inverse(T);
printf("Voici les elements du tableau inverse\n");
for(i=0;i<10;i++){
printf("%d \t",T[i]);
}
return 0;
}

//La fonction qui remplit le tableau


void saisie(int *T){
int i;
printf("Remplissage du tableau\n");
for(i=0;i<10;i++){
printf("Entrer l'element no %d : ",i+1);
scanf("%d",&T[i]);
}
}

//La fonction qui inverse les elements


void inverse(int *T){
int i, tampon;
for(i=0;i<5;i++){
tampon=T[i];
T[i]=T[10-i-1];
T[10-i-1]=tampon;
}
}

21 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Illustration de l’exécution

EXERCICE 9
Ecrivez le programme : Tant que je n’ai pas saisi 10 chiffres premiers (2, 3, 5 ou
7), je recommence la saisie d’un chiffre. Vous prendre soin d’indiquer à
l’utilisateur combien de chiffres premiers il lui reste à entrer.

(TP à défendre)

Solution

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */

int main(int argc, char *argv[]) {


int n=0,i=0;
do{
printf("Il vous reste %d chiffres premiers a saisir\n",10-i);
printf("Saisir un chiffre premier : ");
scanf("%d",&n);
if(n==2 || n==3 || n==5 || n==7){
i++;
}
}while(i<10);
printf("Bravo, vous avez saisi 10 chiffres premiers\n");
return 0;

22 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}

Illustration de l’exécution

EXERCICE 10
Quels résultats fournira ce programme
#include <stdio.h>
#include <stdlib.h>
int main( )
{
int a=3,b=9,c=0 ;
int *P1,*P2,*P3=&c ;
P1=&a,P2=&b, P3=&c ;
*P3=((*P1)++)*(*P1) ;
printf("%d %d %d %d\n”,a,b,c);
a=(b++)*(*P1);
printf("%d %d %d %d\n”,a,b,c);
c=(*P1)++/--*P2;
printf("%d %d %d %d\n”,a,b,c);
b<c?b++: --c;
23 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("%d %d %d %d\n”,a,b,c);
printf(“%d, (a-3)&&(c-37));
return 0
}

(Examen)

Solution

En exécutant ce programme, on a le résultat suivant :

Détaillons ce résultat :

Pour la première ligne : 𝑎 = 3 𝑏 = 9 𝑒𝑡 𝑐 = 0

Pour la deuxième ligne : 𝑎 = 3 𝑏 = 9 𝑒𝑡 𝑐 = 0 𝑝1 = 𝑁𝑈𝐿𝐿 𝑝2 = 𝑁𝑈𝐿𝐿 𝑝3 = &𝑐

Pour la 3e ligne : 𝑎 = 3 𝑏 = 9 𝑒𝑡 𝑐 = 0 𝑝1 = &𝑎 𝑝2 = &𝑏 𝑝3 = &𝑐

Pour la 4e ligne : *P3=((*P1)++)*(*P1) ;


𝑐 = (𝑎 + +) ∗ (𝑎)

𝑐 = (3 + +) ∗ (3)

𝑎 = 4 𝑏 = 9 𝑒𝑡 𝑐 = 12 𝑝1 = &𝑎 𝑝2 = &𝑏 𝑝3 = &𝑐

La 5e ligne affiche les valeurs de a, b et c

EXERCICE 11
Ecrire un programme qui réalise les actions suivantes.
𝑎. Déclare et définit une chaine de caractères initialisée à Mathématiques et
Informatique.
𝑏. L’affiche de gauche à droite (sens de lecture).

𝑐. Affiche les treize premiers caractères dans le sens de la lecture


𝑑. L’affiche entièrement de droite à gauche (sens inverse de la lecture)
𝑒. Affiche les treize premiers caractères dans le sens inverse de la lecture.

Une exécution de ce programme donnera à l’écran ce qui suit :


Mathématiques et Informatique
24 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Mathématiques
euqitamrofnI te seuqitamehtaM
seuqitamehtaM
(Interro 2015-2016)

Solution

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */

int main(int argc, char *argv[]) {

//déclaration et initialisation de la variable


char mot[]="Mathematiques et Informatique";
int i;

//Affichage de gauche à droite


printf("%s\n",mot);
//Affichage de 13 premiers caractères
for(i=0;i<13;i++){
printf("%c",mot[i]);
}
//Affichage de droite à gauche
printf("\n");
for(i=strlen(mot);i>=0;i--)
{
printf("%c",mot[i]);
}
//Affichage de 13 premiers caracteres de droite à gauche
printf("\n");
for(i=12;i>=0;i--)
{
printf("%c",mot[i]);
}

return 0;
}

25 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Illustration de l’exécution

EXERCICE 12
Remplissez le tableau ci-après en considérant a,b,c comme étant des
variables entières et P1, P2, P3 comme des variables pointeurs de type entier :
𝑎 𝑏 𝑐 𝑃1 𝑃2 𝑃3
Initialisation 1 3 5 &a / &c
*P1+=*P2
P2=&b
b=++*P2*(*P1)
*P2=*P1/=*P3
*P1=&b
*P3=((*P1)**)*(*P2)
a=(*P3)++/++*P1
P1=&c
P2=&b
P3=&a

(Interro 2015-2016)

Solution

𝑎 𝑏 𝑐 𝑃1 𝑃2 𝑃3
Initialisation 1 3 5 &a / &c
*P1+=*P2 / 3 5 &a / &c
P2=&b / 3 5 &a &b &c
b=++*P2*(*P1)
*P2=*P1/=*P3
*P1=&b
*P3=((*P1)**)*(*P2)
a=(*P3)++/++*P1
P1=&c
P2=&b
P3=&a

26 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 13
Soit les déclarations suivantes :
int m=11,p=4;
long r=3;
float x=1.65;
Donner le type et la valeur de chacune des expressions suivantes :
𝑎) 𝑚 + 𝑟
𝑏) 𝑚 + 𝑥
𝑐) 𝑚 % 𝑝 + 𝑟
𝑑) 𝑚 > 𝑟
𝑒) 𝑚 >= 𝑝
𝑓) 𝑚 < 𝑝
𝑔) 𝑟 + 4 ∗ (𝑚 > 𝑝)
ℎ) 𝑚 && 𝑟
𝑖) (𝑟 − 3)&& (𝑚 − 11)
𝑗) 𝑥 ∗ (𝑟 == 3)

(Support de Langage C, page 120)


Rappel et analyse

Voici quelques règles sur les opérations avec des opérandes de types
différents1

1. Si un opérande est de type long double, le résultat est de type long


double ;
2. Si un opérande est de type double, le résultat est de type double ;
3. Si un opérande est de type float, le résultat est de type float ;
4. Si un opérande est de type unsigned long long, le résultat est de type
unsigned long long;
5. Si un opérande est de type long long, le résultat est de type long long;
6. Si un opérande est de type unsigned long, le résultat est de type
unsigned long;
7. Si un opérande est de type long, le résultat est de type long;
8. Si un opérande est de type unsigned int, le résultat est de type unsigned
int; le résultat est de type int.

1 [Link]
27 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
𝑎) 𝑚 + 𝑟

Valeur : 14
Type : long
𝑏) 𝑚 + 𝑥

Valeur : 12,65
Type : float
𝑐) 𝑚 % 𝑝 + 𝑟
11 % 4 + 3
=3+3
=6
𝑇𝑦𝑝𝑒: 𝑙𝑜𝑛𝑔
𝑑) 𝑚 > 𝑟
11 > 3
=1
𝑇𝑦𝑝𝑒: 𝑖𝑛𝑡
𝑒) 𝑚 >= 𝑝
11 >= 4
=1
𝑇𝑦𝑝𝑒 ∶ 𝑖𝑛𝑡
𝑓) 𝑚 < 𝑝
11 < 4
=0
𝑇𝑦𝑝𝑒 ∶ 𝑖𝑛𝑡
𝑔) 𝑟 + 4 ∗ (𝑚 > 𝑝)
3 + 4 ∗ (11 > 4)
=3+4∗1
=3+4
=7
𝑇𝑦𝑝𝑒 ∶ 𝑙𝑜𝑛𝑔

28 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
ℎ) 𝑚 && 𝑟
11 && 3
=1
𝑇𝑦𝑝𝑒 ∶ 𝑖𝑛𝑡
𝑖) (𝑟 − 3)&& (𝑚 − 11)
(3 − 3)&& (11 − 11)
= 0 && 0
=0
𝑇𝑦𝑝𝑒 ∶ 𝑖𝑛𝑡
𝑗) 𝑥 ∗ (𝑟 == 3)
1.65 ∗ (3 == 3)
= 1.65 ∗ 1
= 1.65
𝑇𝑦𝑝𝑒 ∶ 𝑓𝑙𝑜𝑎𝑡

EXERCICE 14
Quels résultats fournit le programme suivant ?
int main(int argc, char *argv[]) {
int m=12,n=6,p=12, r, q;
r=n==(p=q);
printf("A : m =%d n=%d p=%d r=%d \n",m,n,p,r);
m=n=p=6 ;
m+=n+=p;
printf("B: m=%d n=%d p=%d\n",m,n,p);
p=m<n?m++:n++;
printf("C: m=%d n=%d p=%d\n",m,n,p);
p=m>n?m++:n++;
printf("D: m=%d n=%d p=%d\n",m,n,p);

(Support de Langage C, page 120)

29 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Analyse et solution
Analyse ligne par ligne
Première ligne
𝑚 = 12 ; 𝑛 = 6 ; 𝑝 = 12 ; 𝑟 = 0; 𝑞=0

Deuxième ligne r=n==(p=q);


D’abord, on affecte la valeur de q à p, p vaut maintenant 0., l’expression
devient 𝑟 = 6 == 0

Ensuite 6==0 donne 0 car 0 n’est pas égale à 6. Puis on affecte le résultat (0)
à r. Donc r vaut maintenant 0. A la fin de cette instruction, on a :

𝑚 = 12; 𝑛 = 6; 𝑝 = 0, 𝑟 = 0,
Troisième ligne
Affichage de la valeur de m, n, p et r

Quatrième ligne m=n=p=6


Affectation de la valeur 6 aux variables m, n et p. Après cette instruction, on
a:
𝑚 = 6 ; 𝑛 = 6; 𝑝 = 6 𝑒𝑡 𝑟 = 0
Cinquième ligne m+=n+=p;

L’affectation de la somme de la n et p à n, n vaut maintenant 12. Ensuite,


l’affectation de la somme de n et m à m, m vaut maintenant 18. Après
exécution de cette instruction, on a :
𝑚 = 18 ; 𝑛 = 12; 𝑝 = 6 𝑒𝑡 𝑟 = 0
Sixième ligne
Affichage de ce message

Septième ligne : p=m<n?m++:n++;

D’abord, le programme teste si m<n, c’est faux, donc ça renvoie la valeur 0.


Comme la condition de l’opérateur ternaire n’est pas vérifiée, c’est la
deuxième instruction (n++) qui va s’exécuter : D’abord, on affecte la valeur de
n à p qui vaut maintenant 12 puis il y a incrémentation de n qui devient 13
Après cette instruction, on a la situation suivante : 𝑚 = 18; 𝑛 = 13; 𝑝 = 12 𝑒𝑡 𝑟 =
0
30 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Huitième ligne
Affichage de ce message

Neuvième ligne : p=m>n?m++:n++;


Le programme teste si m>n , c’est vrai et c’est la premier expression de
l’opérateur ternaire qui va s’exécuter, on affecte à p la valeur de m, p vaut
maintenant 18, puis vint l’incrémentation de m qui vaut maintenant 19.

Après cette instruction, on a la situation suivante : 𝑚 = 19; 𝑛 = 13; 𝑝 = 18 𝑒𝑡 𝑟 =


0

Dernière ligne
Affichage du message suivant :

En général, ce programme fournit le résultat suivant :

EXERCICE 15
En supposant que 𝑥 = 20 𝑦 = 5 𝑧 = −10 𝑡 = 2 𝑞 = 12 𝑝 = 15

Evaluer les expressions suivantes :


(1) (5 ∗ (𝑞 + 2) ∗ 3) ∗ (𝑦 + 4)
(2) (5 ∗ 𝑞) + 2 ∗ ((3 ∗ 𝑦) + 4)

(3) 𝑥+= (𝑞 + 5)
(4) 𝑥 == (𝑦 = 5)

(5) 𝑥! = (𝑧 ∗= (−𝑡))

(6) 𝑥 ∗= 𝑧 + (𝑞 − 𝑡)
(7)𝑥 % = + + 𝑡
(8) 𝑥% = 𝑞 + +
(9) (𝑞 + +) ∗ (𝑥 + 𝑧)
(10)𝑥 = 𝑞 ∗ (𝑦 < 𝑧) + 𝑝 ∗ ! (𝑦 < 𝑧)
31 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
(11) ! (𝑞 − 𝑡 + 𝑧) | |𝑡
(12) 𝑥 && 𝑦 | | ! 0 && 𝑝 && ! 𝑡

(Support de Langage C, page 121)


Solution
Première solution : supposons que ces expressions sont indépendantes
(1) (5 ∗ (𝑞 + 2) ∗ 3) ∗ (𝑦 + 4)
= (5 ∗ (12 + 2) ∗ 3) ∗ (5 + 4)
= (5 ∗ 14 ∗ 3) ∗ 9
= 210 ∗ 9
= 1890
(2) (5 ∗ 𝑞) + 2 ∗ ((3 ∗ 𝑦) + 4)

= (5 ∗ 12) + 2 ∗ ((3 ∗ 5) + 4)

= 60 + 2 ∗ (15 + 4)
= 60 + 2 ∗ 19
= 60 + 38
= 98
(3) 𝑥+= (𝑞 + 5)
𝑥+= (12 + 5)
𝑥+= 17
𝑥 = 20 + 17
𝑥 = 37
(4) 𝑥 == (𝑦 = 5)
20 == (𝑦 = 5)
20 == 5
0
(5) 20! = (𝑧 ∗= (−𝑡))

20 ! = (𝑧 ∗= (−2))

20 ! = (𝑧 = (−10) ∗ (−2))

20 ! = (𝑧 = 20)

32 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
20! = 20
0
(𝟔) 𝒙 ∗= 𝒛 + (𝒒 − 𝒕)
𝑥 ∗= −10 + (12 − 2)
𝑥 ∗= −10 + 10
𝑥 ∗= 0
𝑥 = 20 ∗ 0
𝑥=0
(𝟕)𝒙 % = + + 𝒕
𝑥 % = (𝑡 = 3)
𝑥%=3
𝑥 = 20 %3
𝑥 = 2; 𝑡 =3
(𝟖) 𝒙% = 𝒒 + +
𝑥 % = 12 ; 𝑞 = 12 + 1
𝑥 = 20 % 12
𝑥 = 8 ; 𝑞 = 13
(𝟗) (𝒒 + +) ∗ (𝒙 + 𝒛)

(𝑞 = 12 + 1) ; 12 ∗ (20 + (−10))

𝑞 = 13; 12 ∗ 10
𝑞 = 13 ; 120
(𝟏𝟎)𝒙 = 𝒒 ∗ (𝒚 < 𝒛) + 𝒑 ∗ ! (𝒚 < 𝒛)
𝑥 = 12 ∗ (5 < −10) + 15 ∗ ! (5 < −10)
𝑥 = 12 ∗ 0 + 15 ∗ ! (0)
𝑥 = 0 + 15 ∗ 1
𝑥 = 0 + 15
𝑥 = 15
(𝟏𝟏) ! (𝒒 − 𝒕 + 𝒛) | |𝒕

! (12 − 2 + (−10)) | | 2

! (0) | |2
33 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
1 | |2
1
(𝟏𝟐) 𝒙 && 𝒚 | | ! 𝟎 && 𝒑 && ! 𝒕
20 && 5 | | ! 0 && 15 && ! 2
1 | | 1 && 15 && 0
1||0
1

EXERCICE 16
Quels seront les résultats fournis par ce programme ?
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {


int n=345;
int p=5;
float x=56.3478;
printf("A: %d %f\n", n,x);
printf("B: %4d %10f\n",n,x);
printf("C: %2d %3f\n",n,x);
printf("D: %10.3f %10.3e\n ", x,x);
printf("E: %*d\n", p,n);

(Support de Langage C, page 121)

Solution

34 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 17
Quelles seront les valeurs lues dans les variables n et p (de type int) par
l’instruction suivante ?
scanf("%4d %2d",&n,&p);

Lorsqu’on lui fournit les données suivantes (le symbole ^ représente un espace
et le symbole @ représente une fin de ligne, c’est-à-dire une validation) ?
𝑎) 23 ^45 @
𝑏) 123456@
𝑐) 234567^8 @

(Support de Langage C, page 121)

Solution
𝑎) 𝑛 = 23 𝑒𝑡 𝑝 = 45
𝑏) 𝑛 = 1234 𝑒𝑡 𝑝 = 56
𝑐) 𝑛 = 2345 𝑒𝑡 𝑝 = 67

EXERCICE 18
Ecrire un programme qui calcule le prix TTC (type double) d’un article à partir
du prix net (type int) et du pourcentage de TVA (type int) à ajouter. Utilisez la
formule suivante en faisant attention aux priorités et aux conversions
automatiques de type :
𝑇𝑉𝐴
𝑃𝑇𝑇𝐶 = 𝑃𝑁𝐸𝑇 + 𝑃𝑁𝐸𝑇 ∗ 100

(Support de Langage C, page 122)

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


double PTTC;
int tva,PNET;
35 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("Entrez le prix net\n");
scanf("%d",&PNET);
printf("Entrez le taux de la TVA\n");
scanf("%d",&tva);
PTTC=PNET+(double)PNET*(double)tva/100;

printf("Le prix TTC vaut %lf", PTTC);


}

EXERCICE 19
Ecrire un programme qui lit un entier et l’affiche s’il est positif

(Support de Langage C, page 122)

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n;
printf("Entrez un entier\n");
scanf("%d",&n);
if(n>0)
{
printf("Vous avez saisi un nombre positif: %d", n);
}

EXERCICE 20
Ecrire un programme qui lit un entier et affiche si ce nombre est pair ou
impair.

(Support de Langage C, page 122)

Solution

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

36 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n;
printf("Entrez un entier\n");
scanf("%d",&n);
if(n%2==0)
{
printf("%d est pair\n", n);
}
else
{
printf("%d est impair\n", n);
}

EXERCICE 21
Soit deux variables 𝒂, 𝒃 de type int entrées par l’utilisateur, écrire un programme
qui effectue l’échange si a est inférieure à b, dans le contraire, il augmente de
10 la valeur de b. On affiche les nouvelles valeurs de 𝒂 𝒆𝒕 𝒃.

(Support de Langage C, page 122)

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int a,b,c;
printf("Entrez la valeur de a\n");
scanf("%d",&a);
printf("Entrez la valeur de b\n");
scanf("%d",&b);
if(a<b)
{
//Echange
c=a;
a=b;
b=c;

}
37 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
else
{
b+=10;
}
printf("Les nouvelles valeurs de a et b sont: a=%d et b=%d",a,b);

EXERCICE 22
Le calcul des racines d’une équation du second degré du type 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 =
0 se fait en calculant d’abord son discriminant ∆= 𝑏 2 − 4𝑎𝑐.

Ecrire un programme permettant de calculer ∆ et d’afficher sa valeur à l’écran


pour les valeurs fixées de 𝑎, 𝑏 𝑒𝑡 𝑐.

(Support de Langage C, page 122)

Solution
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int a,b,c, delta;
label1: printf("Entrez la valeur de a\n");
scanf("%d",&a);
//On vérifie si a égal de 0
if(a==0)
{
printf("a ne peut pas etre nul, recommencez\n");
goto label1;
}

printf("Entrez la valeur de b\n");


scanf("%d",&b);

printf("Entrez la valeur de c\n");


scanf("%d",&c);

delta=pow(b,2)-4*a*c;
printf("Le discriminant vaut %d",delta);
}

38 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 23
Ecrire un programme qui lit N nombre entiers au clavier et qui affiche leur
somme, leur produit et leur moyenne. Choisissez un type approprié pour les
valeurs à afficher. Le nombre N est à entrer au clavier. Résolvez ce problème

𝑎) En utilisant while

𝑏) En utilisant do while

𝑐) En utilisant for

Laquelle des trois variantes est la plus naturelle pour ce problème ?

(Support de Langage C, page 123)

Solution
𝑎) 𝐴𝑣𝑒𝑐 𝑙𝑎 𝑏𝑜𝑢𝑐𝑙𝑒 𝑤ℎ𝑖𝑙𝑒
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n, i=0;
int val,somme=0;
long produit=1;
float moyenne;
label1: printf("Entrez le nombre de valeurs\n");
scanf("%d",&n);
if(n<=0)
{
printf("Le nombre de valeur incorrect, recommencez\n");
goto label1;
}

while(i<n)
{
printf("Entrez le nombre numero %d\n", i+1);
scanf("%d",&val);
somme+=val;
produit*=val;
i++;

}
39 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
moyenne=(float)somme/(float)n;
printf("La somme vaut : %d\n",somme);
printf("Le produit vaut: %ld\n",produit);
printf("La moyenne vaut: %f\n", moyenne);

𝑏) 𝐴𝑣𝑒𝑐 𝑙𝑎 𝑏𝑜𝑢𝑐𝑙𝑒 𝑑𝑜 𝑤ℎ𝑖𝑙𝑒


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n, i=0;
int val,somme=0;
long produit=1;
float moyenne;
label1: printf("Entrez le nombre de valeurs\n");
scanf("%d",&n);
if(n<=0)
{
printf("Le nombre de valeur incorrect, recommencez\n");
goto label1;
}

do
{
printf("Entrez le nombre numero %d\n", i+1);
scanf("%d",&val);
somme+=val;
produit*=val;
i++;

}while(i<n);

moyenne=(float)somme/(float)n;
printf("La somme vaut : %d\n",somme);
printf("Le produit vaut: %ld\n",produit);
printf("La moyenne vaut: %f\n", moyenne);

40 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
𝑐) 𝐴𝑣𝑒𝑐 𝑙𝑎 𝑏𝑜𝑢𝑐𝑙𝑒 𝑓𝑜𝑟
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n, i=0;
int val,somme=0;
long produit=1;
float moyenne;
label1: printf("Entrez le nombre de valeurs\n");
scanf("%d",&n);
if(n<=0)
{
printf("Le nombre de valeur incorrect, recommencez\n");
goto label1;
}

for(i=1;i<=n;i++)
{
printf("Entrez le nombre numero %d\n", i);
scanf("%d",&val);
somme+=val;
produit*=val;

moyenne=(float)somme/(float)n;
printf("La somme vaut : %d\n",somme);
printf("Le produit vaut: %ld\n",produit);
printf("La moyenne vaut: %f\n", moyenne);

41 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 24
Calculer la moyenne de notes fournies au clavier avec un dialogue de ce
type :
note 1 :12
note 2 : 20
note 3 :8.75
note 4 : 13.5
note 5 : 15.25
note 6 : -1
moyenne de ces 5 notes : 13.9

Le nombre de notes n’est pas connu a priori et l’utilisateur peut en fournir


autant qu’il le désire.

Pour signaler qu’il a terminé, on convient qu’il fournira une note fictive
négative. Celle-ci ne devra naturellement pas être pris en compte dans le
calcul de la moyenne.

(Support de Langage C, page 123)

Solution
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int i=0;
float note,moy,somme=0;
do
{
printf("note %d: ",i+1);
scanf("%f",&note);
if(note>=0)
{
somme+=note;
i++;
}

42 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}while(note>=0);
// On vérifie qu'il y a au moins une note avant de calculer la moyenne
if(i!=0)
{
moy=somme/(float)i;
}
else
{
moy=0;
}

printf("La moyenne de ces %d notes %f",i,moy);


}

EXERCICE 25
Ecrire un programme qui affiche un triangle rempli d’étoiles, s’étendant sur un
nombre de lignes entré au clavier, comme dans l’exemple suivant :
Nombre de lignes : 5
*
**
***
****
*****

(Support de Langage C, page 123)

Solution
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n, i,j;
label1: printf("Nombre de lignes= ");
scanf("%d",&n);
if(n<=0)
{
printf("Nombre de lignes incorrect, recommencez\n");
goto label1;
}

43 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
printf("*");
}
printf("\n");
}
}

EXERCICE 26
Ecrire un programme qui lit la dimension N d’un tableau T du type int
(dimension maximale : 50 composantes) ; remplit le tableau par des valeurs
entrées au clavier et affiche le tableau. Effacer ensuite toutes les occurrences
de la valeur 0 dans le tableau T et tasser les éléments. Afficher le tableau
résultant.

(Support de Langage C, page 124)

Solution

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n, i,j;
label1: printf("Entrez la taille du tableau (taille maximale 50)\n");
scanf("%d",&n);
if(n<=0 || n>50)
{
printf("La taille incorrect, recommencez\n");
goto label1;
}
int T[n];
//Remplissage du tableau
for(i=0;i<n;i++)
{
printf("Entrez l'element T[%d]", i);
scanf("%d",&T[i]);
}

//Affichage du tableau
system("cls");

44 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("Voici les elements du tableau\n");
for(i=0;i<n;i++)
{
printf("%d \t",T[i]);
}
printf("\n");
//on efface toutes les occurences de 0
//D'abord, on compte le nombre de fois que 0 se trouve dans le tableau
int k=0;
for(i=0;i<n;i++)
{
if(T[i]==0)
{
k++;
}
}
if(k==0)
{
//Le tableau ne contient pas 0
printf("Le tableau insere ne contient pas 0\n");
}
else
{
int A[n-k];
j=0;
for(i=0;i<n;i++)
{
if(T[i] !=0)
{
A[j]=T[i];
j++;
}
}
//Affichage du nouveau tableau
printf("Voici le nouveau tableau apres suppression de toutes les occur
ences de 0\n");
for(j=0;j<n-k;j++)
{
printf("%d \t",A[j]);
}
}
}

45 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Illustration de l’exécution

EXERCICE 27
Ecrire un programme qui lit les dimensions L et C d’un tableau T à deux
dimensions du type int (dimension maximale :50 lignes et 50 colonnes). Remplir
le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la
somme de chaque ligne et de chaque colonne en n’utilisant qu’une variable
d’aide pour la somme.

(Support de Langage C, page 124)

Solution

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int l,c, i,j;
label1: printf("Entrez le nombre de lignes du tableau (taille maximale 50)\n"
);
scanf("%d",&l);

46 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
if(l<=0 || l>50)
{
printf("Le nombre de ligne incorrect, recommencez\n");
goto label1;
}

label2: printf("Entrez le nombre de colonnes du tableau (taille maximale 50)\


n");
scanf("%d",&c);
if(c<=0 || c>50)
{
printf("Le nombre de colonnes incorrect, recommencez\n");
goto label2;
}

int T[l][c];
int sommeLigne[l];
int sommeColonne[c];

//Remplissage du tableau
printf("Remplissage du tableau\n");
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("Entrez l'element T[%d][%d] \n",i,j);
scanf("%d",&T[i][j]);
}

//Somme de chaque ligne


for(i=0;i<l;i++)
{
sommeLigne[i]=0;
for(j=0;j<c;j++)
{
sommeLigne[i]+=T[i][j];
}
}

//Somme de chaque colonne


for(j=0;j<c;j++)
{
sommeColonne[j]=0;
for(i=0;i<l;i++)
{
sommeColonne[j]+=T[i][j];

47 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}
}

//Affichage
printf("Voici le tableau insere\n");
for(i=0;i<l;i++)
{
for(j=0;j<c;j++)
{
printf("%d \t",T[i][j]);
}
printf("\n");
}
printf("La somme de chaque ligne\n");
for(i=0;i<l;i++)
{
printf("Ligne %d : %d\n",i, sommeLigne[i]);
}
printf("La somme de chaque ligne\n");
for(j=0;j<c;j++)
{
printf("Ligne %d : %d\n",j, sommeColonne[j]);
}
}

Illustration exécution

48 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 28
Un tableau A contient N+1 valeurs triées par ordre croissant ; la (𝑁 + 1)𝑖è𝑚𝑒
valeur est indéfinie. Insérer une valeur L donnée au clavier dans le tableau A
de manière à obtenir un tableau de N+1 valeurs triées.

(Support de Langage C, G2 2019-2020, page 124)

Solution

Première solution

Supposons que le tableau n’est pas donné, on doit remplir le tableau, le trié
puis insérer l’élément à la bonne position.

49 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n,i,j,tampon, l, pos;
label1: printf("Entrez la taille du tableau\n");
scanf("%d",&n);
if(n<=0)
{
printf("Taille du tableau incorrecte, recommencez\n");
goto label1;
}
int A[n+1];
//Remplissage du tableau
for(i=0;i<n;i++)
{
printf("Entrez l'element A[%d]\n",i);
scanf("%d",&A[i]);
}

//On trie le tableau


for(i=0;i<n;i++)
{

for(j=n-1;j>=i+1;j--)
{

if(A[j]<A[j-1])
{
tampon=A[j] ;
A[j]=A[j-1] ;
A[j-1]=tampon;
}
}
}

printf("Entrez l'element a inserer\n");


scanf("%d",&l);
//Insertion du nouvel élément
//on cherche d'abord la position où inserer l
pos=-1;
for(i=0;i<n;i++)
{
if(A[i]>l)
{

50 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
pos=i;
break;
}
}
//si pos=-1, l'élément doit etre inseré à la fin du tableau
if(pos==-1)
{
A[n]=l;
}
else
{
for(i=n-1;i>=pos;i--)
{
A[i+1]=A[i];
}
A[pos]=l;
}
printf("Nouveau tableau apres insertion de l'element\n");
for(i=0;i<=n;i++)
{
printf("%d \t", A[i]);
}

Deuxième solution : on suppose que le tableau existe déjà et que les éléments
sont déjà triés. On mettre seulement la partie de l’insertion du nouvel élément.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n,i, l, pos;

int A[n+1];

printf("Entrez l'element a inserer\n");


scanf("%d",&l);
//Insertion du nouvel élément
//on cherche d'abord la position où inserer l
pos=-1;
for(i=0;i<n;i++)
{
if(A[i]>l)
51 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
pos=i;
break;
}
}
//si pos=-1, l'élément doit etre inseré à la fin du tableau
if(pos==-1)
{
A[n]=l;
}
else
{
for(i=n-1;i>=pos;i--)
{
A[i+1]=A[i];
}
A[pos]=l;
}

printf("Nouveau tableau apres insertion de l'element\n");


for(i=0;i<=n;i++)
{
printf("%d \t", A[i]);
}

EXERCICE 29
Ecrire un programme qui sera constitué d’un menu comportant le choix de
l’opération à effectuer, ce programme permettra donc d’effectuer un
ensemble d’opérations sur une chaine de caractères quelconque saisie à
partir du clavier. Les opérations sur la chaine se présentent de la manière
suivante :

- Fonction saisir : elle lit une chaine de caractères à partir du clavier, elle
retourne cette chaine.
- Fonction Afficher : elle inverse la chaine argument (elle la modifie donc).
- Fonction Ajouter : elle ajoute le mot m à la chaine de caractère saisie et
retourne son indice dans le tableau (ou -1 si m=NULL).
- Fonction supprimer : elle supprime le mot m à la chaine de caractères.
- Fonction mot : elle compte le nombre de mots de la chaine. On
considère le caractère blanc (vide) comme caractère séparateur des
mots. Il peut y avoir plusieurs consécutifs dans la chaine.

52 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Après chaque opération, le retour au menu s’effectue après affichage du
message « Frappez une touche pour revenir au menu ».

(TP à défendre 2019-2020)


Solution
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
//Prototypes des fonctions
char* saisir();
void Afficher(char *chain);
int Ajouter(char *chain);
void Supprimer(char *chain);
void mots(char *chain);
char chaine[100];
int main(int argc, char *argv[]) {
char *ch = malloc(100* sizeof(char));
ch[0]=' ';
ch[1]=' ';
ch[2]=' ';
int choix=0;
label1: printf("Voici le menu\n");
printf("1. Saisir la chaine\n");
printf("[Link] la chaine\n");
printf("3. Ajouter un mot\n");
printf("4. Supprimer le mot\n");
printf("[Link] de mot de la chaine\n");
printf("________________________________________\n");
label2: printf("Faites votre choix\n");
scanf("%d", &choix);
if (choix<1 && choix>5)
{
printf("Le choix est incorrect, recommencez\n");
goto label2;
}
if(choix==1)
{
ch=saisir();
}
else if(choix==2)
{
Afficher(ch);
}
else if(choix==3)
53 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
int p;
p=Ajouter(ch);
printf("Apres ajout, la chaine vaut %s\n",ch);
printf("Le mot ajoute se trouve a la position %d\n",p);
}
else if(choix==4)
{
Supprimer(ch);
}
else if(choix==5)
{
mots(ch);
}

char touche;
printf("Frapper une touche pour revenir au menu\n");
scanf("%c", &touche);
scanf("%c", &touche);
system("cls");
goto label1;
return 0;
}
//Fonction Saisir
char* saisir()
{
printf("Entrez la chaine\n");
gets(chaine);
gets(chaine);
return chaine;
}

//Fonction Afficher
void Afficher(char *chain)
{
int i=0;
char tampon;
if (strlen(chain)==0)
{
printf("La chaine est vide\n");
}
else
{
//Inversion de la chaine
for(i=0; i<floor(strlen(chain)/2); i++ )
{
tampon=chain[i];
chain[i]=chain[strlen(chain)-i-1];

54 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
chain[strlen(chain)-i-1]=tampon;
}
printf("La chaine inversee est %s\n", chain);
}
}

//Fonction Ajouter
int Ajouter(char *chain)
{
char m[30];
printf("Entrez le mot a ajouter\n");
scanf("%s",m);
strcat(chain," ");
strcat(chain,m);
int pos=0;
if (m==NULL)
{
pos=-1;
}
else
{
pos=strlen(chain)-strlen(m)+1;
}
return pos;
}

//Fonction Supprimer
void Supprimer(char *chain)
{

char mot[30];
printf("Entrez le mot a supprimer\n");
scanf("%s",mot);
const char *pos; /* Position d'une occurance de Avant dans txt */
char *TxtRetour; /* La chaine retournée */
size_t PosTxtRetour; /* Position du prochain caractère à écrire */
/* dans TxtRetour */
size_t Long; /* Long d'une chaine à écrire dans TxtRetour */
size_t TailleAllouee; /* Taille allouée à TxtRetour */
char Apres[]=" ";
/* Cherche la première occurence */
pos = strstr (chain, mot);

/* Aucune occurrences : renvoie simplement une copie de la chaine */


if (pos == NULL)
{
printf("Le mot entre ne se trouve pas dans la chaine\n");
}

55 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
/* Alloue une nouvelle chaine */
Long = (size_t)pos - (size_t)chain;
TailleAllouee = Long + strlen (Apres) + 1;
TxtRetour = malloc (TailleAllouee);
PosTxtRetour = 0;

/* Copie la première partie de la chaîne sans occurrence */


strncpy (TxtRetour + PosTxtRetour, chain, Long);
PosTxtRetour += Long;
chain = pos + strlen (mot);

/* Ajoute la chaîne de remplacement Apres */


Long = strlen (Apres);
strncpy (TxtRetour + PosTxtRetour, Apres, Long);
PosTxtRetour += Long;

/* Cherche la prochaine occurrence */


pos = strstr (chain, mot);
while (pos != NULL)
{
/* Agrandit la chaine */
Long = (size_t)pos - (size_t)chain;
TailleAllouee += Long + strlen (Apres);
TxtRetour = (char *)realloc (TxtRetour, TailleAllouee);

/* Copie ce qu'il y a entre la dernier occurrence et la nouvelle */


strncpy (TxtRetour + PosTxtRetour, chain, Long);
PosTxtRetour += Long;

/* Passe l'occurrence */
chain = pos + strlen (mot);

/* Ajoute la chaîne de remplacement */


Long = strlen (Apres);
strncpy (TxtRetour + PosTxtRetour, Apres, Long);
PosTxtRetour += Long;

/* Cherche la prochaine occurrence */


pos = strstr (chain, mot);
}

/* Ajoute le reste de la chaîne (il reste au moins '\0') */


Long = strlen (chain) + 1;
TailleAllouee += Long;
TxtRetour = realloc (TxtRetour, TailleAllouee);
strncpy (TxtRetour + PosTxtRetour, chain, Long);

56 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("Apres suppression du mot, la chaine devient %s\n",TxtRetour);

// Fonction mots
void mots(char *chain)
{
int n=1, i=0;
char c=32;
for(i=1; i<strlen(chain);i++)
{
if (chain[i]==c && chain[i] !=chain[i-1])
{

n++;
}
}
printf("La chaine a %d mots \n",n);}

Illustration de l’exécution

57 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 30
Proposez un jeu en C qui demande à l’utilisateur de trouver la bonne assertion
du problème qui suit en 5 essais tout au plus : à la clôture de la caisse, le
comptable réalise que toutes les 17 pièces de monnaie qu’il détient sont de 1
euro ou de 50 centimes. Combien de pièces de pièces de 1 Euro et de 50
centimes a le comptable, si la valeur totale des pièces est de 12 Euros.

(TP à défendre 2019-2020)

Solution
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
int main(int argc, char *argv[]) {
int i=1;
58 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
int rep;

printf("QUESTION\n");
printf("__________\n");
printf("A la cloture de la caisse, le comptable realise que toutes les 17
pieces qu'il detient sont de 1 Euro ou de 50 centimes. Combien de pieces de 1
Euro et de 50 centimes a le comptable, si la valeur totale des pieces est de 1
2 Euros\n");
printf("Le nombre de pieces de 1 Euro et de 50 centimes valent respectivem
ent\n");
printf("1) 5 et 12 2) 6 et 11 3) 10 et 7 4) 17 et 0 5) 0 et 17 6)
11 et 6 7) 7 et 10 8) 16 et 1\n");
label1: printf("Entrez votre reponse\n");
scanf("%d", &rep);
if(rep==7)
{
printf("BRAVO, vous avez reussi\n");
}
else
{
i++;
if(i<6)
{
printf("MAUVAISE REPONSE\n");
printf("Il vous reste %d essaies\n", 6-i);
goto label1;
}
else
{
printf("Vous avez epuise vos essaie, vous avez echoue\n");
}

return 0;
}

Illustrations de l’exécution

59 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 31
Une pièce a 5.10 m de largeur et 6.90 m de longueur. Vous voulez y placer des
carreaux dont chacun fait 30 cm x 30 cm (les joints inclus). Ecrire un programme
en C qui calcule le nombre des carreaux qu’on devrait avoir et l’utilisateur
devrait le trouver en 5 essaies maximum.

(TP à défendre 2019-2020)

60 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


float surface1=0.0;
float surface2=0.0;
int n=0, rep=0,i=1;
surface1=5.10*6.90;
surface2=0.3*0.3;
//Nombre de carreaux
n=surface1/surface2;
printf("Soit une piece de 5,10 m de largeur et de longueur, on desire y pl
acer des carreaux dont chacun fait 30 cm x 30 cm (Les joints inclus).\n");
printf("Trouver le nombre de carreaux qu'on devait avoir\n");
label1: printf("Entrez votre reponse\n");
scanf("%d",&rep);

if(rep==n)
{
printf("BRAVO, vous avez trouve\n");
}
else
{
i++;
if(i<6)
{
printf("MAUVAISE REPONSE\n");
printf("Il vous reste %d essaies\n", 6-i);
goto label1;
}
else
{
printf("Vous avez epuise vos essaies, VOUS AVEZ ECHOUE\n");
}
}
return 0;
}

Illustrations de l’exécution

61 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
62 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 32
Ecrire un programme calculette permettant d’utiliser les fonctions suivantes :

𝑎. Une fonction Exponentielle qui prend en argument deux entiers n et m avec


𝑚 ≥ 0 et qui renvoie 𝑛𝑚

𝑏. Une fonction Pgcd qui prend en argument deux entiers n et m avec 𝑛 ≠ 0


et qui envoie le plus grand diviseur commun de |n| et |m|. (on utilisera la
méthode d’Euclide).

𝑐. Une fonction Ppcm qui prend en arguments deux entiers non nuls et qui
renvoie le plus petit multiple commun de n et m.

(TP à défendre 2019-2020)

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
//Prototypes des fonctions
int Exponentielle(int n, int m);
int Pgcd(int n, int m);
int Ppcm(int a, int b);

int main(int argc, char *argv[]) {


int choix=0, exp=0, ppcm=0, pgcd=0;
int n=0, m=0;
printf("Voici le menu\n");
printf("1. Exponentiation\n");
printf("2. PGCD\n");
printf("3. PPCM\n");
label1: printf("Faites votre choix\n");
scanf("%d",&choix);
if (choix<1 || choix>3)
{
printf("Le choix est incorrect, recommencez\n");
goto label1;
}
//Pour l'exponentiation
if(choix==1)
{
printf("Entrez la valeur du nombre\n");

63 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
scanf("%d",&n);
label2: printf("Entrez la valeur de l'exposant\n");
scanf("%d",&m);
if (m<0)
{
printf("L'exposant doit etre superieur a 0, recommencez\n");
goto label2;
}
exp=Exponentielle(n,m);
printf("%d exposant %d vaut %d\n", n, m, exp);

//Pour le PGCD
else if(choix==2)
{
printf("Entrez le premier nombre\n");
scanf("%d",&n);
printf("Entrez le deuxieme nombre\n");
scanf("%d",&m);
pgcd=Pgcd(n,m);
printf("Le pgcd de %d et de %d vaut %d\n",n,m,pgcd);
}

//Pour le ppcm
else if(choix==3)
{
printf("Entrez le premier nombre\n");
scanf("%d",&n);
printf("Entrez le deuxieme nombre\n");
scanf("%d",&m);
ppcm=Ppcm(n,m);
printf("Le ppcm de %d et de %d vaut %d\n",n,m,ppcm);
}
return 0;
}

//La fonction Exponentielle


int Exponentielle(int n, int m)
{
return pow(n,m);
}

//La fonction Pgcd


int Pgcd(int n, int m)
{
int a=0, b=0, q=0, r=0;
if (n>=m)

64 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
a=fabs(n);
b=fabs(m);
}
else
{
a=fabs(m);
b=fabs(n);
}
q=floor(a/b);
r=a-b*q;
while(r !=0)
{
a=b;
b=r;
q=floor(a/b);
r=a-b*q;
}
return b;
}
//Fonction PPCM
int Ppcm(int a, int b)
{
int c=0, d=0;
c=fabs(a);
d=fabs(b);
while( a!=b)
{
if(a>b)
{
b+=d;
}
else
{
a+=c;
}
}
return a;
}

Illustrations de l’exécution

65 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
66 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 33
Ecrire un programme permettant de jouer au jeu "Kaf, Gabino, Parker". On
codera Kaf par 0, Gabino par 1 et Parker par 2. Chaque joueur propose son
pari en tapant 0, 1 ou 2. Pour déterminer lequel des deux joueurs a gagné, on
utilise l’algorithme suivant :

Soit J1 le pari du joueur 1 et J2 celui du joueur 2

- Si J1 et J2 sont identiques le match est nul,


- J1 gagne si J1=(J2+1)mod3,
- J2 gagne dans le cas restant

Pour ceci :

Ecrire une fonction LireInf qui effectue la saisie contrôlée d’un entier entre 0 et
2

Ecrire une fonction arbitre qui reçoit les paris des deux joueurs et qui renvoie 0
si le match est nul, 1 si le joueur 1 a gagné et 2 si c’est le joueur 2

Ecrire un programme qui arbitre 10 parties et qui affiche le score

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
//Prototypes de la fonction
int LireInf();
int arbitre(int n1, int n2);

int main(int argc, char *argv[]) {


int j1=0, j2=0,i=1, score1=0, score2=0, resultat=0;
label2: printf("Debut de la partie %d\n",i);
printf("Joueur 1\n");
j1=LireInf();
system("cls");
printf("Joueur 2\n");
j2=LireInf();
//Détermination du résultat
resultat=arbitre(j1,j2);
if (resultat==1)

67 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
score1++;
}
else if(resultat==2)
{
score2++;
}
i++;
system("cls");
if(i<=10)
{
goto label2;
}
else
{
printf("Voici le score: Joueur 1 %d - %d Joueur 2\n",score1, score2);
}

return 0;
}

//Fonction LireInf
int LireInf()
{
int p;
do
{
printf("Entrez votre pari\n");
scanf("%d",&p);
if(p<0 || p>2)
{
printf("Le pari est incorrect, recommencez\n");

}
}while (p<0 || p>2);

return p;
}
//Fonction arbitre
int arbitre(int n1, int n2)
{
int res=0;
if(n1==n2)
{
res=0;
}
else if(n1==((n2+1)%3))
{

68 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
res=1;
}
else
{
res=2;
}
return res;
}

EXERCICE 34
Ecrire le programme qui propose un choix à l’utilisateur entre minimum,
maximum et médiane. Le programme consistera de trouver le minimum de 2
entiers, le maximum de 3 entiers ainsi que la valeur médiane de trois réels. On
utilisera d’abord les instructions de test, puis les opérateurs

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int choix=0;
int n1=0, n2=0, n3=0;
float a=0.0, b=0.0, c=0.0, med=0.0;
printf("Menu\n");
printf("__________________\n");
printf("1. Minimum\n");
printf("2. Maximum\n");
printf("3. Mediane\n");
label1: printf("Faites votre choix\n");
scanf("%d",&choix);
if(choix<1 || choix>3)
{
printf("Choix incorrect, recommencez\n");
goto label1;
}

if(choix==1)
{
printf("Entrez le premier nombre\n");
scanf("%d", &n1);

69 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
printf("Entrez le deuxieme nombre\n");
scanf("%d", &n2);
if(n1<n2)
{
printf("Le minimum de deux est %d\n",n1);
}
else if(n1<n2)
{
printf("Le minimum de deux est %d\n",n2);
}
else
{
printf("Les deux entiers sont egaux\n");
}
}
else if(choix==2)
{
printf("Entrez le premier nombre\n");
scanf("%d", &n1);
printf("Entrez le deuxieme nombre\n");
scanf("%d", &n2);
printf("Entrez le troisieme nombre\n");
scanf("%d", &n3);
if(n1>n2 && n1> n3)
{
printf("Le maximum de trois entiers est : %d", n1);
}
else if (n2>n1 && n2> n3)
{
printf("Le maximum de trois entiers est : %d", n2);
}
else if (n3>n2 && n3> n1)
{
printf("Le maximum de trois entiers est : %d", n3);
}
else
{
printf("Le maximum n'existe pas\n");
}
}
else if(choix==3)
{
printf("Entrez le premier nombre\n");
scanf("%f", &a);
printf("Entrez le deuxieme nombre\n");
scanf("%f", &b);
printf("Entrez le troisieme nombre\n");
scanf("%f", &c);

70 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
if((a>=b && a<=c) || a<=b && a>=c)
{
printf("La mediane vaut : %f",a);
}
else if ((b>=a && b<=c) || b<=a && b>=c)
{
printf("La mediane vaut : %f",b);
}
else if ((c>=b && c<=a) || c<=b && c>=a)
{
printf("La mediane vaut : %f",c);
}
}
return 0;
}

EXERCICE 35
Ecrire un programme qui affiche sous forme binaire le résultat d’un OU, d’un ET,
ou d’un OU EXCLUSIF entre deux entiers entrés au clavier, selon le choix de
l’utilisateur.

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n1=0, n2=0, i=99, j=0;
char nombre1[100];
char nombre2[100];
int choix=0, p1, p2;
printf("Les operations logiques disponibles\n");
printf("1. ET\n");
printf("2. OU \n");
printf("3. OU EXCLUSIF\n");
label1: printf("Faites votre choix\n");
scanf("%d", &choix);
if (choix !=1 && choix!=2 && choix!=3 )
{
printf("Choix incorrect, recommencez!!!\n");
goto label1;
71 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}
printf("Entrez les deux entiers\n");
scanf("%d %d", &n1, &n2);
p1=n1;
p2=n2;
//Conversion du premier nombre en binaire
while(n1 !=0)
{
nombre1[i]=n1%2;
n1=floor(n1/2);
i--;
}

int t1=0, t2=0, tmax=0;


t1=99-i;

//Conversion du deuxieme nombre en binaire


i=99;
while(n2 !=0)
{
nombre2[i]=n2%2;
n2=floor(n2/2);
i--;
}

t2=99-i;
if (t1>=t2)
{
tmax=t1;
}
else
{
tmax=t2;
}

int binaire2[tmax];
int binaire1[tmax];

//Initialisation
for(j=0; j<tmax;j++)
{
binaire1[j]=0;
binaire2[j]=0;
}

//Récupération des valeurs correspondantes en binaire et on les mets


//Dans les tableaux des entiers

72 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
int l=tmax-1;
for (j=99; j>99-t1;j--)
{
binaire1[l]=nombre1[j];
l--;
}

l=tmax-1;
for (j=99; j>99-t2;j--)
{
binaire2[l]=nombre2[j];
l--;
}

// Détermination de la table de vérité


int ET[tmax];
int OU[tmax];
int XOR[tmax];
if(choix==1)
{
for(i=0;i<tmax;i++)
{
if (binaire1[i]==1 && binaire2[i]==1)
{
ET[i]=1;
}
else
{
ET[i]=0;
}
}
printf("Voici le résultat\n");
printf("%d | %d | %d ET %d\n", p1, p2, p1, p2);
printf("____________________________\n");
for (i=0; i<tmax; i++)
{
printf("%d | %d |%d\n", binaire1[i], binaire2[i], ET[i]);
}
}
else if(choix==2)
{
for(i=0;i<tmax;i++)
{
if (binaire1[i]==0 && binaire2[i]==0)
{
OU[i]=0;
}
else

73 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
OU[i]=1;
}
}
printf("Voici le résultat\n");
printf("%d | %d | %d OU %d\n", p1, p2, p1, p2);
printf("____________________________\n");
for (i=0; i<tmax; i++)
{
printf("%d | %d |%d\n", binaire1[i], binaire2[i], OU[i]);
}
}
else
{
for(i=0;i<tmax;i++)
{
if (binaire1[i]== binaire2[i])
{
XOR[i]=0;
}
else
{
XOR[i]=1;
}
}
printf("Voici le résultat\n");
printf("%d | %d | %d XOR %d\n", p1, p2, p1, p2);
printf("____________________________\n");
for (i=0; i<tmax; i++)
{
printf("%d | %d |%d\n", binaire1[i], binaire2[i], XOR[i]);
}
}

return 0;
}

Illustrations de l’exécution

74 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
75 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 36
Ecrire un programme qui déclare et initialise un tableau de cinq chaînes de
caractères, et selon le choix de l’utilisateur :

- Affiche la taille exacte de chacune des chaînes,


- Recopie les caractères d’une chaîne donnée dans une autre chaîne
- Change toutes les lettres minuscules d’une chaîne choisie dont l’adresse
est passée en argument, en majuscule

(TP à défendre 2019-2020)

Solution

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
char chaine[5][20]={"Wissen corporation", "Assistant" , "Langage C", "Math
info", "Unikin"};
//Prototype de la fonction
void Majuscules(char* ch );
int main(int argc, char *argv[]) {

76 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
int choix=0, i=0, chaineAcopier, chaineDest;
printf("Faites votre choix\n");
printf("1. Entrez la taille exacte des chaines\n ");
printf("2. Recopier les caracteres d'une chaine dans une autre\n");
printf("3. Changer toutes les lettres minuscules en majuscules\n");
label1: printf("Entrez votre choix\n");
scanf("%d", &choix);
if(choix !=1 && choix!=2 && choix!=3)
{
goto label1;
}

//Traitement du choix de l'utilisateur


if(choix==1)
{
printf("Voici la taille exacte de chaque chaine\n");
for(i=0; i<5; i++)
{
printf("%d", i);
printf(" La chaine %s a %d caracteres\n", chaine[i], strlen(chai
ne[i]) );
}
}
else if(choix==2)
{
label2: printf("Entrez le numero de la chaine a copier\n");
scanf("%d", &chaineAcopier);
if(chaineAcopier <0 || chaineAcopier>4)
{
printf("Le numero incorrect, recommencez\n");
goto label2;
}
label3: printf("Copier dans quelle chaine\n");
scanf("%d", &chaineDest);
if(chaineDest<0 || chaineDest>4)
{
printf("Le numero incorrect, recommencez\n");
goto label3;
}
//on copie
strcpy(chaine[chaineDest], chaine[chaineAcopier]);
printf("Apres copie, les 5 chaines sont: \n");
for(i=0; i<5; i++)
{
printf(" %s\n", chaine[i] );
}
}

77 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
else
{
char ch[20];
printf("Voici les 5 chaines \n");
for(i=0; i<5; i++)
{
printf(" %s\n", chaine[i] );
}
printf("Entrez la chaine a transformer\n");
scanf("%s", ch);
Majuscules(ch);
}
return 0;
}

void Majuscules(char* ch )
{
//On recherche cette chaine dans le tableau
int pos=-1, i=0;
for(i=0; i<5; i++)
{
if (strcmp(chaine[i], ch)==0)
{
pos=i;
}
}
//Changement des lettres minuscules en majuscules
if (pos==-1)
{
printf("La chaine saisie est incorrecte\n");
}
else
{
for(i=0; i<strlen(chaine[pos]);i++)
{
chaine[pos][i]=toupper(chaine[pos][i]);
}
printf("Apres transformation, les differentes chaines sont:\n");
for(i=0; i<5; i++)
{
printf("%s \n",chaine[i]);
}
}
}

78 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 37
Créer un programme qui permet de gérer un répertoire téléphonique. Pour
chaque entrée dans le répertoire téléphonique on retient le numéro de
téléphone et nom de la personne comme des chaînes de caractères,
l’adresse, la date de naissance, l’adresse e-mail ainsi que le code de
département dont la personne appartient. Le programme permet de :

𝑎) Ajouter un enregistrement dans le répertoire

𝑏) Vérifier si une personne située dans un certain département est présente


dans le répertoire. Si la personne n’existe pas, afficher le message

𝑐) Rechercher le nom et le département selon le numéro de téléphone

𝑑) Enlever un enregistrement dans le répertoire. L’enregistrement est identifié


soit par le n° de téléphone soit par le nom et le département

𝑒) Trier les enregistrements selon les noms

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
typedef struct contact contact;
struct contact
{
char nume[16];
char noms[15];
char adress[20];
char dateNaiss[20];
char mail[20];
int Departement;
};
int main(int argc, char *argv[]) {
FILE* fichier = NULL;
char numero[16];
char nom[15];
char adresse[20];
char dateNaissance[20];
char email[20];
int codeDepartement;

79 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
contact listes[100];
int choix=0;
printf("Voici le menu\n");
printf("[Link] un enregistrement\n");
printf("[Link] grace au nom et au departement\n");
printf("[Link] le nom et le departement \n");
printf("4. Supprimer un contact grace au numero\n");
printf("5. Supprimer un contact grace au nom et departement\n");
printf("6. Trier les enregistrements selon les noms\n");
printf("_____________________________________________________\n");
label1: printf("Faites votre choix\n");
scanf("%d", &choix);
if (choix<1 && choix>6)
{
printf("Le choix est incorrect, recommencez\n");
goto label1;
}
if (choix==1)
{
printf("Les informations du contact\n") ;
printf("Son numero\n");
scanf("%s",numero);
printf("Son nom\n");
scanf("%s", nom);
printf("son adresse\n");
scanf(" %s",adresse);
printf("sa date de naissance\n");
scanf("%s",dateNaissance);
printf("Son email\n");
scanf("%s", email);
printf("Le code de son departement\n");
scanf("%d", &codeDepartement);
//Ouverture du fichier

fichier = fopen("[Link]", "a+");


if(fichier!=NULL)
{
//Enregistrement
fprintf(fichier,"%s %s %s %s %s %d \n", numero, nom, adresse,dateN
aissance,email,codeDepartement);
printf("Enregistrement reussi\n");
}
fclose(fichier);
}
else if(choix==2)
{
char n[100];
int test=0;

80 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
int departement;
printf("Entrez le nom de la personne\n");
scanf("%s", n);
printf("Entrez son departement\n");
scanf("%d", &departement);
//ouverture du fichier
fichier = fopen("[Link]","r");

while(fscanf(fichier,"%s %s %s %s %s %d \n",numero, nom, adresse,d


ateNaissance,email,&codeDepartement)==6)
{
if(strcmp(nom,n)==0 && departement==codeDepartement)
{
test=1;
}

if(test==1)
{
printf("%s du departement %d se trouve dans le repertoire \n",n, d
epartement);
}
else
{
printf("%s du departement %d ne se trouve pas dans le rep
ertoire", n, departement);
}

fclose(fichier);
}
else if(choix==3)
{
char num[16];
printf("Entrez le numero\n");
scanf("%s",num);
//ouverture du fichier
fichier = fopen("[Link]","r");
int test=0;
while(fscanf(fichier,"%s %s %s %s %s %d \n",numero, nom, adresse,d
ateNaissance,email,&codeDepartement)==6)
{
if(strcmp(num,numero)==0 )
{
printf("Le proprietaire du numero %s est %s et et son dep
artement est %d\n",num, nom, codeDepartement);
test=1;

81 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}

}
if(test==0)
{
printf("Ce numero est introuvable\n");
}
fclose(fichier) ;
}
else if(choix==4)
{

char num[16];
printf("Entrez le numero\n");
scanf("%s", &num);
//ouverture du fichier
fichier = fopen("[Link]","r");
int test=0,j=0, k=0;
while(fscanf(fichier,"%s %s %s %s %s %d \n",numero, nom, adresse,d
ateNaissance,email,&codeDepartement)==6)
{
if(strcmp(num,numero)!=0 )
{
strcpy(listes[j].nume,numero);
strcpy(listes[j].adress,adresse);
strcpy(listes[j].dateNaiss,dateNaissance);
listes[j].Departement=codeDepartement;
strcpy(listes[j].mail,email);
strcpy(listes[j].noms,nom);
j++;
}
else
{
test=1;
}

}
//Fermeture du fichier
fclose(fichier);
//Ouverture du fichier avec eclasement du contenu
fichier = fopen("[Link]","w+");
//Enregistrement du nouveau contenu
for(k=0;k<j;k++)
{
fprintf(fichier,"%s %s %s %s %s %d \n", listes[k].nume, listes
[k].noms, listes[k].adress,listes[k].dateNaiss,listes[k].mail,listes[k].Depart
ement);
}

82 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
if (test==0)
{
printf("Numero introuvable\n");
}
else
{
printf("Suppression effectuee avec succes\n");
}
}
else if(choix==5)
{
char n[100];
int dpt=0;
printf("Entrez le nom a supprimer\n");
scanf("%s",n);
printf("Entrez le departement\n");
scanf("%d",&dpt);
//ouverture du fichier
fichier = fopen("[Link]","r");
int test=0,j=0, k=0;
while(fscanf(fichier,"%s %s %s %s %s %d \n",numero, nom, adresse,d
ateNaissance,email,&codeDepartement)==6)
{
if(strcmp(n,nom)!=0 && dpt !=codeDepartement )
{
strcpy(listes[j].nume,numero);
strcpy(listes[j].adress,adresse);
strcpy(listes[j].dateNaiss,dateNaissance);
listes[j].Departement=codeDepartement;
strcpy(listes[j].mail,email);
strcpy(listes[j].noms,nom);
j++;
}
else
{
test=1;
}

}
//Fermeture du fichier
fclose(fichier);
//Ouverture du fichier avec eclasement du contenu
fichier = fopen("[Link]","w+");
//Enregistrement du nouveau contenu
for(k=0;k<j;k++)
{

83 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
fprintf(fichier,"%s %s %s %s %s %d \n", listes[k].nume, listes
[k].noms, listes[k].adress,listes[k].dateNaiss,listes[k].mail,listes[k].Depart
ement);
}
if (test==0)
{
printf("Nom ou departement introuvable\n");
}
else
{
printf("Suppression effectuee avec success\n");
}
fclose(fichier);
}

//Tri des enregistrements suivants les noms


else if(choix==6)
{
//ouverture du fichier
fichier = fopen("[Link]","r");
int j=0, k=0,l=0;
contact tampon;
//On met tous les enregistrements dans un tableau en vue d'un tri fac
ile
while(fscanf(fichier,"%s %s %s %s %s %d \n",numero, nom, adresse,d
ateNaissance,email,&codeDepartement)==6)
{

strcpy(listes[j].nume,numero);
strcpy(listes[j].adress,adresse);
strcpy(listes[j].dateNaiss,dateNaissance);
listes[j].Departement=codeDepartement;
strcpy(listes[j].mail,email);
strcpy(listes[j].noms,nom);
j++;
}
fclose(fichier);
//On tri le tableau contenant tous les enregistrements du fic
hier
for(l=0;l<=j-1;l++)
{
for(k=l+1;k<j;k++)
{
if(listes[k].noms < listes[k-1].noms)
{
strcpy([Link],listes[k].adress);
strcpy([Link],listes[k].dateNaiss);
strcpy([Link],listes[k].mail);

84 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
strcpy([Link],listes[k].noms);
strcpy([Link],listes[k].nume);
[Link]=listes[k].Departement;

strcpy(listes[k].adress,listes[k-1].adress);
strcpy(listes[k].dateNaiss,listes[k-1].dateNaiss);
strcpy(listes[k].mail,listes[k-1].mail);
strcpy(listes[k].noms,listes[k-1].noms);
strcpy(listes[k].nume,listes[k-1].nume);
listes[k].Departement=listes[k-1].Departement;

strcpy(listes[k-1].adress,[Link]);
strcpy(listes[k-1].dateNaiss,[Link]);
strcpy(listes[k-1].mail,[Link]);
strcpy(listes[k-1].noms,[Link]);
strcpy(listes[k-1].nume,[Link]);
listes[k-1].Departement=[Link];

listes[k]=listes[k-1];
listes[k-1]=tampon;
}
}
}
//On ouvre le fichier en écrasant l'ancien contenu
//Ouverture du fichier avec eclasement du contenu
fichier = fopen("[Link]","w+");
//Enregistrement du nouveau contenu
for(k=0;k<j;k++)
{
fprintf(fichier,"%s %s %s %s %s %d \n", listes[k].nume, listes
[k].noms, listes[k].adress,listes[k].dateNaiss,listes[k].mail,listes[k].Depart
ement);
}
printf("Tri effectue avec succes\n");
}
return 0;
}

85 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 38
Ecrire un programme allouant dynamiquement un emplacement pour un
tableau d’entiers, dont la taille est fournie en donnée. Utiliser ce tableau pour
y placer des nombres entiers lus également en donnée. Créer ensuite
dynamiquement un nouveau tableau destiné à recevoir les carrés des
nombres contenus dans le premier. Supprimer le premier tableau, afficher les
valeurs du second et supprimer le tout. On ne cherchera pas à traiter un
éventuel problème de manque de mémoire.

(TP à défendre 2019-2020)

Solution
#include <stdio.h>

#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n=0, i=0;
int* t=NULL;
int* A=NULL;
label1: printf("Entrez la taille du tableau\n");
scanf("%d", &n);
if (n<=0)
{
printf("La taille doit etre positif, recommencez\n");
goto label1;
}
//Allocation dynamique de l'emplacement du tableau
t = malloc(n * sizeof(int));
if (t==NULL)
{
label2: printf("Espace insuffisant\n");
exit(0);
}

//On place les nombres entiers saisis dans ce tableau


for(i=0; i<n;i++)
{
printf("Entrez l'element n %d\n",i+1);
scanf("%d", &t[i]);
}

86 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
//On crée dynamiquement un deuxieme tableau
A = malloc(n * sizeof(int));
if(A==NULL)
{
goto label2;
}
//On insere les carrés du premier tableau dans le deuxieme
for(i=0;i<n;i++)
{
A[i]=t[i]*t[i];
}
//On supprime le premier tableau
free(t);
//On affiche les données du deuxième tableau
printf("Voici les éléments du deuxieme tableau\n");
for(i=0; i<n; i++)
{
printf("%d\t",A[i] );
}
//On supprime le deuxième tableau
free(A);
return 0;
}

EXERCICE 39
Soit la structure suivante, représentant un point d’un plan :
Struct point
{ char c ; //nom du point
Int x, y ; //Coordonnées
};
Ecrire un programme qui :

- Lit en données des valeurs pour le tableau courbe


- Fait appel à la fonction (nommée affiche) qui affiche les valeurs des
différentes « points » du tableau courbe, transmis en argument, sous la
forme :
Point D de coordonnées 10 2 pour les afficher
(TP à défendre 2019-2020)

87 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
struct point
{
char c; //nom du point
int x, y; //coordonnées
};

//Prototype de la fonction
void Affiche(struct point *tableau, int tailleTableau);
int main(int argc, char *argv[]) {
int n=0, i=0;
struct point* courbe=NULL;
label1: printf("Entrez le nombre de points\n");
scanf("%d",&n);
if(n<=0)
{
printf("La taille du tableau doit etre positif, recommencez\n");
goto label1;
}
//Allocation dynamique du tableau
courbe = malloc(n * sizeof(struct point));
if (courbe==NULL)
{
printf("Espace insuffisant\n");
exit(0);
}
//Lecture des données du tableau
for(i=0;i<n; i++)
{
printf("Lecture des coordonnees du point n %d \n", i+1);
printf("Le nom du point \n");
scanf(" %c", &courbe[i].c);
printf("La coordonnee x \n");
scanf(" %d", &courbe[i].x);
printf("La coordonnee y \n");
scanf(" %d", &courbe[i].y);

//Appel de la fonction affiche


Affiche(courbe, n);
88 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
//On libere la memoire
free(courbe);
return 0;
}

//La fonction Affiche


void Affiche(struct point *tableau, int tailleTableau)
{
int i=0;
printf("Voici les differents points\n");
for(i=0; i<tailleTableau; i++)
{
printf("point %c de coordonnees %d %d \n", tableau[i].c, tableau[i].x, tab
leau[i].y);
}
}

EXERCICE 40
On possède un compte bancaire avec un solde positif. On veut écrire un
programme en C qui lit une opération représentée par un caractère d pour
dépôt ou r pour retrait, ainsi qu’un entier positif qui indique la somme à
transférer. Dans le cas d’un retrait, la somme à transférer ne devra pas être
supérieur à 3⁄4 du solde. Si l’opération a pu aboutir, on écrira le nouveau solde.

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


//Le solde est deja connu dans le système
//On suppose que le solde est 100000
int solde=100000;
char operation="";
int montant=0;
label2: printf("Entrez l'operation a effectuer\n");
scanf(" %c",&operation);
label1: printf("Entrez le montant\n");
scanf("%d", &montant);
if(montant<=0)

89 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
printf("Le montant ne peut pas etre negatif, recommencez\n");
goto label1;
}

//On traite le cas où il s'agit d'un retrait


if (operation=='r')
{
if(montant> solde*3/4)
{
printf("Le montant du retrait ne peut pas etre superieur a trois q
uart du solde, recommencez\n");
goto label1;
}
else
{
solde=solde-montant;
printf("Operation du retrait reussie, le nouveau solde est: %d", sol
de);
}
}
else if (operation=='d')
{
solde=solde+montant;
printf("Depot reussi, le nouveau solde est %d\n", solde);
}
else
{
printf("Le type d'operation non reconnu, recommencez\n");
goto label2;
}
return 0;
}

EXERCICE 41
Ecrire un programme TD_A_DEFENDRE qui réalise le traitement suivant sur des
valeurs entières arbitrairement entrées au clavier. Dans cet exercice les
affichages seront systématiquement réalisés en décimal et en hexadécimal
(resp. %d, %x). Les positions des bits sont comptées à partir de la droite en
commençant par 0.

1. Afficher la valeur entrée dans les formats demandés ;

2. Tester si les bits de position 0 et 1 valent 0 ;

3. Mettre à 0 les bits de position 0 et 1


90 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
4. Tester si les bits de positions 0 et 1 valent 0

(TP à défendre 2019-2020)

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int n=0, t1=0, t2=0;
char decimal[100];
char hexa[100];
printf("Entrez un nombre\n");
scanf("%d", &n);
//Affichage de la valeur saisie en décimale et hexadécimale
printf("La valeur saisie en decimale vaut %d\n", n);
printf("Et en hexadecimale %x\n", n);

sprintf(decimal,"%d",n);
t1=strlen(decimal);
sprintf(hexa, "%x",n);
t2=strlen(hexa);

//Test sur les bits de positions 0 et 1 pour la représentation en déc


imale
printf("En representation decimale\n");
printf("___________________________________\n");
if (strlen(decimal)==1)
{
if (decimal[0]=='0')
{
printf("Le nombre n'a qu'un seul bit et ce bit egal a 0");
}
else
{
printf("Le nombre a un seul bit qui est different de 0");
}
}
else
{
if (decimal[t1-1]=='0' && decimal[t1-2]=='0')
{
printf("Les bits de position 1 et 0 valent 0\n");
}

91 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
else if (decimal[t1-1]=='0' && decimal[t1-2]!='0')
{
printf("Le bit de position 0 vaut 0 mais celui de position 1 e
st different de 0\n");
}
else if (decimal[t1-1]!='0' && decimal[t1-2]=='0')
{
printf("Le bit de position 1 vaut 0 mais celui de position 0 e
st different de 0\n");
}
else
{
printf("Les bits de position 1 et 0 sont differents de 0\n");
}
}

//Test sur les bits de positions 0 et 1 pour la représentation en


hexadecimale
printf("En representation hexadecimale\n");
printf("___________________________________\n");
if (strlen(hexa)==1)
{
if (hexa[0]=='0')
{
printf("Le nombre n'a qu'un seul bit et ce bit egal a 0");
}
else
{
printf("Le nombre a un seul bit qui est different de 0");
}
}
else
{
if (hexa[t2-1]=='0' && hexa[t2-2]=='0')
{
printf("Les bits de position 1 et 0 valent 0\n");
}
else if (hexa[t2-1]=='0' && hexa[t2-2]!='0')
{
printf("Le bit de position 0 vaut 0 mais celui de position 1 e
st different de 0\n");
}
else if (hexa[t2-1]!='0' && hexa[t2-2]=='0')
{
printf("Le bit de position 1 vaut 0 mais celui de position 0 e
st different de 0\n");
}
else

92 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
printf("Les bits de position 1 et 0 sont differents de 0\n");
}
}
//Mise en 0 les bits de position 0 et 1
if (t1==1)
{
decimal[0]='0';
}
else
{
decimal[t1-1]='0';
decimal[t1-2]='0';
}

if(t2==1)
{
hexa[t2-1]='0';
}
else
{
hexa[t2-1]='0';
hexa[t2-2]='0';
}
//Affichage
printf("___________________________________\n");
printf("Apres la mise en 0 des bits de position 0 et 1, le nombre vaut
\n") ;
printf("En decimale :%s\n", decimal);
printf("En hexadecimale : %s\n", hexa);

return 0;
}

EXERCICE 42
On veut mettre au point un programme de vente des cartons de papiers
duplicateurs (formats : A4, A3 et A2) avec possibilité de livraison à domicile. Le
programme calculera le prix total (PT) pour un format donné des papiers à
l’aide de son prix unitaire (PU) avec un taux de TVA constant de 12,6% et de sa
quantité (Q) ; ensuite le Net à payer (NP) constitué du prix total (PT) et des frais
de transport (FT) (les formats A4, A3 et A2 ont respectivement comme prix
unitaires 5$, 8$ et 12$ par carton). Proposer un programme qui résout ce
problème.

(TP à défendre 2019-2020)


93 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int Q=0,pu=0, ft=0;
float tva=0.0, pt=0.0, np=0.0 ;
char format[2];
label1: printf("Entrez le format de papiers\n");
scanf(" %s", format);
label2: printf("Entrez le nombre de cartons\n");
scanf(" %d", &Q);
if (Q<0 )
{
printf("Le nombre de cartons ne peut pas etre negatif, recommencez\n");
goto label2;
}
label3: printf("Entrez le frais de transport\n");
scanf(" %d",&ft);
if(ft<0)
{
printf("Le frais de transport ne peut pas etre negatif, recommencez\n"
);
goto label3;
}

//Calcul du prix total


if (strcmp(format, "A4")==0)
{
pt=Q*5;
}
else if (strcmp(format, "A3")==0)
{
pt=Q*8;
}
else if (strcmp(format, "A2")==0)
{
pt=Q*12;
}
else
{
printf("format non reconnu, recommencez\n") ;
goto label1;
}

94 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
tva=pt*0.126;
pt=pt+tva;
np=pt+ft;
printf("Le net a payer est: %f", np);
return 0;
}

EXERCICE 43
Ecrire un programme nommé TRI qui trie par ordre croissant trois valeurs double
lues au clavier. Une exécution de ce programme donnera à l’écran ce qui
suit :
Entrez trois valeurs flottantes : 4.4 1.1 3.3

Vous avez entré les valeurs 4.400000, 1.100000, 3.300000 qui triées par ordre
croissant sont : 1.100000, 3.300000, 4.400000
(TP à défendre 2019-2020)
Solution
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


double a, b, c;
printf("Entrez trois valeurs flottantes\n");
scanf("%lf %lf %lf", &a, &b, &c);
//Tri
if (a<=b && a<=c)
{
if(b<=c)
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont : %lf, %lf, %lf",a,b,c, a, b, c);
}
else
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont : %lf, %lf, %lf"a,b,c, a, c, b);
}
}
else if(b<=a && b<=c)
{

95 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
if(a<=c)
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont :%lf, %lf, %lf",a,b,c, b, a, c);
}
else
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont: %lf, %lf, %lf:",a,b,c, b, c, a);
}
}
else if(c<=a && c<=b)
{
if(a<=b)
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont: %lf, %lf, %lf:",a,b,c, c, a, b);
}
else
{
printf("Vous avez entre les valeurs %lf, %lf, %lf qui triées par o
rdre croissant sont: %lf, %lf, %lf:",a,b,c, c, b, a);
}
}

return 0;
}

EXERCICE 44
Un centre hospitalier calcule le montant à payer par un malade pour les soins
suivis à l’aide des rubriques suivantes : coût matériel (CM), frais actes médicaux
(Faux) et frais d’hospitalisation (FH). Les frais d’hospitalisation dépendent de
nombre de jours et se calculent comme suit : 0 à 30 jours, les frais journaliers
d’hospitalisation sont fixés à 2850Fc et à partir du 31ème jour, ces frais journaliers
passent à 1350Fc. Seuls les malades de la catégorie « employé » obtiennent
une réduction de 25% sur les frais d’hospitalisation et sont exemptés aussi du
coût matériel

(TP à défendre 2019-2020)

96 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int CM=0, Faux=0,FH=0, nombreJours=0, NP=0;
char categorie[15];
printf("Entrez la categorie du malade\n");
scanf("%s", categorie);

label1: printf("Entrez le cout materiel\n");


scanf("%d",&CM);
if(CM<0)
{
printf("Le cout materiel ne peut pas etre negatif, recommencez\n");
goto label1;
}

label2: printf("Entrez les frais d'actes medicaux\n");


scanf("%d",&Faux);
if(Faux<0)
{
printf("Les frais d'actes medicaux ne peuvent pas etre negatif, recommence
z\n");
goto label2;
}

label3: printf("Entrez le nombre de jours\n");


scanf("%d",&nombreJours);
if (nombreJours<0)
{
printf("Le nombre de jours incorrect\n");
goto label3;
}

//Détermination des frais d'hospitalisation


if(nombreJours<=30)
{
FH=nombreJours*2850;
}
else
{
FH=30*2850+(nombreJours-30)*1350;
97 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}

//Determination de la réduction
if (strcmp(categorie,"Employe")==0)
{
FH=FH-FH*0.25;
CM=0;
}

//Détermination et affichage du net à payer


NP=CM+Faux+FH;
printf("Le net a payer est %d FC", NP);
return 0;
}

EXERCICE 45
Proposer un programme nommé COMPTER qui calcule le nombre
d’occurrences (le nombre d’apparitions) d’un caractère arbitrairement entré
au clavier, dans le mot anticonstitutionnellement. L’exécution de ce
programme donnera à l’écran ce qui suit.

Pour éviter les répétitions indésirables des demandes, utiliser le format "%C%C"
pour la lecture du caractère au clavier.

Anticonstitutionnellement

Entrer un caractère en minuscule (X si arrêt) : a

Le mot anticonstitutionnellement comporte 1 fois la lettre a

Entrer un caractère en minuscule (X si arrêt) : z

Le mot anticonstitutionnellement comporte 0 fois la lettre a

Entrer un caractère en minuscule (X si arrêt) : X

(TP à défendre 2019-2020)

Solution

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


char chaine[]="anticonstitutionnellement";
98 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
char car;
int n=0,i=0;
printf("%s\n",chaine);
label1: printf("Entrez un caractere en minuscule\n");
scanf("%c%*c",&car);
n=0;
if (car!='X')
{
for(i=0;i<strlen(chaine);i++)
{
if (chaine[i]==car)
{
n++;
}
}
printf("Le mot %s comporte %d fois la lettre %c\n",chaine,n,car);
goto label1;
}

return 0;
}

EXERCICE 46
Ecrire un programme en C qui demande à l’utilisateur d’introduire 2 Matrices
A et B d’ordres 2 et affiche ensuite la matrice concaténée C selon la règle
suivante :

Si le déterminant de la matrice A est supérieur ou égal à celui de la matrice B,


la concaténation se fait en colonne c’est-à-dire une matrice 𝐶(4 × 2) ;
contrairement, elle se fera en ligne (2 × 4).

N.B. : L’affichage devra se faire sous forme matricielle.

Illustration
10 2 9 5
𝐴=( ) & 𝐵=( )
7 3 4 3
𝐷𝑒𝑡 𝐴 = 16 𝑒𝑡 𝐷𝑒𝑡 𝐵 = 7. D’où une concaténation en colonne :
10 2 9 5
𝐶=( )
7 3 4 3
(Interro 2017-2018)
(TP 2019-2020)

99 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
Solution
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */

int main(int argc, char *argv[]) {


int A[2][2];
int B[2][2];
int C[2][4];
int D[4][2];
int i=0, j=0, detA=0, detB=0;
//Lecture des éléments de deux tableaux
printf("Lecture des elements du premier tableau\n");
for(i=0;i<2;i++)
{
for(j=0; j<2; j++)
{
printf("Entrez l'element A[%d][%d]\n",i, j);
scanf("%d", &A[i][j]);
}
}

printf("Lecture des elements du deuxieme tableau\n");


for(i=0;i<2;i++)
{
for(j=0; j<2; j++)
{
printf("Entrez l'element B[%d][%d]\n",i, j);
scanf("%d", &B[i][j]);
}
}
//Calcul des déterminants
detA=A[0][0]*A[1][1]-A[0][1]*A[1][0];
detB=B[0][0]*B[1][1]-B[0][1]*B[1][0];

//Concaténation
if(detA>=detB)
{
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
if(j<2)
{
100 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
C[i][j]=A[i][j];
}
else
{
C[i][j]=B[i][j-2];
}

}
}
printf("Voici la matrice concatenee\n");
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t", C[i][j]);
}
printf("\n");
}
}
else
{
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{
if (i<2)
{
D[i][j]=A[i][j];
}
else
{
D[i][j]=B[i-2][j];
}
}
}
printf("Voici la matrice concatenee\n");
for(i=0;i<4;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t", D[i][j]);
}
printf("\n");
}
}
return 0;
}

101 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 47

Vous êtes dans la boutique du plus grand marchand de la ville, à la recherche


d'un certain nombre d'ingrédients. Malheureusement pour vous, c'est la
période du grand inventaire et cela peut durer très longtemps ! Vous décidez
de les aider. À partir du livre de comptes, sur lequel sont indiqués toutes les
ventes et achats de chaque produit, vous allez pouvoir rapidement vérifier si
les quantités restantes dans les étalages sont bien les bonnes et s'il n'y a pas eu
de vols.

Votre programme en C fait ce qui suit :

Un livre de comptes décrit les achats et ventes successives de 10 produits


numérotés de 1 à 10. Le livre décrit les opérations depuis une situation où le
stock de chacun des produits était de zéro.
Chaque ligne du livre de comptes décrit l'achat (augmentation du stock) ou
la vente (réduction du stock) d'une certaine quantité de l'un des produits.
Votre objectif est de déterminer pour chaque produit, la quantité restant dans
le stock à l'issue de l'ensemble de ces achats et ventes.

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

/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
typedef struct transaction transaction;
struct transaction
{
int numProduit;
char typeOperation[10];
int qte;
};

int main(int argc, char *argv[]) {


int n=0, i=0;
printf("Entrez le nombre des operations\n");
scanf("%d",&n);
transaction livre[n];
//Enregistrement des transactions
printf("Enregistrement des operations\n");
for(i=0; i<n;i++)

102 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
printf("Operation no %d\n", i+1);
printf("Type de l'operation: Achat ou vente\n");
scanf("%s", &livre[i].typeOperation);
printf("Numero produit concerne\n");
scanf("%d", &livre[i].numProduit);
printf("La quantite\n");
scanf("%d",&livre[i].qte);
}

//Inventaire
int totalAchat;
int totalVente;
int stock[10];
int j=0;
for(j=0; j<10;j++)
{
totalAchat=0;
totalVente=0;
for(i=0; i<n;i++)
{
if (livre[i].numProduit==j+1 && strcmp(livre[i].typeOperation, "ac
hat")==0)
{
totalAchat+=livre[i].qte;
}
else if (livre[i].numProduit==j+1 && strcmp(livre[i].typeOperation
, "vente")==0)
{
totalVente+=livre[i].qte;
}

}
stock[j]=totalAchat-totalVente;
}
//Affichage du résultat
system("cls");
printf("Voici le resutat de l'inventaire\n");
for(i=0;i<10; i++)
{
printf("Produit %d : stock restant : %d\n", i+1,stock[i]);
}

return 0;
}

103 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 48
Rechercher dans un tableau d’entier A une valeur L entrée au clavier. Afficher
la position de L. Si elle se trouve dans le tableau, sinon afficher un message
correspondant. La valeur P qui est utilisée pour mémoriser la position de la
valeur dans le tableau, aura la valeur -1 aussi longtemps que L n’a pas été
trouvée.
Implémentez deux versions :
La recherche séquentielle
La recherche dichotomique (recherche binaire, binary search) : condition est
que le tableau A doit être trié.

(Support de Langage C, page 124)

Solution

Recherche séquentielle

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
int main(int argc, char *argv[])
{ int n, i, l, p;
printf("Entrez la taille du tableau\n");
scanf("%d", &n); int A[n];
//Lecture des éléments du tableau printf("Lecture des elements du tableau\
n");
for(i=0; i<n; i++)
{
printf("Entrez l\'element n° %d\n", i+1);
scanf ("%d", &A[i]);
}
printf("Entrez l element a rechercher\n");
scanf("%d", &l);
//recherche i=-1;
p=-1;
while (i<n && l !=A[i])
{
i=i+1;
if (A[i]==l)
{
p=i;
}

104 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}
if (p==-1)
{
printf("L element %d ne se trouve pas dans le tableau\n", l);
}
else
{
printf("L element %d se trouve dans le tableau a la position %d",l, p)
;
}
return 0;
}

Recherche dichotomique
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pa
use") or input loop */
int main(int argc, char *argv[])
{
int n, i, j, l, p, tampon, debut, fin, m;
printf("Entrez la taille du tableau\n");
scanf("%d", &n);
int A[n];
//Lecture des éléments du tableau
printf("Lecture des elements du tableau\n");
for(i=0; i<n; i++)
{
printf("Entrez l\'element n° %d\n", i+1);
scanf ("%d", &A[i]);
}
printf("Entrez l element a rechercher\n");
scanf("%d", &l);
//Tri du tableau
for(i=0; i<n-1; i++)
{
for(j=n-1; j>i;j--)
{
if(A[j] < A[j-1])
{
tampon=A[j];
A[j]=A[j-1];
A[j-1]=tampon;
}
}
}
//recherche
105 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
debut=0;
fin=n-1;
do {
m=(debut+fin)/2;
if (l>A[m])
{
debut=m+1;
}
else
{
fin=m;
}
}while(debut !=fin);
if (A[debut]==l)
{
p=debut;
printf("L element %d se trouve dans le tableau a la position %d", l,p );
}
else
{
printf("L element %d ne se trouve pas dans le tableau ", l);
}
return 0;
}

EXERCICE 49
Définir un tableau carré à deux dimensions (N x N) des caractères. Saisir les
coordonnées d’une case de ce tableau (indices de ligne et de colonne), et
placer * dans cette case, placer des + dans les diagonales du tableau passant
par ce point, et des blancs partout ailleurs. Faire afficher le tableau ligne par
ligne.

(Support de Langage C, page 124)

Solution

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n,i, j,c, l;
printf("Entrez la dimension du tableau\n");
scanf("%d", &n);
char A[n][n];
printf("Entrez les coordonnées de la case\n");
do
106 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
{
printf("Sa ligne\n");
scanf("%d",&l);
printf("Sa colonne\n");
scanf("%d",&c);
if (l>=n || l<0 || c>=n || c<0)
{
printf("Erreur, recommence!!!");
}
}while(l>=n || l<0 || c>=n || c<0);
// Initialisation
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
{
A[i][j]=' ';
}
}
// on place + dans les diagonales passant par ce point
// 1ere diagonale
int p=n-1, k;
if (l+c<p)
{
k=l+c;
for(i=0;i<=l+c; i++)
{
A[i][k]='+';
k--;
}
}
else
{
k=p;
for(i=l-p+c;i<=p;i++)
{
{
A[i][k]='+';
k--;
}
}
}
//2e diagonale
if (l-c<0)
{ k=c-l;
for(i=0;i<=p-c+i;i++)
{
A[i][k]='+';
k++;

107 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
}
}
else
{
k=p-l;
for (i=l-c;i<n;i++)
{
for(0;j<n-l+c;j++)
{
A[i][j]='+';
}
}
}
// On place * dans la case correspondante
A[l][c] ='*';
// Affichage du tableau
printf("Le tableau est :\n");
for (i=0; i<n; i++)
{
for(j=0;j<n;j++)
{
printf("%c \t", A[i][j]);
}
printf("\n");
}
return 0;
}

Illustrations de l’exécution

108 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 50
Un professeur d’informatique met en place un petit programme sur le jeu de
nombre qui demande à un étudiant de G2 info de saisir au hasard deux
nombres différents compris entre 100 et 1000. Si les conditions ne sont pas
respectées, l’étudiant est invité à saisir de nouveau jusqu’à satisfaire ces
conditions. Une fois respectée, le programme fait l’addition de ces deux
nombres ensuit leurs inverses. Si les deux sommes obtenues sont à la fois
divisibles par 3 ce que l’étudiant est gagnant ; au cas contraire, il est perdant.

Il vous est donc demandé d’implémenter ce programme en C en utilisant 3


fonctions notamment pour :
Le calcul de l’inverse
L’affichage des messages d’erreur ou exception
Le calcul et affichage du score final
Illustration
Nombre 1 =214 et Nombre 2 = 352
Inverse nombre 1 = 412 et Inverse nombre 2 = 253
Somme 1 = 566 et somme 2 = 665

Score : Les deux sommes ne sont pas divisibles par 3, donc l’étudiant est
perdant.
(Examen S1 2017-2018)

109 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 51
Ecrire un programme qui réalise les actions suivantes.

(a) Définit une fonction aff qui affiche une chaine de caractères (dans le
sens de la lecture) de longueur arbitraire. Cette longueur sera un
paramètre de aff.
(b) Obtenir les quatre affichages suivantes en appliquant aff.

Université de Kinshasa

Universite

asahsniK ed etisrevinU

etisrevinU.

(TP à défendre 2019-2020)

EXERCICE 52
𝑎) Peut-on donner un même identificateur à une variable locale et à une
même variable globale au cours d’un même programme ? Justifiez votre
réponse

𝑏) Peut-on changer la taille d’un tableau en cours d’exécution d’un


programme ? Justifiez votre réponse

𝑐) Comment fait-on pour déclarer un tableau dont les éléments sont de types
différents ?

𝑑) Donnez la bonne syntaxe pour accéder à la case située à la 2eme ligne et


la 3e colonne de la matrice T

𝑒) Soit la déclaration suivante :

Char les[ ]= "ab". Que vaut les[2]

(Examen S1 2017-2018)

110 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 53
Ecrire un programme qui affiche la conjugaison du verbe "CHOIR" au présent
et au futur de l’indicatif. Vérifiez le groupe qu’appartient ce verbe avant de
conjuguer. Utiliser les fonctions de la bibliothèque "string.h"

(Examen)

EXERCICE 54
Proposer un programme qui permet de produire une petite table de
conversion dollar en Franc congolais, dollar en FCFA, dollar en euro et vice
versa selon le choix de l’utilisateur.

(TP à défendre)

EXERCICE 55
Réaliser un programme permettant de gérer un système d’emprunt de livre
dans une bibliothèque. Le modèle à mettre en œuvre contiendra plusieurs
listes chainées, à savoir l’adhérent qui est caractérisé par son identifiant (de
type int), son nom et prénom (de type chaine de caractères) et le nombre de
livre qu’il peut emprunter en même temps. Il est à noter que le prêt d’un livre
dure 15 jours et que la date du début du prêt est un paramètre que l’utilisateur
doit mentionner (normalement c’est la date du système qui est utilisé dans les
applications réelles).

Alors que la structure livre est caractérisé par son identifiant (de type int), le
titre, le nom de l’auteur et le nombre d’exemplaires de ce livre. Votre
programme devra proposer un menu comme celui-ci :

1. Gestion des adhérents : Ajouter, Modifier ou Supprimer un adhérent et


afficher la liste des adhérents.

2. Gestion des emprunts : Emprunter un livre, Afficher des livres empruntés,


Rendre un livre, Afficher la liste des emprunteurs d’un livre, Afficher les
retardataires.

3. Gestion des livres : Ajouter, Modifier o u Supprimer, Rendre un livre et afficher


la liste des livres par ordre alphabétique (titre).

111 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
4. Quitter le Programme. Merci

(TP à défendre)

EXERCICE 56
On souhaite avoir un programme qui effectue les traitements suivants. Après
chaque traitement et pour chaque pointeur ou valeur, afficher le contenu du
pointeur, son adresse, la valeur pointée et l’adresse de la valeur pointée. Le
format d’affichage des pointeurs est %p.

- Déclarer un pointeur p sans l’initialiser et un pointeur q initialisé à NULL ;


- Le pointeur p pointe sur une valeur entière v initialisée à 10 ;
- À l’aide du pointeur, modifier cette valeur entière v "à partir du clavier" ;
- Utiliser seulement le pointeur p pour initialiser une valeur entière w à la
valeur de v ;
- Utiliser seulement un pointeur r qui pointe vers p pour modifier la valeur
entière v "à partir du clavier"
(TP à défendre)

EXERCICE 57
Ecrire un programme qui initialise de façon aléatoire puis affiche les objets
suivants :
1. Un vecteur de double de taille définie comme constante symbolique.
2. Une matrice de char de taille (nombres de lignes et de colonnes) définie
comme constante symbolique
(TP à défendre)

EXERCICE 58
Ecrire un programme qui permet de traduire une phrase en langila.

On aura un module lisant une phrase se terminant obligatoirement par un


point, un module effectuant la traduction et un module de traduction donnant
le résultat suivant :
Entrez la phrase : Bonjour, je parle de Langila.
La traduction donne : jourbon, ej lepar el gilalan
N.B. : Langila est une langue qui consiste à renverser une partie
(TP à défendre)

112 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 59
Proposer un programme nommé max-tab qui identifie l’indice de la première
occurrence du maximum d’un tableau d’entiers de longueur quelconque. La
longueur du tableau sera définie par une constante symbolique (macro sans
paramètres).

EXERCICE 60
Proposer un programme nommé TabConcat en utilisant tous les pointeurs
nécessaires aux traitements suivants :
1. Lire au clavier les dimensions d1 et d2 de deux tableaux d’entiers T1 et T2
2. Initialise T1 avec la suite des d1 premiers entiers impairs et T2 avec la suite des
d2 premiers entiers pairs,
3. Concatène T1 et T2 dans un tableau T,

(TP à défendre)

EXERCICE 61
Codage : on choisit un décalage (par exemple 5), et un a sera placé par un f,
un b par un g, un c par un h, etc…on ne cryptera que les lettres majuscules et
minuscules sans toucher ni à la ponctuation, ni à la mise en page (caractères
blancs, etc.), on supposera que les codes des lettres se suivent de a à z et de
A à Z.

𝑎) Déclarer un tableau de caractères Message initialisé avec le message en


clair

𝑏) Ecrire une procédure crypt de cryptage d’un caractère qui sera passé par
adresse.

𝑐) Ecrire le programme principal main qui activera crypt sur l’ensemble du


message et imprimera le résultat.

(TP à défendre)

113 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
EXERCICE 62
La grande bibliothèque de l’université de Kinshasa a actuellement des
difficultés à gérer son stock car elle est très fréquentée en ce moment et ne
dispose pas d’un nombre suffisant d’employés. Vous décidez de l’aider en
écrivant un programme informatique permettant de soulager le travail des
employés.

La bibliothèque possède nbLivres livres indexés de 0 à nbLivres-1. Chaque jour,


un certain nombre de clients demandent à emprunter des livres pour une
certaine durée. Si le livre est disponible, la requête du client est satisfaite, sinon
le client repart sans livre.

Votre programme doit d’abord lire sur une première ligne deux entiers :
nbLivres<=1000 et nbJours. Pour chacun des jours, votre programme lira un
entier nbClientss sur une ligne puis nbClients lignes de deux entiers. Le premier
entier correspond à l’indice du livre et le second la durée correspondante. Il
affichera ensuite, sur des lignes séparées, pour chaque client un 1 si le livre peut
être prêté et 0 dans le cas contraire.

On remarquera que si un client emprunte un livre le jour iJour pendant une


durée alors celui-ci ne sera de nouveau disponible qu’au iJour+durée. De plus,
si plusieurs personnes le même livre pendant une journée, seule la première a
une chance d’être satisfaite.

(TP de récupération 2019-2020)

EXERCICE 63
On vous demande de gérer les informations sur les étudiants de L1 LMD du
département de Math-Info/Unikin.

Une structure date de naissance et une structure étudiant avec des variables
formées d’un numéro de jour, d’un nom de mois et d’un numéro d’année pour
le type date et du matricule, nom, post-nom, prénom et promotion (tous de
chaine de caractères).

1. Créer les structures

2. Remplir le tableau

3. Modifier les informations sur un étudiant à partir de son matricule

4. Affichage de toutes les informations sur les étudiants

114 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits
5. Supprimer les informations sur un étudiant à partir de son matricule ;
utilisation de la fonction

6. Le nombre d’étudiant par année

7. Afficher les informations sur un étudiant à partir de son nom ou une partie
de son nom.

115 | P a g e
Aimé DIUMI DIKOLO [Link]
Groupe Les Erudits

Vous aimerez peut-être aussi