Академический Документы
Профессиональный Документы
Культура Документы
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
Support de cours
Atelier de Programmation I
Élaboré par
Riadh BOUSLIMI
Technologue en Informatique
2/73
Chapitre 1
ELEMENTS DE LANGAGE C
Objectifs spécifiques:
Manipuler les types standard.
Déclarer des variables.
Savoir les opérateurs de base du langage c.
Savoir utiliser les Bibliothèques.
Savoir afficher et utiliser les formats de sorties des variables.
Savoir écrire un programme C, le compiler et l'exécuter.
Savoir convertir un type de données vers un autre.
1. INTRODUCTION
Le langage C est un langage évolué et structuré, assez proche du langage machine destiné à des
applications de contrôle de processus (gestion d'entrées/sorties, applications temps réel ...).
Le langage C possède assez peu d'instructions, il fait par contre appel à des bibliothèques, fournies en
plus ou moins grand nombre avec le compilateur.
1- Edition du programme source, à l'aide d'un éditeur (traitement de textes). Le nom du fichier
contient l'extension .CPP, exemple: EXI_1.CPP (menu « edit »).
2- Compilation du programme source, c'est à dire création des codes machine destinés au
microprocesseur utilisé. Le compilateur indique les erreurs de syntaxe mais ignore les fonctions-
bibliothèque appelées par le programme.
Le compilateur génère un fichier binaire, non listable, appelé fichier objet: EXI_1.OBJ (commande
« compile »).
3- Editions de liens: Le code machine des fonctions-bibliothèque est chargé, création d'un fichier
binaire, non listable, appelé fichier executable: EXI_1.EXE (commande « build all »).
Les compilateurs permettent en général de construire des programmes composés de plusieurs fichiers
sources, d'ajouter à un programme des unités déjà compilées ...
3/73
Exemple 1
#include <stdio.h> /* bibliotheque d'entrees-sorties standard */
#include <conio.h>
void main()
{
printf("BONJOUR"); /* utilisation d'une fonction-bibliotheque */
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
Le langage C distingue les minuscules, des majuscules. Les mots réservés du langage C doivent être
écrits en minuscules.
Exemple 2
#include <stdio.h> /* bibliotheque d'entrees-sorties standard */
#include <conio.h>
void main()
{
int a, b, somme ; /* déclaration de 3 variables */
printf("BONJOUR"); /* utilisation d'une fonction-bibliotheque */
a = 10 ; /* affectation* /
b = 50 ; /* affectation */
somme = (a + b)*2 ; /* affectation et opérateurs */
printf("Voici le resultat : %d\n ", somme) ;
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
4/73
a) Les entiers
Exemples:
5/73
Exemple 3
b) Les réels
4. LES INITIALISATIONS
Le langage C permet l'initialisation des variables dans la zône des déclarations:
c) LA FONCTION PRINTF
Ce n'est pas une instruction du langage C, mais une fonction de la bibliothèque stdio.h.
Exemple 4
#include <stdio.h>
#include <conio.h>
void main()
{
printf("BONJOUR ");
printf("IL FAIT BEAU\n"); /* equivalent à puts("BONJOUR"; */
printf("BONNES VACANCES");
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
printf("%format",nom_de_variable);
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
c =66; /* c est le caractere alphanumerique A */
printf("%d\n",c); /* affichage du code ASCII en decimal */
/* et retour … à la ligne */
printf("%o\n",c); /* affichage du code ASCII en base huit
/* et retour … à la ligne */
printf("%x\n",c); /* affichage du code ASCII en hexadecimal
/* et retour … à la ligne */
printf("%c\n",c); /* affichage du caractère */
/* et retour à la ligne */
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
7/73
Résultat après compilation et exécution:
Exemple 6
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
c ='A'; /* c est le caractere alphanumerique A */
printf("decimal = %d ASCII = %c\n",c,c);
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
Solution
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
a= -21430;
b= 4782;
printf("A + B = %d\n",a+b);
printf("A - B = %d\n",a-b);
printf("A x B = %d\n",a*b);
printf("A sur B = %d\n",a/b);
printf("A mod B = %d\n",a%b);
puts("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
8/73
Exercice d'application n°2
Soit a et b sont des réels, a = -21,43 b = 4,782, calculer et afficher a+b, a-b, a*b, a/b, en
soignant l’interface homme/machine.
NB : Pour le format de sortie pour les réels c'est : %f
Solution
#include <stdio.h>
#include <conio.h>
void main()
{
float a,b;
a= -21.43;
b= 4.782;
printf("A + B = %f\n",a+b);
printf("A - B = %f\n",a-b);
printf("A x B = %f\n",a*b);
printf("A sur B = %f\n",a/b);
printf("Pour continuer frapper une touche...");
getch(); /* Attente d'une saisie clavier */
}
Il vaut mieux utiliser puts et putchar si cela est possible, ces fonctions, non formatées, sont
d'exécution plus rapide, et nécessitent moins de place en mémoire lors de leur chargement.
6. LES OPERATEURS
Opérateurs arithmétiques sur les réels: + - * / avec la hiérarchie habituelle.
Les caractères sont des entiers sur 8 bits, on peut donc effectuer des opérations. Sur cet exemple, on
transforme la lettre majuscule G en la lettre minuscule g.
OPERATEURS COMBINES
Le langage C autorise des écritures simplifiées lorsqu'une même variable est utilisée de chaque côté
du signe = d'une affectation. Ces écritures sont à éviter lorsque l'on débute l'étude du langage C car
elles nuisent à la lisibilité du programme.
a = a+b; est équivalent à a+= b;
a = a-b; est équivalent à a-= b;
a = a & b; est équivalent à a&= b;
Dans ce cas, le compilateur réserve de la place en mémoire (ici 4 octets), pour la variable pi, mais
dont on ne peut changer la valeur.
Le compilateur ne réserve pas de place en mémoire. Les constantes déclarées par #define s'écrivent
traditionnellement en majuscules, mais ce n'est pas une obligation.
Le langage C permet d'effectuer des opérations de conversion de type: On utilise pour cela l'opérateur
de "cast"().
10/73
Exemple :
#include <stdio.h>
#include <conio.h>
void main()
{
int i=0x1234,j;
char d,e;
float r=89.67,s;
j = (int)r;
s = (float)i;
d = (char)i;
e = (char)r;
printf("Conversion float -> int: %5.2f -> %d\n",r,j);
printf("Conversion int -> float: %d -> %5.2f\n",i,s);
printf("Conversion int -> char: %x -> %x\n",i,d);
printf("Conversion float -> char: %5.2f -> %d\n",r,e);
printf("Pour sortir frapper une touche "); getch();
}
11/73
Chapitre 2
SAISIE DE NOMBRES ET DE CARACTERES AU CLAVIER
Objectifs spécifiques:
Manipuler les fonctions d'entrée de base
Savoir la différence entre les fonctions d'entrée et leurs lieux d'utilisation
1. LA FONCTION GETCH
La fonction getch, appartenant à la bibliothèque conio.h permet la saisie clavier d'un caractère
alphanumérique. La saisie s'arrête dès que le caractère a été frappé.
Les parenthèses vides de getch() signifient qu'aucun paramètre n'est passé à cette fonction par
le programme.
2. LA FONCTION SCANF
La fonction scanf, appartenant à la bibliothèque stdio.h, permet la saisie clavier de n'importe quel
type de variable.
Les variables à saisir sont formatées, le nom de la variable est précédé du symbole & désignant
l'adresse de la variable.
12/73
Remarque: Si l'utilisateur ne respecte pas le format indiqué dans scanf, la saisie est ignorée. Aucune
erreur n'est générée.
3. LA FONCTION GETCHAR
La fonction getchar pemet la saisie d'un caractère (char). Elle appartient à la bibliothèque stdio.h.
Les 2 écritures suivantes sont équivalentes:
char c; char c;
printf("ENTRER UN CARACTERE: "); printf("ENTRER UN CARACTERE: ");
scanf("%c",&c); c = getchar();
La fonction getchar est moins gourmande en place mémoire que scanf. Il vaut mieux l'utiliser quand
cela est possible; getchar utilise le flux d'entrée exactement comme scanf.
13/73
Chapitre 3
LES STRUCTURES CONDITIONNELLES ET LES BOUCLES
Objectifs spécifiques:
Savoir les structures conditionnelles ainsi que ces différentes formes.
Savoir combiner deux ou plusieurs conditions.
Choisir la forme adéquate des structures de contrôle conditionnelles.
Savoir les structures itératives ainsi que ces différentes formes.
Choisir la forme adéquate des structures itératives.
Organigramme:
vraie
suite du programme
Syntaxe en C: if (expression)
{
............; /* bloc 1 d'instructions */
............;
............;
}
else
{
............; /* bloc 2 d'instructions */
............;
............;
}
14/73
Le bloc "sinon" est optionnel: si (expression vraie)
alors {BLOC D'INSTRUCTIONS}
oui non
condition
vraie
bloc d'
instructions
suite du programme
Syntaxe en C: if (expression)
{
............; /* bloc d'instructions */
............;
............;
}
Remarque: les {} ne sont pas nécessaires lorsque les blocs ne comportent qu'une seule instruction.
15/73
Toutes les combinaisons sont possibles entre ces tests.
L'instruction switch permet des choix multiples uniquement sur des entiers (int) ou des caractères
(char).
Syntaxe:
16/73
Exemple:
Cette instruction est commode pour fabriquer des "menus":
char choix;
printf("LISTE PAR GROUPE TAPER 1\n");
printf("LISTE ALPHABETIQUE TAPER 2\n");
printf("POUR SORTIR TAPER S\n");
printf("\nVOTRE CHOIX: ");
choix = getchar();
switch(choix)
{
case '1': .......;
.......;
break;
default; printf("\nCE CHOIX N'EST PAS PREVU "); /* pas de break ici */
}
Organigramme:
oui non
condition
vraie
bloc d'
instructions
Remarque:
- les {} ne sont pas nécessaires lorsque le bloc ne comporte qu'une seule instruction.
- On peut rencontrer la construction suivante: while (expression); terminée par un ; et
sans la présence du bloc d'instructions. Cette construction signifie: "tant que
l'expression est vraie attendre".
Il s'agit de l'instruction:
Organigramme:
initialisation
condition de
continuité vraie
non
oui
bloc d'instructions
Syntaxe en C:
Remarques:
Les {} ne sont pas nécessaires lorsque le bloc ne comporte qu'une seule instruction.
Les 3 instructions du for ne portent pas forcément sur la même variable.
Une instruction peut être omise, mais pas les ;
18/73
Exemples: for(i = 0 ; i<10 ; i++)
{
............; /* bloc d'instructions */
............;
............;
}
i = 0
non
i < 10
oui
bloc d'instructions suite du
programme
i=i+1
La boucle for(;;)
{
............; /* bloc d'instructions */
............;
............;
}
resultat = 0;
for(i = 0 ; resultat<30 ; i++)
{
............; /* bloc d'instructions */
............;
............;
resultat = resultat + 2*i;
}
Exercice: Ecrire un programme C qui permet de saisir un entier puis calcule sa factoriel.
19/73
Organigramme:
bloc d'
instructions
non
condition
oui vraie
suite du programme
Syntaxe en C: do
{
............; /* bloc d'instructions */
............;
............;
}
while (expression);
Remarque: les {} ne sont pas nécessaires lorsque le bloc ne comporte qu'une seule instruction.
20/73
Chapitre 4
LES TABLEAUX ET LES CHAINES DE CARACTERES
Objectifs spécifiques:
Comprendre l'utilisation du type tableau.
Savoir déclarer un tableau.
Manipuler des tableaux à une ou deux dimensions.
Manipuler des chaînes de caractères.
Manipuler les fonctions sur les chaines de caractères.
Les tableaux correspondent aux matrices en mathématiques. Un tableau est caractérisé par sa
taille et par ses éléments.
Utilisation: Un élément du tableau est repéré par son indice. En langage C les tableaux
commencent à l'indice 0. L'indice maximum est donc dim-1.
Appel: nom[indice]
Exemples: compteur[2] = 5;
nombre[i] = 6.789;
printf("%d",compteur[i]);
scanf("%f",&nombre[i]);
Utilisation: Un élément du tableau est repéré par ses indices. En langage C les tableaux
commencent aux indices 0. Les indices maximum sont donc dim1-1, dim2-1.
Appel: nom[indice1][indice2]
Exemples: compteur[2][4] = 5;
nombre[i][j] = 6.789;
printf("%d",compteur[i][j]);
scanf("%f",&nombre[i][j]);
21/73
2. INITIALISATION DES TABLEAUX
Exemples:
En langage C, les chaînes de caractères sont des tableaux de caractères. Leur manipulation est donc
analogue à celle d'un tableau à une dimension:
Affichage à l'écran:
Saisie: On peut utiliser la fonction scanf et le format %s. Une chaîne étant un pointeur, on
n'écrit pas le symbole &. On utilisera de préférence la fonction gets non formatée.
char texte[10];
printf("ENTRER UN TEXTE: ");
scanf("%s",texte); est équivalent à gets(texte);
22/73
Remarque: scanf ne permet pas la saisie d'une chaîne comportant des espaces: les caractères saisis à
partir de l'espace ne sont pas pris en compte (l'espace est un délimiteur au même titre que LF) mais
rangés dans le tampon d'entrée. Pour saisir une chaîne de type "il fait beau", il faut utiliser gets.
A l'issue de la saisie d'une chaîne de caractères, le compilateur ajoute '\0' en mémoire après le dernier
caractère.
Remarques
- Comme le nom d'une chaîne de caractères représente une adresse fixe en mémoire, on ne peut
pas 'affecter' une autre chaîne au nom d'un tableau:
Il faut bien copier la chaîne caractère par caractère ou utiliser la fonction strcpy
respectivement strncpy: strcpy(A, "Hello");
- La fonction strcmp est dépendante du code de caractères et peut fournir différents résultats
sur différentes machines.
23/73
Chapitre 5
LES FONCTIONS
Objectifs spécifiques:
Comprendre l'intérêt des fonctions
Savoir déclarer, programmer et utiliser les fonctions.
1. INTRODUCTION
En langage C les sous-programmes s'appellent des fonctions.
L'imbrication de fonctions n'est pas autorisée en C: une fonction ne peut pas être déclarée à l'intérieur
d'une autre fonction. Par contre, une fonction peut appeler une autre fonction. Cette dernière doit être
déclarée avant celle qui l'appelle.
Une fonction possède un et un seul point d'entrée, mais éventuellement plusieurs points de sortie (à
l'aide du mot return).
Une variable connue uniquement d'une fonction ou de main() est une variable locale.
Une variable connue de tout le programme est une variable globale.
2. DECLARATION
type est le type de la valeur renvoyée par la fonction. type1 est le type du 1er argument arg1 ....
Les variables locales sont des variables qui ne sont connues qu’à l’intérieur de la fonction.
expression est évaluée lors de l’instruction return (expression) ;, c’est la valeur que renvoie
la fonction quand elle est appelée depuis main().
Exemple de fonction :
24/73
3. FONCTIONS SANS PASSAGE D'ARGUMENTS ET NE RENVOYANT RIEN AU
PROGRAMME.
Une fonction ne renvoyant rien au programme est une fonction de type void.
Exemple1
#include <stdio.h>
#include <conio.h>
Dans cette exemple le programme principal appel une fonction bonjour qui se charge
d'affichage du message "Bonjour" mais cette dernière ne renvoie rien en retour.
Exemple 2
#include <stdio.h>
#include <conio.h>
Dans cette exemple on traite le cas ou une fonction fait appel à une autre fonction.
25/73
Exemple 3
#include <stdio.h>
#include <conio.h>
Constatation
Les variables n et n2 ne sont connues que de la fonction carré on les appels des variables locaux.
Exemple 4
#include <stdio.h>
#include <conio.h>
26/73
switch(choix)
{
case '2':carre();break;
case '3':cube();break;
}
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE: ");
getch();
}
Constatations
Les 2 variables locales n sont indépendantes l'une de l'autre.
La variable locale choix n'est connue que de main().
Exemple 5
#include <stdio.h>
#include <conio.h>
27/73
Constatations
La variable globale n est connue de tout le programme (fonctions et main()).
La variable locale choix n'est connue que de main().
Le fichier d’en-tête n’a pas changé.
Un programme bien construit possède peu de variables globales.
Exemple 6
#include <stdio.h>
#include <conio.h>
Ces fonctions utilisent les valeurs de certaines variables du programme les ayant appelé: on passe ces
valeurs au moyen d'arguments déclarés avec la fonction.
Exemple 7
#include <stdio.h>
#include <conio.h>
28/73
void main()
{
int n1, n2, res1, res2; /* variables locales */
printf("ENTRER UN NOMBRE: ");
scanf("%d",&n1);
res1 = carre(n1);
printf("ENTRER UN AUTRE NOMBRE: ");
scanf("%d",&n2);
res2 = carre(n2);
printf("VOICI LEURS CARRES: %d %d\n\n",res1, res2);
printf("POUR SORTIR FRAPPER UNE TOUCHE: ");
getch();
}
On peut ainsi appeler la fonction carre autant de fois que l'on veut avec des variables différentes.
x est un paramètre, ou argument: ce n'est pas une variable du programme.
On a donc vu qu'une variable globale est déclarée au début du programme et qu'elle est connue de
tout le programme. Les variables globales sont initialisées à 0 au début de l'exécution du
programme, sauf si on les initialise à une autre valeur.
On a vu aussi qu'une variable locale (déclarée au début d'une fonction ou de main()) n'est connue que
de cette fonction ou de main(). Une variable locale est encore appelée automatique.
Les variables locales ne sont pas initialisées (sauf si on le fait dans le programme) et elles perdent
leur valeur à chaque appel à la fonction.
On peut allonger la durée de vie d'une variable locale en la déclarant static. Lors d'un nouvel appel à
la fonction, la variable garde la valeur obtenue à la fin de l'exécution précédente. Une variable static
est initialisée à 0 lors du premier appel à la fonction.
En langage C, le passage de paramètre se fait uniquement par adresse. Autrement dit, une fonction
ne peut pas modifier la valeur des variables locales à main() ou à une autre fonction. Elle ne
peut modifier que le contenu de l'adresse de cette variable.
29/73
Exemple: Fonction permettant d'échanger la valeur de 2 variables:
a et b sont des variables locales à main(). La fonction ech ne peut donc pas modifier leur valeur. On
le fait donc en passant par l'adresse de ces variables.
30/73
REPUBLIQUE TUNISIENNE
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE
LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
TP n°1
Exercice 1
Ecrire un programme qui saisit 2 entiers et affiche successivement la somme, la différence, le produit
et le quotient de ces 2 entiers.
Exercice 2
Ecrire un programme qui demande à l’utilisateur de donner le rayon d’un cercle et lui retourne sa
surface et son périmètre.
Exercice 3
Ecrire un programme qui saisit deux entiers a et b et permute la valeur de ces deux entiers.
Exercice 4
Ecrire un programme qui saisit un réel x et un entier n et affiche x à la puissance n.
Exercice 5
Ecrire un programme qui saisit un caractère c puis affiche son code ASCII en décimal, en octal(base
huit) et en hexadécimal(base seize).
31/73
Correction du TP n°1
Exercice 1
#include<stdio.h>
#include<conio.h>
void main()
{
int a,b;
void main()
{
/* il faut utiliser une variable tampon pour l'echange */
int a,b,tampon;
tampon=a;
a=b;
b=tampon;
}
Exercice 3
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define Pi 4*atan(1)
void main()
{
float r;
printf("Entrer le rayon du cercle :");
scanf("%f",&r);
32/73
Exercice 4
#include<stdio.h>
#include<math.h>
#include<conio.h>
void main()
{
int n;
float x;
33/73
REPUBLIQUE TUNISIENNE
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE
LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
TP n°2
L’objectif du TP c'est d'utiliser la forme adéquate des structures de contrôle conditionnelles pour
résoudre des problèmes.
Exercice 1
Considérez la séquence d'instructions suivante:
if (A>B) printf ("premier choix \n");else
if (A>10) printf ("deuxième choix \n");
if (B<10) printf ("troisième choix \n");
else printf ("quatrième choix \n");
a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else
appartenant ensemble.
b) Déterminez les réponses du programme pour chacun des couples de nombres suivants et
vérifiez à l'aide de l'ordinateur.
A=10 et B=5
A=5 et B=5
A=5 et B=10
A=10 et B=10
A=20 et B=10
A=20 et B=20
34/73
Exercice 2
Considérez la séquence d'instructions suivante:
if (A>B)
if (A>10)
printf ("premier choix \n"); else if (B<10)
printf ("deuxième choix \n"); else
if (A==B) printf ("troisième choix \n");
else printf ("quatrième choix \n");
a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else
appartenant ensemble.
d) Notez vos réponses et choisissez vous-mêmes des valeurs pour A et B pour les vérifier l'aide
de l'ordinateur.
Exercice 3
Ecrivez un programme qui saisit un caractère, et qui teste s'il s'agit d'une lettre majuscule, si oui il
renvoie cette lettre en minuscule, sinon il renvoie un message d'erreur.
Exercice 4
Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier et qui affiche la plus grande
des trois valeurs, en utilisant:
Exercice 5
Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier. Triez les valeurs A, B et C
par échanges successifs de manière à obtenir :
35/73
Exercice 8
Ecrivez un programme qui calcule les solutions réelles d'une équation du second degré ax2+bx+c =
0 en discutant la formule:
Utilisez une variable d'aide D pour la valeur du discriminant b2-4ac et décidez à l'aide de D, si
l'équation a une, deux ou aucune solution réelle.
Utilisez des variables du type int pour A, B et C.
Considérez aussi les cas où l'utilisateur entre des valeurs nulles pour A; pour A et B; pour A, B et C.
Affichez les résultats et les messages nécessaires sur l'écran.
Exercice 9
Ecrivez un programme qui permet de saisir un entier entre 1 et 7 et affiche en toutes lettres le nom du
jour de la semaine qui lui correspond.
36/73
Correction du TP n°2
Exercice 1
if (A>B) printf ("premier choix \n"); else
if (A>10) printf ("deuxième choix \n");
if (B<10) printf ("troisième choix \n");
else printf ("quatrième choix \n");
a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else
appartenant ensemble.
if (A>B)
printf ("premier choix \n");
else
if (A>10)
printf ("deuxième choix \n");
if (B<10)
printf ("troisième choix \n");
else
printf ("quatrième choix \n");
b) Déterminez les réponses du programme pour chacun des couples de nombres suivants et
vérifiez à l'aide de l'ordinateur.
A=10 et B=5 : premier choix
troisième choix
A=5 et B=5 : troisième choix
A=5 et B=10 : quatrième choix
A=10 et B=10 : quatrième choix
A=20 et B=10 : premier choix
quatrième choix
A=20 et B=20 : deuxième choix
quatrième choix
Exercice 2
Considérez la séquence d'instructions suivante:
if (A>B)
if (A>10)
printf ("premier choix \n"); else if (B<10)
printf ("deuxième choix \n"); else
if (A==B) printf ("troisième choix \n");
else printf ("quatrième choix \n");
a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if - else
appartenant ensemble.
if (A>B)
if (A>10)
printf ("premier choix \n");
else if (B<10)
printf ("deuxième choix \n");
else if (A==B)
printf ("troisième choix \n");
else
printf ("quatrième choix \n");
37/73
b) Le résultat:
"premier choix" apparaît pour (A>B) et (A>10)
c) On n'obtient pas de réponses pour (AB). Si (A>B) alors la construction if - else if - ... - else
garantit que toutes les combinations sont traitées et fournissent un résultat.
Exercice 3
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
printf("ENTRER UNE LETTRE:");
c = getchar();
if((c>='A') && (c<='Z'))
printf("CETTE LETTRE EN MINUSCULE: %c\n",c);
else
printf("CE N'EST PAS UNE LETTRE MAJUSCULE\n");
printf("POUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}
Exercice 4
a) if - else et une variable d'aide MAX
#include <stdio.h>
#include <conio.h>
void main()
{
int A, B, C;
int MAX;
printf("Introduisez trois nombres entiers :");
scanf("%d %d %d", &A, &B, &C);
if (A>B)
MAX=A;
else
MAX=B;
if (C>MAX)
MAX=C;
printf("La valeur maximale est %d\n", MAX);
printf("Tapez une touche pour continuer…");
getch();
}
38/73
b) if - else if - ... - else sans variable d'aide
int A, B, C;
printf("Introduisez trois nombres entiers :");
scanf("%d %d %d", &A, &B, &C);
printf("La valeur maximale est ");
if (A>B && A>C)
printf("%d\n",A);
else if (B>C)
printf("%d\n",B);
else
printf("%d\n",C);
c) opérateurs conditionnels et une variable d'aide MAX
int A, B, C;
int MAX;
printf("Introduisez trois nombres entiers :");
scanf("%d %d %d", &A, &B, &C);
MAX = (A>B) ? A : B;
MAX = (MAX>C) ? MAX : C;
printf("La valeur maximale est %i\n", MAX);
d) opérateurs conditionnels sans variable d'aide
int A, B, C;
printf("Introduisez trois nombres entiers :");
scanf("%d %d %d", &A, &B, &C);
printf("La valeur maximale est %d\n",
(A>((B>C)?B:C)) ? A : ((B>C)?B:C));
Exercice 5
#include <stdio.h>
#include <conio.h>
void main()
{
/* Tri par ordre décroissant de trois entiers
en échangeant les valeurs
*/
int A, B, C, AIDE;
printf("Introduisez trois nombres entiers :");
scanf("%d %d %d", &A, &B, &C);
printf("Avant le tri : \tA = %d\tB = %d\tC = %d\n", A, B, C);
/* Valeur maximale -> A */
if (A<B)
{
AIDE = A;
A = B;
B = AIDE;
}
if (A<C)
{
AIDE = A;
A = C;
C = AIDE;
}
/* trier B et C */
if (B<C)
{
AIDE = B;
B = C;
C = AIDE;
}
printf("Après le tri : \tA = %d\tB = %d\tC = %d\n", A, B, C);
printf("Tapez une touche pour continuer…");
getch();
}
39/73
Exercice 6
#include <stdio.h>
#include <conio.h>
void main()
{
/* Afficher le signe du produit de deux entiers sans
faire la multiplication
*/
int A, B;
printf("Introduisez deux nombres entiers :");
scanf("%d %d", &A, &B);
if ((A>0 && B>0) || (A<0 && B<0))
printf("Le signe du produit %d * %d est positif\n", A, B);
else if ((A<0 && B>0) || (A>0 && B<0))
printf("Le signe du produit %d * %d est négatif\n", A, B);
else
printf("Le produit %d * %d est zéro\n", A, B);
Exercice 7
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
/* Afficher le signe de la somme de deux entiers sans
faire l'addition
*/
int A, B;
printf("Introduisez deux nombres entiers :");
scanf("%d %d", &A, &B);
if ((A>0 && B>0) || (A<0 && B>0 && fabs(A)<fabs(B))
|| (A>0 && B<0 && fabs(A)>fabs(B)))
printf("Le signe de la somme %d + %d est positif\n",A,B);
else if ((A<0 && B<0) || (A<0 && B>0 && fabs(A)>fabs(B))
|| (A>0 && B<0 && fabs(A)<fabs(B)))
printf("Le signe de la somme %d + %d est négatif\n",A,B);
else
printf("La somme %d + %d est zéro\n", A, B);
printf("\n Tapez une touche pour continuer…");
getch();
}
Exercice 8
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
/* Calcul des solutions réelles d'une équation du second degré */
int A, B, C;
float D; /* Discriminant */
printf("Calcul des solutions réelles d'une équation du second \n");
printf("degré de la forme ax^2 + bx + c = 0 \n\n");
printf("Introduisez les valeurs pour a, b, et c : ");
scanf("%d %d %d", &A, &B, &C);
40/73
/* Distinction des différents cas */
if (A==0 && B==0 && C==0) /* 0x = 0 */
printf("Tout réel est une solution de cette équation.\n");
else if (A==0 && B==0) /* Contradiction: c # 0 et c = 0 */
printf("Cette équation ne possède pas de solutions.\n");
else if (A==0) /* bx + c = 0 */
{
printf("La solution de cette équation du premier degré est :\n");
printf(" x = %f\n", -C/B);
}
else if (D<0) /* b^2-4ac < 0 */
printf("Cette équation n'a pas de solutions réelles.\n");
switch(N)
{
case 1: jour="Lundi";break;
case 2: jour="Mardi";break;
case 3: jour="Mercredi";break;
case 4: jour="Jeudi";break;
case 5: jour="Vendredi";break;
case 6: jour="Samedi";break;
case 7: jour="Dimanche";break;
default: printf("\n Jour Incorrect"); /* pas de break ici */
}
41/73
REPUBLIQUE TUNISIENNE
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE
LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
TP n°3
Les objectifs de ce TP c'est de manipuler des structures de contrôle itératives et savoir distinguer
entre les différentes formes (structure itérative complète et structure itérative à condition d'arrêt).
Exercice 1
Saisir une suite de caractères, compter et afficher le nombre de lettres e et d'espaces. Utiliser les
propriétés du tampon.
Exercice 2
Ecrivez un programme qui lit N nombres 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,
a) en utilisant while,
b) en utilisant do - while,
c) en utilisant for.
Exercice 3
Calculez par des soustractions successives le quotient entier et le reste de la division entière de deux
entiers entrés au clavier.
Exercice 4
Calculez par multiplications successives XN de deux entiers naturels X et N entrés au clavier.
Exercice 5
Calculez la somme des N premiers termes de la série harmonique :
42/73
Exercice 6
Calculez la somme, le produit et la moyenne d'une suite de chiffres non nuls entrés au clavier, sachant
que la suite est terminée par zéro. Retenez seulement les chiffres (0, 1 ... 9) lors de l'entrée des
données et effectuez un signal sonore si les données sortent de ce domaine.
Exercice 7
Calculez le nombre lu à rebours d'un nombre positif entré au clavier en supposant que le fichier
d'entrée standard contient une suite de chiffres non nuls, terminée par zéro (Contrôlez s'il s'agit
vraiment de chiffres).
43/73
Correction du TP n°3
Exercice 1
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
int compt_espace= 0,compt_e= 0;
printf("ENTRER UNE PHRASE:\n");
while((c=getchar())!='\n') /* */
lors du 1er passage, getchar ne prend
/* en compte que le 1er caractere*/
{ /* */
les autres sont ranges dans le tampon
if(c=='e')compt_e++; /* et recuperes par getchar lors */
/* des autres passages */
if(c==' ')compt_espace++;
}
printf("NOMBRE DE e: %d\n",compt_e);
printf("NOMBRE D'ESPACE: %d\n",compt_espace);
printf("POUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}
Exercice 2
a) en utilisant while,
#include <stdio.h>
#include <conio.h>
void main()
{
int N; /* nombre de données */
int NOMB; /* nombre courant */
int I; /* compteur */
long SOM; /* la somme des nombres entrés */
double PROD; /* le produit des nombres entrés */
SOM=0;
PROD=1;
I=1;
while(I<=N)
{
printf("%d. nombre : ", I);
scanf("%d", &NOMB);
SOM += NOMB;
PROD *= NOMB;
I++;
}
do
44/73
{
printf("%d. nombre : ", I);
scanf("%d", &NOMB);
SOM += NOMB;
PROD *= NOMB;
I++;
}
while(I<=N);
c) en utilisant for.
void main()
{
int NUM; /* numérateur de la division entière */
int DEN; /* dénominateur de la division entière */
int DIV; /* résultat de la division entière */
int RES; /* reste de la division entière */
RES=NUM;
DIV=0;
while(RES>=DEN)
{
RES-=DEN;
DIV++;
}
/* ou mieux encore : */
for (RES=NUM, DIV=0 ; RES>=DEN ; DIV++)
RES-=DEN;
*/
printf(" %d divisé par %d est %d reste %d\n", NUM, DEN, DIV, RES);
printf("POUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}
Exercice 4
#include <stdio.h>
#include <conio.h>
void main()
{
int X, N; /* Les données */
int I; /* Le compteur */
double RESU; /* Type double à cause de la */
/* grandeur du résultat. */
do
{
printf("Entrez l'entier naturel X : ");
scanf("%d", &X);
}
while (X>=0);
45/73
do
{
printf("Entrez l'exposant N : ");
scanf("%d", &N);
}
while (N<0);
Exercice 5
#include <stdio.h>
#include <conio.h>
void main()
{
int N; /* nombre de termes à calculer */
int I; /* compteur pour la boucle */
float SOM; /* Type float à cause de la précision du résultat. */
do
{
printf ("Nombre de termes: ");
scanf ("%d", &N);
}
while (N>=1);
for (SOM=0.0, I=1 ; I<=N ; I++)
SOM += (float)1/I;
printf("La somme des %d premiers termes est %f \n", N, SOM);
printf("POUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}
Exercice 6
Solution (une de plusieurs solutions possibles) :
#include <stdio.h>
#include <conio.h>
void main()
{
int X; /* Le chiffre courant */
int N=0; /* Le compteur des données */
int SOM=0; /* La somme actuelle */
long PROD=1; /* Le produit actuel - Type long à */
/* cause de la grandeur du résultat. */
46/73
do
{
/* Saisie des données (pour perfectionnistes) */
printf("Entrez le %d%s chiffre : ", (N+1), (N)?"e":"er");
scanf("%d", &X);
if (X<0||X>9)
printf("\a");
else if (X)
{
N++;
SOM+=X;
PROD*=X;
}
else if (!X && N>0)
{/* Seulement si au moins un chiffre a été accepté */
printf("La somme des chiffres est %d \n", SOM);
printf("Le produit des chiffres est %ld\n", PROD);
printf("La moyenne des chiffres est %f \n", (float)SOM/N);
}
}
while (X);
printf("POUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}
Exercice 7
#include <stdio.h>
#include <conio.h>
void main()
{
int X; /* Le chiffre courant */
int N=0; /* Le compteur des décimales */
long VALD=1; /* Valeur de la position décimale courante */
long NOMB=0; /* Le nombre résultat */
do
{
printf("Entrez le %d%s chiffre : ", (N+1), (N)?"e":"er");
scanf("%d", &X);
En remplaçant la ligne
NOMB += VALD*X;
par
47/73
NOMB += pow(10, N)*X;
on n'a plus besoin de la variable VALD. Il faut cependant inclure les fonctions de la bibliothèque
<math>. D'autre part, le calcul de 10N serait alors répété à chaque exécution de la boucle.
Finalement, cette variante est plus lente et plus volumineuse que la première.
Exercice 8
#include <stdio.h>
#include <conio.h>
void main()
{
int NOMB; /* Le nombre à inverser */
int NINV; /* Le nombre inversé */
/* Attention: en utilisant le type int, il est impossible */
/* d'inverser correctement des nombres comme 10033 ... */
do
{
printf("Entrez un nombre positif (<10000) : ", NOMB);
scanf("%d", &NOMB);
}
while (NOMB<0 || NOMB>9999);
NINV=0;
while(NOMB>0)
{
NINV *= 10;
NINV += NOMB%10;
NOMB /= 10;
}
/* Autre possibilité : */
/* for (NINV=0 ; NOMB>0 ; NOMB/=10)
NINV = NINV*10 + NOMB%10;
*/
void main()
{
int U1, U2, UN; /* pour parcourir la suite */
int N; /* rang du terme demandé */
int I; /* compteur pour la boucle */
do
{
printf("Rang du terme demandé : ");
scanf("%d", &N);
}
while(N<1);
49/73
REPUBLIQUE TUNISIENNE
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE
LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
TP n°4
Les objectifs de ce TP c'est de manipuler les tableaux et les chaînes de caractères, et d’utiliser les
fonctions prédéfinies pour résoudre des problèmes.
Ces fonctions renvoient l'adresse de l'information recherchée en cas de succès, sinon le pointeur NULL (c'est à dire le
pointeur de valeur 0 ou encore le pointeur faux).
Bibliothèque (stdlib.h):
50/73
base: base dans laquelle est exprimé le nombre,
cette fonction renvoie l'adresse de la chaîne.
exemple: itoa(12,texte,10); texte vaut "12"
Exercice n°1
Écrire 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. Calculer et
afficher ensuite la somme des éléments du tableau.
Exercice n°2
Écrire un programme qui calcule le produit scalaire de deux vecteurs d'entiers U et V (de même
dimension).
Exemple:
/ \ / \
| 3 2 -4 | * | 2 -3 5 | = 3*2+2*(-3)+(-4)*5 = -20
\ / \ /
Exercice n°3
Écrire un programme qui détermine la plus grande et la plus petite valeur dans un tableau d'entiers
A. Afficher ensuite la valeur et la position du maximum et du minimum. Si le tableau contient
plusieurs maxima ou minima, le programme retiendra la position du premier maximum ou
minimum rencontré.
Exercice n°4
Problème: Rechercher dans un tableau d'entiers A une valeur VAL entrée au clavier. Afficher la
position de VAL si elle se trouve dans le tableau, sinon afficher un message correspondant. La
valeur POS qui est utilisée pour mémoriser la position de la valeur dans le tableau, aura la valeur -
1 aussi longtemps que VAL n'a pas été trouvée.
Implémenter deux versions:
a) La recherche séquentielle
Comparer successivement les valeurs du tableau avec la valeur donnée.
b) La recherche dichotomique
Condition: Le tableau A doit être trié
Comparer le nombre recherché à la valeur au milieu du tableau,
s'il y a égalité ou si le tableau est épuisé, arrêter le traitement avec un message
correspondant.
si la valeur recherchée précède la valeur actuelle du tableau, continuer la recherche
dans le demi-tableau à gauche de la position actuelle.
si la valeur recherchée suit la valeur actuelle du tableau, continuer la recherche dans le
demi-tableau à droite de la position actuelle.
Écrire le programme pour le cas où le tableau A est trié par ordre croissant.
Question: Quel est l'avantage de la recherche dichotomique ?
Exercice n°5
Ecrire un programme qui demande l'introduction du nom et du prénom de l'utilisateur et qui
affiche alors la longueur totale du nom sans compter les espaces. Employer la fonction strlen.
Exemple:
51/73
Introduisez votre nom et votre prénom: HSINI Sana
Exercice n°6
Écrire un programme qui lit 5 mots, séparés par des espaces et qui les affiche ensuite dans une
ligne, mais dans l'ordre inverse.
Les mots sont mémorisés dans 5 variables M1, ... ,M5.
Exemple
voici une petite phrase !
! phrase petite une voici
Exercice n°7
Écrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères) la mémorise dans
une variable TXT et affiche ensuite:
a) la longueur L de la chaîne.
b) le nombre de 'e' contenus dans le texte.
c) toute la phrase à rebours, sans changer le contenu de la variable TXT.
d) toute la phrase à rebours, après avoir inversé l'ordre des caractères dans TXT:
Exemple :
voici une petite phrase !
! esarhp etitep enu iciov
Exercice n°8
Ecrire un programme qui lit un texte TXT (de moins de 200 caractères) et qui enlève toutes les
apparitions du caractère 'e' en tassant les éléments restants. Les modifications se feront dans la
même variable TXT.
Exemple:
Cette ligne contient quelques lettres e.
Ctt lign contint qulqus lttrs .
Exercice n°9
Ecrire un programme qui lit un verbe régulier en "er" au clavier et qui en affiche la conjugaison au
présent de l'indicatif de ce verbe. Contrôlez s'il s'agit bien d'un verbe en "er" avant de conjuguer.
Utiliser les fonctions gets, puts, strcat et strlen.
Exemple:
Verbe : fêter
je fête tu fêtes il fête nous fêtons vous fêtez ils fêtent
Exercice n°10
Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2, les compare
lexicographiquement et affiche le résultat:
Exemple:
Introduisez la première chaîne: ABC
Introduisez la deuxième chaîne: abc
"ABC" précède "abc"
52/73
Exercice n°11
Écrire un programme qui permet de vérifier si un mot saisit est un palindrome. Un mot est dit
palindrome si la lecture du mot se fait à gauche et à droite. La taille maximale du mot est 30
caractères. Exemple : “aziza”
53/73
CORRECTION DU TP N°4
Exercice n°1
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
int T[50]; /* tableau donné */
int N; /* dimension */
int I; /* indice courant */
long SOM; /* somme des éléments - type long à cause */
/* de la grandeur prévisible du résultat. */
/* Affichage du tableau */
printf("Tableau donné :\n");
for (I=0; I<N; I++)
printf("%d ", T[I]);
printf("\n");
/* Calcul de la somme */
for (SOM=0, I=0; I<N; I++)
SOM += T[I];
/* Edition du résultat */
printf("Somme de éléments : %ld\n", SOM);
printf("\n Tapez une touche pour continuer…");
getch();
}
Exercice n°2
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
int U[50], V[50]; /* tableaux donnés */
int N; /* dimension */
int I; /* indice courant */
long PS; /* produit scalaire */
/* Saisie des données */
do{
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
}while(N>=1 && N<=50);
printf("** Premier tableau **\n");
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
scanf("%d", &U[I]);
}
printf("** Deuxième tableau **\n");
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
54/73
scanf("%d", &V[I]);
}
/* Calcul du produit scalaire */
for (PS=0, I=0; I<N; I++)
PS += (long)U[I]*V[I];
/* Edition du résultat */
printf("Produit scalaire : %ld\n", PS);
printf("\n Tapez une touche pour continuer…");
getch();
}
Exercice n°3
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int N; /* dimension */
int I; /* indice courant */
int MIN; /* position du minimum */
int MAX; /* position du maximum */
/* Saisie des données */
do{
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
}while(N>=1 && N<=50);
for (I=0; I<N; I++)
{
printf("Elément %d : ", I);
scanf("%d", &A[I]);
}
/* Affichage du tableau */
printf("Tableau donné :\n");
for (I=0; I<N; I++)
printf("%d ", A[I]);
printf("\n");
/* Recherche du maximum et du minimum */
MIN=0;
MAX=0;
for (I=0; I<N; I++)
{
if(A[I]>A[MAX]) MAX=I;
if(A[I]<A[MIN]) MIN=I;
}
/* Edition du résultat */
printf("Position du minimum : %d\n", MIN);
printf("Position du maximum : %d\n", MAX);
printf("Valeur du minimum : %d\n", A[MIN]);
printf("Valeur du maximum : %d\n", A[MAX]);
printf("\n Tapez une touche pour continuer…");
getch();
}
Exercice n°4
a) La recherche séquentielle :
Comparer successivement les valeurs du tableau avec la valeur donnée.
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int VAL; /* valeur à rechercher */
int POS; /* position de la valeur */
55/73
int N; /* dimension */
int I; /* indice courant */
b) La recherche dichotomique
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
int A[50]; /* tableau donné */
int VAL; /* valeur à rechercher */
int POS; /* position de la valeur */
int N; /* dimension */
int I; /* indice courant */
int INF, MIL, SUP; /* limites du champ de recherche */
/* Edition du résultat */
if (POS==-1)
printf("La valeur recherchée ne se trouve pas "
"dans le tableau.\n");
else
printf("La valeur %d se trouve à la position %d. \n", VAL, POS);
printf("\n Tapez une touche pour continuer…");
getch();
}
Question: Quel est l'avantage de la recherche dichotomique?
Dans le pire des cas d'une recherche séquentielle, il faut traverser tout le tableau avant de trouver la
valeur ou avant d'être sûr qu'une valeur ne se trouve pas dans le tableau.
Lors de la recherche dichotomique, on élimine la moitié des éléments du tableau à chaque exécution
de la boucle. Ainsi, la recherche se termine beaucoup plus rapidement.
La recherche dichotomique devient extrêmement avantageuse pour la recherche dans de grands
tableaux (triés) : L'avantage de la recherche dichotomique par rapport à la recherche séquentielle
monte alors exponentiellement avec la grandeur du tableau à trier.
Exemple:
Lors de la recherche dans un tableau de 1024 éléments:
- le pire des cas pour la recherche séquentielle peut entraîner 1024 exécutions de la boucle.
- le pire des cas pour la recherche dichotomique peut entraîner 10 exécutions de la boucle.
Lors de la recherche dans un tableau de 1 048 576 éléments:
- le pire des cas pour la recherche séquentielle peut entraîner 1 048 576 exécutions de la boucle.
- le pire des cas pour la recherche dichotomique peut entraîner 20 exécutions de la boucle.
Exercice n°5
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main(){
{
char NOM[40], PRENOM[40];
printf("Introduisez votre nom et votre prénom: \n");
scanf("%s %s", NOM, PRENOM);
printf("\nBonjour %s %s !\n", NOM, PRENOM);
printf("Votre nom est composé de %d lettres.\n",
strlen(NOM) + strlen(PRENOM));
/* ou bien
printf("Votre nom est composé de %d lettres.\n",
strlen(strcat(NOM,PRENOM)));
*/
printf("Tapez une touche pour continuer...");
getch();
57/73
}
Exercice n°6
#include <stdio.h>
#include <conio.h>
void main()
{
char M1[30], M2[30], M3[30], M4[30], M5[30];
printf("Entrez 5 mots, séparés par des espaces :\n");
scanf ("%s %s %s %s %s", M1, M2, M3, M4, M5);
printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1);
printf("Tapez une touche pour continuer...");
getch();
}
Exercice n°7
#include<stdio.h>
#include<conio.h>
void main()
{
/* Déclarations */
char TXT[201]; /* chaîne donnée */
int I,J; /* indices courants */
int L; /* longueur de la chaîne */
int C; /* compteur des lettres 'e' */
int AIDE; /* pour l'échange des caractères */
58/73
Exercice n°8
#include <stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
/* Déclarations */
char TXT[201]; /* chaîne donnée */
int I,J,N; /* indices courants */
/* Saisie des données */
printf("Entrez une ligne de texte (max.200 caractères) :\n");
gets(TXT);
/* Eliminer les lettres 'e' et comprimer : */
/* Copier les caractères de I vers J et incrémenter J */
/* seulement pour les caractères différents de 'e'. */
N=strlen(TXT);
I=0; J=0;
while(I<N)
{
if (TXT[I] != 'e'){
TXT[J] = TXT[I];
J++;
}
I++;
}
/* Terminer la chaîne !! */
TXT[J]='\0';
/* Edition du résultat */
puts(TXT);
printf("Tapez une touche pour continuer...");
getch();
}
Exercice n°9
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main()
{
/* Déclarations */
char VERB[20]; /* chaîne contenant le verbe */
char AFFI[30]; /* chaîne pour l'affichage */
int L; /* longueur de la chaîne */
/* Conjuguer ... */
AFFI[0]='\0';
strcat(AFFI, "je ");
strcat(AFFI, VERB);
strcat(AFFI, "e");
puts(AFFI);
. . .
59/73
AFFI[0]='\0';
strcat(AFFI, "ils ");
strcat(AFFI, VERB);
strcat(AFFI, "ent");
puts(AFFI);
}
printf("Tapez une touche pour continuer...");
getch();
}
Exercice n°10
#include<stdio.h>
#include<string.h>
#include<conio.h>
void main()
{
/* Déclarations */
char CH1[200], CH2[200]; /* chaînes entrées */
int RES; /* résultat de la fonction strcmp */
void main(){
/* Déclarations */
char mot[30];
int n,i;
printf("Entrer un mot:");
scanf("%s",mot);
n=strlen(mot)-1;
//1ere solution
i=0;
while((mot[i]==mot[n-i]) && (i<=(n/2))){
i++;
}
/*
//2ème solution
i=-1; /*initialisation*/
do{
i++; /*incrementation*/
}while((mot[i]!=mot[n-i]) || (i==(n/2)));
*/
if(mot[i]==mot[n-i])
printf("Le mot %s est palindrome \n",mot);
else
printf("Le mot %s n'est pas palindrome \n",mot);
60/73
REPUBLIQUE TUNISIENNE
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE
LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES
UNIVERSITE DE JENDOUBA
FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA
TP n°5
Les objectifs de ce TP c'est de comment utiliser les fonctions pour résoudre des problèmes et
Comment déclarer une fonction et comment se fait l'appel de cette dernière?
Exercice n°1
Écrire un programme se servant d'une fonction MOYENNE du type float pour afficher la
moyenne arithmétique de deux nombres réels entrés au clavier.
Exercice n°2
Écrire une fonction MIN et une fonction MAX qui déterminent le minimum et le maximum de
deux nombres réels.
Écrire un programme se servant des fonctions MIN et MAX pour déterminer le minimum et le
maximum de quatre nombres réels entrés au clavier.
Exercice n°3
Écrire la fonction AJOUTE_CH à deux paramètres CH1 et CH2 qui copie la chaîne de
caractères CH2 à la fin de la chaîne CH1 sans utiliser de variable d'aide.
Écrire le programme principale permettant de saisir deux chaînes et de faire appel à la fonction
AJOUT_CH.
Exercice n°4
Écrire la fonction IsPalindrome qui permet de vérifier si le nom en paramètre est palindrome ou
non. La fonction retourne vrai si c'est le cas et faux sinon.
Écrire le programme principale permettant de saisir un nom et de faire appel à la fonction
IsPalindrome.
61/73
Exercice n°5
Écrire un programme qui permet de remplir un tableau d’entiers de dimension N (tel que N≤50) et
d’afficher les nombres impairs.
NB : Le programme doit comporter au minimum une fonction et deux procédures.
62/73
Correction du TP n°5
Exercice n°1
#include<stdio.h>
#include<conio.h>
void main()
{
/* Variables locales */
float A,B;
/* Traitements */
printf("Introduire deux nombres : ");
scanf("%f %f", &A, &B);
printf("La moyenne arithmétique de %f et %f est %f\n",
A, B, MOYENNE(A,B));
printf("Tapez une touche pour continuer…");
getch();
}
Exercice n°2
#include <stdio.h>
#include<conio.h>
void main()
{
/* Variables locales */
double A,B,C,D;
/* Traitements */
printf("Introduire 4 réels : ");
scanf("%lf %lf %lf %lf", &A, &B, &C, &D);
printf("Le minimum des 4 réels est %f \n",
MIN( MIN(A,B), MIN(C,D)) );
printf("Le maximum des 4 réels est %f \n",
MAX( MAX(A,B), MAX(C,D)) );
printf("Tapez une touche pour continuer…");
getch();
63/73
Exercice n°3
Ou aussi
#include<stdio.h>
#include<conio.h>
#include<string.h>
void AJOUTE_CH(char *CH1, char *CH2) void AJOUTE_CH1(char *CH1, char *CH2)
{ {
while (*CH1) /* chercher la fin de CH1 */ int i,n1,n2;
CH1++; n1=strlen(CH1);
while (*CH2) /* copier CH2 à la fin de n2=strlen(CH2);
CH1 */ for(i=0;i<n2;i++)
{ {
*CH1 = *CH2; CH1[i+n1]=CH2[i];
CH1++; }
CH2++;
}
*CH1='\0'; /* terminer la chaîne CH1 */ CH1[n1+n2]='\0';
} }
void main()
{
char Chaine1[30];
char Chaine2[30];
printf("Entrer chaine n°1:");
gets(Chaine1);
printf("Entrer chaine n°2:");
gets(Chaine2);
AJOUTE_CH(Chaine1,Chaine2);
printf("La nouvelle est chaine 1 est :%s",Chaine1);
}
Exercice n°4
#include <stdio.h>
#include<conio.h>
#include<string.h>
n = strlen(LeNom)-1;
i=0;
if(LeNom[i]!= LeNom[n-i+1])
return 0;
else
return 1;
void main()
{
/* Variable locale */
char nom[50];
/* Traitements */
printf("Introduire votre nom : ");
scanf("%s", nom);
if(isPalindrome(nom)==0)
printf("Le nom n'est pas palindrome");
else
printf("Le nom est palindrome");
printf("Tapez une touche pour continuer…");
getch();
64/73
Exercice n°5
#include<stdio.h>
#include<conio.h>
}while(Taille<0 || Taille>50);
return Taille;
}
for(i=0;i<Taille;i++)
{
printf("Elément n° %d :",i+1);
scanf("%d",&TAB[i]);
}
}
for(i=0;i<Taille;i++)
{
if(TAB[i] % 2 !=0)
printf("% d ",TAB[i]);
}
}
void main()
{
int N;
int T[50];
N=TailleTableau();
Remplissage(N,&T);
Affichage(N,T);
printf("Tapez une touche pour continuer...");
getch();
}
65/73
Université de Jendouba
Faculté des Sciences Juridiques, Economiques et de Gestion de Jendouba
EXAMEN
Exercice n°1 (4 points)
Écrire un programme qui permet de saisir deux chaines CH1 et CH2, de les concaténer ensembles et d’afficher la
nouvelle chaine CH3 obtenue.
Exemple:
CH1=TRAVAILLER PLUS
CH2=GAGNER PLUS
CH3=TRAVAILLER PLUSGAGNER PLUS
On suppose que ces dernières sont deux dates valides et que Date1≤Date2.
Déterminer et afficher le nombre de jours de différence entre ces deux dates.
Exemple:
Date1=19/12/2008
Date2=05/06/2009
Le nombre de jours de différence est : 168 jours
NB : Les deux dates sont de types char de 10 caractères; pour extraire le jour, le mois et l’année vous devez employer la
fonction prédéfinie atoi de la bibliothèque (stdlib.h) qui permet de convertir une chaine en entier.
int atoi(char *chaîne) convertit la chaîne en entier
exemple: printf("ENTRER UN TEXTE: ");
gets(texte);
n = atoi(texte) ;
printf("%d",n); /* affiche 12 si texte vaut "12" */
Bonne Chance
66/73
Correction d’examen session principale
Module : Atelier de programmation I – 1LFIAG
Enseignant : Riadh BOUSLIMI
67/73
void main(){
char Date1[10];
char Date2[10];
char C1_JJ[3],C1_MM[3],C1_AAAA[5];
char C2_JJ[3],C2_MM[3],C2_AAAA[5];
int JJ1,MM1,AAAA1;
int JJ2,MM2,AAAA2;
int i,j,nbAnnee,NombreDeJours;
printf("Date1=");gets(Date1);
printf("Date2=");gets(Date2);
//Extraction du Jour, du mois et de l'année de Date1
C1_JJ[0]=Date1[0];C1_JJ[1]=Date1[1];C1_JJ[2]='\0';
C1_MM[0]=Date1[3];C1_MM[1]=Date1[4];C1_MM[2]='\0';
C1_AAAA[0]=Date1[6];C1_AAAA[1]=Date1[7];
C1_AAAA[2]=Date1[8];C1_AAAA[3]=Date1[9];C1_AAAA[4]='\0';
//Extraction du Jour, du mois et de l'année de Date2
C2_JJ[0]=Date2[0];C2_JJ[1]=Date2[1];C2_JJ[2]='\0';
C2_MM[0]=Date2[3];C2_MM[1]=Date2[4];C2_MM[2]='\0';
C2_AAAA[0]=Date2[6];C2_AAAA[1]=Date2[7];
C2_AAAA[2]=Date2[8];C2_AAAA[3]=Date2[9];C2_AAAA[4]='\0';
//Conversion en entier
JJ1=atoi(C1_JJ);MM1=atoi(C1_MM);AAAA1=atoi(C1_AAAA);
JJ2=atoi(C2_JJ);MM2=atoi(C2_MM);AAAA2=atoi(C2_AAAA);
nbAnnee=AAAA2-AAAA1;
NombreDeJours=0;
if (AAAA2==AAAA1)
{
if (MM1==MM2)
NombreDeJours=JJ2-JJ1;
else
{
for(i=MM1+1;i<=MM2-1;i++)
NombreDeJours=NombreDeJours+GetNombreJoursDuMois(i,AAAA1);
NombreDeJours=NombreDeJours+JJ2+GetNombreJoursDuMois(MM1,AAAA1)-JJ1;
}
}
else
{
//nb jours du mois suivant jusqu'à la fin de l'année de Date1
for(i=MM1+1;i<=12;i++)
NombreDeJours=NombreDeJours+GetNombreJoursDuMois(i,AAAA1);
//nb jours du mois de différences entre AAAA+1 et AAAA2-1
if (nbAnnee!=1)
{
for(j=AAAA1+1;j<=AAAA2-1;j++)
{
for(i=1;i<=12;i++)
NombreDeJours=NombreDeJours+GetNombreJoursDuMois(i,j);
}
}
//nb jours du mois de janvier jusqu'à le mois précédent de Date2
for(i=MM2-1;i>=1;i--)
NombreDeJours=NombreDeJours+GetNombreJoursDuMois(i,AAAA2);
NombreDeJours=NombreDeJours+JJ2+GetNombreJoursDuMois(MM1,AAAA1)-JJ1;
}
printf("\n Le nombre de jours de différences est %d \n",NombreDeJours);
printf("Tapez une touche pour continuer...");
getch();
}
68/73
Exercice n°3 (9pts)
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main(){
char ch1[100];
char ch2[100];
int i,j;
int LongeurCh1,LongeurCh2,nbOcc;
printf("Entrer ch1:");gets(ch1);
printf("Entrer ch2:");gets(ch2);
LongeurCh1=strlen(ch1);
LongeurCh2=strlen(ch2);
nbOcc=0;
i=0;
while(i<LongeurCh1){
j=0;
while((ch1[i]!=ch2[j]) && (i<LongeurCh1))
i++;
if (j==LongeurCh2)
nbOcc++;
}
printf("\n Le nombre d'occurrences de %s dans %s est :
%d\n",ch2,ch1,nbOcc);
printf("Tapez une touche pour continuer…");
getch();
}
69/73
Université de Jendouba
Faculté des Sciences Juridiques, Economiques et de Gestion de Jendouba
EXAMEN
70/73
Correction d’examen session contrôle
Module : Atelier de programmation I – 1LFIAG
Enseignant : Riadh BOUSLIMI
int TailleTab()
{
int taille;
do{
printf("Entrer la taille du tableau:");
scanf("%d",&taille);
}while((taille<5) || (taille>30));
return taille;
}
return som/n;
}
71/73
void main()
{
int n;
float moy;
int T[100];
n=TailleTab(); /* Affectation de la taille du tableau */
Remplissage(&T,n); /* remplissage du tableau */
moy=calculer(T,n); /* calcul et affectation de la moyenne */
printf("La moyenne est : %f\n",moy); /* Affichage de la moyenne */
printf("Pour sortir frapper une touche ");
getch();
}
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char ch1[100];
char ch2[100];
int som;
printf("Entrer chaine ch1=");gets(ch1);
printf("Entrer chaine ch2=");gets(ch2);
som=somme(extraire(ch1),extraire(ch2)); /* appel des deux fonctions */
printf("La somme est : %d\n",som); /* Affichage de la somme */
printf("Pour sortir frapper une touche ");
getch();
}
72/73
B ibliographie
Achille Braquelaire
Méthodologie de la programmation en C
2ème édition, septembre 2004 Editions Dunod
Claude Delannoy
Programmer en langage C - notions de programmation acquises par la pratique
2ème édition, Avril 2002 Editions Dunod
Yves Mettier
C en action- Solutions et exemples pour les programmeurs en C
1 ère édition, juin 2005 Editions O'Reilly
73/73