• Aucun résultat trouvé

Langages de programmation

N/A
N/A
Protected

Academic year: 2022

Partager "Langages de programmation"

Copied!
16
0
0

Texte intégral

(1)

Langages de

programmation

Jean-Jacques Lévy

jean-jacques.levy@inria.fr

Cours 6

http://jeanjacqueslevy.net/lp-prog

(2)

Plan

• chaînes de caractères

• booléens

• allocation mémoire

• arithmétique des pointeurs

A Lire: tutorial sur le langage C http://www.programiz.com/c-programming

(3)

Tableaux

• adresse, pointeur (aussi appelé référence)

int main() { int x = 3;

int *b = &x;

printf("%d\n", *b);

}

int main() {

int a[] = {1, 3, 4, 2, 3, 5, 9};

print_array (a, 7);

int *b = a;

print_array (b, 7);

}

• en C, pour tout tableau a, on a l’équation: a == &a[0]

a 1

0

3

1

4

2

2

3

3

4

5

5

9

6

b b

x 3

(4)

Tableaux

• allocation mémoire (memory alloc)

#include <stdlib.h>

int *copy_array (int a[], int n) {

int *r = malloc (n * sizeof(int));

for (int i=0; i<n; ++i) r[i] = a[i];

return r;

}

a 1

0

3

1

4

2

2

3

3

4

5

5

9

6

int main() {

int a[] = {1, 3, 4, 2, 3, 5, 9};

print_array (a, 10);

int *b = copy_array (a, 10);

print_array (b, 10);

}

1

0

3

1

4

2

2

3

3

4

5

5

9 b 6

int *new_array (int a[], int n, int v) { int *r = malloc (n * sizeof(int));

for (int i=0; i<n; ++i) r[i] = v;

return r;

}

(5)

Chaînes de caractères

• les chaînes de caractères sont des tableaux de caractères se finissant par 0 ou encore ‘\0’

#include <string.h>

int main() {

char s[] = "bonjour";

printf ("%s, longueur = %lu\n", s, strlen(s));

}

mac$ ./prog2

bonjour, longueur = 7

s ‘b’ 0

0

‘o’

1

’n’

2

‘j’

3

‘o’

4

‘u’

5

‘r’

6 7

#include <string.h>

#include <stdbool.h>

bool is_palindrome (char s[]) { int n = strlen(s);

for (int i=0; i < n; ++i) if (s[i] != s[n-1-i]) return false;

return true;

}

int main() {

char s[] = "kayak";

if (is_palindrome(s))

printf ("%s est un palindrome", s);

else

printf ("%s n'est pas un palindrome", s);

}

(6)

Chaînes de caractères

• les chaînes de caractères sont des tableaux de caractères se finissant par 0

#include <string.h>

int main() {

char s[] = "bonjour";

printf ("%s, longueur = %lu\n", s, strlen(s));

}

mac$ ./prog2

bonjour, longueur = 7

s ‘b’ 0

0

‘o’

1

’n’

2

‘j’

3

‘o’

4

‘u’

5

‘r’

6 7

#include <string.h>

#include <stdbool.h>

bool is_palindrome (char s[]) { int n = strlen(s);

for (int i=0; i < n; ++i) if (s[i] != s[n-1-i]) return false;

return true;

}

int main() {

char s[] = "kayak";

if (is_palindrome(s))

printf ("%s est un palindrome", s);

else

printf ("%s n'est pas un palindrome", s);

}

(7)

Chaînes de caractères

Exercice

Écrire la fonction strcat (char a[], char b[]) qui met la chaîne b au bout de la chaîne a

Exercice

Écrire la fonction strcp (char a[]) qui retourne une copie de la chaîne a

Exercice

Écrire la fonction str_catenate (char a[], char b[])

qui retourne une nouvelle chaîne concaténant a et b

Exercice

Écrire la fonction strmem (char a[], char c) qui teste si le caractère c apparait dans la chaîne a

Exercice

Écrire la fonction strlen (char a[]) qui retourne la longueur de la chaîne a

(8)

Arithmétique des pointeurs

• adresse, pointeur (aussi appelé référence)

int main() { int x = 3;

int *b = &x;

printf("%d\n", *b);

}

• en C, pour tout tableau a, on a l’équation: a == &a[0]

• arithmétique des pointeurs: a + i == &a[i]

a 1

0

3

1

4

2

2

3

3

4

5

5

9

6

a + 3

int main() {

int a[] = {3, 2, 7, 8, 1, 12, 30, 4, 2, 12};

print_array (a, 10);

int *b = copy_array (a+3, 6);

print_array (b, 6);

}

(9)

Arithmétique des pointeurs

Exercice

Écrire la fonction mystrlen (char a[]) qui retourne la longueur de la chaîne a

int mystrlen (char a[]) { int r = 0;

for (int i=0; a[i] != 0; ++i) ++r;

return r;

}

int mystrlen1 (char a[]) { int r = 0;

for (char *p = a; *p != 0; ++p) ++r;

return r;

(10)

Booléens

• mais aussi , on a 0 pour Faux, et toute valeur non nulle pour Vrai

• librairie stdbool des booléens

#include <stdbool.h>

int main(){

printf ("%d et %d \n", true, false);

}

ne pa s con fond re = e t ==

DAN GER !

int x = 4;

int main() { if (x = 3)

printf ("x vaut 3");

else

printf ("x ne vaut pas 3");

}

int x = 4;

int main() { if (x == 3)

printf ("x vaut 3");

else

printf ("x ne vaut pas 3");

}

CORRECT

ERREUR

(11)

Booléens

• on a 0 pour Faux, et toute valeur non nulle pour Vrai

int mystrlen2 (char a[]) { int r = 0; char *p = a;

while (*p) { p++; r++; } return r;

}

int mystrlen2 (char a[]) { int r = 0; char *p = a;

while (*p++) ++r;

return r;

}

style de la librairie C

(12)

C++

+

=

C++ C Simula

programmation objet programmation système

Nygaard Ritchie

Stroustrup

• Smalltalk aussi ancêtre de la programmation objet

(13)

Débuts en C++

• le suffixe des noms de fichiers est .C au lieu de .c

• C++ a les mêmes types de base et opérateurs que C

• les entrées-sorties sont différentes

#include <iostream>

using namespace std;

int main() {

cout << "Bonjour tout le monde" << endl;

return 0;

}

flux de sortie

int main() { char a;

int num;

cout << "Entrez caractère et nombre: " ; cin >> a >> num;

cout << "a = " << a << "; ";

cout << "num = " << num << endl;

return 0;

}

flux d’entrée

end line

[ on n’a pas à spécifier le type du format comme dans printf (merci à la programmation objet !) — voir plus tard ]

(14)

Débuts en C++

• l’allocation mémoire se fait avec la primitive new (plus besoin de malloc et sizeof !)

int main() {

int *a = new int[10];

for (int i = 0; i < 10; ++i) a[i] = i*i;

cout << a << " " << endl;

for (int i = 0; i < 10; ++i) cout << a[i] << " ";

return 0;

}

ne pas oublier d’initialiser le tableau

• la dé-allocation mémoire se fait avec la primitive free (qui existe aussi en C)

[ très peu utilisé à cause des alias — problème général du ramasse-miettes (garbage collector) ]

(15)

Surcharge des fonctions

• les fonctions peuvent être surchargées (overloading)

int absolu (int x) { if (x < 0)

return -x;

else

return x;

}

double absolu (double x) { if (x < 0)

return -x;

else

return x;

}

int main() {

cout << absolu(22) << " " << absolu (-42) << endl;

cout << absolu(3.14) << " " << absolu (-1.28) << endl;

}

résultat réel flottant 64bits

• elles peuvent avoir un code différent selon le type ou le nombre de leurs arguments résultat entier

(16)

Prochain cours

• enregistrements, classes, objets

• un bon tutorial C++: http://www.programiz.com/cpp-programming

• structures de données dynamiques

• principes de la programmation objet

Références

Documents relatifs

Elle ne peut donc pas être appelée directement, mais doit être redéfinie dans. les

On vous demande de préciser le contenu des fichiers manipulés (on demande de distinguer deux types de fichier, les fichiers textes et les fichiers binaires). On vous demande

• faire marcher l’ordinateur avec ses périphériques (écran, disques, clavier, souris, utilisateurs, réseau, …). • les OS sont d’une complexité extrême (~100 millions de

• mots clés en Python (déjà vus en rouge).

• un interface en français se trouve dans l’extension French Language Pack, en chinois dans Chinese language Pack. • on charge les extensions: Python, Python for VSCode,

Ecrire un programme pour trouver les jours où on aurait dû acheter et vendre cette action pour avoir obtenu un gain

différence: on compile pour obtenir un fichier binaire hello qui est exécuté. • si on veut rajouter un retour à la

• chaque fois qu’on introduit une nouvelle profession, il faut changer à un seul endroit du programme:. en rajoutant une