Académique Documents
Professionnel Documents
Culture Documents
Programmation
17 novembre 2021
2021-22 Algorithmique et Programmation
1 Débuter en Langage C 7
1.1 Préparation de l'environnement de travail . . . . . . . . . . . . . . . . . . 7
1.2 Premier programme élémentaire . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 Rappel sur le processus de compilation . . . . . . . . . . . . . . . 8
1.2.2 Édition de la source . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.3 Compilation du chier source . . . . . . . . . . . . . . . . . . . . 9
1.2.4 Ajout d'un chier d'en-tête et d'une macro . . . . . . . . . . . . . 9
1.2.5 Recompiler le programme . . . . . . . . . . . . . . . . . . . . . . 10
1.3 Hello world ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 La structure des chiers du programme . . . . . . . . . . . . . . . 10
1.3.2 Les diérentes sources . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.3 La compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.1 Structures de contrôle de type sélection . . . . . . . . . . . . . . . 13
1.4.2 Structures de contrôle de type itératif . . . . . . . . . . . . . . . . 14
1.5 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.1 Tableaux à une dimension . . . . . . . . . . . . . . . . . . . . . . 14
1.5.2 Tableaux à 2 dimensions . . . . . . . . . . . . . . . . . . . . . . . 15
2 Fonctions 17
2.1 Première partie : Modularisation du TP1 . . . . . . . . . . . . . . . . . . 17
2.2 Deuxième partie : les Caractères . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.1 Le code ascii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.2 Transformation de caractères . . . . . . . . . . . . . . . . . . . . 18
2.3 Troisième partie : les Chaînes de Caractères . . . . . . . . . . . . . . . . 18
2.4 Quatrième partie : le passage d'argument par adresse . . . . . . . . . . . 19
2.4.1 Produit scalaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2 Produit vectoriel . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.3 Transformation de caractères . . . . . . . . . . . . . . . . . . . . 19
2.4.4 Transformation de chaîne de caractères . . . . . . . . . . . . . . . 19
2.5 Cinquième partie : Bibliothèque statique . . . . . . . . . . . . . . . . . . 20
2.5.1 Création de la bibliothèque FonctionsSupmeca.lib . . . . . . . . . 20
2.5.2 Utilisation de la bibliothèque . . . . . . . . . . . . . . . . . . . . 20
3
2021-22 Algorithmique et Programmation
3 Tableaux 21
3.1 Calcul du champ de température d'une plaque d'acier . . . . . . . . . . . 21
3.2 Méthode numérique utilisée . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.1 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3 Programmons cet algorithme . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.1 Débutons par le main() . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.2 Fonction CopieMatrice() . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.3 Fonction CalculDi() . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.4 Fonction CalculMax() . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.5 Fonction CalculeConditionsLimites() . . . . . . . . . . . . . . . . 25
3.3.6 Fonction CalculTemperature() . . . . . . . . . . . . . . . . . . . . 26
3.3.7 Bravo ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4 Structures 29
4.1 Objectif de l'exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 Le type complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2.1 Dénition de type . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2.2 Parties réelles, imaginaires, module et argument . . . . . . . . . . 29
4.2.3 Achage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.4 Conjugué . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.5 Programme principal . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3 Traitement arithmétique des complexes . . . . . . . . . . . . . . . . . . . 30
4.4 Application : représentation de Nyquist . . . . . . . . . . . . . . . . . . . 31
Travail Pratique 1
Débuter en Langage C
L'objectif de ce premier sujet est de prendre en main les notions essentielles du
langage C.
Dans un premier temps, nous nous intéresserons à l'aspect compilé des programmes
réalisés grâce au langage C. Pour ceci, nous utiliserons l'interpréteur de commandes et
les programmes en ligne de commandes des outils de Microsoft Visual Studio.
Dans un deuxième temps, nous réaliserons des petits programmes utilisant des struc-
tures de contrôle, des expressions, des variables simples, des tableaux et des constantes
symboliques à l'aide de l'interface graphique de Visual Studio. Nous utiliserons aussi
deux fonctions de la librairie standard du langage C : printf et scanf.
Au prompt C :\Program les (x86)\Microsoft Visual Studio 10.0\vc, taper les com-
mandes suivantes :
cd /d C:\users\mon_login\mes documents
md ALGO\TP1
cd ALGO\TP1
dir
1.3.3 La compilation
Utiliser les commandes suivantes :
16 else
17 p r i n t f ( "\n | v2 | = %d" , +v2 ) ;
18 } while ( . . . )
19 return 0 ;
20 }
1.5 Tableaux
1.5.1 Tableaux à une dimension
1/ Calcul de moyenne
Écrire un programme qui aecte à un entier s la moyenne des n premières valeurs
d'un tableau t d'entiers de vingt éléments initialisés par : t[i] = 2 * i + 1.
n est saisi au clavier, si n ne correspond pas à un indice valide du tableau, on ache
un message d'erreur et on met n au programme. Sinon s doit être aché.
scanf("%d",&n);
2/ Transformation
Vous transformerez le tableau de la façon suivante :
Tout élément sera égal à la somme de lui-même et des éléments situés à sa droite
sur la même ligne.
a) d'abord en appliquant rigoureusement la dénition de la transformation.
b) ensuite en cherchant à minimiser le nombre d'opérations eectuées.
Travail Pratique 2
Fonctions
A chaque changement d'exercice vous conserverez le même programme principal et les
fonctions développées précédemment mais vous mettrez en commentaires les instructions
d'appel relatives aux questions précédentes.
• deux fonctions répondant aux cahiers des charges des questions 1.5.1b/ et 1.5.2b/
du TP précédent. Les prototypes de ces fonctions seront :
si ce n'est pas une lettre minuscule, elle retourne le caractère non modié.
a/ Vous dénirez une fonction qui copie une chaîne de caractères dans une autre
en transformant les lettres minuscules en lettres majuscules, les autres carac-
tères restant inchangés ; bien entendu cette fonction utilisera la fonction trans-
forme_caractere_majuscule, et son prototype sera :
b/ Vous dénirez une fonction qui modie une chaîne de caractères, donc sans en
faire de copie, en transformant les lettres minuscules en lettres majuscules, les
autres caractères restant inchangés ; son prototype sera :
c/ Vous dénirez une fonction qui copie une chaine de caractères dans une autre
en inversant l'ordre des caractères et en transformant les lettres minuscules en
lettres majuscules, les autres caractères restant inchangés ; de plus elle retournera
le nombre de lettres transformées et son prototype sera :
Vous écrirez un programme principal qui permet de tester ces trois fonctions ;
pour lire une chaîne de caractères pouvant contenir plusieurs mots, et donc des
espaces, vous utiliserez l'instruction : gets(chaine) ; où chaine est l'identicateur
de la variable lue, l'achage pouvant se faire avec l'instruction : puts(chaine) ;.
Cette fonction retourne rien (void) mais produit le résultat par son troisième argument.
Le prototype sera placé dans un chier .h dans lequel la constante symbolique MMAX
sera dénie.
Travail Pratique 3
Tableaux
3.2.1 Algorithme
Les températures seront stockées dans un tableau bidimensonnel T. La température
au coin haut-gauche de la plaque sera stokée en T[0][0], la température au coin bas-droit
de la plaque sera stockée en T[n-1][m-1]. n et m sont des variables de l'algorithme per-
mettant de xer la nesse de la grille.
1. Cette fonction est à placer dans la bibliothèque FonctionsSupmeca.lib créée au TP2 et fera l'objet
de prototypes à placer dans le chier .h de cette librairie
Initialisations
Déclarez le tableau et les variables nécessaires au stockage des températures puis ini-
tialisez le tableau (premier point de l'algorithme décrit en section 3.2.1). On utilisera les
constantes symboliques N M AX , M M AX dénies dans le chier FonctionsSupmeca.h
de la bibliothèque créée au TP2 pour déclarer le tableau des températures. Deux va-
riables entières n, m permettant de xer le nombre de points de discrétisations à n × m
seront déclérées et utilisées dans vos algorithmes (n ≤ N M AX , m ≤ M M AX ).
void CopieMatrice( double T1[ ][MMAX], double T2[ ][MMAX], int n, int m ){ ... }
Cette fonction copie T1 dans T2, les dimensions n, m de ces deux tableaux sont
passées en argument, elle ne renvoie rien.
void CalculDiff(double T1[ ][MMAX], double T2[ ][MMAX], double diff[ ][MMAX],
int n, int m){ ... }
Cette fonction calcule la diérence des matrices T1 et T2 et stocke le résultat
dans la matrice di, les dimensions n, m de ces tableaux sont passées en argu-
ment, elle ne renvoie rien.
double CalculMax ( double A[][MMAX] , int *ierr, int *jerr, int n, int m ){ ...
Cette fonction permet de calculer le maximum d'un tableau en valeur absolue
et de l'envoyer en valeur de retour. Cette fonction devra aussi calculer ierr et
jerr, qui représentent la position du point où la précision du calcul est la plus
mauvaise. Pour que cette fonction puisse "produire" 3 valeurs, il faudra
utiliser le passage par adresse.
void CalculeConditionsLimites (double T[][MMAX], double Th, double Td,
double Tb, double Tg, int n, int m ){ ... }
Cette fonction impose les températures T h, T b, T d et T g sur le bord haut, bas,
droit et gauche respectivement.
void CalculeTemperature (double T[][MMAX], double dx, double dy, int n, int m){
Cette fonction calcule la température courante en tout point intérieur à la plaque.
dx, dy sont les distances respectivement selon x et selon y des points de discréti-
sation spatiale.
3.3.7 Bravo !
Vous avez réalisé votre première résolution numérique. Cet algorithme de résolution
n'est pas vraiment optimisé, mais a l'avantage d'être assez simple.
Pensez à vérier le comportement de votre programme vis-a-vis de l'algorithme pro-
posé au paragraphe 3.2.1
Pour aller plus loin, vous pouvez modier votre programme pour
Annexes
Travail Pratique 4
Structures
4.2.3 Achage
On souhaite pouvoir acher à l'écran des nombres complexes pour contrôler leur
valeur. L'achage sera réalisé selon les deux formats des complexes :
z = a + bi = r e^(it)
4.2.4 Conjugué
Dénissez une fonction Conjugue produisant le conjugué d'un complexe donné. Le
prototype de cette fonction sera :
complexe Conjugue(complexe);
Ecrire une fonction qui stocke dans un tableau de complexes les valeurs de la fonction
de transfert ĥ(f ) sur l'intervalle fréquentiel [fmin , fmax ] discrétisé par nf points fréquen-
tiels. On rappelle que pulsation ω et fréquence f sont liées par ω = 2πf . Le prototype
de cette fonction sera :
int Nyquist(complexe[],double, double, int, double,double);
Les paramètres de cette fonction seront respectivement :
la pulsation propre ω0
l'amortissement η .
void AfficheNyquist(complexe[],int,char*,char);
Le 3ème paramètre est le nom du chier à créer alors que le dernier paramètre est le
caractère souhaité pour séparer les valeurs dans ce chier.
Travail Pratique 5
Lecture sur chier formaté
5.1.2 Rugosité
La norme AFNOR NFE 05-015 décrit certains des paramètres de l'état de surface.
On distingue, entre autres :
Rt : diérence d'altitude entre le point le plus haut et le point le plus bas du prol.
Rp : altitude du point le plus élevé du prol par rapport à la ligne moyenne (ou
droite des moindres carrés).
Relevé du profil :
(µm)
100
50
0 1 2 3 4 (mm)
(µm)
0,5
0,0
-0,5
-1,0
0 1 2 3 4 (mm)
Le chier sera ouvert dans la fonction main() grâce à la fonction fopen, bien entendu
avant d'appeler la fonction précédente, et le programme non exécuté au cas où le chier
ne serait pas trouvé ; ceci peut se faire de la façon suivante :
Listing 5.2 Test d'ouverture dans programma principal
1 #include <s t d i o . h>
2 int main ( ) {
3 FILE * p f e ;
4 i f ( ( p f e = fopen ( " r u g o s i t e . t x t " , " r " ) ) == ( FILE * )NULL) {
5 p r i n t f ( " Erreur en o u v e r t u r e du f i c h i e r \n" ) ;
6 return = 1;
7 }
8 ...
9 return 0 ;
10 }
Il s'agit de la droite dite des moindres carrés, c'est-à-dire telle que la somme des
carrés des distances des points à une droite d'équation y = ax + b soit minimale.
Vous dénirez enn une fonction permettant de calculer la covariance de deux va-
riables aléatoires dont les échantillons sont stockés dans deux tableaux ; son prototype
sera :
double Covariance (double[], double, double[], double, int) ;
Votre programme principal sera alors en possession de tous les éléments permettant de
déterminer les coecients a et b de la droite de régression de Y en X .
5.3.4 Calcul de Rp
Vous dénirez une fonction permettant de calculer ce paramètre dont la dénition
est :
Rp = yk tel que (yi − yi∗ ) soit maximal
yi∗ étant la valeur de l'altitude obtenue grâce au modèle linéaire précédent.
5.3.5 Calcul de Ra
Vous dénirez une fonction permettant de calculer ce paramètre dont la dénition
est : n
1X
Ra = |yi − yi∗ |
n i=1
Le prototype de cette fonction sera :
double Ra (double[], double[], double, double, int) ;
5.3.6 Calcul de Rq
Vous dénirez une fonction permettant de calculer ce paramètre dont la dénition
est : n
1X
Rq = (yi − yi∗ )2
n i=1
Le prototype de cette fonction sera :
double Rq (double[], double[], double, double, int) ;