Exercice 01 :
- Un pointeur en C est une variable qui contient l'adresse mémoire d'une autre variable. Pour accéder à une variable en mémoire en utilisant un pointeur, on utilise l'opérateur de déréférencement (*). Par exemple, si "ptr" est un pointeur vers une variable "x", on accède à la valeur de "x" en utilisant "*ptr".
- Pour passer des paramètres à une fonction en C en utilisant des pointeurs, on peut passer l'adresse de la variable en utilisant l'opérateur d'adressage (&). Par exemple, pour passer une variable "x" à une fonction "func", on appelle "func(&x)".
- Pour parcourir un tableau ou une chaîne de caractères en C en utilisant des pointeurs, on peut utiliser un pointeur de déplacement pour parcourir les éléments de l'élément. Par exemple, pour parcourir un tableau "arr" de taille "n", on peut utiliser une boucle for qui déclare un pointeur "ptr" qui pointe vers le début du tableau, et incrémente ptr à chaque itération pour accéder à chaque élément du tableau.
- La différence entre un pointeur et une référence en C est que les pointeurs sont des variables qui contiennent l'adresse d'une autre variable alors que les références sont un alias pour une variable existante.
- Pour allouer et libérer de la mémoire dynamiquement en C en utilisant des pointeurs, on peut utiliser les fonctions malloc et free. La fonction malloc alloue un bloc de mémoire de la taille spécifiée et renvoie un pointeur vers le début de ce bloc. La fonction free libère un bloc de mémoire précédemment alloué en utilisant malloc. Il est important de noter qu'il faut toujours libérer la mémoire allouée dynamiquement pour éviter les fuites de mémoire.
Exercice 2 :
Version recursive ----
#include <stdio.h>
int rechercheDicho(int y, int *u, int v, int w) {
if (v > w) {
return v;
}
int milieu = (v + w) / 2;
if (u[milieu] == y) {
return milieu;
}
if (u[milieu] > y) {
return rechercheDicho(y, u, v, milieu - 1);
}
else {
return rechercheDicho(y, u, milieu + 1, w);
}
}
int main() {
int u[] = {1, 3, 5, 7, 9, 11, 13, 15};
int i = sizeof(u) / sizeof(u[0]);
int y = 8;
int index = rechercheDicho(y, u, 0, i - 1);
if (u[index] == y) {
printf("L'élément %d se trouve à l'indice %d dans le tableau u\n", y, index);
}
else {
printf("L'élément %d devrait être inséré à l'indice %d dans le tableau u pour conserver l'ordre croissant\n", y, index);
}
return 0;
}
Probleme :
1)
typedef struct {
char code[6];
char nom[31];
char auteur[31];
char description[101];
float prix;
int quantite;
float notation;
} Livre;
Livre ensembleLivres[MAX_LIVRES];
2)
Livre *rechercherLivreParCode(char *code, Livre *ensembleLivres, int tailleEnsemble) {
for (int i = 0; i < tailleEnsemble; i++) {
if (strcmp(ensembleLivres[i].code, code) == 0) {
return &ensembleLivres[i];
}
}
return NULL;
}
3)
void insererLivre(Livre l, Livre *ensembleLivres, int *tailleEnsemble) {
ensembleLivres[*tailleEnsemble] = l;
(*tailleEnsemble)++;
}
4)#
int compterLivresParNom(Livre *ensembleLivres, int tailleEnsemble) {
int compteur = 0;
for (int i = 0; i < tailleEnsemble; i++) {
if (strcmp(ensembleLivres[i].nom, '' Genius'') == 0) {
compteur++;
}
}
return compteur;
}
5)
void trierLivresParNotation(Livre *ensembleLivres, int tailleEnsemble) {
for (int i = 1; i < tailleEnsemble; i++) {
Livre livreActuel = ensembleLivres[i];
int j = i - 1;
while (j >= 0 && ensembleLivres[j].notation > livreActuel.notation) {
ensembleLivres[j + 1] = ensembleLivres[j];
j--;
}
ensembleLivres[j + 1] = livreActuel;
}
}
6)
void modifierPrixLivre(char *code, float nouveauPrix, Livre *ensembleLivres, int tailleEnsemble) {
Livre *livre = rechercherLivreParCode(code, ensembleLivres, tailleEnsemble);
if (livre != NULL) {
livre->prix = nouveauPrix;
}
}
7)
void afficherLivresVendus(Livre *ensembleLivres, int tailleEnsemble) {
for (int i = 0; i < tailleEnsemble; i++) {
if (ensembleLivres[i].notation > 2.5) {
printf("Nom : %s, Auteur : %s, Description : %s, Prix : %f, Quantité : %d, Notation : %f\n", ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
}
}
}
8)
void afficherLivresVendus(Livre *ensembleLivres, int tailleEnsemble) {
for (int i = 0; i < tailleEnsemble; i++) {
if (ensembleLivres[i].notation > 2.5) {
printf("Nom : %s, Auteur : %s, Description : %s, Prix : %f, Quantité : %d, Notation : %f\n", ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
}
}
}
9)
void sauvegarderEnsembleLivres(Livre *ensembleLivres, int tailleEnsemble, char *nomFichier) {
FILE *fichier = fopen(nomFichier, "w");
for (int i = 0; i < tailleEnsemble; i++) {
fprintf(fichier, "%s,%s,%s,%s,%f,%d,%f\n", ensembleLivres[i].code, ensembleLivres[i].nom, ensembleLivres[i].auteur, ensembleLivres[i].description, ensembleLivres[i].prix, ensembleLivres[i].quantite, ensembleLivres[i].notation);
}
fclose(fichier);
}
10)