EVALUATION EN LANGAGE C TEST  2020

Examen Langage C

Dans ce document la correction du CC de programmation a été entièrement rédigé par le groupe Genius. Le but réel et de pouvoir écrire un programme qui puise réaliser la racine carrée, le produit matriciel, la gestion d’étudiants et bien d’autres. Dans une correction détaillée pas à pas, vous aller découvrir ce qu’il y avait lieu de faire dans cette épreuve

Contrôle continu de programmation IN1

Exercice 1 :10 pts
1)Ecrire une fonction fact qui lit un nombre entier naturel positif n au clavier et affiche le factoriel de n.                                        1pt
2)Ecrire une fonction exp qui lit in nombre x et un nombre en entier naturel n au clavier et affiche    xn                                         1pt
3)Ecrire une procédure SaisieMatrice qui initialise une matrice M(n,m) de nombre réels.                                                1pt
Ecrire un programme ProduitMatrice qui utiliser la procédure SaisieMatrice pour lire deux matrices M1(n1, m2) et M2(n2, m2) et afficher le produit de M1 par M2 (M1xM2).

NB attention aux valeurs n1 et m2                            2pts
4) Pour calculer la racine carrée d’un nombre positif on utilise la suite numérique de terme général    
   Un+1=     ½(Un+a/Un)    Avec a ≥ 0
                    1 pour n=0
Ecrire la fonction Ua (int n, double a) qui calcul et retourne un pour a et n donné par l’utilisateur au clavier.                                2pts
Ecrire un programme qui lit un nombre a au clavier et affiche la valeur de N pour laquelle Ua (N,a)-Ua(N-1,a)<1/10000                            2pts
Que représente Ua (N,a) et 1/10000  pour le nombre a ?                1pt

Exercice 2 : 10 pts
On suppose qu’un étudiant est représenté par : un matricule sur 20 caractères ; un sexe sur 1 caractère (M ou F) ; une date de naissance (Jour entier, mois entier, année entier) et la moyenne des notes. On suppose également qu’un étudiant compose sur 30 matières. Une matière est composé d’un code de 5 caractères ; d’un titre de 30 caractères d’un nombre de crédits et d‘une note.
On dispose de 30 000 étudiants.

  1. Proposer une structure en C, TEtud pour représenter un étudiant, TMat  pour représenter une matière, TEtudMat pour représenter un étudiant et toutes ses matières, TListeEtud pour représenter tous les 30 000 étudiants            2pts
  2. Ecrire une fonction SaisieEtud qui retourne les informations saisies au clavier sur un étudiant.                                2pts
  3. Ecrire une procédure SaisieMatEtud qui enregistre les informations saisies au clavier sur les matières d’un étudiant e.                            2pts
  4. Ecrire un programme qui enregistre les informations sur tous les étudiants et leurs matières.                                2pts
  5. Ecrire une fonction MoyenEtud qui calcule la moyenne des notes de chaque étudiant et met le résultat dans la moyenne étudiant                         2pts 

 

 

Correction :

/// EXERCICE 1
/// 1) Fonction FACTORIEL
#include
#include

long Fact()
{
    int nbre, i;
    long f=1;
    printf("Entrer un nombre positif, je determine son factoriel");
    
    /// boucle pour s'assurer que le nombre est positif
    do
    {
        scanf("%d", &nbre);
    } while (nbre < 0);

    if (nbre == 0 || nbre == 1)
    {
        printf("Le factoriel de %d est :\n", nbre);
        return 1;
    }
    else
    {
        for (i = 2; i <= nbre; i++)
        {
            f = f * i;
        }
        printf("Le factoriel de %d est :\n", nbre);
        return f;
    }
}

/// 2) Fonction Exponentiel
long expo()
{
    int x, n, i;
    long r=1;
    printf("Entrer l'element dont on veut la puissance\n");

    do
    {
        scanf("%d", &x);
    } while (x < 0);

    printf("Entrer l'exposant :\n");

    do
    {
        scanf("%d", &n);
    } while (n < 0);

    if (n == 0)
    {
        printf("%d exposant %d vaut ", x, n);
        return 1;
    }
    else if (n == 1)
    {
        printf("%d exposant %d vaut ", x, n);
        return x;
    }
    else
    {
        for (i = 1; i <= n; i++)
        {
            r = r * x;
        }
        printf("%d exposant %d vaut ", x, n);
        return r;
    }
}

/// 3) Procedure SaisieMatrice
void SaisieMatrice(int n, int m, int M[][m])
{
    int i, j;
    printf("Entrer les elements de votre matrice\n");
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < m; ++j)
        {
            scanf("%d", &M[i][j]);
        }
    }
    return;
}

/// 4) Programme ProduitMatrice
void AfficheMatrice(int n, int m, int M[][m]);
void SaisieMatrice(int n, int m, int M[][m]);

int main()
{
    int n1, m1, n2, m2;

    /// recuperation du nombre de lignes et colonnes des matrices
    printf("Entrer le nombre de lignes et de colonnes de la premiere matrice");
    do
    {
        scanf("%d%d", &n1, &m1);
    } while (n1 < 0 && m1 < 0);

    printf("Entrer le nombre de lignes et de colonnes de la deuxieme matrice");
    do
    {
        scanf("%d%d", &n2, &m2);
    } while (n2 < 0 && m2 < 0);

    /// verifions que le nombre de lignes de la deuxieme matrice est egal au nombre de colonnes de la premiere matrice
    if (m1 != n2)
    {
        printf("Produit Matriciel impossible\n"
               "car le nombre de ligne de M2 est"
               "different du nombre de colonnes de M1");
    }
    else
    {
        int i, j, k, M1[n1][m1], M2[n1][m1], M3[n1][m1];
        SaisieMatrice(n1, m1, M1);
        SaisieMatrice(n2, m2, M2);

        /// boucle pour obtenir le produit matriciel
        for (i = 0; i < n2; ++i)
        {
            for (j = 0; j < m1; ++j)
            {
                M3[i][j] = 0;
                for (k = 0; k < m1; ++k)
                {
                    M3[i][j] = M3[i][j] + (M1[i][k] * M2[k][j]);
                }
            }
        }
        AfficheMatrice(n2, m1, M3);
    }

    return 0;
}

void AfficheMatrice(int n, int m, int M[][m])
{
    int i, j;
    printf("Entrer les elements de votre matrice\n");
    for (i = 0; i < n; ++i)
    {
        for (j = 0; j < m; ++j)
        {
            printf("%d  ", M[i][j]);
        }
        printf("\n");
    }
    return;
}

/// 5) Calculer la racine carree d'un nombre

/// a) Fonction qui calcule la racine carree
double Ua(int n, double a)
{
    if (n == 0)
    {
        return 1;
    }
    else
    {
        return ((0.5) * (Ua(n - 1, a) + (a / Ua(n - 1, a))));
    }
}

/// b) Programme pour obtenir N
int main()
{
    int N = 0;
    double a, U;
    do
    {
        printf("Entrer le nombre dont on veut calculer ca racine carree\n");
        scanf("%lf", &a);
    } while (a < 0);

    do
    {
        N++;
        U = Ua(N, a);
    } while ((Ua(N, a) - (Ua(N - 1, a))) > (1 / 10000));

    printf("La valeur de N pour la quelle (Ua(N,a)-Ua(N-1,a))<(1/10000) est %d \n", N);
    return 0;
}

/// c) Que represente Ua(N,a) et 1/10000 pour le nombre a

/// Reponse
/// - Ua(N,a); est le terme de la suite au rang N.
/// - 1/10000 est une sorte de precision ou valeur d'arret.
/// EXERCICE 2
/// 6) Structure pour representer un étudiant
/// pour réaliser cela, nous aurons besoin d'une structure date
/// structure d'une date
typedef struct Tdate
{
    int jour;
    int mois;
    int annee;
} Tdate;

/// structure d'un etudiant
typedef struct TEtud
{
    char mat[20];
    char sexe;
    Tdate date;
    float moy;
} TEtud;

/// structure pour representer une matiere
typedef struct Tmat
{
    char code[5];
    char titre[30];
    int Ncredit;
    float note;
} Tmat;

/// structure pour representer l'ensemble des étudiants
#define N 30000
TEtud TListeEtud[N];

/// structure pour representer un étudiant et ces matieres
#define M 30
typedef struct TEtudMat
{
    TEtud Etud;
    Tmat matiere[M];
} TEtudMat;

/// 7) Fonction pour retourner les informations sur un étudiant
/// Pour realiser cette fonction nous aurons besoin d'une fonction
/// qui nous permettra de lire une date et s'assurer de sa validite
/// Fonction pour lire une date et la retourner si elle est valide
Tdate LireDate()
{
    Tdate date;
    printf("Entrer votre date de naissance dans le format (jj/mm/aaaa)\n");
    scanf("%d/%d/%d", &date.jour, &date.mois, &date.annee);

    /// verification de la validite de la date
    if ((date.jour >= 1 && date.jour <= 31) && (date.mois == 1 || date.mois == 3 || date.mois == 5 || date.mois == 7 || date.mois == 8 || date.mois == 10 || date.mois == 12))
        return date;
    else if ((date.jour >= 1 && date.jour <= 30) && (date.mois == 4 || date.mois == 6 || date.mois == 9 || date.mois == 11))
        return date;
    else if ((date.jour >= 1 && date.jour <= 29) && (date.mois == 2) && ((date.annee % 400 == 0 || date.annee % 4 == 0) && (date.annee % 100 != 0)))
        return date;
    else
    {
        printf("Votre date est invalide. Veuillez entrer une nouvelle date.\n");
        return LireDate();  // Appel recursif pour obtenir une date valide
    }
}

/// Fonction pour retourner les informations sur un etudiant
TEtud SaisieEtud(TEtud Etud)
{
    printf("Entrer les informations sur votre etudiant :\n");
    printf("Entrer le matricule :\n");
    scanf("%s", Etud.mat);
    fflush(stdin);

    /// boucle pour s'assurer que le caractere saisi est vraiment "F" ou "M"
    do
    {
        printf("Entrer le sexe (F ou M) :\n");
        scanf(" %c", &Etud.sexe);
        fflush(stdin);
    } while (Etud.sexe != 'F' && Etud.sexe != 'M');

    /// Appel de la fonction LireDate pour recuperer une date valide
    Etud.date = LireDate();

    /// boucle pour s'assurer que la moyenne n'est pas inferieure a 0
    do
    {
        printf("Entrer la moyenne :\n");
        scanf("%f", &Etud.moy);
    } while (Etud.moy < 0);

    return Etud;
}

/// 8) Fonction pour enregistrer les informations sur les matieres d'un etudiant
void SaisieMatEtud(Tmat e[], int taille)
{
    int i;
    printf("Entrer les informations sur les matieres :\n");
    for (i = 0; i < taille; ++i)
    {
        printf("Entrer les informations sur la matiere %d :\n", (i + 1));
        printf("Entrer le code :\n");
        scanf("%s", e[i].code);
        printf("Entrer le titre :\n");
        scanf("%s", e[i].titre);

        do
        {
            printf("Entrer le nombre de credits :\n");
            scanf("%d", &e[i].Ncredit);
        } while (e[i].Ncredit <= 0);

        do
        {
            printf("Entrer la note :\n");
            scanf("%f", &e[i].note);
        } while (e[i].note <= 0);
    }
    return;
}

/// 9) Programme pour enregistrer les informations sur tous les etudiants et leurs matieres
void SaisieTout()
{
    TEtudMat TListeEtud[N];
    int i;

    for (i = 0; i < N; i++)
    {
        TListeEtud[i].Etud = SaisieEtud(TListeEtud[i].Etud);
        SaisieMatEtud(TListeEtud[i].matiere, M);
    }
    return;
}

/// 10) Fonction pour calculer la moyenne d'un Etudiant
void Moyenetud(TEtudMat TListeEtud[], int taille)
{
    float sum = 0;
    int i, j;

    for (i = 0; i < taille; ++i)
    {
        for (j = 0; j < M; ++j)
        {
            sum = sum + TListeEtud[i].matiere[j].note;
        }
        TListeEtud[i].Etud.moy = (sum / M);
    }
    return;
}

Corrections

Pandacodeur langage c 01

Pandacodeur langage c 02

Pandacodeur langage c 03

Pandacodeur langage c 04

Pandacodeur langage c 05

Pandacodeur langage c 06

Pandacodeur langage c 07

Pandacodeur langage c 08

Pandacodeur langage c 09

Pandacodeur langage c 10

Pandacodeur langage c 11

  • 3 votes. Moyenne 4.4 sur 5.

Commentaires

  • Akim

    1 Akim Le 29/01/2021

    Merci de nous faire profiter de vos connaissances

Ajouter un commentaire

Anti-spam