Mode
Slides
Presentation
Remote control
Send
Listen
Press F11 to switch to fullscreen.
C: Cours 2
1
MyFiles
2
==
3
Tableaux
4
Syntaxe
5
Variable
6
Type
7
Pointeurs
8
Pointeurs
9
Pointeurs
10
Longueur
11
Fonctions
12
Slice
13
Strings
14
Boucle
15
Boucle
16
ASCII
17
ASCII
18
Fonctions
19
Semaine 2
Tableaux, pointeurs,
chaines de caractères
SSIE Programmation en C, Thomas Lochmatter, 2019
1
Sauvegarder les fichiers
dans le répertoire MyFiles!
Sinon ils disparaissent au logout.
2

a == b == c

	// Notation correcte
	if (a == b && a == c) {
		...
	}
	// L'expression
	a == b == c;

	// est équivalente à
	(a == b) == c;

	// et soit
	0 == c;
	1 == c;
3

Tableaux en Python, Matlab, ...

Liste de valeurs ou d'objets

67
55
33
41
48

Tableaux en C

Zone de mémoire consécutive

4
5 cases à 4 bytes = 20 bytes
	// Option 1: initialisation directe
	int visiteurs[] = {67, 55, 33, 41, 48};

	// Option 2: créer le tableau, puis le remplir
	int visiteurs[5];
	visiteurs[0] = 67;
	visiteurs[1] = 55;
	visiteurs[2] = 33;
	visiteurs[3] = 41;
	visiteurs[4] = 48;
Une fois le tableau a été crée, sa taille ne peut plus être modifié.
5
	// Tableau de 5 cases à 4 bytes (20 bytes)
	int visiteurs[] = {67, 55, 33, 41, 48};

	// Variable (1 case) de 4 bytes
	int total = 244;

	// Taille d'une case
	int tailleInt = sizeof (int);
6
Le tableau visiteurs est de type
int *
pointeur sur int
et pointe sur la première case.
Chaque case du tableau est de type int.
Pointer sur Wikipedia
7
	int visiteurs[] = {67, 55, 33, 41, 48};

	int * case0 = visiteurs;
	int * case3 = visiteurs + 3;

	printf("La case 0 se trouve à l'addresse %p.\n", case0);
	printf("La case 3 se trouve à l'addresse %p.\n", case3);

	// La case 0 se trouve à l'addresse 0x4000.
	// La case 3 se trouve à l'addresse 0x400c.
	// Différence: 0x400c - 0x4000 = 12 bytes
8
	int visiteurs[] = {67, 55, 33, 41, 48};

	int * case0 = visiteurs;
	int * case3 = visiteurs + 3;

	// Les 4 lignes suivantes sont équivalentes
	int valeur3 = visiteurs[3];
	int valeur3 = *(visiteurs + 3);
	int valeur3 = *case3;
	int valeur3 = case3[0];
9

5 min

	int visiteurs[] = {67, 55, 33, 41, 48};

	int * case3 = visiteurs + 3;
	int * case5 = case3 + 2;

	printf("Valeur de la case 5: %d.\n", *case5);
	printf("Valeur de la case 5: %d.\n", visiteurs[5]);
10

Longueur d'un tableau

Un tableau est juste un pointeur sur la première case.
Comment gérer sa longueur?
11

Passer un tableau et sa longueur à une fonction

	#include <stdio.h>

	int calculerTotal(int * tableau, int longueur) {
		int total = 0;
		for (int i = 0; i < longueur; i++) {
			total += tableau[i];
		}

		return total;
	}

	int main(int argc, char * argv[]) {
		int visiteurs[] = {67, 55, 33, 41, 48};
		int total = calculerTotal(visiteurs, 5);
		printf("Il y a eu %d visiteurs au total.\n", total);
		return 0;
	}
12
	int visiteurs[] = {67, 55, 33, 41, 48};

	// Tableau entier
	int total = calculerTotal(visiteurs, 5);

	// 3 premières cases
	int total = calculerTotal(visiteurs, 3);

	// 2 dernières cases
	int total = calculerTotal(visiteurs + 3, 2);
13

Chaine de caractères

	char mot[] = "Mississippi";
	char mot[] = {'M', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'p', 'i', 0};
C string handling sur Wikipedia
14

Compter le nombre de S

	#include <stdio.h>

	int main(int argc, char * argv[]) {
		char * mot = "Mississippi";

		int count = 0;
		for (int i = 0; mot[i] != 0; i++) {
			if (mot[i] == 'S' || mot[i] == 's') {
				count += 1;
			}
		}

		printf("Le mot %s contient %d S.\n", mot, count);
		return 0;
	}
15

Compter le nombre de S

	#include <stdio.h>

	int compterS(char * mot) {
		int count = 0;
		for (; *mot; mot++)
			if (*mot == 'S' || *mot == 's') count++;
		return count;
	}

	int main(int argc, char * argv[]) {
		char * mot = "Mississippi";
		printf("Le mot %s contient %d S.\n", mot, compterS(mot));
		return 0;
	}
16

ASCII

	// Ces deux lignes sont equivalentes
	char c = 'T';
	char c = 84;
'\0' NUL 0
'\t' TAB 9
'\n' LF 10
'\r' CR 13
' ' espace 32
'0' 48
'1' 49
'2' 50
...
'9' 57
'A' 65
'B' 66
'C' 67
...
'Z' 90
'a' 97
'b' 98
'c' 99
...
'z' 122
ASCII sur Wikipedia
17
	char mot[] = "Mississippi";
	char mot[] = {'M', 'i', 's', 's', 'i', 's', 's', 'i', 'p', 'p', 'i', 0};
	char mot[] = {77, 105, 115, 115, 105, 115, 115, 105, 112, 112, 105, 0};
18
			#include <string.h>

			char mot[] = "Mississippi";

			// Copier une chaine
			char copie[50];
			strncpy(copie, mot, 50);
			copie[49] = 0;

			// Comparer deux chaines
			if (strncmp(mot, copie, 50) == 0) {
				// même texte
			}
		
			// Longueur
			int len = strlen(mot);

			// Chercher un caractère
			char * pos = strchr(mot, 's');
			if (pos == NULL) {
				// rien trouvé
			}

			// Chercher une chaine
			char * pos = strstr(mot, "pp");
		
19