EXAMEN LANGAGE C ( PROGRAMMATION C ) TEST  10 /XX 2023

EXAMEN + CORRIGE EN LANGAGE C

Examinateur : Mr Joël Yk

Exercice 01 : Question de Cours (5pts)

1) Quelles sont les valeurs des expressions suivantes, pour int i=1,j=4; ?
a) (float)i/j
b) (float)(i/j)
c) (float)i/(float)j
2) Qu'affiche le programme suivant ?
#include<stdio.h>
int main()
{
int n=3;
n++;
if (n > 3) {
printf("n=%d\n", --n);
} else {
printf("n-2=%d\n", n-2);
}
return 0;
}
3) Soient les déclarations suivantes :
int n = 5, p = 9 ;
int q ;
float x ;
Quelle est la valeur affectée aux différentes variables concernées par chacune des instructions
suivantes ?
a) q = n<p ;
b) q = n == p ;
c) q = p % n + p>n ;
d) x = p / n ;
e) x = (p + 0.5)/n ;
f) x = (int)(p + 0.5)/n ;
g) q = n *(p>n?n:p) ;

4)Chercher dans le programme C suivant les erreurs qui peuvent causer son disfonctionnement, et proposer une correction :
#include<studio.h>
#define PI=3.14
int main()
{
Float rayon,Périm,long;
printf("Donner le rayon du cercle:");
do
{
scanf("%f,&rayon");
printf("Donner PI:");
}while(PI!=3.14)
scanf("%f,&PI");
//calcul du diamètre de cercle
long=2*rayon;
//calcul du périmetre
Périm=long*PI;
printf("Diamètre=",long,"\n Périmetre=", Périm);
switch(Périm)
{
case 50: printf ("Cercle 50"); break;
case 100: printf ("Cercle 100");
default: printf ("Autre cercle");
}
return 0; }

5) Soit le programme C suivant :
#include <stdio.h>
void Aire(float A, float B, float C)
{
C = A * B;
}
void main()
{ float Large=10, Longueur=20, P=0;
Aire(Large, Longueur, P);
Printf(«Le périmètre du rectangle est %f » ,P) ;
}
1. Donnez les valeurs des variables Large, Longueur et P en sortie.
2. Quelles modifications doit-on apporter à la fonction et au programme principal pour qu’après l’appel de la fonction Aire, la variable P contient l’aire du rectangl

Exercice 02 : Ecriture d'un Programme C  5pts (1.5+2+1.5)

A) Soit la suite numérique définie comme suit:
U0=1
Un=2*Un-1
 Ecrire un unique programme C qui réalise les traitements suivants:

1. Pour un entier n donné strictement positif (gerer le cas ou l'utilisateur ne devra pas entrer de nombre negatif), calculer et afficher le nème terme de cette suite.

2. Calculer la valeur n du premier terme Un tel que pour un entier p donné Un<= p <Un+1 (la valeur de p est entrée au clavier avec p>0). Par exemple : pour p = 5, U2 = 4 et U3 = 8 donc n = 2.

 

B) Ecrire un programme C qui permet de saisir N éléments d’un tableau T d'entiers (au maximum 50) et d’une matrice M a deux dimensions LxC (dimensions maximales: 10 lignes et 10 colonnes) et d’afficher si tous les éléments du tableau T figurent dans la matrice M ou non.

 

Langage c pandacodeurC)Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et qui vérifie l'existence de la chaine CH2 dans CH1.
Exemples:

- CH1="PandaCodeur " CH2="cod" ==> CH2 est une sous chaine de CH1
- CH1="Genius" CH2="G" ==> CH2 est une sous chaine de CH1

- CH1="abacab"
CH2="aa" ==> CH2 n'existe pas dans CH1

Problème :  10pts (1+1+1+1+1+1+1+3)

Mr Joël souhaite modéliser des opérations permettant de gérer les articles dans un stock de magasin (GeniusStock) à l'aide de tableaux à une dimension. On considère pour cela un tableau TabArt de chaînes de caractères où les éléments représentent les codes des articles (10 caractères maximum), un tableau TabStock d’entiers représentant la quantité en stock de chaque article, et un tableau TabPrix de réels représentant les prix des articles. Ainsi, un élément à l’indice i du tableau TabStock représente la quantité en stock de l’article de la case i du tableau TabArt et qui a comme prix la case i du tableau TabPrix.
On suppose que les tableaux ont une capacité maximale définie par une constante max donnée (max =100).
1. Ecrire une fonction void LireArticles (char TabArt [max][10],int TabStock[],float TabPrix, int N) permettant de remplir un tableau de chaînes de caractères TabArt de N articles, ainsi que les tableaux TabStock et TabPrix (pour chaque article lire son code, sa quantité en stock et son prix).
2. Ecrire une fonction void AfficherArticles (char TabArt[max][10], int TabStock[], float TabPrix[], int N) permettant d’afficher la liste des articles avec leurs quantités en stock et leurs prix.
3. Ecrire une fonction int QuantitéStock(char TabArt[max][10], int TabStock[], char codeart[], int N) permettant de rechercher la quantité en stock d’un article donné (codeart) et retourne sa quantité en stock s’il existe et -1 sinon.
4. Créer une procédure void AjouterArticle (char TabArt[max][10], int Tabstock[], float TabPrix[], char codeart[], int qs, float px, int *N) permettant d’ajouter un article (codeart). Cette opération consiste à ajouter le code de l’article codeart à la fin du tableau TabArt, la quantité en stock qs dans le tableau TabStock et le prix px dans le tableau TabPrix.
5. Ecrire une fonction void ApprovisionnerStock(char TabArt[max][10], int TabStock[], char codeart[], int qs, int N) permettant d’approvisionner le stock d’un article en ajoutant une quantité donnée au stock existant. Cette fonction effectue une recherche de code de l’article dans le tableau TabArt, s’il existe alors elle ajoute la quantité qs au stock correspondant dans le tableau TabStock, s’il n’existe pas elle affiche un
message d’erreur.

6. Ecrire une fonction void MaxPrix(char TabArt[max][10], float TabPrix[],int N) qui permet d’afficher le code et le prix de l’article le plus cher.
7. Ecrire une fonction void SupprimerArticle (char TabArt[max][10], int TabStock[], float TabPrix[], char code[], int *N) permettant de supprimer un article stocké dans le tableau TabArt en fournissant code. Sa suppression entraine la suppression de sa quantité en stock dans le tableau TabStock et de son prix du tableau TabPrix.
8. Ecrire un programme principale main() qui permet de :

a) Remplir les tableaux TabArt, TabPrix et TabStock.
b) Mettre à jour le stock d’un article donné par son code CD1 avec la quantité en stock QT1 donnée.
c) Ajouter un article dont le code CD2, la quantité QT2 et le prix PX sont données par l’utilisateur.
d) Supprimer les articles dont la quantité en stock est égale à 0.
e) Afficher tous les articles (code, prix et quantité)

 

 

 

 

 

Correction :

Exercice 01 : Question de Cours (5pts)

1) a) (float)i/j = 1/4 = 0.25

b) (float)(i/j) = (float)(1/4) = 0

c) (float)i/(float)j = (float)1/(float)4 = 0.25

--------

2) Le programme affichera : n=4

--------------

3) a) q = n<p ; q vaudra 1 car n est bien inférieur à p

b) q = n == p ; q vaudra 0 car n n'est pas égal à p

c) q = p % n + p>n ; q vaudra 1 car le reste de la division de p par n est 9%5 = 4 et 9 est bien supérieur à n

d) x = p / n ; x vaudra 1.8

e) x = (p + 0.5)/n ; x vaudra 1.9

f) x = (int)(p + 0.5)/n ; x vaudra 1 car le résultat de (int)(p + 0.5) sera converti en entier avant la division

g) q = n *(p>n?n:p) ; q vaudra 45 car (p>n?n:p) vaudra 9 et n * 9 = 45

----------------------

4) Les erreurs dans le programme sont :

  • Dans l'en-tête du fichier, l'orthographe de "stdio.h" est incorrecte. Il faut écrire "stdio.h" au lieu de "studio.h".
  • La constante PI est définie incorrectement avec le signe d'égalité = au lieu de l'opérateur de définition #define. Il faut écrire : #define PI 3.14
  • Dans la déclaration de la variable "long", le nom est réservé par le compilateur et ne peut pas être utilisé. Il faut utiliser un autre nom, comme "diametre".
  • Dans la déclaration des variables "Périm" et "rayon", les accents sont incorrects et ne seront pas reconnus par le compilateur. Il faut écrire "Perim" et "rayon".
  • Dans la commande scanf pour lire "rayon", il y a une erreur de syntaxe en ce qui concerne le format du paramètre. Il manque une fermeture de guillemets et il y a une virgule au lieu d'un point-virgule. Il faut écrire : scanf("%f", &rayon);
  • Dans la boucle while, l'opérateur de comparaison "!=" est utilisé pour vérifier si PI est égal à 3.14, mais il n'y a pas de moyen de changer la valeur de PI dans la boucle pour qu'elle sorte. La boucle sera donc infinie. Pour résoudre ce problème, il faut enlever la boucle.

Correction :

#include <stdio.h>

#define PI 3.14

int main() {

float rayon, Périm, longueur;

printf("Donner le rayon du cercle :");

scanf("%f", &rayon);

do {

printf("Donner PI :");

scanf("%f", &PI);

} while (PI != 3.14);

//calcul du diamètre de cercle

longueur = 2 * rayon;

//calcul du périmetre

Périm = longueur * PI;

printf("Diametre = %f\nPérimetre = %f", longueur, Périm);

switch (Périm) {

case 50: printf("Cercle 50"); break;

case 100: printf("Cercle 100"); break;

default: printf("Autre cercle");

}

return 0; }

------------------

5) ---------------

5-1) Large = 10, Longueur = 20, P = 0

5-2) Pour que P contienne l'aire du rectangle après l'appel de la fonction Aire, il faut faire les modifications suivantes :

Modifier le nom de la fonction Aire en "Aire_Rectangle" et le retour de la fonction en void à float.

Ajouter un argument pour stocker le résultat de la fonction.

Dans la fonction Aire_Rectangle, il faut changer la ligne C = A * B; en *C = A * B; pour stocker le résultat dans la variable P.

Dans le programme principal, il faut changer l'appel de la fonction en Aire_Rectangle(Large, Longueur, &P); pour passer la référence de P.

Modifier le printf en printf("L'aire du rectangle est %f\n", P);

Voici le code modifié :

#include <stdio.h>

float Aire_Rectangle(float A, float B) {

return A * B;

}

void main() {

float Large = 10, Longueur = 20, P = 0;

P = Aire_Rectangle(Large, Longueur);

printf("L'aire du rectangle est %f\n", P);

}

Exercice 02 : Ecriture d'un Programme C  5pts (1.5+2+1.5)

A)---------------

#include <stdio.h>
#include <math.h>

int main() {
  int n, p, i;
  long long u_n;

  // Demande à l'utilisateur de saisir un entier strictement positif pour n
  do {
    printf("Entrez un entier strictement positif pour n: ");
    scanf("%d", &n);
  } while (n <= 0);

  // Demande à l'utilisateur de saisir un entier strictement positif pour p
  do {
    printf("Entrez un entier strictement positif pour p: ");
    scanf("%d", &p);
  } while (p <= 0);

  // Calcul et affichage du nème terme de la suite
  u_n = pow(2, n - 1);
  printf("Le nème terme de la suite est: %lld\n", u_n);

  // Recherche de la valeur de n tel que Un <= p < Un+1
  for (i = n; i >= 1; i--) {
    if (p >= pow(2, i - 1) && p < pow(2, i)) {
      printf("La valeur de n est: %d\n", i);
      break;
    }
  }

  return 0;
}

Dans ce programme, nous utilisons une boucle do-while pour demander à l'utilisateur de saisir les valeurs de n et p jusqu'à ce qu'il saisisse des valeurs strictement positives. Ensuite, nous utilisons la fonction pow de la bibliothèque math.h pour calculer la valeur du nème terme de la suite et nous utilisons une boucle for pour trouver la valeur de n en comparant la valeur de p avec les termes successifs de la suite.

U0=1 Un=2*Un-1 Ecrire un unique programme C qui réalise les traitements suivants: 1. Pour un entier n donné strictement positif (gerer le cas ou l'utilisateur ne devra pas entrer de nombre negatif), calculer et afficher le nème terme de cette suite. 2. Calculer la valeur n du premier terme Un tel que pour un entier p donné Un<= p <Un+1 (la valeur de p est entrée au clavier avec p>0). Par exemple : pour p = 5, U2 = 4 et U3 = 8 donc n = 2

--------------------.

B)

#include <stdio.h>
#include <stdbool.h>

#define MAX_N 50
#define MAX_L 10
#define MAX_C 10

int main(void) {
  int n, l, c, t[MAX_N], m[MAX_L][MAX_C];
  bool found;

  printf("Saisir le nombre d'éléments du tableau T: ");
  scanf("%d", &n);

  printf("Saisir les %d éléments du tableau T: ", n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &t[i]);
  }

  printf("Saisir les dimensions de la matrice M (lignes puis colonnes): ");
  scanf("%d%d", &l, &c);

  printf("Saisir les éléments de la matrice M: \n");
  for (int i = 0; i < l; i++) {
    for (int j = 0; j < c; j++) {
      scanf("%d", &m[i][j]);
    }
  }

  for (int i = 0; i < n; i++) {
    found = false;
    for (int j = 0; j < l && !found; j++) {
      for (int k = 0; k < c && !found; k++) {
        if (t[i] == m[j][k]) {
          found = true;
        }
      }
    }
    if (!found) {
      printf("L'élément %d du tableau T n'a pas été trouvé dans la matrice M.\n", t[i]);
      return 0;
    }
  }

  printf("Tous les éléments du tableau T figurent dans la matrice M.\n");
  return 0;
}

Ce programme utilise un algorithme de boucle double pour parcourir les éléments du tableau t et rechercher leur occurrence dans la matrice m. Si un élément du tableau n'est pas trouvé dans la matrice, le programme affiche un message d'erreur et se termine immédiatement. Sinon, le programme affiche un message indiquant que tous les éléments du tableau figurent dans la matrice.

-----------------

C)

#include <stdio.h>
#include <string.h>

int main() {
    char CH1[100], CH2[100];
    int i, j, flag = 0;

    printf("Entrer la première chaîne CH1: ");
    scanf("%s", CH1);

    printf("Entrer la seconde chaîne CH2: ");
    scanf("%s", CH2);

    int l1 = strlen(CH1);
    int l2 = strlen(CH2);

    for (i = 0; i <= l1 - l2; i++) {
        for (j = i; j < i + l2; j++) {
            flag = 1;
            if (CH1[j] != CH2[j - i]) {
                flag = 0;
                break;
            }
        }
        if (flag == 1) break;
    }
    if (flag == 1) {
        printf("CH2 est une sous-chaîne de CH1\n");
    } else {
        printf("CH2 n'existe pas dans CH1\n");
    }
    return 0;
}

PROBLEME :

#include <stdio.h>
#include <string.h>

#define max 100

1) void LireArticles(char TabArt[max][10], int TabStock[], float TabPrix[], int N)
{
    int i;
    for (i = 0; i < N; i++)
    {
        printf("Entrer le code de l'article %d: ", i + 1);
        scanf("%s", TabArt[i]);
        printf("Entrer la quantité en stock de l'article %d: ", i + 1);
        scanf("%d", &TabStock[i]);
        printf("Entrer le prix de l'article %d: ", i + 1);
        scanf("%f", &TabPrix[i]);
    }
}

2)void AfficherArticles(char TabArt[max][10], int TabStock[], float TabPrix[], int N)
{
    int i;
    printf("Liste des articles:\n");
    printf("Code\tQuantité en stock\tPrix\n");
    for (i = 0; i < N; i++)
    {
        printf("%s\t%d\t\t\t%.2f\n", TabArt[i], TabStock[i], TabPrix[i]);
    }
}

3)int QuantitéStock(char TabArt[max][10], int TabStock[], char codeart[], int N)
{
    int i;
    for (i = 0; i < N; i++)
    {
        if (strcmp(TabArt[i], codeart) == 0)
        {
            return TabStock[i];
        }
    }
    return -1;
}

4)void AjouterArticle(char TabArt[max][10], int TabStock[], float TabPrix[], char codeart[], int qs, float px, int *N)
{
    strcpy(TabArt[*N], codeart);
    TabStock[*N] = qs;
    TabPrix[*N] = px;
    (*N)++;
}

5)

void ApprovisionnerStock(char TabArt[max][10], int TabStock[], char codeart[], int qs, int N)
{
    int i, stock;
    for (i=0; i<N; i++)
    {
        if (strcmp(TabArt[i], codeart) == 0)
        {
            TabStock[i] += qs;
            return;
        }
    }
    printf("Article non trouvé\n");
}

6)

void MaxPrix(char TabArt[max][10], float TabPrix[], int N) {
  int i;
  int indice = 0;
  float maxPrix = TabPrix[0];

  for (i = 1; i < N; i++) {
    if (TabPrix[i] > maxPrix) {
      maxPrix = TabPrix[i];
      indice = i;
    }
  }

  printf("Code de l'article le plus cher: %s\n", TabArt[indice]);
  printf("Prix de l'article le plus cher: %.2f\n", maxPrix);
}

7) void SupprimerArticle(char TabArt[max][10], int TabStock[], float TabPrix[], char code[], int *N) {
  int i, j;
  int trouve = 0;

  for (i = 0; i < *N; i++) {
    if (strcmp(TabArt[i], code) == 0) {
      trouve = 1;
      for (j = i; j < (*N) - 1; j++) {
        strcpy(TabArt[j], TabArt[j + 1]);
        TabStock[j] = TabStock[j + 1];
        TabPrix[j] = TabPrix[j + 1];
      }
      (*N)--;
      break;
    }
  }

  if (!trouve) {
    printf("Article avec code %s introuvable\n", code);
  }
}

8)------------

#include <stdio.h>
#include <string.h>

#define max 100

void LireArticles(char TabArt[max][10], int TabStock[], float TabPrix[], int N);
void AfficherArticles(char TabArt[max][10], int TabStock[], float TabPrix[], int N);
int QuantitéStock(char TabArt[max][10], int TabStock[], char codeart[], int N);
void AjouterArticle(char TabArt[max][10], int TabStock[], float TabPrix[], char codeart[], int qs, float px, int *N);
void ApprovisionnerStock(char TabArt[max][10], int TabStock[], char codeart[], int qs, int N);
void MaxPrix(char TabArt[max][10], float TabPrix[], int N);
void SupprimerArticle(char TabArt[max][10], int TabStock[], float TabPrix[], char code[], int *N);

int main()
{
    char TabArt[max][10];
    int TabStock[max];
    float TabPrix[max];
    char codeart[10], code[10];
    int N, qs, QT1, QT2;
    float px, PX;

    printf("Entrer le nombre d'articles: ");
    scanf("%d", &N);

    LireArticles(TabArt, TabStock, TabPrix, N);

    printf("\nEntrer le code de l'article a approvisionner: ");
    scanf("%s", codeart);
    printf("Entrer la quantité ajoutée: ");
    scanf("%d", &QT1);
    ApprovisionnerStock(TabArt, TabStock, codeart, QT1, N);

    printf("\nEntrer le code de l'article à ajouter: ");
    scanf("%s", code);
    printf("Entrer la quantité en stock de l'article: ");
    scanf("%d", &QT2);
    printf("Entrer le prix de l'article: ");
    scanf("%f", &PX);
    AjouterArticle(TabArt, TabStock, TabPrix, code, QT2, PX, &N);

    for (int i = 0; i < N; i++) {
        if (TabStock[i] == 0) {
            SupprimerArticle(TabArt, TabStock, TabPrix, TabArt[i], &N);
        }
    }

    printf("\n");
    AfficherArticles(TabArt, TabStock, TabPrix, N);

    return 0;
}

 

  • 2 votes. Moyenne 3 sur 5.

Ajouter un commentaire

Anti-spam