TD/TP
INFORMATIQUE – LANGAGE C
2
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
Exercice 3 : Ecrire un programme en C qui permet de lire une somme d’argents S (entier), puis déterminer
le nombre de billets de 100, 50, 20 et les pièces de 10, 5 et 1 DH.
Exercice 4 : Ecrire un programme en C qui permet de lire 3 réels a, b et c puis les afficher dans l’ordre
croissant.
Exercice 7 : Ecrire un programme en C qui permet de simuler le travail d’une calculatrice. Le programme
permet tout d’abord de lire un réel, suivi d’un caractère (’+’,’-’,’*’,’/’), puis d’un autre réel, et d’afficher par
la suite le résultat selon l’opération demandée. (utiliser switch)
Exercice 8 : Ecrire un programme en C qui permet de lire l’année et le numéro d’un mois puis affiche le
nombre de jours correspondant à ce mois. (avec et sans switch)
Exercice 9 : Écrire un programme qui permet de lire une date donnée sous la forme : nombre jour, mois,
année. Il affiche ensuite son lendemain sous forme décrite ci-dessous.
Exemple : si le jour est : 30/09/2019 l’algorithme affiche 01/10/2019.
3
Université Cadi Ayyad - Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
Exercice 3 : Ecrire un programme qui demande à l’utilisateur de saisir des nombres jusqu’à ce qu’il
saisisse 0, puis affiche le nombre des valeurs saisies, leur somme, leur Max, Min, la position du Max et celle
du Min.
Exercice 4 : Écrire un programme qui affiche les 50 premiers nombres pairs (2,4,6,...), de trois façons
différentes :
– avec une boucle while (...) { ... } ;
– avec une boucle do { ... } while (...) ;
– avec une boucle for (...;...;...) { ... } ;
4
Le nombre de lignes de la pyramide (ici 5) devrait être donné par une variable hauteur.
Exercice 9 : Ecrire un programme qui demande à l’utilisateur de saisir un entier n et détermine le nième
terme d'une suite définie par :
S0 = 2, S1 = 3,
Sn = Sn-2 + (-1)n * Sn-1 (pour n>1)
Cette suite atteint la valeur 1 quelle que soit le nombre entier A! Par exemple, si A= 10, la suite des termes
est 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, ...
Le cycle 1, 4, 2, 1 se répète indéfiniment.
1. Écrire un programme qui affiche les termes de la suite jusqu’à arriver à la valeur 1.
2. Modifier le programme pour qu’il affiche le nombre de termes avant convergence (c’est à dire la
première valeur de n telle que Un soit égal à 1.
3. Écrire un programme qui affiche le nombre de termes défini dans la question précédente, pour toutes les
valeurs de A comprises entre 2 et 20.
Exercice 12 : On démontre en mathématique que le cosinus d'un angle exprimé en radian est donné par la
somme infinie suivante :
On décide d'arrêter la somme à un certain rang n (n>3) donné. Prenons par exemple n=10.
Ecrire le programme qui permet d'évaluer le cosinus d'une valeur x donnée par l’utilisateur.
Exercice 13 : On peut calculer une approximation du sinus d’un angle x grâce à la série de Taylor :
1. Écrire un programme qui donne une approximation du sinus de x calculée avec nb termes.
2. Écrire un programme qui détermine quel est le nombre de termes nécessaires pour approximer
avec une erreur inférieure à 10−4.
5
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
Exercice 1 : Soit un tableau T de short. Supposons que l’élément T[0] soit rangé à l’adresse 0400H.
1. Quelle est l’adresse de l’élément T[4] ?
2. Même question pour un tableau de nombres flottants (float).
Exercice 2: Ecrire un programme qui permet de saisir 10 nombres entiers dans un tableau à une dimension,
puis affiche la somme et la moyenne de ces 10 nombres.
Exercice 3: Ecrire un programme dans lequel vous déclarerez et initialiserez un tableau d’entiers T avec des
valeurs dont certaines seront nulles. Le programme doit parcourir le tableau et afficher les index des
éléments nuls du tableau.
Exercice 4: Déclarer et initialiser une matrice [5,5] d’entiers (iMat). Afficher les éléments de la matrice
iMat sous forme d’un tableau.
Exercice 7: Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50
composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.
Ranger ensuite les éléments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le
tableau résultant.
Idée: Echanger les éléments du tableau à l'aide de deux indices qui parcourent le tableau en commençant
respectivement au début et à la fin du tableau et qui se rencontrent en son milieu.
Exercice 8: Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50
composantes), remplit le tableau par des valeurs entrées au clavier et affiche le tableau.
Copier ensuite toutes les composantes strictement positives dans un deuxième tableau TPOS et toutes les
valeurs strictement négatives dans un troisième tableau TNEG. Afficher les tableaux TPOS et TNEG.
Exercice 9: Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du type int
(dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des valeurs entrées au clavier et
afficher le tableau ainsi que la somme de tous ses éléments.
Exercice 10: Ecrire 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é.
6
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
3. Une fonction saisirHeure ( ) qui admettra trois paramètres entiers iH, iM et iS, dont elle affectera les
valeurs respectivement à iHeures, iMinutes et iSecondes.
4. Une fonction tick ( ) qui incrémentera l’heure d’une seconde.
5. La fonction main sera un jeu d’essai des fonctions précédentes.
Exercice 6 : Écrire une fonction afficheTableau ( ) qui affiche le tableau de nombres flottants passé en
paramètre.
Prototype : void afficheTableau (float T[ ], int N) ; /* N nombre d’elements*/
Exemple :
void main(void) {
float T[5] = { 1.0, 3.6, 3.14, 0, 0 };
AfficheTableau(T,5);
}
7
}
Résultat de l’exécution : index de 36= 2 index de 99= -1.
3.1. Quel est le prototype de la fonction indexElement ( ) ?
3.2. Que retourne la fonction lorsque l’élément cherché n’est pas dans le tableau ?
3.3. Écrire le corps de indexElement ( ).
4. Écrire une fonction maximum ( ) qui retourne l’élément le plus grand d’un tableau de nombres flottants.
5. Écrire une fonction indexMaximum ( ) qui fournit l’index de l’élément le plus grand du tableau.
Exercice 8 : Écrire une fonction afficheTableau2 ( ) qui affiche le tableau à deux dimensions de nombres
entiers passé en paramètre.
Prototype : void afficheTableau2 (int T[ ], int N, int M) ;
/* N nombre de lignes et M nombre de colonnes*/
Exemple :
void main(void) {
int TAB[3][5]={{-2,5,15,33,0},{-1,-10,25,2,100},{200,-27,3,10,10}} ;
AfficheTableau2(TAB,3,5);
}
Résultat de l’exécution :
-2 5 15 33 0
-1 -10 25 2 100
200 27 3 10 10
Exercice 9 : Écrire une fonction maximumTab2 ( ) qui retourne l’élément le plus grand d’un tableau à deux
dimensions de nombres entiers.
8
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
9
Exercice 4 : Tri avec qsort()
Proposer un programme de tri par ordre croissant d’un tableau A à l’aide de la fonction qsort ( ).
2. Pour “mesurer” le temps nécessaire à l’exécution d’un bloc d’instructions appelé Algorithme_de_tri, on
fait appel à la fonction clock ( ) de la bibliothèque < time.h >. Le code est le suivant :
Algorithme_de_tri;
n2 = clock(); /* n2 donne le nbre de périodes d’horloge depuis le début du main() */
Écrire un programme permettant de “mesurer” le temps nécessaire pour les trois algorithmes pour les tailles
suivantes : 1000, 10000, 20000, 50000 et 100000.
10
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
Exercice 1 : Les codes ASCII des lettres minuscules (de 'a' à 'z') sont rangés dans l'ordre de 97 à 122, et les
majuscules (de 'A' à 'Z') de 65 à 90. (voir annexe 1 joint)
1. Ecrire un programme pour afficher à l'écran les caractères de la table ASCII de code allant de 0 à 128. On
les présentera par ligne de 16 caractères.
2. Ecrire une fonction maj ( ) qui prend en argument une chaine de caractère non accentuée et qui renvoie la
chaîne avec minuscules converties en majuscules.
3. Ecrire une fonction qui calcule le nombre de mots dans une chaîne de caractères.
4. Ecrire une fonction qui calcule le nombre de voyelles et le nombre de consonnes présentes dans une
chaîne.
5. Donner les codes ASCII de la chaîne : “Hello World !”
Exercice 2 : Sans utiliser de fonction de la bibliothèque sting.h, écrire une fonction myStrlen ( ) permettant
de connaître la taille d’une chaîne fournie en argument. Celle-ci retourne une valeur de type int. Noter bien
que la longueur retournée ne comprend pas le caractère nul.
Prototype: int myStrlen(char *chaine);
Exercice 3 : Sans utiliser de fonction de la bibliothèque sting.h, écrire une fonction myStrcpy ( ) qui copie
le contenu de la chaîne source dans la chaîne destination, caractère nul compris. La fonction retourne
l’adresse de destination.
Exercice 4 : Sans utiliser de fonction de la bibliothèque sting.h, écrire une fonction myStrcmp ( ) qui
compare deux chaines de caractères. Cette fonction retourne :
- une valeur positive si la première chaîne est « plus grande » que la seconde ;
- zéro si elles sont égales ;
- une valeur négative si la seconde chaîne est « plus grande » que la première.
Exercice 5 : Un palindrome est un mot ou une phrase se lisant de la même façon à l’endroit et à l’envers.
Exemples : rotor, ressasser.
Les deux phrases suivantes sont des phrases palindromes :
“Engage le jeu que je le gagne”
“Tu l’as trop écrasé, César, ce Port-Salut !”
Ecrire une fonction qui prend en paramètre une chaine de caractères et retourne vrai si elle représente un
palindrome ou faux sinon.
Exercice 6 : La légende raconte que Jules César transmettait ses messages en décalant chaque lettre de 3
positions : A devient D, B devient E,... W devient Z, X devient A, Y devient B et Z devient C.
Les chiffres sont décalés de la même façon, les autres caractères (espaces, virgules, points...) ne sont pas
modifiés.
Ecrire une fonction réalisant le chiffrement d’un message passé en paramètre sous forme d’une chaîne en
utilisant la méthode précédente.
11
Exercice 7 : On cherche à supprimer les espaces multiples qui se succèdent dans une chaine et de ne
conserver qu’un seul espace.
Exemple : Soit la chaîne de caractères ch = ’’ ceci est un essai ’’
Après la suppression des espaces superflus, on doit avoir le résultat suivant : ch = ’’ceci est un essai’’.
Ecrire une fonction suppEspaces() qui supprime les espaces multiples consécutifs (qui se suivent) entre les
caractères de la chaîne transmise comme paramètre. S’il y’a plusieurs espaces au début ou à la fin, on ne
conserve aucun.
Exercice 8 : Déclarer un tableau de chaînes de caractères puis proposer un programme de tri selon l’ordre
croissant.
Annexe 1:
CODE ASCII
Annexe 2:
Bibliothèque string.h
UTILISATION DES FONCTIONS DE LA BIBLIOTHEQUE string.h
strlen
size_t strlen(char *chaine);
La fonction strlen() vous permet de connaître la taille d’une chaîne fournie en argument. Celle-ci retourne une valeur de
type size_t. Notez bien que la longueur retournée ne comprend pas le caractère nul. L’exemple ci-dessous affiche la taille de la
chaîne « Bonjour ».
#include <stdio.h>
#include <string.h>
int main(void)
{
printf("Longueur : %u\n",(unsigned)strlen("Bonjour"));
12
return 0;
}
Longueur : 7
strcpy
La fonction strcpy() copie le contenu de la chaîne source dans la chaîne destination, caractère nul compris. La fonction retourne
l’adresse de destination. L’exemple ci-dessous copie la chaîne « Au revoir » dans la chaîne chaine.
#include <stdio.h>
int main(void)
{
char chaine[25] = "Bonjour\n";
La fonction strcpy() n’effectue aucune vérification. Vous devez donc vous assurer que la chaîne de destination dispose de
suffisamment d’espace pour accueillir la chaîne qui doit être copiée (caractère nul compris !).
strcat
La fonction strcat() ajoute le contenu de la chaine source à celui de la chaîne destination, caractère nul compris. La fonction
retourne l’adresse de destination. L’exemple ci-dessous ajoute la chaîne « tout le monde » au contenu de la chaîne chaine.
#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine[25] = "Bonjour";
Comme strcpy(), la fonction strcat() n’effectue aucune vérification. Vous devez donc vous assurer que la chaîne de destination
dispose de suffisamment d’espace pour accueillir la chaîne qui doit être ajoutée (caractère nul compris !).
strcmp
• une valeur positive si la première chaîne est « plus grande » que la seconde ;
• zéro si elles sont égales ;
• une valeur négative si la seconde chaîne est « plus grande » que la première.
13
#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine1[] = "Bonjour";
char chaine2[] = "Au revoir";
if (strcmp(chaine1, chaine2) == 0)
printf("Les deux chaînes sont identiques\n");
else
printf("Les deux chaînes sont différentes\n");
return 0;
}
Les deux chaînes sont différentes
strchr
La fonction strchr() recherche la présence du caractère ch dans la chaîne chaine. Si celui-ci est rencontré, la fonction retourne
l’adresse de la première occurrence de celui-ci au sein de la chaîne. Dans le cas contraire, la fonction renvoie un pointeur nul.
#include <stddef.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine[] = "Bonjour";
char *p;
p = strchr(chaine, 'o');
if (p != NULL)
printf("La chaîne `%s' contient la lettre %c\n", chaine, *p);
return 0;
}
La chaîne `Bonjour' contient la lettre o
strpbrk
La fonction strpbrk() recherche la présence d’un des caractères de la chaîne liste dans la chaîne chaine. Si un de ceux-ci est
rencontré, la fonction retourne l’adresse de la première occurrence au sein de la chaîne. Dans le cas contraire, la fonction renvoie
un pointeur nul.
#include <stddef.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine[] = "Bonjour";
char *p;
p = strpbrk(chaine, "aeiouy");
if (p != NULL)
printf("La première voyelle de la chaîne `%s' est : %c\n", chaine, *p);
14
return 0;
}
La première voyelle de la chaîne `Bonjour' est : o
strstr
La fonction strstr() recherche la présence de la chaîne chaine2 dans la chaîne chaine1. Si celle-ci est rencontrée, la fonction
retourne l’adresse de la première occurrence de celle-ci au sein de la chaîne. Dans le cas contraire, la fonction renvoie un pointeur
nul.
#include <stddef.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char chaine[] = "Bonjour";
char *p;
p = strstr(chaine, "jour");
if (p != NULL)
printf("La chaîne `%s' contient la chaîne `%s'\n", chaine, p);
return 0;
}
La chaîne `Bonjour' contient la chaîne `jour'
15
Université Cadi Ayyad-Marrakech
Ecole supérieure de Technologie de Safi
GIM 1ère année / Informatique
Exercice 1 :
Soit P un pointeur qui 'pointe' sur un tableau A:
2. Tester.
PROBLEME
Partie 1 :
On considère la structure date suivante :
16
Effectuer les opérations de base sur cette structure :
Partie 2 :
On souhaite écrire un programme pour gérer les notes des étudiants d’une classe de N étudiants. N est une
variable globale à déclarer et à initialiser.
Partie 3 :
Organiser votre programme en proposant un menu pour l’utilisateur.
Partie 4 :
Refaire les questions de la partie 2 en utilisant à chaque fois que c’est possible des pointeurs.
17
1. Ecrire une fonction ajouterEtudiant() qui permet de créer une variable de type struct etudiant et de la
mettre à jour si opération d’allocation mémoire est réussie.
2. Vérifier la taille de l’espace mémoire allouée pour une variable de type struct etudiant puis tester la
libération de la mémoire avec free().
18