Post

DS1 2022 2023 Correction (DS4 Anciennement) Informatique2-DS PREING1 S2

Voir le DS1 2022 2023 (DS4 Anciennement)

Exercices : 1 2 3

Il n’ya pas d’erreur normalement, si il y’en a envoyez un message a deltabot sur WhatsApp et je réglerai le soucis.

Exercice 1

exercice 1

exercice 12

  • On inclue les bibliothèque et on definie les variables utiles
1
2
3
4
5
6
#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 

#define MAX_CHAR 100 // Définition de la taille maximale d'une chaîne de caractères

  • On définie la structure pour la date
1
2
3
4
5
typedef struct {
    int jour;
    int mois;
    int annee;
} Date;
  • On définie la structure pour la adresse
1
2
3
4
5
typedef struct {
    int numeroRue;
    char nomRue[MAX_CHAR];
    char nomVille[MAX_CHAR];
} Adresse;
  • On définie la structure pour le client
1
2
3
4
5
6
7
8
typedef struct {
    char nom[MAX_CHAR];
    char prenom[MAX_CHAR];
    Adresse adresse;
    int points_fidel;
    Date dateNaissance;
    Date dateAdhesion;
} Client;
  • On créer la fonction pour afficher une adresse
1
2
3
void afficheAdresse(Adresse adr) {
    printf("%d %s, %s\n", adr.numeroRue, adr.nomRue, adr.nomVille);
}
  • On créer la fonction pour vérifier si deux dates sont identiques
1
2
3
int memeDate(Date date1, Date date2) {
    return (date1.jour == date2.jour) && (date1.mois == date2.mois);
}
  • On créer la fonction pour calculer le nombre d’années entre deux dates
1
2
3
4
5
6
7
int nombreAnnees(Date date1, Date date2) {
    int ans = date2.annee - date1.annee;
    if (date2.mois < date1.mois || (date2.mois == date1.mois && date2.jour < date1.jour)) {
        ans--;
    }
    return ans;
}
  • On créer la fonction pour comparer deux chaînes de caractères
1
2
3
4
5
6
7
8
9
10
int memeMot(char mot1[], char mot2[]) {
    int i = 0;
    while (mot1[i] == mot2[i]) {
        if (mot1[i] == '\0' && mot2[i] == '\0')
            return 1;
        i++;
    }
    return 0;
}

  • Deuxième méthode (utilisation de strcmp car l’utilisation n’est pas interdite)
1
2
3
int memeMot(char mot1[], char mot2[]) {
    return !strcmp(mot1, mot2); // Utilisation de la fonction strcmp de la bibliothèque string.h
}
  • On créer une fonction pour saisir les entiers naturels
1
2
3
4
5
6
7
8
9
10
11
int better_scan(char * message){
    int var = -1;
    int ret_var = 0;
    while (ret_var != 0 || var < 0)
    {   
        printf(message); // Affichage du message
        ret_var = scanf("%d", &var); // Lecture de l'entier
        while(getchar()!='\n'){} // Vidage du tampon d'entrée (ligne facultative)
    }
    return var;
}

Cette fonction est facultative, la ligne while(getchar()!='\n'){} permet de vider le buffer et d’avoir un scanf qui ne boucle pas a l’infinie lors d’une mauvaise saisie.

  • On créer une fonction pour saisir les entiers naturels (avec une valeur maximale)
1
2
3
4
5
6
7
8
9
10
11
int better_scan_val_max(char * message, int max){
    int var = -1;
    int ret_var = 0;
    while (ret_var != 0 || var < 0 && var > max)
    {   
        printf(message); // Affichage du message
        ret_var = scanf("%d", &var); // Lecture de l'entier
        while(getchar()!='\n'){} // Vidage du tampon d'entrée (ligne facultative)
    }
    return var;
}

Cette fonction est facultative, la ligne while(getchar()!='\n'){} permet de vider le buffer et d’avoir un scanf qui ne boucle pas a l’infinie lors d’une mauvaise saisie.

  • On créer la fonction pour saisir les informations d’un client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Client saisirClient() {
    Client client;
    // Lecture du nom avec fgets pour éviter les problèmes de débordement de mémoire (on peut utiliser aussi un scanf)
    printf("Nom: ");
    if (fgets(client.nom , MAX_CHAR, stdin) == NULL) {
        exit(1);
    }
    client.nom[strlen(client.nom)-1] = '\0';

    printf("Prénom: ");
    if (fgets(client.prenom , MAX_CHAR, stdin) == NULL) {
        exit(1);
    }
    client.prenom[strlen(client.prenom)-1] = '\0';

    client.adresse.numeroRue = better_scan("Numéro de rue:");

    printf("Rue : ");
    if (fgets(client.adresse.nomRue , MAX_CHAR, stdin) == NULL) {
        exit(1);
    }
    client.adresse.nomRue[strlen(client.adresse.nomRue)-1] = '\0';

    printf("Nom de ville: ");
    if (fgets(client.adresse.nomVille , MAX_CHAR, stdin) == NULL) {
        exit(1);
    }
    client.adresse.nomVille[strlen(client.adresse.nomVille)-1] = '\0';

    client.points_fidel = better_scan("Points de fidélité (0 au départ): ");
    printf("Date de naissance (jj/mm/aaaa): ");
    client.dateNaissance.jour = better_scan_val_max("Date de naissance jj: ", 31);
    client.dateNaissance.mois = better_scan_val_max("Date de naissance mm: ", 12);
    client.dateNaissance.annee = better_scan("Date de naissance aaaa: ");

    // Utilisation de la date actuelle pour la date d'adhésion
    client.dateAdhesion.jour = 23;
    client.dateAdhesion.mois = 2;
    client.dateAdhesion.annee = 2023;
    return client;  // Retourne le client saisi
}

fgets prend en argument la variable où stocker la valeur d’entrée, le nombre maximum de char qu’elle doit enregistrer et pour finir le stream qu’elle doit lire (ici stdin) cette fonction renvoie un pointeur vers la chaîne de char si la fonction échoue elle renvoie NULL.

  • On créer la fonction pour mettre à jour les points de fidélité d’un client en fonction d’un montant d’achat
1
2
3
void majPoint(Client *client, int montantAchat) {
    client->points_fidel += montantAchat / 100;
}
  • deuxième methode car l’énoncé n’est pas clair (retourne une copie modifiée du client)
1
2
3
4
void majPoint(Client client, int montantAchat) {
    client.points_fidel += montantAchat / 100;
    return client; // Cette fonction devrait retourner un Client* pour modifier le client passé par référence
}
  • On créer la fonction pour calculer le taux de réduction applicable à un client
1
2
3
4
5
6
7
8
9
10
11
12
float reduction(Client client) {
    Date dateActuelle = {19, 3, 2024}; // Date actuelle

    float tauxReduction = nombreAnnees(client.dateAdhesion, dateActuelle) * 0.05; // 5% par année de fidélité
    
    tauxReduction += client.points_fidel * 0.01; // 1% par point de fidélité

    if (tauxReduction > 0.5){
        tauxReduction = 0.5; // Plafonnement à 50%
    }
    return tauxReduction; // Retourne le taux de réduction calculé
}
  • On créer la fonction pour afficher les clients dont c’est l’anniversaire aujourd’hui
1
2
3
4
5
6
void anniversaire(Client tableau[], int taille, Date date) {
    for (int i = 0; i < taille; i++) {
        if (tableau[i].dateNaissance.jour == date.jour && tableau[i].dateNaissance.mois == date.mois)
            printf("%s %s\n", tableau[i].prenom, tableau[i].nom);
    }
}
  • On créer la fonction pour afficher les adresses des clients dans une ville donnée
1
2
3
4
5
6
7
void adressePublicite(Client tableau[], int taille, char ville[]) {
    for (int i = 0; i < taille; i++) {
        if (memeMot(tableau[i].adresse.nomVille, ville))
            afficheAdresse(tableau[i].adresse);
    }
}

Exercice 2

exercice 2

  • On créer une fonction tableauCroissant qui vas verifier si un tableau est croissant
1
2
3
4
5
6
7
8
9
10
11
12
int tableauCroissant(char * tab, int taille){
    for (int i = 0; i < taille-1; i++)
    {
        if (*(tab+i) > *(tab+i+1))
        {
            return 0;
        }
        
    }
    return 1;
    
}

Exercice 3

exercice 3

  • Déclaration de la fonction pour trier les trois valeurs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

void traitement(float *a, float *b, float *c) {
    float temp;
    // Tri des valeurs pour s'assurer que a <= b <= c
    if (*a > *b) {
        temp = *a;
        *a = *b;
        *b = temp;
    }
    if (*b > *c) {
        temp = *b;
        *b = *c;
        *c = temp;
    }
    if (*a > *b) {
        temp = *a;
        *a = *b;
        *b = temp;
    }
}
  • On créer une fonction pour saisir les entiers naturels
1
2
3
4
5
6
7
8
9
10
11
float better_scan(char * message){
    float var;
    int ret_var = 0;
    while (ret_var != 0)
    {   
        printf(message); // Affichage du message
        ret_var = scanf("%f", &var); // Lecture de l'entier
        while(getchar()!='\n'){} // Vidage du tampon d'entrée (ligne facultative)
    }
    return var;
}

Cette fonction est facultative, la ligne while(getchar()!='\n'){} permet de vider le buffer et d’avoir un scanf qui ne boucle pas a l’infinie lors d’une mauvaise saisie.

  • On test le tout dans le main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main() {
    float a, b, c;

    // Demande à l'utilisateur de saisir les trois valeurs
    a = better_scan("Entrez a : \n");
    b = better_scan("Entrez b : \n");
    c = better_scan("Entrez v : \n");

    // Appel de la fonction de traitement pour trier les valeurs
    traitement(&a, &b, &c);

    // Affichage des valeurs triées
    printf("Les valeurs triées sont : %f, %f, %f\n", a, b, c);

    return 0;
}

Exercices : 1 2 3

Cet article est sous licence BSD 2-Close licence par l'auteur.