Académique Documents
Professionnel Documents
Culture Documents
Recueil d’exercices
On voudrait écrire une commande qui à partir d'un fichier de cette forme récupère toutes les
données dans une liste chaînée et y effectue une recherche par un code. Les arguments seront
donnés sur la ligne de commande. Un exemple d'exécution de la commande est donné ci-après .
#include <string.h>
Struct etudiant {
Char code[7] ;
Char prenom[20] ;
Char nom[20] ;
Char classe[7] ;
};
Struct etudiant *lire_fichier(char *nom_fichier) {
FILE *f = fopen(nom_fichier, « r ») ;
If (f == NULL) {
Return NULL ;
While ( !feof(f)) {
Free(e);
Break ;
e->next = NULL ;
if (premier == NULL) {
premier = e ;
} else {
Dernier->next = e ;
Dernier = e ;
Fclose(f) ;
Return premier ;
While (e != NULL) {
If (strcmp(e->code, code) == 0) {
Return e ;
}
e = e->next ;
Return NULL ;
If (argc != 3) {
Return 1 ;
If (liste == NULL) {
Return 1 ;
If (e == NULL) {
} else {
Return 0 ;
S. Ndao de Tattaguine
Considérons un étudiant
défini par son identifiant, son
nom, son prénom et sa date de
naissance.
La date de naissance est
définie par le jour, le mois et
l'année.
2. Définir le type « Etudiant ».
3. Ecrire une fonction Tableau
VersListe qui transforme un
tableau d' étudiants en liste
chaînée. La fonction doit
retourner un pointeur qui
indique la tête de la liste.
L'ordre des éléments de la
liste obtenue est le même
que celui du tableau.
4. Ecrire une fonction qui
affiche et permet de
vérifier résultat obtenu ;
5. Ecrire une fonction qui
permet de rechercher un
étudiant dans la liste par son
identifiant ; la fonction
permettra de récupérer'
toutes les informations sur
l'étudiant dans la fonction
appelante ;
Rajouter une fonction main »
qui crée un tableau d'étudiants
et appelle les fonctions
précédentes.
Struct Etudiant {
Int identifiant ;
Char nom[50] ;
Char prenom[50] ;
Struct {
Int jour ;
Int mois ;
Int annee ;
} dateDeNaissance ;
};
Struct EtudiantNode {
};
newNode->data = tableau[i] ;
newNode->next = NULL ;
if (tete == NULL) {
tete = newNode ;
} else {
Courant->next = newNode ;
Courant = newNode ;
Return tete ;
AfficherEtudiant(courant->data) ;
Courant = courant->next ;
If (courant->data.identifiant == id) {
Return &(courant->data) ;
Courant = courant->next ;
Return NULL ;
}
#include <stdio.h>
#include <stdlib.h>
Typedef struct {
Int jour ;
Int mois ;
Int annee ;
} DateNaissance ;
Int identifiant ;
Char nom[100] ;
Char prenom[100] ;
DateNaissance dateNaissance ;
} Etudiant ;
*nouvelEtudiant = tableauEtudiants[i] ;
nouvelEtudiant->suivant = NULL ;
if (precedent != NULL) {
precedent->suivant = nouvelEtudiant ;
If (tete == NULL) {
Tete = nouvelEtudiant ;
Precedent = nouvelEtudiant ;
}
Return tete ;
Printf(« \n ») ;
etudiantActuel = etudiantActuel->suivant ;
If (etudiantActuel->identifiant == identifiantRecherche) {
Return etudiantActuel ;
etudiantActuel = etudiantActuel->suivant ;
Return NULL ;
Int main() {
Etudiant tableauEtudiants[3] = {
{1, « Dupont », « Jacques », {12, 5, 1990}, NULL},
};
AfficherListe(teteListeEtudiants) ;
Int identifiantRecherche = 2 ;
If (etudiantTrouve != NULL) {
} else {
Return 0 ;
Un document est défini par son titre, son auteur, et peut avoir jusqu’à sept mots-cés,
Tester votre implémentation en créant des documents et en leur appliquant ces différentes
Correction :
#define MAX_KEYWORDS 7
Typedef struct {
Char* title ;
Char* author ;
Char* keywords[MAX_KEYWORDS] ;
Int num_keywords ;
} Document ;
Doc->title = title ;
Doc->author = author ;
Doc->num_keywords = 0 ;
Return doc ;
}
Void destroy_document(Document* doc) {
Free(doc->title) ;
Free(doc->author) ;
Free(doc->keywords[i]) ;
Free(doc) ;
Doc->keywords[doc->num_keywords] = keyword ;
Doc->num_keywords++ ;
If (strcmp(doc->keywords[i], keyword) == 0) {
Return true ;
Return false ;
Return doc->title ;
Add_keyword(copy, doc->keywords[i]) ;
Return copy ;
Return doc->keywords[index] ;
Return NULL ;
Printf(« Keywords : « ) ;
Printf(« %s « , doc->keywords[i]) ;
Printf(« \n ») ;
***†******************************”****************
On veut écrire un programme permettant de gérer le personnel d'une entreprise. Les membres du
personnel d'une entreprise sont définis comme suit:
respectivement par leur prénom, le nom, le sexe, le métier, le nombre d'années d'expérience et le
salaire. L'entreprise est définie par un tableau de N (à définir) membres du personnel.
3. On voudrait maintenant sélectionner une femme parmi les ingénieurs dont le nombre
d’expériences dépasse 5 ans. Expliquer comment le faire et écrire la (ou les) fonction(s)
correspondantes ;
4. Dans le fichier «main.c », il faudra saisir le tableau des N membres de l’entreprise et appeler les
différentes fonctions. Il faudra également afficher la femme sélectionnée si elle existe.
Salutations :
#ifndef ENTREPRISE_H
#define ENTREPRISE_H
#define N 10
Typedef struct {
Char prenom[30] ;
Char nom[30] ;
Char sexe ;
Char metier[30] ;
Int anneesExperience ;
Int salaire ;
} MembrePersonnel ;
Typedef struct {
MembrePersonnel personnel[N] ;
Int nbMembres ;
} Entreprise ;
#endif
#include <stdio.h>
#include « Entreprise.h »
Int I ;
Scanf(« %s », entreprise->personnel[I].prenom) ;
Scanf(« %s », entreprise->personnel[I].nom) ;
Scanf(« %s », entreprise->personnel[I].metier) ;
Scanf(« %d », &(entreprise->personnel[I].anneesExperience)) ;
Scanf(« %d », &(entreprise->personnel[I].salaire)) ;
Membre.anneesExperience, membre.salaire) ;
Int i ;
afficherMembrePersonnel(entreprise.personnel[i]) ;
afficherMembre(ent.personnel[i]) ;
}
}
afficherMembre(ent.personnel[i]) ;
Printf(« Ingénieurs:\n ») ;
If (strcmp(ent.membres[i].metier, « Ingénieur ») == 0) {
afficherMembre(ent.personnel[i]) ;
Int somme = 0 ;
Somme += ent.personnel[i].salaire ;
Return somme ;
#include <stdio.h>
#include « Entreprise.h »
Int main() {
Entreprise ent ;
ent.nbMembre = 5 ;
saisirEntreprise(&ent) ;
afficherEntreprise(ent) ;
printf(« \n ») ;
afficherMembresSalaireSuperieur(ent, 300000) ;
printf(« \n ») ;
afficherFemmesSecretaires(ent) ;
printf(« \n ») ;
afficherIngenieurs(ent) ;
printf(« \n ») ;
return 0 ;
Khoulyo081@gmail.com
« Exercice 4
Soit un fichier de données structurées en une suite de lignes contenant chacune un nom de
personne, un nom de pièce, un nombre et un prix. Exemple :
Une fonction qui lit le fichier et mémorise son contenu dans un tableau de structures, chaque
structure permettant de mémoriser le contenu d’une ligne (nom, article, nombre et prix) et
correspondant ainsi à une commande. La lecture se fera par un appel à fscanf.
Une fonction qui parcourt ensuite ce tableau en imprimant le contenu de chaque structure
2) Reprendre l’exercice ci-dessus en mémorisant le fichier de données non pas dans un tableau
de structures, mais dans une liste chaînée de structures.
3) Rajouter une fonction de recherche de commande maximum (celle pour laquelle le produit
nombre*prix est maximum). Cette fonction prend en paramètre un pointeur vers la structure
commande qui est en tête de la liste complète et renvoie un pointeur vers la structure
recherche .
Solution
2/2
Khoulyo081@gmail.com
#include <stdio.h>
#define MAX_COMMANDES 100
Struct commande {
Char nom[50] ;
Char article[50] ;
Int nombre ;
Float prix ;
};
// Fonction pour lire le fichier et stocker les commandes dans un tableau de structures
// Jusque là nous ne connaissons pas la taille pour faire nous allons compter le nombre de types qui
sont dans le fichier avec boucle tantque
Int nb_commandes = 0 ;
If (fichier == NULL) {
Return 0 ;
Nb_commandes++ ;
Fclose(fichier) ;
Return nb_commandes ;
}
// Fonction pour parcourir le tableau de structures et afficher les commandes
Int main() {
Afficher_commandes_tableau(commandes, nb_commandes) ;
Return 0 ;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Struct commande {
Char nom[50] ;
Char article[50] ;
Int nombre ;
Float prix ;
};
// Fonction pour ajouter une commande à la liste chaînée
Void ajouter_commande_liste(struct commande** liste, char nom[], char article[], int nombre, float
prix) {
Strcpy(nouvelle_commande->nom, nom) ;
Strcpy(nouvelle_commande->article, article) ;
Nouvelle_commande->nombre = nombre ;
Nouvelle_commande->prix = prix ;
Nouvelle_commande->suivante = *liste ;
*liste = nouvelle_commande ;
// Fonction pour lire le fichier et stocker les commandes dans une liste chaînée de structures
If (fichier == NULL) {
Return ;
Char nom[50] ;
Char article[50] ;
Int nombre ;
Float prix ;
Fclose(fichier) ;
}
Liste = liste->suivante ;
Produit_max = produit_courant ;
Commande_max = liste ;
Liste = liste->suivante ;
Return commande_max ;
}
Int main() {
Lire_fichier_liste(&liste_commandes) ;
Afficher_commandes_liste(liste_commandes) ;
Return 0 ;
Notez que la fonction ajouter_commande_liste a été ajoutée pour permettre l’ajout d’une nouvelle
commande à la liste chaînée, la fonction lire_fichier_liste pour lire le fichier et remplir la liste
chaînée, et la fonction afficher_commandes_liste pour afficher les commandes de la liste chaînée. La
fonction chercher_commande_max permet quant à elle de chercher la commande pour laquelle le
produit nombre*prix est maximum.
Programme en C.
Khoulyo081@gmail.com
Ecrire un programme qui lit une suite d’entiers à la console et crée la liste chaînée correspondante
dans les deux cas :
2. Les entiers doivent être ranges par ordre croissant (au fur et à mesure de la création de la liste)
b)Recherche d’un élément de la liste renvoie le premier maillon qui contient la valeur ;
Salutations :::
#include <stdio.h>
#include <stdlib.h>
Int data ;
} Node ;
newNode->data = newData ;
newNode->next = NULL ;
if (*headRef == NULL) {
*headRef = newNode ;
Return ;
Last = last->next ;
Last->next = newNode ;
Return ;
}
newNode->data = newData ;
newNode->next = NULL ;
newNode->next = *headRef ;
*headRef = newNode ;
Return ;
Current = current->next ;
newNode->next = current->next ;
current->next = newNode ;
Printf(« %d « , node->data) ;
Node = node->next ;
Printf(« \n ») ;
}
If (current->data == key) {
Return current ;
Current = current->next ;
Return NULL ;
Current = current->next ;
Current->next = head2 ;
Return head1 ;
*headRef = temp->next ;
Free(temp) ;
Return ;
Prev = temp ;
Temp = temp->next ;
If (temp == NULL) {
Return ;
Prev->next = temp->next ;
Free(temp) ;
*headRef = temp->next ;
Free(temp) ;
Temp = *headRef ;
Prev = temp ;
Temp = temp->next ;
// Fonction pour recopier une liste chaînée en conservant l’ordre des éléments
newNode->data = current->data ;
newNode->next = NULL ;
if (newList == NULL) {
newList = newNode ;
last = newNode ;
} else {
Last->next = newNode ;
Last = newNode ;
Current = current->next ;
Return newList ;
// Fonction pour recopier une liste chaînée en inversant l’ordre des éléments
Next = current->next ;
Current->next = prev ;
Prev = current ;
Current = next ;
Return prev ;
If (head1 == NULL) {
Return head2 ;
If (head2 == NULL) {
Return head1 ;
Current = current->next ;
Current->next = head2 ;
Return head1 ;
// Fonction pour recopier une liste chaînée en inversant l’ordre des éléments
newNode->data = current->data ;
newNode->next = newList ;
newList = newNode ;
current = current->next ;
Return newList ;
Une bibliothèque est définie par nom, son université d’appartenance, un tableau de N livres et le
nombre courant de livres. Chaque livre est ainsi défini par son identifiant (chaîne de caractères), son
titre, son auteur et sa discipline.
3) Écrire une fonction qui rajoute un livre à la bibliothèque , un livre ne doit pas être ajouté deux
fois ;
Typedef struct {
Char identifiant[50] ;
Char titre[100] ;
Char auteur[100] ;
Char discipline[100] ;
} Livre ;
Typedef struct {
Char nom[100] ;
Char universite[100] ;
Livre livres[MAX_LIVRES] ;
Int nbLivres ;
} Bibliotheque ;
Void remplirLivre(Livre* livre, char* id, char* titre, char* auteur, char* discipline) {
Strcpy(livre->identifiant, id) ;
Strcpy(livre->titre, titre) ;
Strcpy(livre->auteur, auteur) ;
Strcpy(livre->discipline, discipline) ;
}
Int main() {
Bibliotheque biblio ;
initBibliotheque(&biblio, « Bibliothèque centrale », « Université de Paris ») ;
ajouterLivre(&biblio, « 001 », « Les Misérables », « Victor Hugo », « Roman ») ;
ajouterLivre(&biblio, « 002 », « L’Étranger », « Albert Camus », « Roman ») ;
ajouterLivre(&biblio, « 003 », « Le Petit Prince », « Antoine de Saint-Exupéry », « Roman
pour enfants ») ;
ajouterLivre(&biblio, « 004 », « Cours de physique de Feynman », « Richard P. Feynman »,
« Physique ») ;
ajouterLivre(&biblio, « 005 », « Le capital au XXIe siècle », « Thomas Piketty »,
« Économie ») ;
printf(« \nAfficher les livres de la bibliothèque:\n ») ;
afficherLivresBibliotheque(&biblio) ;
printf(« \nAfficher les livres d’une université:\n ») ;
afficherLivresUniversite(&biblio, « Université de Paris ») ;
printf(« \nAfficher toutes les bibliothèques d’une université:\n ») ;
afficherBibliothequesUniversite(&biblio, « Université de Paris ») ;
printf(« \nIntersection des livres de deux bibliothèques:\n ») ;
Bibliotheque biblio2 ;
initBibliotheque(&biblio2, « Bibliothèque des sciences », « Université de Paris ») ;
ajouterLivre(&biblio2, « 002 », « L’Étranger », « Albert Camus », « Roman ») ;
ajouterLivre(&biblio2, « 004 », « Cours de physique de Feynman », « Richard P. Feynman »,
« Physique ») ;
trouverIntersectionLivres(&biblio, &biblio2) ;
return 0 ;
}
On peut alors représenter un dictionnaire bilingue par un tableau de pointeurs de << struct
traduction >>, chaque case du tableau pointant sur une paire de mots se traduisant l’un en l’autre.
On supposera que les dictionnaires sont triés par ordre lexicographique (l’ordre alphabétique) sur le
champ a.
3. On voudrait maintenant créer une commande qui permet de rechercher un nom dans le
dictionnaire. Les arguments seront donnés sur la ligne de commande. Un exemple
d’exécution de la commande pourrait être celui donné ci-après :
Où << search » est le nom de la commande, «< nom » est le nom recherché, et « dictio >> est le Nom
du fichier ;
Correction :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Struct traduction {
Char a[20] ;
Char b[20] ;
};
/* ********Cette fonction prend en paramètres les arguments de la ligne de commande. Elle vérifie
que le nombre d’arguments est correct, puis récupère le nom du fichier et le mot à chercher. Elle
crée un tableau de traductions et le remplit à partir du fichier avec la fonction remplir_tableau().
Enfin, elle effectue une recherche dichotomique avec la fonction recherche_dichotomique() et
affiche le résultat.**********/
Int debut = 0 ;
If (strcmp(dico[milieu].a, s) == 0) {
Return &dico[milieu] ;
} else {
Fin = milieu – 1 ;
Return NULL ;
/***** Cette fonction prend en paramètres le tableau de traductions, sa taille et le nom du fichier
binaire à partir duquel remplir le tableau. Elle ouvre le fichier, lit les données avec la fonction fread()
et ferme le fichier.*******/
If ( !fichier) {
Exit(EXIT_FAILURE) ;
Fclose(fichier) ;
If (argc != 3) {
Exit(EXIT_FAILURE) ;
If (trad) {
Return 0 ;
Exercise : map
#include <studio.h>
int i ;
nv_tab[i] = f(tabIi]) ;
return X*X ;
int main(){
int i ;
int tab[]={1,2,3,4,5} ;
int n=5 ;