/* CS 203. Correction de la feuille 3 */
/* Les fichiers departements.txt et communes.txt doivent etre dans le repertoire courant */
/* ces fichiers peuvent etre telechargest sur le site web du CS203 */
/* Credit : certains des programmes presentes ici ont ete realises par Pierre Cohort */
#include <stdio.h>
/* exercice 1 */
/* commentaire : il faut passer l'adresse de lamdba et mu pour que la fonction
puisse modifier effectivement ces variables. */
void LameLambdaMu(double Young, double Poisson, double* Lambda, double* Mu)
{
*Lambda=Young*Poisson/((1.+Poisson)*(1.-2.*Poisson));
*Mu=Young/(2.*(1.+Poisson));
}
/* exercice 2 */
int exercice2()
{
int i;
int a;
int *tab;
int *b;
tab=(int*)malloc(10*sizeof(int));
a=1;
for(i=0;i<10;i++)
tab[i]=a*i;
/* le contenu du tableau tab est 0 1 2 3 4 5 6 7 8 9 */
a++;
/* La commande a++; n'affecte pas le tableau, en revanche la variable a
contient desormais 2. */
for(i=0;i<9;i++)
tab[i]=tab[i+1];
/* le contenu du tableau tab est 1 2 3 4 5 6 7 8 9 9.
A la ligne suivante b pointe sur la deuxieme case du tableau. */
b=&(tab[1]);
*b=--a;
/* La commande *b=--a; est une affectation a ce qui est pointe
par b, donc une affectation a la la deuxieme case du
tableau. La valeur affectee est a decrementee de 1, soit
2-1=1. Le tableau tab devient 1 1 3 4 5 6 7 8 9 9. */
for(i=0;i<10;i++)
printf("%d\n",tab[i]);
/* affiche les cases du tableau en colonne, en passant a la
ligne apres chaque case. */
return(0);
}
/* exercice 3 */
/* question 3.1 */
int exercice3_question1()
{
int x;
int *y;
int **z;
x=1;
y=&x; // y pointe vers x
z=(int**)malloc(2*sizeof(int*));
z[0]=y; // Le premiere case du tableau z pointe vers un pointeur vers x
x=2; // maintenant x vaut 2 donc *y=2 et x[0] pointe vers un pointeur vers 2
z[1]=y; // // La deuxieme case du tableau z pointe vers un pointeur vers x
printf("%d %d\n",*(z[0]),*(z[1])); // Affichage de x deux fois soit 2 et 2
return(0);
}
/* question 3.2 */
int exercice3_question2()
{
int x, y;
int *T;
x=1;
y=2;
T=(int*)malloc(2*sizeof(int));
T[0]=++x; // La premiere case de T recoit 2 car x est incremente avant l'affectation
T[1]=y; // La deuxieme case de T recoit 2
x+=5; // les modifications sur x et y n'affecteront pas T
y--;
printf("%d %d\n",T[0],T[1]); // Affichage de 2 et 2
return(0);
}
/* exercice 4 */
/* On reprend les fonctions de la feuille d'exercices precedente */
int clef (long int N1, long int N2)
/*
Calcul de la clef d'un numero de securite sociale
ENTREE : N1 les 7 premiers chiffres du numero SS
N2 les 6 derniers chiffres du numero SS
SORTIE : clef du numero SS
Cette fonction utilise la formule etablie dans la question 1
*/
{
int R0, R1, R2;
R1=N1%97;
R2=N2%97;
R0=(27*N1+N2)%97;
/*
R0 est le reste de la division du numero SS par 97
Pour que la somme du numero SS et de la clef soit divisible par 97
il suffit que la clef soit 97-R0. Si R0=97 alors on pose R0=0
pour que la clef soit 97.
*/
if (R0==97) R0=0;
return(97-R0);
}
/* On ajoute ces deux fonctions */
void AfficherDepartement(int n)
// Arguments : le departement n
// Affiche le nom de la ville
{
FILE* dept=NULL;
int trouve=0;
int numero;
char nom[40], resultat[40];
dept=fopen("departements.txt","r");
if (dept==NULL){ error(1); } /* arret si probleme d'ouverture du fichier */
while (!feof(dept)) {
fscanf(dept,"%d,%s\n",&numero,nom);
if (numero==n) {
trouve=1;
strcpy(resultat,nom);
}
}
fclose(dept); /* fermeture du fichier */
if (trouve==1)
printf("Departement de naissance :\t%s\n",resultat);
else printf("Departement de naissance inconnu\n");
}
void AfficherVille(int d, int v)
// Arguments : le departement d et la ville v
// Affiche le nom de la ville
{
FILE* villes=NULL;
int trouve=0;
int numerodept, numeroville;
char nom[80], resultat[80];
villes=fopen("communes.txt","r");
if (villes==NULL){ error(1); } /* arret si probleme d'ouverture du fichier */
while (!feof(villes)) {
fscanf(villes,"%d,%d,%s\n",&numerodept,&numeroville,nom);
if ((numerodept==d)&&(numeroville==v)) {
trouve=1;
strcpy(resultat,nom);
}
}
fclose(villes); /* fermeture du fichier */
if (trouve==1)
printf("Ville de naissance :\t\t%s\n",resultat);
else printf("Ville de naissance inconnue\n");
}
int exercice4()
{
int groupe1, groupe2, groupe3, groupe4, groupe5, groupe6;
long int N1, N2;
printf("Entrez le numero de securite sociale en separant les 6 groupes par un espace.\n");
scanf("%d %d %d %d %d %d",&groupe1,&groupe2,&groupe3,&groupe4,&groupe5,&groupe6);
// N1 comprend les 7 premiers chiffres et N2 les 6 deriniers
N1=groupe4+100*groupe3+10000*groupe2+1000000*groupe1;
N2=groupe6+groupe5*1000;
// Affichage de la clef
printf("Clef : \t\t\t\t%d\n",clef(N1,N2));
// Affichage homme/femme
if ((groupe1==1)||(groupe1==7))
printf("Sexe : \t\t\t\tHomme\n");
else
printf("Sexe : \t\t\t\tFemme\n");
// Affichage du lieu de naissance
if (groupe4==99)
printf("Ne a l'etranger\n");
else {
AfficherVille(groupe4,groupe5);
AfficherDepartement(groupe4);
}
}
int main()
{
printf("Exercice 1\n");
{
double E=1.,nu=0.7,lambda,mu;
LameLambdaMu(E,nu,&lambda,&mu);
printf("Lamdba=%f Mu=%f\n",lambda,mu);
}
printf("\n\n\n");
printf("Exercice 2\n");
exercice2();
printf("\n\n\n");
printf("Exercice 3\n");
exercice3_question1();
exercice3_question2();
printf("\n\n\n");
printf("Exercice 4\n");
exercice4();
printf("\n\n\n");
return 0;
}