Académique Documents
Professionnel Documents
Culture Documents
Langage de programmation
TP 1
Variables, instructions conditionnelles
Dans cette première séance de travaux dirigés, nous abordons les points suivants :
• Les entrées/sorties en C ;
• L es d éc la ra ti o ns de variables et de constantes ;
• Les types de base ;
• Les structures conditionnelles if et if . . . else.
Dans tout programme, le programmeur fait appel `a des données. Ces données
peuvent prendre des valeurs qui peuvent évoluer pendant toute l’exécution du
programme. On parle alors de variables. Une variable a un type qui d´extermine les
valeurs que la variable peut prendre ainsi que les opérations pouvant s’y appliquer.
Nous utiliserons les types standards de C suivant : int, float et char. Commentez le
programme suivant :
int main(void)
{
int i,j ; float x,y,z ;
i=3; j=5;
x=3.0;
printf("i= %d j=%d somme = %d \n", i,j,i+j);
i=j/2;y=x/2;z=j/2;
printf("i= %d \n y=%f z =%f\n",i,y,z);
return 0;
}
2. Lecture au clavier
La lecture au clavier se fait grâce à la fonction scanf. Il faut lui indiquer exactement le
type des données à lire :
%d pour int,%f pour float, %c pour char.
Pour les deux premiers types, les espaces, tabulations et passages à la ligne sont
considérés comme des séparateurs.
De plus chaque variable à lire doit ˆêtre précédée du symbole &. Ainsi scanf("%d",&i);
scanf("%f",&x); scanf("%d",&j); lit successivement au clavier un entier affecté à la
variable i, un réel affecté `a la variable x et un entier affecté à la variable j (on peut
regrouper en une seule instruction scanf("%d%f%d",&i,&x,&j), mais cela demande
plus de précaution). Comme pour printf, il doit y avoir concordance entre le type et le
nombre des valeurs à lire et les variables fournies à la fonction.
Ecrire un programme qui demande un entier à l’utilisateur, le lit au clavier puis
l’affiche entre deux lignes vides.
1
Programmation En langage C
3. Manipulation de nombres
Ecrire un programme lisant quatre variables de type int, affiche ensuite chaque
valeur sur une ligne, puis leur somme et leur moyenne sur la ligne suivante.
Par exemple, si l’utilisateur entre les valeurs : 12 3 14 5
Le programme affiche :
12
3
14
5
somme = 34, moyenne = 8.5
4. Structures conditionnelles
Ecrire une suite d’instructions échangeant le contenu de deux variables 𝑎, 𝑏 de type int
entrées par l’utilisateur. En d´enduire un programme qui effectue l’échange si 𝑎 est
inferieur a 𝑏, et qui sinon augmente de 10 la valeur de 𝑏. On affiche les nouvelles
valeurs de 𝑎 et de 𝑏.
6. Etude du nombre de solutions d’une équation du second dégrée
2
Programmation En langage C
TP 2
Itérations
Dans cette séance de travaux diriges, nous abordons les points suivants:
• la boucle for(initialisation ;condition de continuation ;incrément)
• la boucle while (condition de continuation)
• la boucle do. . . while (condition de continuation)
Itérations bornées
boucle for(initialisation ;condition de continuation ;incrément)
1. Somme d’entiers
Ecrire un programme qui affiche la factorielle d’un entier n entré par l’utilisateur. Le
programme affiche un message d’erreur si l’utilisateur entre un entier n´négatif.
1
Programmation En langage C
*
**
***
****
***
**
*
5. Somme
On veut lire au clavier un entier strictement positif. Pour cela on répète la lecture si
l’utilisateur entre une valeur incorrecte. Ecrire un programme qui lit un entier positif n
entré par l’utilisateur, et qui calcule la somme de exactement n entiers positifs entrés par
l’utilisateur (si une valeur négative est entrée, elle est ignorée).
−1 2 4 2 4 5 0
↑ ↑ ↑ ↑
Le programme affichera :
2
Programmation En langage C
TP3
Fonctions, transmission des
paramètres
Dans cette séance de travaux pratiques, nous abordons l’utilisation des
fonctions. Nous allons voir comment un problème peut être résolu en le
décomposant en plusieurs sous-problèmes plus simples.
Une partie des exercices de cette feuille concerne les nombres premiers.
1. Table de multiplication
0 2 4 6 8 10 12 14 16 18
• En déduire un programme Table qui affiche sur des lignes consécutives les
10 premiers multiples de 𝑝 pour 𝑝 variant de 1 a` 10.
2. Test de primalité
Un nombre est dit premier si ses seuls diviseurs sont 1 et lui-même. Par
convention, 1 n’est pas premier.
1. Ecrire une fonction Deuxpremiers qui recroît deux entiers et affiche les
messages :
Aucun des nombres n’est premier
Un seul nombre est premier
Les deux nombres sont premiers
On pourra transformer la fonction AffichePremier en une fonction EstPremier
qui renvoie la valeur 1 si le nombre est premier et l’entier 0 sinon. Ce choix
permet d’utiliser la valeur de retour par exemple dans un test.
1
Programmation En langage C
Pour ceci :
• Ecrire une fonction LireInf2 qui effectue la saisie contrôlée d’un entier entre 0
et 2.
• Ecrire une fonction arbitre qui recoit les paris des deux joueurs et qui renvoie
0 si le match et nul, 1 si le joueur 1 a gagné et 2 si c’est le joueur 2.
2
Programmation En langage C
TP4
Fonctions, transmission des paramètres
Dans cette séance de travaux pratiques, nous approfondissons l’utilisation des fonctions.
Pour qu’une fonction puisse changer la valeur d’une variable, il est nécessaire de faire
précéder cette variable par &au moment de l’appel et faire précéder le paramètre dans la
définition de fonction par *.
Ecrire une fonction Echange qui réalise l’´échange de deux valeurs entières
passées en argument.
2. Lecture contrôlée d’un entier strictement positif
Ecrire une fonction void LirePositif(int *n) qui réalise la lecture contrôlée d’un
entier strictement positif. Cette fonction affiche un message indiquant qu’une
valeur positive est attendue et répète la lecture jusqu’à ce que l’utilisateur entre
un entier positif. On pourra utiliser une variable locale pour la lecture de l’entier
au clavier.
3. Valeurs minimum et maximum d’une liste de 𝒏 valeurs entières
1
Programmation En langage C
TP 5
Tableaux
Dans cette séance de travaux pratiques, nous introduisons les structures de données
“tableaux”. Nous allons travailler sur des tableaux de taille 𝑁 (𝑁 est une constante définie dans
le programme).
Rappels
• Tableau
Un tableau en C est une suite indicée d’éléments du même type. Les indices
commencent impérativement à l’indice 0. Une variable tableau est déclarée par :
Type des ´éléments Nom[taille] ;
Ecrire un programme qui déclare un tableau de N entiers et la valeur -1 dans toutes les
cases. Quel est l’intérêt d’utiliser une constante symbolique pour définir la taille du
tableau ?
ATTENTION C’est au programmeur de vérifier que les indices utilisés ne dépassent
pas la taille du tableau.
Tableaux et fonctions
L’indication qu’un paramètre est un tableau se fait uniquement par les [] : par
exemple void affiche (int suite [], ,). Il peut être nécessaire de transmettre à la fonction
la taille du tableau.
L’affectation d’une case d’un tableau transmis en paramètre d’une fonction change
définitivement la valeur de la case. Le passage du tableau en paramètre est toujours
un passage par adresse. En fait le C identifie le tableau et l’adresse de son premier
élément.
2. Lecture, affichage d’un tableau
• Ecrire une fonction Affichage prenant en argument un tableau T de N
entiers et qui effectue l’affichage de ce tableau.
• Ecrire une fonction Lecture qui prend un tableau T de N entiers en
argument et qui remplit le tableau T avec N entiers lus au clavier.
3. Calcul d’une moyenne
1
Programmation En langage C
Les coefficients binomiaux formant le triangle de Pascal sont liés par les relations de
récurrence suivantes :
𝑘+1
𝐶𝑛+1 = 𝐶𝑛𝑘 + 𝐶𝑛𝑘+1 .
2
Programmation En langage C
TP6
Chaîne de caractères
Une chaîne de caractères en C est un tableau de char particulier. Les caractères à
prendre en compte dans le tableau sont en effet suivis par un caractère spécial, utilisé
comme marqueur de fin de mot : il s’agit du caractère de code ASCII 0, noté ’\0’.
Dans toute la suite de cette feuille, on travaillera sur des tableaux contenant au plus
MAXLET- TRES caractères, donc sur des chaînes contenant au plus MAXLETTRES−1
caractères différents de ’\0.
Rappels
Format pour lecture et écriture
• Le format chaîne de caractères est indiqué aux fonctions scanf et printf par %s.
• La fonction scanf remplace le premier séparateur (espace, tabulation ou passage à
la ligne) par ’\0’.
• La fonction printf n’affiche pas le ’\0’.
• Aucune vérification sur la validité des données n’est faite par ces fonctions : pas de
vérification que la place réservée est suffisante, ni que le symbole ’\0’ est présent.
• La fonction gets (char Mot[]) permet de lire une ligne formée de plusieurs mots. La
ligne est placée dans le tableau mot après avoir été changée en chaine de caractères,
c’est à dire que le caractère de fin de ligne (’ \n’) est remplacé par le caractère de fin
de mot (’\0’)
On supposera dans la suite que les chaînes manipulées sont correctes.
1
Programmation En langage C
3. Nombre de chiffres
Ecrire une fonction NombreChiffres qui recroît une chaîne de caractères et renvoie
le nombre de chiffres qu’elle contient.
4. Différent
Ecrire une fonction Diffèrent qui recroît deux chaînes de caractères et qui renvoie 1
si elles sont différentes et 0 sinon.
5. Copie
E Ecrire une fonction Copie qui recroît deux chaînes de caractères et qui copie la
première dans la seconde.
6. Mise en majuscule
Ecrire une fonction MetEnMajuscule qui recroît une chaîne de caractères et met en
majuscule les lettres minuscules contenues dans cette chaîne.
7. Suppression des caractères non alphabétiques
Ecrire une fonction SupprimeNonAlphabetique qui recroît une chaîne de caractères
et supprime de cette chaîne les caractères qui ne sont pas alphabétiques. La
fonction renverra la longueur de la chaine obtenue après suppression.
8. Palindromes
Un mot est un palindrome s’il peut être lu indifféremment de droite à gauche ou de
gauche à droite (comme ´été, laval, . . .). On étend cette définition aux phrases en
ignorant les séparateurs, la ponctuation et la différence entre minuscules et
majuscules (ex : Esope reste et se repose.). Le but de l’exercice est de déterminer si
une phrase est un palindrome. Comment procéder pour ne pas transformer la
phrase d’origine ?
• Première méthode.
Ecrire une fonction Miroir qui recroît une chaîne de caractères et la remplace
par la chaîne écrite en sens inverse. Utiliser Miroir pour d´déterminer si une
chaîne est un palindrome.
• Deuxième méthode.
Procéder directement sur la chaîne à tester. On pourra même ´écrire une
fonction ne nécessitant pas de “nettoyer” la chaîne.
2
Programmation En langage C
TD 7
Structures
Définir un type Date pour des variables formées d’un numéro de jour, d’un
nom de mois et d’un numéro d’année.
Ecrire la d´déclaration d’un type Fiche permettant de m´mémoriser les
informations sur un étudiant :
• Son nom ;
• Son prénom ;
• Sa date de Naissance, de type Date ;
• Sa formation, représentée par deux lettres ;
• S’il est redoublant ou non ;
• Son groupe de TD, représenté par un entier ;
• Ses notes, représentées par un tableau note d’au plus MAXNOTES réels ;
• Un entier nb notes indiquant le nombre de notes valides dans le tableau
note.
2. Polynômes
3. Rationnel
4. Fiche
o Ecrire une fonction AjouteNote qui recroît une Fiche et ajoute une note, si
cela est possible.
o Ecrire une fonction Moyenne qui recroît une Fiche et renvoie, si cela est
possible, la moyenne des notes de l’étudiant.
2
Programmation En langage C
TP 8
Tableau de structures
1. Définitions de type
2. Lecture et é́criture
En utilisant les fonctions précédemment définies, écrire les fonctions LireClasse et Ecrire-
Classe permettant la saisie ou l’affichage des fiches des élèves d’une classe.
• Ecrire une fonction MoyenneEleve prenant en argument une classe et une variable Nom de
type chaine de caractères et permettant de calculer la moyenne des notes d’un étudiant dont
le nom est égal à Nom.
• Ecrire une fonction Meilleure qui affiche les coordonnées de ou des étudiants ayant obtenu la
meilleure moyenne d’une classe (on utilisera un tableau défini localement).
• Ecrire une fonction SaisieOrdonnee qui ordonne alphabétiquement les fiches des étudiants au
moment de la saisie. On écrira pour cela une fonction insertion effectuant l’insertion d’une
fiche dans un tableau déjà ordonne.
3. Tri
1
Programmation En langage C
Remarque
Les corrections des exercices seront disponibles qu'au fur et à mesure du déroulement des
travaux pratiques à la fin de chaque séance.
Prog. C ---- Corrigé du TP n°1
Exercice 1.
#include <stdio.h>
/* La ligne #include <stdio.h> est nécessaire pour permettre l'utilisation
des fonctions printf et scanf. Sans entrer dans les détails pour le moment,
disons simplement que cette ligne permet d'inclure un fichier contenant les
prototypes de toutes les fonctions d'entrée / sortie de base. */
int main(void) /* Lorsqu'un programme est chargé, son exécution commence par l'appel d'une
fonction spéciale du programme. Cette fonction doit impérativement s'appele
« main » pour que le compilateur puisse savoir que c'est cette fonction qui
marque le début du programme. La fonction main est appelée par le système
d'exploitation. La fonction <main> peut aussi recevoir des paramètres du
système d'exploitation. Ceci sera expliqué plus tard. Pour l'instant, on se
contentera d'une fonction main ne prenant pas de paramètre.*/
{
int i,j ; /* Déclarer deux variables (i et j) de type entier */
printf("i= %d j=%d somme = %d \n", i,j,i+j); /* Afficher les valeurs de i, j et leur somme */
Exercice 2.
#include <stdio.h>
main() {
int i;
return 0;
}
Exercice 3.
#include <stdio.h>
main() {
int i, j, k, l;
printf("\n%d\n%d\n%d\n%d\n", i, j, k, l);
printf("somme = %d, moyenne = %f\n", i+j+k+l, (i+j+k+l)/4.0);
return 0;
}
Exercice 4-a.
#include <stdio.h>
main() {
int i;
return 0;
}
Exercice 4-b.
#include <stdio.h>
main() {
int i;
if (i % 2 == 0)
printf("\n%d est pair\n\n", i);
else
printf("\n%d est impair\n\n", i);
return 0;
}
Exercice 5.
#include <stdio.h>
main() {
int a, b, temp;
(a < b ) {
temp = a;
a = b;
b = temp;
}
else
b = b + 10;
Exercice 6.
#include <stdio.h>
#include <math.h>
main () {
if (a == 0 && b == 0)
printf("\nl'équation est dégénérée.\n\n");
else if (a == 0 && b != 0)
printf("\nIl y a une racine, x = %f.\n\n", -c/b);
else if (a != 0 && c == 0) {
x1 = 0.0;
x2 = (-b - b)/(2*a);
printf("\nIl y a deux racines, x1 = %f et x2= %f\n\n", x1, x2);
}
else {
d = b*b - 4*a*c;
if (d < 0)
printf("\nIl n'y a pas de racines réelles.\n\n");
else if (d == 0)
printf("\nIl y a une racine double, x1 = x2 = %f\n\n", -b/(2*a));else
{
x1 = (-b + sqrt(d))/(2*a);
x2 = (-b - sqrt(d))/(2*a);
printf("\nIl y a deux racines, x1 = %f et x2 = %f\n\n", x1, x2);
}
}
return 0;
}
Prog. C ---- Corrigé du TP n°2
Exercice-1
#include <stdio.h>
int main(void) {
int i, x, somme=0;
return 0;
}
Exercice-1-b
#include <stdio.h>
int main(void) {
int i, n, x, somme=0;
return 0;
}
Exercice-2
#include <stdio.h>
int main(void) {
int i, n, factorielle;
if (n < 0)
printf("\nUn entier négatif est entré, la factorielle est non défini.\n\n");
else {
factorielle = 1;
for(i=1; i<=n; i++)
factorielle *= i;
printf("\nLa factorielle de %d est %d\n\n", n, factorielle);
}
return 0;
}
Exercice-3
#include <stdio.h>
int main(void) {
int i, j, n;
return 0;
}
Exercice-3-b
#include <stdio.h>
int main(void) {
int i, j, n;
char c;
return 0;
}
Exercice-4
#include <stdio.h>
int main(void) {
int n, min, max;
return 0;
}
Exercice-5
#include <stdio.h>
int main(void) {
int i, n, somme, x;
do {
printf("Entrez un entier positif:");
scanf("%d", &n);
} while (n <= 0);
somme = 0;
i=1;
printf("Maintenant, entrez %d entiers positifs\n", n);
while (i <= n) {
printf("Entrez entier n° %d (positif): ", i); scanf("%d", &x);
if (x > 0) {
somme += x;
i++;
}
}
return 0;
}
Exercice-6
include <stdio.h>
int main(void) {
int count, x, somme=0, lmax;
return 0;
}
Prog. C ---- Corrigé du TP n°3
================================================================================================
#include <stdio.h>
int main(void) {
int j;
for (j=1; j<=10; j++) {
Multiples(j);
printf("\n");
}
return 0;
}
void Multiples(int n) {
int i;
for (i=0; i<10; i++) printf("%3d ", n*i);
}
#include <stdio.h>
int main(void) {
int test;
do {
printf("Entrez un entier positif : ");
scanf("%d", &test);
if (test < 0)
printf("%d est un numbre negatif. (il faut un numbre positif).\n", test);
} while (test < 0);
AffichePremier(test);
return 0;
}
void AffichePremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
for (i = 2; i < n; i++) {
if (n % i == 0) {
estPremier = 0;
break;
}
}
if (estPremier)
printf("\n%d est un nombre premier.\n\n", n);
else
printf("\n%d n'est pas un nombre premier.\n\n", n);
}
Fonctions renvoyant une valeur
==========================================
#include <stdio.h>
int main(void) {
int n1, n2;
do {
printf("Entrez un entier positif : ");
scanf("%d%d", &n1, &n2);
if (n1 < 0 || n2 < 0)
printf("(n1= %d, n2= %d) - Il faut entrer deux numbres positifs).\n", n1, n2);
} while (n1 < 0 || n2 < 0);
DeuxPremiers(n1, n2);
return 0;
}
int EstPremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
for (i = 2; i < n; i++) {
if (n % i == 0) {
estPremier = 0;
break;
}
}
return (estPremier);
}
Exercice 2. (Nombre premier supérieur un entier n)
#include <stdio.h>
int main(void) {
int n;
do {
printf("Entrez un entier positif : ");
scanf("%d", &n);
if (n < 0)
printf("%d est un numbre negatif. (il faut un numbre positif).\n", n);
} while (n < 0);
return 0;
}
int PremierSuperieur(int n) {
return (n);
}
int EstPremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
return (estPremier);
}
Exercice 3. (Liste des nombres premiers)
#include <stdio.h>
int main(void) {
int n;
do {
printf("Entrez un entier positif : ");
scanf("%d", &n);
if (n < 0)
printf("%d est un numbre negatif. (il faut un numbre positif).\n", n);
} while (n < 0);
PremiersPremiers(n);
return 0;
}
void PremiersPremiers(int n) {
int i;
int EstPremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
return (estPremier);
}
Exercice 4. (Nombres premiers jumeaux)
#include <stdio.h>
int main(void) {
int n;
do {
printf("Entrez un entier positif : ");
scanf("%d", &n);
if (n < 0)
printf("%d est un numbre negatif. (il faut un numbre positif).\n", n);
} while (n < 0);
Jumeaux(n);
return 0;
}
void Jumeaux(int n) {
int i;
if (n <= 4)
printf("Pas de couples..\n");
else {
printf("\nLes couples de nombres premiers jumeaux inferieurs a %d: \n", n);for
(i = 2; i < n; i++)
if (EstPremier(i) && EstPremier(i+2)) printf("(%d, %d)\n", i, i+2);
}
}
int EstPremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
for (i = 2; i < n; i++) {
if (n % i == 0) {
estPremier = 0;
break;
}
}
return (estPremier);
}
Exercice 5. (Décomposition en facteurs premiers)
#include <stdio.h>
int main(void) {
int n;
do {
printf("Entrez un entier positif : ");
scanf("%d", &n);
if (n < 0)
printf("%d est un numbre negatif. (il faut un numbre positif).\n", n);
} while (n < 0);
Decomposition(n);
return 0;
}
void Decomposition(int n) {
printf("\n\n");
}
int EstPremier(int n) {
int i, estPremier = 1;
if (n == 1 || n == 0) estPremier = 0;
for (i = 2; i < n; i++) {
if (n % i == 0) {
estPremier = 0;
break;
}
}
return (estPremier);
}
Exercice 6. (Papier, caillou, ciseaux)
#include <stdio.h>
int LireInf2(void);
int arbitre(void);
int main(void) {
int j1=0, j2=0;
int i;
return 0;
}
int LireInf2(void) {
int i;
do {
printf("Entrez votre pari (0, 1, ou, 2): ");
scanf("%d",&i);
if (i < 0 || i > 2)
printf("\nIl faut entrer 0, 1, ou 2 !!!\n\n");
} while (i < 0 || i > 2);
return i;
}
int arbitre(void) {
int J1, J2;
if (J1==J2) return 0;
if (J1==((J2+1)%3)) return 1;
return 2;
}
Prog. C ---- Corrigé du TP n°4
/*
Exercice 1. Echange de deux valeurs
Ecrire une fonction Echange qui réalise l’échange de deux valeurs entières passées en
argument. */
#include <stdio.h>
int main(void) {
int x, y;
return 0;
}
#include <stdio.h>
int main(void) {
int value;
LirePositif(&value);
return 0;
}
do {
printf("Entrez un entier positif ?: ");
scanf("%d", valeur);
if ((*valeur) < 0) {
printf(" <--- %d est une valeur negative --->\n", (*valeur));
}
} while ((*valeur) < 0);
}
/* Exercice 3. Valeurs minimum et maximum d’une liste de n valeurs entières
• Comment une fonction peut-elle transmettre plus d’une seule valeur la partie du
programme qui l’a appele ?
• Ecrire une fonction MinMax qui transmet à la partie appelante le minimum et le
maximum de n entiers lus au clavier, où n est un paramétre de la fonction.
• Ecrire un programme permettant de lire un entier positif n d’afficher le minimum
et le maximum de n valeurs lues au clavier.
*/
#include <stdio.h>
int main(void) {
int n, min, max;
LirePositif(&n);
MinMax(n, &min, &max);
if (n) {
printf("Le minimum et Le maximum de %d valeurs lues au clavier sont:\n", n);
printf("\tLe minimum est %d\n\tLe maximum est %d\n", min, max);
}
return 0;
}
do {
printf("Entrez un entier positif ?: ");
scanf("%d", valeur);
if ((*valeur) < 0) {
printf(" <--- %d est une valeur negative --->\n", (*valeur));
}
} while ((*valeur) < 0);
}
/* Exercice 4. Simplification de deux nombres représentant une fraction
• Ecrire une fonction Simplifie qui reçoit deux valeurs en paramètre représentant
le numérateur et le dénominateur d’une fraction et transforme ces valeurs en
numérateur et dénominateur d’une fraction équivalente simplifiée. Par exemple,
si les variables données initialement ont pour valeur 3 et 12, leur valeur après
exécution de la procédure sera 1 et 4 ( 3/12 = 1/4 ). On supposera dans ce cas que
la procédure reçoit une fraction valide (c’est-à-dire, que le dénominateur n’est pas
nul).
• Ecrire une fonction qui réalise le même travail que la fonction Simplifie mais qui
indique une erreur grâce à la valeur retournée si le dénominateur de la première
fraction est nul (!= 0 si le déroulement est correct, 0 en cas d’erreur).
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int numerateur, denominateur;
if (Simplifie(&numerateur, &denominateur)==EXIT_SUCCESS)
printf("\nLa fraction simplifiée = %d/%d\n", numerateur, denominateur); else
printf("\n<--- Error - Simplifie() --->\n\n");
return 0;
}
if (*denominateur != 0) {
while ((*numerateur >= diviseur) && (*denominateur >= diviseur)) {
if ((*numerateur % diviseur == 0) && (*denominateur % diviseur == 0)) {
*numerateur /= diviseur;
*denominateur /= diviseur;
}
else
diviseur++;
}
return EXIT_SUCCESS;
}
else
return EXIT_FAILURE;
}
Prog. C ---- Corrigé du TP n°6
Exercice - 1
#include <stdio.h>
int main(void) {
char str[80];
return 0;
}
Exercice - 1.1
#include <stdio.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok)
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
return 0;
}
Exercice - 2
#include <stdio.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
}
return 0;
}
return length;
}
return is_ok;
}
Exercice - 3
#include <stdio.h>
#define MAXLETTTRES 30
int SaisieLigneControlee(char []);
int Longueur(char []);
int NombreChiffres(char []);
int main(void) {
char str[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
return 0;
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 4
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES], str1[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
return 0;
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 5
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES], str1[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
Copie(str, str1);
printf("\nApres l'appel de Copie():\n\tstr = %s\n",str);
printf("\tstr1 = %s\n",str1);
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
return 0;
}
void Copie(char dest[], char source[]) {
int i=0;
dest[i]='\0';
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 6
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES], str1[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
Copie(str, str1);
printf("\nApres l'appel de Copie():\n\tstr = %s\n",str);
printf("\tstr1 = %s\n",str1);
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
MetEnMajuscule(str, str);
printf("\nApres l'appel de MetEnMajuscule():\n\tstr en Majuscule = %s\n",str);
return 0;
}
for(;source[i]; i++)
if (source[i] >= 'a' && source[i] <= 'z')
enMajuscule[i] = 'A' + source[i] - 'a';
else
enMajuscule[i] = source[i];
enMajuscule[i] = '\0';
}
dest[i]='\0';
}
int Different(char str1[], char str2[]) {
int i=0;
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 7
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
Copie(str, str1);
printf("\nApres l'appel de Copie():\n\tstr = %s\n",str);
printf("\tstr1 = %s\n",str1);
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
MetEnMajuscule(str, str);
printf("\nApres l'appel de MetEnMajuscule():\n\tstr en Majuscule = %s\n",str);
SupprimeNonAlphabetique(str, str);
printf("\nApres l'appel de SupprimeNonAlphabetique():\n\tstr_modifiee = %s\n",str);
return 0;
}
str_modifiee[compteur] = '\0';
return compteur;
}
for(;source[i]; i++)
if (source[i] >= 'a' && source[i] <= 'z')
enMajuscule[i] = 'A' + source[i] - 'a';
else
enMajuscule[i] = source[i];
enMajuscule[i] = '\0';
}
dest[i]='\0';
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 8
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES], str1[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
Copie(str, str1);
printf("\nApres l'appel de Copie():\n\tstr = %s\n",str);
printf("\tstr1 = %s\n",str1);
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
MetEnMajuscule(str, str);
printf("\nApres l'appel de MetEnMajuscule():\n\tstr en Majuscule = %s\n",str);
SupprimeNonAlphabetique(str, str);
printf("\nApres l'appel de SupprimeNonAlphabetique():\n\tstr_modifiee = %s\n",str);
Miroir(str);
printf("\nApres l'appel de Miroir():\n\tstr_inversee = %s\n",str);
return 0;
}
Copie(str_rev, str);
Miroir(str_rev);
MetEnMajuscule(str_rev, str_rev);
MetEnMajuscule(str, str);
str_modifiee[compteur] = '\0';
return compteur;
}
for(;source[i]; i++)
if (source[i] >= 'a' && source[i] <= 'z')
enMajuscule[i] = 'A' + source[i] - 'a';
else
enMajuscule[i] = source[i];
enMajuscule[i] = '\0';
}
dest[i]='\0';
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Exercice - 8-1
#include <stdio.h>
#include <string.h>
#define MAXLETTTRES 30
int main(void) {
char str[MAXLETTTRES], str1[MAXLETTTRES];
int is_ok;
is_ok=SaisieLigneControlee(str);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str));
printf("Et elle contient %d chiffres\n", NombreChiffres(str));
}
is_ok=SaisieLigneControlee(str1);
if (is_ok) {
printf("\nVous avez entree au clavier la chaine de caracteres suivante:\n\t%s\n",str1);
printf("Longueur de la chaine est de %d caracters\n", Longueur(str1));
printf("Et elle contient %d chiffres\n", NombreChiffres(str1));
}
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
Copie(str, str1);
printf("\nApres l'appel de Copie():\n\tstr = %s\n",str);
printf("\tstr1 = %s\n",str1);
Different(str, str1) ?
printf("les deux chaines sont differentes\n") : printf("les deux chaines sont egale\n");
MetEnMajuscule(str, str);
printf("\nApres l'appel de MetEnMajuscule():\n\tstr en Majuscule = %s\n",str);
SupprimeNonAlphabetique(str, str);
printf("\nApres l'appel de SupprimeNonAlphabetique():\n\tstr_modifiee = %s\n",str);
Miroir(str);
printf("\nApres l'appel de Miroir():\n\tstr_inversee = %s\n",str);
return 0;
}
return palindrome;
}
str_modifiee[compteur] = '\0';
return compteur;
}
for(;source[i]; i++)
if (source[i] >= 'a' && source[i] <= 'z')
enMajuscule[i] = 'A' + source[i] - 'a';
else
enMajuscule[i] = source[i];
enMajuscule[i] = '\0';
}
dest[i]='\0';
}
return nombre_de_chiffres;
}
return length;
}
return is_ok;
}
Prog. C ---- Corrigé du TP n°7
Structures
#include <stdio.h>
typedef struct {
int jour;
char mois[10];
int annee;
} DATE;
DATE LireDate(void);
void AfficheDate(DATE);
int main(void) {
DATE date;
date = LireDate();
AfficheDate(date);
return 0;
}
DATE LireDate(void) {
DATE temp;
printf("Enter a date (in this form:: Day(1-31) Month(Janvier - Decembre) Year(xxxx)):? ")
scanf("%d %s %d", &temp.jour, temp.mois, &temp.annee);
return temp;
}
/*
Exercice 1.2 Définition de nom de type
Ecrire la déclaration d’un type Fiche permettant de mémoriser les informations
sur un étudiant :
• son nom ;
• son prenom ;
• sa date de Naissance, de type Date ;
• sa formation, représentée par deux lettres ;
• s’il est redoublant ou non ;
• son groupe de TD, représenté par un entier ;
• ses notes, représentées par un tableau note d’au plus MAXNOTES rels;
• un entier nbnotes indiquant le nombre de notes valides dans le tableau note.
#include <stdio.h>
#define MAXNOTES 10
typedef struct {
int jour;
char mois[10];
int annee;
} DATE;
typedef struct {
char nom[10];
char prenom[10];
DATE date_naissance;
char info[3];
char redoublant;
int groupe;
float notes[MAXNOTES];
char nom_module[MAXNOTES][30];
int nbnotes;
} FICHE;
FICHE LireFiche(void);
void EcrireFiche(FICHE);
FICHE AjouteNote(FICHE);
int main(void) {
FICHE etd_fiche;
etd_fiche = LireFiche();
etd_fiche = AjouteNote(etd_fiche);
etd_fiche = AjouteNote(etd_fiche);
EcrireFiche(etd_fiche);
return 0;
}
return fiche;
}
FICHE LireFiche(void) {
FICHE fiche;
fiche.nbnotes=0;
return fiche;
}
/*
Exercice 2. Polynomes
• Définir un type Polynomes permettant de manipuler des polynomes à une variable,
à coefficients réels de degré inférieur à DGMAX.
• Ecrire une fonction LirePolynome effectuant la saisie monome par monome d’un
polynome. Pour chaque monome, on indiquera le degré puis le coefficient.
*/
#include <stdio.h>
#define MAXDEGREE 101
#define MAX(x, y) (x > y ? x : y)
typedef struct {
int degree;
int coef[MAXDEGREE];
} polynomial;
typedef struct {
int coef;
int expo;
} term;
int main(void) {
polynomial a, b, c;
int i;
display_poly(a, 'a');
display_poly(b, 'b');
c = add_poly(a, b);
printf("\nPolynomial c = a + b\n");
display_poly(c, 'c');
c = mul_poly(a, b);
printf("\nPolynomial c = a * b\n");
display_poly(c, 'c');
return 0;
}
return c;
}
polynomial read_poly() {
polynomial a={0,0}; /* Initialize the polynomial to zero */
int i, nb_terms, expo, coef, max_expo=0;
do {
printf("Enter number of terms in your polynomial (a positive integer): ");
scanf("%d", &nb_terms);
if (nb_terms <= 0) printf("Invalide value assigend to nb_terms, another trail\n");
} while (nb_terms <= 0);
a.degree = max_expo;
return a;
}
/*
Exercice 3. Rationnel
• Définir un type Rationnel composé de deux entiers: un numérateur et un
dénominateur.
• Ecrire une fonction LireRationnel qui effectue la lecture d’un rationnel
valide. Le rationnel mémorisé aura été simplifié.
• Ecrire une fonction SommeRationnel qui retourne la somme des deux rationnels
valides passés en argument. Le rationnel retourné aura été simplifié.
*/
#include <stdio.h>
typedef struct {
int num;
int denom;
} Rationnel;
int main(void) {
Rationnel a = LireRationnel("1iere"), b = LireRationnel("2ieme");
Rationnel c = SommeRationnel(a, b);
printf("\n\n");
return 0;
}
void AfficheRationnel(Rationnel x) {
printf("%d/%d ", x.num, x.denom);
}
do {
printf("\tEntrez le denominateur (une entier != 0) :");
scanf("%d", &x.denom);
if (x.denom == 0)
printf("\t\t <---- Le denominateur ( = %d) n'est pas valide ----> \n", x.denom);
} while(x.denom == 0);
return Simplifie(x);
}
Rationnel Simplifie(Rationnel x) {
int diviseur=2;
return x;
}
---------------------------------------****************--------------------------------------
Prog. C ---- Corrigé du TP n°8
===================
#include <stdio.h>
#include <string.h>
#define MAXNOTES 10
#define MAXELEVES 10
typedef struct {
int jour;
char mois[10];
int annee;
} DATE;
typedef struct {
char nom[10];
char prenom[10];
DATE date_naissance;
char info[3];
char redoublant;
int groupe;
float notes[MAXNOTES];
char nom_module[MAXNOTES][30];
int nbnotes;
// float moyenne;
} FICHE;
typedef struct {
int n_eleves;
FICHE les_eleves[MAXELEVES];
} CLASSE;
CLASSE LireClasse(void);
CLASSE SaisieOrdonnee(void);
void EcrireClasse(CLASSE);
void Meilleur(CLASSE);
CLASSE insertion(CLASSE, FICHE);
FICHE LireFiche(int);
void EcrireFiche(FICHE);
FICHE AjouteNote(FICHE, char []);
float Moyenne(FICHE);
float MoyenneEleve(CLASSE, char []);
char *touppercase(char []);
int main(void) {
CLASSE classe;
classe = LireClasse();
EcrireClasse(classe);
Meilleur(classe);
return 0;
}
CLASSE SaisieOrdonnee(void) {
CLASSE classe;
int i, n_eleves;
do {
printf("Entrez le nombre des eleves (1 - %d): ?", MAXELEVES);
scanf("%d", &n_eleves);
if (n_eleves < 1 || n_eleves > MAXELEVES)
printf("\n\terr <--- Entrez un nombre entre 1 et %d --->\n", MAXELEVES);
} while (n_eleves < 1 || n_eleves > MAXELEVES);
classe.n_eleves=0;
for (i=0; i < n_eleves; i++)
classe = insertion(classe, LireFiche(i+1));
return classe;
}
CLASSE LireClasse(void) {
CLASSE classe;
int i;
do {
printf("Entrez le nombre des eleves (1 - %d): ?", MAXELEVES);
scanf("%d", &classe.n_eleves);
if (classe.n_eleves < 1 || classe.n_eleves > MAXELEVES)
printf("\n\terr <--- Entrez un nombre entre 1 et %d --->\n", MAXELEVES);
} while (classe.n_eleves < 1 || classe.n_eleves > MAXELEVES);
return classe;
}
struct {
char nom[30];
float moyenne;
} moyenne_eleves[MAXELEVES], temp;
/* sorting */
for (i=0; i<classe.n_eleves; i++) {
max_index = i;
for (j= i + 1; j<classe.n_eleves; j++)
if (moyenne_eleves[max_index].moyenne < moyenne_eleves[j].moyenne) max_index=j;
if (i != max_index) {
temp = moyenne_eleves[max_index];
moyenne_eleves[max_index] = moyenne_eleves[i];
moyenne_eleves[i] = temp;
}
}
classe.n_eleves++;
return classe;
}
float Moyenne(FICHE f) {
float somme=0;
int i;
fiche.nbnotes++;
}
else
printf("\n <---- c'est pas possible d'ajuter une note ----- >\n");
return fiche;
}
fiche.nbnotes=0;
return fiche;
}
return str;
}