- Séquence 3: Partie 1 - Exercice 1
- Séquence 3: Partie 1 - Exercice 2
- Séquence 3: Partie 2 - Exercice 1
- Séquence 3: Partie 2 - Exercice 2
Exercice 1: Gestion de Notes des étudiants (passage par valeur)
Écrivez une fonction
saisirNotesqui prend en paramètre un tableau de notes et la taille de ce tableau. Cette fonction permet à l’utilisateur de saisir les notes de l’étudiant. Assurez-vous que chaque note saisie est comprise entre 0 et 20. Si une note saisie est invalide, demandez à l’utilisateur de la saisir à nouveau jusqu’à ce qu’elle soit valide.Implémentez une fonction
calculerMoyennequi prend en paramètre un tableau de notes et la taille de ce tableau, et qui renvoie la moyenne des notes saisies.Développez une procédure
afficherDetailsqui prend en paramètre un tableau de notes, la taille de ce tableau et la moyenne calculée, et qui affiche les détails de l’étudiant, y compris ses notes et sa moyenne.
Dans la fonction principale (main):
- Demandez à l’utilisateur de saisir la taille du tableau de notes.
Créez un tableau de notes de la taille saisie.
Appelez la fonction
saisirNotespour permettre à l’utilisateur de saisir les notes de l’étudiant.Utilisez la fonction
calculerMoyennepour calculer la moyenne des notes saisies.Appelez la procédure
afficherDetailspour afficher les détails de l’étudiant, y compris ses notes et sa moyenne.
Solution commentée :
#include "stdio.h"
//Declaration des fonctions
void saisirNotes(float note[],int N);
/*
Dans les fonctions CalculerMoyenne et afficherDetails,
il faut passer la longueur du tableau en paramètre,
car le tableau devient un pointeur lorsqu’il est
transmis à une fonction. Donc on ne peut pas utiliser
sizeof à l'interieur de la fonction.
*/
float calculerMoyenne(float note[],int N);
void afficherDetails(float note[],int N);
int main()
{
int N;
printf("Quel est le nombre d'etudiant? ");
scanf("%d",&N);
float note[N];
saisirNotes(note,N);
afficherDetails(note,N);
return 0;
}
void saisirNotes(float note[],int N)
{
int i=0;
while(i20 || note[i] < 0))
{
printf("La note saisie n'est pas correcte!\n");
}
}
while (note[i]>20 || note[i] < 0);
i++;
}
}
float calculerMoyenne(float note[],int N)
{
float somme = 0;
for(int i=0;i
Exercice 2: Manipulation de Chaînes de Caractères (passage par adresse)
- Écrivez une fonction
compterCaracteresqui prend en paramètre une chaîne de caractères et renvoie le nombre de caractères dans cette chaîne. - Implémentez une fonction
inverserChainequi prend en paramètre une chaîne de caractères et inverse cette chaîne. - Développez une procédure
afficherChainequi prend en paramètre une chaîne de caractères et affiche cette chaîne.
Dans la fonction principale (main):
- demandez à l’utilisateur de saisir une chaîne de caractères.
- Appelez la fonction
afficherChainepour afficher la chaîne de caractères saisie. - Utilisez la fonction
compterCaracterespour compter le nombre de caractères dans la chaîne saisie, puis affichez ce nombre. - Appelez la fonction
inverserChainepour inverser la chaîne saisie. - Affichez la chaîne inversée à l’écran.
Solution commentée :
#include
int compterCaracteres(char *chaine)
{
/*
Attention : la fonction compterCaracteres doit
recevoir l’argument chaine comme pointeur (*).
Sinon, elle peut le recevoir comme tableau char chaine[],
car en C un tableau se comporte comme un pointeur.
*/
int i=0;
//La boucle while contient une seule commande pas besoin des {}
while (chaine[i]!='\0') i++;
return i;
}
void inverserChaine(char *chaine)
{
//Déclaration des variables
/*
N : La longueur de la chaine
i = 0 : pour accéder au début de la chaîne
j = N - 1 : Pour accéder à la fin de la chaîne
*/
int N = compterCaracteres(chaine), i = 0, j = N-1;
/* variable temporaire "temp" pour stocker
le caractère avant la permutation*/
char temp;
while (i scanf : car elle s'arrête s’arrête automatiquement
au premier caractère blanc, comme :
- espace ' '
-tabulation \t
-retour à la ligne \n
=> fegts(chaine,sizeof(chaine),stdin) : car il rajoute
retoure à la ligne après avoir saisie la chaine à partir
de stdin (Standard input "Clavier")\n
*/
gets(chaine);
printf("Affichage de la chaine avant l'inversement: \n");
afficherChaine(chaine);
inverserChaine(chaine);
printf("ffichage de la chaine après l'inversement: \n");
afficherChaine(chaine);
printf("La longueur de la chaine est : %d",compterCaracteres(chaine));
return 0;
}
Exercice 1: Calcul de la somme des entiers jusqu'à n (Passage par adresse)
Vous devez développer un programme en langage C qui utilise une fonction récursive pour calculer la somme des entiers de 1 jusqu’à un nombre entier positif n saisi par l’utilisateur. L’objectif est d’utiliser le passage par adresse pour stocker la somme calculée dans le programme principal.
Instructions :
Dans votre programme, demandez à l’utilisateur de saisir un nombre entier positif
n.Implémentez une fonction récursive
sommeEntiersqui prend en paramètres un entiernet un pointeur vers un entiersomme. Cette fonction doit calculer la somme des entiers de 1 jusqu’ànet stocker le résultat dans la variable pointée parsomme.La fonction
sommeEntiersdevrait être appelée récursivement en diminuant la valeur denà chaque appel jusqu’à ce quendevienne égal à 0.Assurez-vous de gérer le cas de base où
nest égal à 0, dans lequel la fonction doit simplement retourner sans aucun calcul supplémentaire.Utilisez le passage par adresse pour stocker la somme calculée dans la fonction
sommeEntiers.Dans le programme principal (
main), appelez la fonctionsommeEntiersavecnet l’adresse de la variablesommepour stocker le résultat.- Affichez la somme calculée à l’aide de la variable
sommedans le programme principal.
Solution commentée :
#include "stdio.h"
// Fonction récursive qui calcule la somme des entiers de 0 à N
int sommeentier(int N, int *somme)
{
// Quitter la fonction si N est négatif
if (N < 0)
{
// Code d'erreur
return 1;
}
// Ajouter N à la somme (Pointeur !!)
*somme += N;
// Condition d'arrêt : lorsque N atteint 0
if (N == 0)
{
return 0;
}
// Appel récursif
return sommeentier(N - 1, somme);
}
int main()
{
// Initialisation des variables
int N, somme = 0;
printf("Saisir un nombre entier positif N = ");
scanf("%d", &N);
/*
Pour les entiers négatifs, afficher un message d’erreur
en se basant sur le code d’erreur retourné par la fonction.
La fonction reçoit 'somme' sous forme de pointeur.
*/
if (sommeentier(N, &somme))
{
printf("Erreur : N doit être positif !\n");
return 0;
}
// Affichage du résultat
printf("La somme de 0 jusqu'à %d est %d\n", N, somme);
return 0;
}
Exercice 2 : Tri fusion récursif
Vous devez développer un programme en langage C qui trie un tableau d’entiers en utilisant l’algorithme de tri fusion. L’objectif est de permettre à l’utilisateur de saisir les éléments du tableau et de trier ensuite ce tableau en utilisant le tri fusion.
Instructions :
Demandez à l’utilisateur de saisir la taille du tableau d’entiers. Assurez-vous que la taille saisie est un entier positif
À l’aide de la fonction
saisirTableau, permettez à l’utilisateur de saisir les éléments du tableau un par un.Implémentez une fonction récursive
triFusionpour trier le tableau d’entiers en utilisant l’algorithme de tri fusion. Cette fonction devrait prendre en compte les indices de début et de fin du tableau.Implémentez une fonction
fusionnerqui fusionne deux sous-tableaux triés en un seul tableau trié.Affichez le contenu du tableau trié à l’aide de la fonction
afficherTableau.Assurez-vous que votre programme est capable de gérer correctement les erreurs de saisie de l’utilisateur.
Solution commentée :
#include
#include
// Prototypes
int saisirTableau(int N, int *tab,int M);
void afficherTableau(int tab[], int N);
void triFusion(int tab[], int deb, int fin);
void fusionner(int tab[], int deb, int milieu, int fin);
int main(void) {
int N,tab[1000];
printf("Saisir la taille du tableau N=");
scanf("%d",&N);
if (saisirTableau(N,&tab, N))
{
printf("Erreur : la taille doit être un entier positif.\n");
return 0;
}
printf("Tableau saisi : ");
afficherTableau(tab, N);
triFusion(tab, 0, N - 1);
printf("Tableau trié : ");
afficherTableau(tab, N);
return 0;
}
// Lit N et le tableau, retourne 1 si OK, 0 sinon
int saisirTableau(int N, int *tab,int M)
{
if (N==0) return 0;
if (N<0) return 1;
printf("tab[%d]=",M-N);
scanf("%d",&tab[M-N]);
saisirTableau(N-1,tab,M);
}
// Affiche un tableau d'entiers
void afficherTableau(int tab[], int N) {
if (N <= 0) {
printf("[]\n");
return;
}
printf("[");
for (int i = 0; i < N; i++) {
printf("%d", tab[i]);
if (i < N - 1) printf(", ");
}
printf("]\n");
}
// triFusion : tri récursif du sous-tableau tab[deb..fin]
void triFusion(int tab[], int deb, int fin) {
int i=0;
printf("%d-Appelle à la fonction ,%d,%d,%d\n",i,deb, fin,deb < fin);
if (deb < fin) {
int milieu = deb + (fin - deb) / 2;
i++;
printf("%d-Recursive 1 : %d,%d,%d\n",i,deb,milieu,deb < milieu);
triFusion(tab, deb, milieu);
i++;
printf("%d-Recursive 2 : %d,%d,%d\n",i,milieu+1,fin,milieu+1 < fin);
triFusion(tab, milieu + 1, fin);
i++;
printf("%d-Fusionner %d,%d,%d\n",i,deb,milieu, fin);
fusionner(tab, deb, milieu, fin);
}
}
// fusionner deux sous-tableaux triés : tab[deb..milieu] et tab[milieu+1..fin]
void fusionner(int tab[], int deb, int milieu, int fin) {
printf("Fusionner interne:%d,%d,%d \n",deb,milieu,fin);
int n1 = milieu - deb + 1;
int n2 = fin - milieu;
// allouer des sous-tableaux temporaires
int *gauche = malloc(n1 * sizeof(int));
int *droite = malloc(n2 * sizeof(int));
if (gauche == NULL || droite == NULL) {
printf("Erreur d'allocation mémoire dans fusionner.\n");
exit(1);
}
// copier les données
for (int i = 0; i < n1; i++) gauche[i] = tab[deb + i];
for (int j = 0; j < n2; j++) droite[j] = tab[milieu + 1 + j];
int i = 0, j = 0, k = deb;
// fusionner en ordre croissant
while (i < n1 && j < n2) {
if (gauche[i] <= droite[j]) {
tab[k++] = gauche[i++];
} else {
tab[k++] = droite[j++];
}
}
// copier le reste s’il y en a
while (i < n1) {
tab[k++] = gauche[i++];
}
while (j < n2) {
tab[k++] = droite[j++];
}
free(gauche);
free(droite);
}