add exam colin22
This commit is contained in:
parent
883f0bddf7
commit
da46906e65
|
@ -0,0 +1,227 @@
|
||||||
|
//Compl<70>tez le programme en respectant les consignes donn<6E>es en commentaires.
|
||||||
|
//Biblioth<74>ques (2 pts)
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <conio.h>
|
||||||
|
|
||||||
|
//D<>finition d'une constante N de valeur 10 (2 pts)
|
||||||
|
#define N 10
|
||||||
|
|
||||||
|
//Prototypes des fonctions d<>finies par apr<70>s (7 pts)
|
||||||
|
FILE* OuvrirFichier ();
|
||||||
|
void EncoderNomFichier (char[]);
|
||||||
|
char ChaineVersOctet (char[]);
|
||||||
|
void LireDonnees (FILE*, char[]);
|
||||||
|
void AfficherDonnees (char[]);
|
||||||
|
void CorrigerDonnee (char[], int);
|
||||||
|
int ParitePaire (char);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i, erreur=0;
|
||||||
|
//D<>claration d'un pointeur fichier permettant de manipuler un fichier, initialis<69>
|
||||||
|
//<2F> NULL (2 pts)
|
||||||
|
FILE* fichier = NULL;
|
||||||
|
|
||||||
|
//D<>claration d'un tableau tab de N <20>l<EFBFBD>ments de 8 bits (2 pts)
|
||||||
|
char tab[N];
|
||||||
|
|
||||||
|
//Le pointeur fichier prend la valeur retourn<72>e par OuvrirFichier (2 pts)
|
||||||
|
fichier = OuvrirFichier ();
|
||||||
|
|
||||||
|
//Si la valeur du pointeur fichier indique que le fichier a pu <20>tre ouvert (1 pt)
|
||||||
|
if (fichier != NULL)
|
||||||
|
{//Appel de la fonction LireDonnees (2 pts)
|
||||||
|
LireDonnees(fichier, tab);
|
||||||
|
|
||||||
|
//Fermeture du fichier (1 pt)
|
||||||
|
fclose (fichier);
|
||||||
|
|
||||||
|
printf("\nDonnees lues :");
|
||||||
|
//Affichage en binaire des N <20>l<EFBFBD>ments de tab (1 pt)
|
||||||
|
AfficherDonnees (tab);
|
||||||
|
|
||||||
|
for (i=0; i<N; i++)
|
||||||
|
{//Tant que ParitePaire retourne "faux" pour l<><6C>l<EFBFBD>ment i de tab (3 pts)
|
||||||
|
while (ParitePaire(tab[i] == 0))
|
||||||
|
|
||||||
|
{//Appel de la fonction CorrigerDonnee pour l<><6C>l<EFBFBD>ment i de tab (2 pts)
|
||||||
|
CorrigerDonnee(tab,i);
|
||||||
|
|
||||||
|
erreur++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Si erreur est "vrai" (1 pt)
|
||||||
|
if (erreur)
|
||||||
|
|
||||||
|
{printf("\nDonnees corrigees :");
|
||||||
|
//Affichage en binaire des N <20>l<EFBFBD>ments de tab (1 pt)
|
||||||
|
AfficherDonnees (tab);}
|
||||||
|
}
|
||||||
|
else printf("Au revoir!");
|
||||||
|
getch();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Type de valeur retourn<72>e par la fonction OuvrirFichier (1 pt)
|
||||||
|
FILE* OuvrirFichier()
|
||||||
|
{
|
||||||
|
int ouvrir = 1;
|
||||||
|
//D<>claration d'un caract<63>re reponse et d'une cha<68>ne nomfichier pouvant stocker
|
||||||
|
//un nom de 250 caract<63>res (2 pts)
|
||||||
|
char reponse;
|
||||||
|
char nomfichier[251];
|
||||||
|
|
||||||
|
//D<>claration d'un pointeur fichier permettant de manipuler un fichier (1 pt)
|
||||||
|
FILE* fichier;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
//Appel de la fonction EncoderNomFichier (1 pt)
|
||||||
|
EncoderNomFichier(nomfichier);
|
||||||
|
|
||||||
|
//Appel de la fonction d<>finie dans stdio.h permettant d'ouvrir en mode
|
||||||
|
//"lecture seule" le fichier texte dont le nom est enregistr<74> dans nomfichier
|
||||||
|
//et sauvegarde de la valeur renvoy<6F>e par cette fonction dans le pointeur
|
||||||
|
//fichier (4 pts)
|
||||||
|
fichier = fopen (nomfichier, "r");
|
||||||
|
|
||||||
|
//Si la valeur du pointeur fichier indique que le fichier n<>a pas pu <20>tre ouvert
|
||||||
|
//(1 pt)
|
||||||
|
if (fichier == NULL)
|
||||||
|
{
|
||||||
|
printf("Fichier introuvable");
|
||||||
|
printf("\nNouvel essai?(o/n) ");
|
||||||
|
//Vider la m<>moire clavier et saisir la reponse de l'utilisateur (3 pts)
|
||||||
|
fflush(stdin);
|
||||||
|
scanf ("%c", &reponse);
|
||||||
|
//Si la reponse n<>est ni o minuscule ni O majuscule, ouvrir prend la
|
||||||
|
//valeur "faux" (3 pts)
|
||||||
|
if (reponse !='o' && reponse !='O')
|
||||||
|
ouvrir = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}while (fichier == NULL && ouvrir==1);
|
||||||
|
//Tant que la valeur du pointeur fichier indique que le fichier n<>a pas pu <20>tre
|
||||||
|
//ouvert et que ouvrir est "vrai" (2 pts)
|
||||||
|
|
||||||
|
|
||||||
|
return fichier;
|
||||||
|
}
|
||||||
|
|
||||||
|
//La fonction EncoderNomFichier re<72>oit en argument une cha<68>ne de caract<63>res
|
||||||
|
//nomfichier. Elle ne retourne aucune valeur. (2 pts)
|
||||||
|
void EncoderNomFichier(char nomfichier [251])
|
||||||
|
{
|
||||||
|
printf("Nom complet du fichier (avec chemin d'acces):\n");
|
||||||
|
//Vider la m<>moire clavier et enregistrer le nom de fichier encod<6F>
|
||||||
|
//dans la cha<68>ne nomfichier (2 pts)
|
||||||
|
fflush (stdin);
|
||||||
|
gets (nomfichier);
|
||||||
|
}
|
||||||
|
|
||||||
|
//La fonction ChaineVersOctet re<72>oit en argument une cha<68>ne de caract<63>res chaine.
|
||||||
|
//Elle retourne une variable cod<6F>e sur un octet. (2 pts)
|
||||||
|
char ChaineVersOctet(char chaine[9])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
//D<>claration et initialisation des variables octet et masque (2 pts)
|
||||||
|
char octet = 0;
|
||||||
|
char masque = 1;
|
||||||
|
//Boucle pour parcourir tous les <20>l<EFBFBD>ments de l<>octet, du bit de poids faible au
|
||||||
|
//bit de poids fort (3 pts)
|
||||||
|
for (i=8; i>=0; i--)
|
||||||
|
{
|
||||||
|
//Si l<><6C>l<EFBFBD>ment i de chaine est le caract<63>re 1, positionner le bit
|
||||||
|
//correspondant de la variable octet <20> 1, sinon le laisser <20> 0. (4 pts)
|
||||||
|
if (chaine[i] == '1')
|
||||||
|
octet = octet|masque;
|
||||||
|
|
||||||
|
//D<>caler masque pour traiter le bit suivant (1 pt)
|
||||||
|
masque<<=1;
|
||||||
|
}
|
||||||
|
return octet;
|
||||||
|
}
|
||||||
|
|
||||||
|
//La fonction LireDonnees re<72>oit en arguments un pointeur fichier permettant
|
||||||
|
//de manipuler un fichier et un tableau tab dont chaque <20>l<EFBFBD>ment est une donn<6E>e
|
||||||
|
//cod<6F>e sur 8 bits. Elle ne retourne aucune valeur. (3 pts)
|
||||||
|
void LireDonnees (FILE*fichier, char tab[N])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char donnee[9];
|
||||||
|
for(i=0; i<N; i++)
|
||||||
|
{
|
||||||
|
//Lecture d<>une cha<68>ne de caract<63>res dans le fichier et enregistrement
|
||||||
|
//dans donnee. On suppose que le fichier ne comporte que des mots de 8 caract<63>res
|
||||||
|
//0 ou 1 repr<70>sentant des octets binaires. (2 pts)
|
||||||
|
fflush (stdin);
|
||||||
|
fscanf (fichier, "%s", donnee);
|
||||||
|
//Assignation <20> l<><6C>l<EFBFBD>ment i de tab de la valeur convertie en octet de la donnee
|
||||||
|
//lue (2 pts)
|
||||||
|
tab[i] = ChaineVersOctet(donnee);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//La fonction AfficherDonnees re<72>oit en argument un tableau tab dont chaque <20>l<EFBFBD>ment
|
||||||
|
//est une donn<6E>e cod<6F>e sur 8 bits. Elle ne retourne aucune valeur. (2 pts)
|
||||||
|
void AfficherDonnees(char tab[])
|
||||||
|
{//D<>claration et <20>ventuellement initialisation des variables locales (3 pts)
|
||||||
|
int i, j, m = 1;
|
||||||
|
char b[10];
|
||||||
|
for(i=0; i<N; i++)
|
||||||
|
{
|
||||||
|
printf("\n%2d) ",i+1);
|
||||||
|
//Affichage en binaire de l<><6C>l<EFBFBD>ment i de tab (6 pts)
|
||||||
|
for (j=8; j>=0; j--)
|
||||||
|
{
|
||||||
|
if (tab[i] & m)
|
||||||
|
b[j]='1';
|
||||||
|
else b[j]='0';
|
||||||
|
m<<=1;
|
||||||
|
}
|
||||||
|
b[9]='\0';
|
||||||
|
printf ("%s", b);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//La fonction CorrigerDonnee re<72>oit en arguments un tableau tab dont chaque <20>l<EFBFBD>ment
|
||||||
|
//est une donn<6E>e cod<6F>e sur 8 bits et un entier i. Elle ne retourne aucune valeur.
|
||||||
|
//(3 pts)
|
||||||
|
void CorrigerDonnee(char tab[N], int i)
|
||||||
|
{
|
||||||
|
char donnee[9];
|
||||||
|
printf("\nLa donnee %d est erronnee; veuillez la reencoder:", i+1);
|
||||||
|
//Vider la m<>moire clavier et saisir la valeur de donnee.(3 pts)
|
||||||
|
fflush (stdin);
|
||||||
|
gets(donnee);
|
||||||
|
|
||||||
|
//Remplacer l<><6C>l<EFBFBD>ment i de tab par la donnee r<>encod<6F>e convertie en octet. (2 pts)
|
||||||
|
tab[i] = ChaineVersOctet(donnee);
|
||||||
|
}
|
||||||
|
|
||||||
|
//La fonction ParitePaire re<72>oit un argument octet cod<6F> sur 8 bits. Elle retourne
|
||||||
|
//"vrai" ou "faux". (2 pts)
|
||||||
|
int ParitePaire (char octet)
|
||||||
|
{//D<>claration et <20>ventuellement initialisation des variables locales (3 pts)
|
||||||
|
int i, compteur = 0, masque = 1;
|
||||||
|
|
||||||
|
for (i=0; i<8; i++)
|
||||||
|
{//Si le bit i de l<>argument octet vaut 1, incr<63>menter la variable compteur
|
||||||
|
//d<>une unit<69> (3 pts)
|
||||||
|
if (octet & masque)
|
||||||
|
compteur++;
|
||||||
|
//D<>caler masque pour traiter le bit suivant (1 pt)
|
||||||
|
masque <<= 1;
|
||||||
|
}
|
||||||
|
//Si compteur est impair retourner "faux", sinon retourner "vrai" (2 pts)
|
||||||
|
if (compteur %2 == 1)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
Loading…
Reference in New Issue