« Return to Teaching
Responsable du cours : Stefano Guerrini
Commandes Linux pour écrire et exécuter un programme
Création de fichier avec Gedit :
Compilation (transformation du fichier .c vers un fichier exécutable).
Le paramètre -Wall
affiche les avertissements (ils ne gênent pas la production du programme de sortie mais indique des anomalies).
gcc -Wall nom_fichier.c -o nom_fichier
Exécution du programme
Instructions de base (avec explications)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| // Permet d'utiliser des identifiants comme EXIT_SUCCESS et d'autres choses
#include <stdlib.h>
// Permet d'utiliser printf et scanf
#include <stdio.h>
// Permet de fixer une constante N de valeur 5
#define N 5
int main() // Bloc principal du programme (commence par { et termine par })
{
int n; // Déclare une variable 'n' de type entier (int) dans la mémoire
n = 6; // Mets la valeur 6 dans la variable n
int m = 5; // Déclare une variable 'm' avec la valeur 5
m = m + 1; // 'm' prend pour valeur 'm+1' (on augmente donc 'm' de 1)
m += 1; // Même chose
m++; // Même chose
printf("Bonjour"); // Affiche le texte "Bonjour" à l'écran
// Le premier paramètre "%d" est le format d'affichage indiquant qu'on affiche un entier
// Les paramètres suivants sont les entiers correspondant à afficher
printf("%d", n); // On affiche la valeur de n
printf("%d/%d", n, m); // On affiche la valeur de 'n' et de 'm' séparés par un symbole /
scanf("%d", &n); // On permet d'entrer un entier au clavier dont la valeur sera placée dans la variable 'n'
// Conditions
if ((n > 3 && m > 4) || !(n == 6)) // Si (n>3 et m>4) ou alors si (n==6) est faux
{
// On fait quelque chose
}
else // Sinon (optionnel)
{
// On fait autre chose
}
// Premier paramètre : on a un compteur 'i' qui démarre à 0
// Second paramètre : on continue tant que la condition est valide
// Troisième paramètre : le changement effectué sur 'i' à chaque tour
for (int i=0; i<N; i++)
{
// On fait des opérations en boucle
}
while (3 <= 6) // On fait des opérations en boucle tant que la condition est valide
{
// Remarque 1 : c'est une boucle infinie
// Remarque 2 : on peut faire la même chose qu'une boucle for avec une boucle while
}
double t[5]; // On déclare un tableau de réels de taille 5 (5 cases dans la mémoire)
double tab[3] = {3.14, 10.0, 1.5} // On déclare un tableau de 3 réels avec des valeurs précises
tab[0] = 1.0; // On change la première case de 'tab', elle a pour valeur 1.0 (l'indice de la première case est 0)
printf("tab[0] = %g", tab[0]); // On affiche la valeur de la première case de 'tab'
scanf("%g", &tab[1]); // On change la valeur de la seconde case au clavier
char c = 'a'; // Déclaration d'un caractère, chaque caractère est associé à un entier (son code ASCII)
printf("%c", c); // Affichage du caractère contenu dans la variable 'c'
printf("%d", c); // Remarque : si on choisit de l'afficher comme entier, cela affiche le code ASCII associé
char text[7] = "Bonjour"; // Une chaîne de caractère (texte) se traite comme un tableau de caractères
printf("%c", text[0]); // Affiche 'B'
// Une matrice est un tableau dont les cases contiennent des tableaux. On a donc un tableau 3x3
int mat[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("%d", mat[0][1]); // Affiche l'entier à la ligne 0 et à la colonne 1, c'est-à-dire 2
// Pour afficher une matrice, on affiche les éléments case par case en parcourant chaque ligne
for (int ligne=0; ligne<3; ligne++)
{
// Le code ci-dessous permet d'afficher une ligne de la matrice
for (int colonne=0; colonne<3; colonne++)
{
printf("%d\t", mat[ligne][colonne]);
}
printf("\n"); // On saute une ligne après avoir affiché une ligne
}
return EXIT_SUCCESS; // Indique que le programme s'est terminé correctement
}
|
Exemple : recherche du maximum d’un tableau d’entier
On souhaite recherche l’entier le plus grand d’un tableau d’entiers.
On décrit informellement le fonctionnement du programme. Il s’agit d’une étape
de conception avant la réalisation (écriture du programme lui-même). Les règles
de rédactions peuvent varier.
Nom : Max
Entrée :
Sortie :
Algorithme
On déclare tab (tableau d'entiers)
On déclare max (entier)
max = tab[0]
Pour tout élément x de tab (à partir du second) :
Si x > max :
max = x
Fin de boucle
Affiche max
Retour : OK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <stdlib.h>
#include <stdio.h>
#define N 5
int main()
{
// Déclaration d'un tableau de taille 5
int tab[N] = {1, 5, 10, 7, 8};
// On suppose que le premier élément est le plus grand puis on vérifie si c'est bien le cas
int max = tab[0];
for (int i=1; i<N; i++) // i prend pour valeur les entiers de 1 à N-1
{
if (tab[i] > max) // On vérifie si la case qu'on regarde est plus grande que le max
{
// Si oui, il devient le nouveau max
max = tab[i];
}
}
printf("Le max est : %d\n", max);
return EXIT_SUCCESS;
}
|
On a une colonne pour ligne, une ligne par données, et la sortie. On met seulement
les lignes intéressantes (où une donnée est modifiée ou un affichage est effectué).
Si on exécute le programme, on a l’évolution suivante des données :
Ligne |
tab |
max |
i |
affichage |
commentaire (optionnel) |
8 |
{1, 5, 10, 7, 8} |
|
|
|
|
9 |
|
1 |
|
|
On suppose que 1 est le max |
12 |
|
|
1 |
|
On commence la boucle à tab[1] |
17 |
|
5 |
|
|
On fait 5>1, le max devient 5 |
12 |
|
|
2 |
|
|
17 |
|
10 |
|
|
On fait 10>5, le max devient 10 |
12 |
|
|
3 |
|
On compare 7>10, on ne change rien |
12 |
|
|
4 |
|
On compare 8>10, on ne change rien |
20 |
|
|
|
“Le max est 10” |
|
Correction des TP notés
Calcul des multiples de 3 et de 5 à la fois qui sont inférieurs à n entré par l’utilisateur.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #include <stdlib.h>
#include <stdio.h>
int main()
{
int n;
printf("Entrer un entier strictement positif : ");
scanf("%d", &n);
// On vérifie que la valeur entrée est bien positive, sinon on arrête
if (n > 0)
{
// On parcourt les entiers de 1 à n (inclus)
for (int i = 1; i<=n; i++) // Remarque : on commence à 1
{
if ((i%5 == 0) && (i%7 == 0)) // n%k est le reste de la division n/k
{
printf("%d est un multiple de 3 et 5\n", i);
}
}
}
else
{
printf("L'entier entré n'est pas strictement positif\n");
}
return EXIT_SUCCESS;
}
|
Demande à l’utilisateur d’entrer N valeurs entières dans un tableau (on ignore les valeurs paires).
On affiche seulement les valeurs positives dans l’ordre inverse.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| #include <stdlib.h>
#include <stdio.h>
#define N 5
int main()
{
int tab[N];
int i = 0;
int n;
// On demande de remplir le tableau au clavier tant qu'on a pas atteint la limite N
while (i < N)
{
printf("Entrez la valeur de tab[%d] : ", i);
scanf("%d", &n);
if (n % 2 != 0) // On permet de continuer en augmentant le compteur 'i' seulement si 'n' est impair
{
tab[i] = n; // On met la valeur de 'n' (entrée au clavier) dans la case 'i' de 'tab'
i++;
}
// Remarque : si 'n' est pair alors on recommence la boucle avec le même 'i'
}
// On parcourt le tableau à l'envers (le compteur commence au dernier indice et on diminue 'i' de 1)
for (int i=N-1; i>=0; i--)
{
if (tab[i] > 0) // On affiche l'entier seulement s'il est positif
{
printf("%d ", tab[i]);
}
}
return EXIT_SUCCESS;
}
|