Programmation C
Préprocesseur - Correction des exercices
Cours Exercices Correction des exercices

Exercice 1 Exercice 2 Exercice 3 Exercice 4
Exercice 5 Exercice 6 Exercice 7 Exercice 8

Exercice 1

#include <stdio.h>

#define NOMBRE_AVROGADRO 6.02214076E+23
#define SHORT_MAX 0x7FFF
#define RAISON_SOCIALE "Microsoft Corp." 

int main(void) {
  printf("%lf\n", NOMBRE_AVROGADRO);
  printf("%e\n", NOMBRE_AVROGADRO);
  printf("\n");
  printf("%d\n", SHORT_MAX);
  printf("%x\n", SHORT_MAX);
  printf("%X\n", SHORT_MAX);
  printf("\n");
  printf("%s\n", RAISON_SOCIALE);
  printf("%p\n", RAISON_SOCIALE);
  return 0;
}

08-Exercice1.c - 08-Exercice1.exe
***
  • RAS

Exercice 2

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

#if defined(WINDOWS)

struct nomAbsoluFichierWindows {
  char lettreUnite;
  char** repertoires;
  int nbRepertoires;
  char* nom;
  char* extension;
};

typedef struct nomAbsoluFichierWindows nomAbsoluFichier;

#else

struct nomAbsoluFichierUnix {
  char** repertoires;
  int nbRepertoires;
  char* nom;
  char* extension;
};

typedef struct nomAbsoluFichierUnix nomAbsoluFichier;

#endif

int calculerNombreCaracteres(nomAbsoluFichier naf) {
#ifdef WINDOWS
  size_t nb = 3;
#else
  size_t nb = 1;
#endif
  for (int i = 0; i < naf.nbRepertoires; i++) {
    nb += strlen(naf.repertoires[i]);
  }
  nb += naf.nbRepertoires;
  nb += strlen(naf.nom);
  if ((naf.extension != NULL) && (strlen(naf.extension) > 0)) {
    nb += 1 + strlen(naf.extension);
  }
  printf("%zu\n", nb);
  return (int) nb;
}

bool creerChaineNomAbsolu(nomAbsoluFichier naf, char* dst, int lMax) {
#ifdef WINDOWS
  char* separateur = "\\";
#else
  char* separateur = "/";
#endif
  dst[0] = 0x00;
  if (calculerNombreCaracteres(naf) >= lMax) {
    return false;
  }
#ifdef WINDOWS
  dst[0] = naf.lettreUnite;
  strcpy(&dst[1], ":");
#endif
  strcat(dst, separateur);
  for (int i = 0; i < naf.nbRepertoires; i++) {
    strcat(dst, naf.repertoires[i]);
    strcat(dst, separateur);
  }
  strcat(dst, naf.nom);
  if ((naf.extension != NULL) && (strlen(naf.extension) > 0)) {
    strcat(dst,".");
    strcat(dst,naf.extension);
  }
  return true;
}

int main(void) {
#ifdef WINDOWS
  char* rprts[2] = { "Users","Dupont" };
  nomAbsoluFichier naf = { 'C',rprts,2,"Exemple","txt" };
#else
  char* rprts[2] = { "home","dupont" };
  nomAbsoluFichier naf = { rprts,2,"exemple","txt" };
#endif
  char filename[512];
  if (creerChaineNomAbsolu(naf, filename, 10)) {
    printf("%s\n", filename);
    printf("%zu\n", strlen(filename));
  }
  else {
    printf("Creation impossible, tableau trop petit\n");
  }
  return 0;
}

08-Exercice2.c - 08-Exercice2.exe
***
  • RAS

Exercice 3

#include <stdio.h>

#define MOYENNE(A,B,C) (A+B+C)/3.0
#define ORDONNANCEMENT(TYPE,A,B) if (A>B) { TYPE aux = A ; A = B ; B = aux; }

int main(void) {
  printf("%lf\n", MOYENNE(2, 6, 9));
  printf("%lf\n", MOYENNE(2.1, 6.3, 9.4));
  printf("%lf\n", MOYENNE('2', '6', '9'));
  int v1 = 10;
  int v2 = 4;
  printf("%d %d\n", v1, v2);
  ORDONNANCEMENT(int, v1, v2);
  printf("%d %d\n", v1, v2);
  double d1 = 10.2;
  double d2 = 6.44;
  printf("%lf %lf\n", d1, d2);
  ORDONNANCEMENT(double, d1, d2);
  printf("%lf %lf\n", d1, d2);
  return 0;
}

08-Exercice3.c - 08-Exercice3.exe
***
  • RAS

Exercice 4

08-Exercice4.c - 08-Exercice4.exe
***
  • RAS

Exercice 5

08-Exercice5.c - 08-Exercice5.exe
***
  • RAS

Exercice 6

08-Exercice6.c - 08-Exercice6.exe
***
  • RAS

Exercice 7

08-Exercice7.c - 08-Exercice7.exe
***
  • RAS

Exercice 8

08-Exercice8.c - 08-Exercice8.exe
***
  • RAS