Académique Documents
Professionnel Documents
Culture Documents
Cette première activité pratique (AP1) couvre les trois premiers chapitres du cours. C'est une
activité qui n'est pas notée, et dont l'objectif est double:
Pour cela, nous allons reprendre les exemples de programmes C++ déjà détaillés dans le cours,
ainsi que leurs équivalents en C et en Python, puis nous essayerons ensemble de:
les éditer, modifier, compiler, corriger, et exécuter en utilisant les différents outils
disponibles,
déterminer les points de ressemblance et les points de différence entre les trois langages
C, C++ et Python, notamment en ce qui concerne:
Programme 1:
eq2d_v1.cpp
C'est la version 1 du premier programme C++ détaillé dans le cours, et dans le support du
cours.
1 %%writefile eq2d_V1.cpp
2 // eq2d_v1.cpp
3 // Sortie du programme si a == 0
4 #include <iostream>
5 #include <math.h>
6 using namespace std;
7 int main() {
8 float a, b, c, delta, x1, x2;
9 cout << "a = "; cin >> a;
10 if (a == 0) exit(1);
11 cout << "Entrer b et c : "; cin >> b >> c;
12 delta = b*b - 4*a*c;
13 cout << " Delta = " << delta << endl;
14 if (delta < 0) cout << " Pas de solutions réelles";
15 else if (delta == 0) cout << " x1 = x2 = " << -b/(2*a);
16 else {
17 x1 = (-b-sqrt(delta))/(2*a);
18 x2 = (-b+sqrt(delta))/(2*a);
19 cout << " x1 = " << x1 << "\n x2 = " << x2;
20 } cout << endl;
21 return 0;
22 }
23
Writing eq2d_V1.cpp
1 ls -lt eq*
man g++ pour affichier son manuel (très long), s'il est installé, ou
whereis g++ pour affichier les répertoires standards qui contiennent des fichiers
nommés g++, y compris les fichiers de documentation.
1 !whereis g++
g++: /usr/bin/g++
Vérifions que le chemin qui mène à g++ fait bien partie de la variable PATH
Si c'est le cas, nous n'aurons pas à précéder g++ par son chemin d'accès (/usr/bin/g++)
1 !echo $PATH
/opt/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/us
Compilation la plus simple possible
Après compilation vérifier la création de l'exécutable a.out
1 !g++ eq2d_V1.cpp
1 ls -lt a*
a.out n'est pas trouvé parce que son chemin n'existe pas dans la liste des
chemins standards qui forment PATH
A vérifier par la commande whereis
1 !whereis a.out
a:
1 !./a.out
a = 1
Entrer b et c : 2 1
Delta = 0
x1 = x2 = -1
Remarque importante
La saisie des valeurs de a, b, et c doit se faire dans les champs de saisie rectangulaire qui
s'affichent après les deux messages "a = " et "Entrer b et c: "
Pour activer ces champs il faut cliquer sur le curseur qui s'affiche en clignottant en noir
après chaque message de saisie.
L'accès au terminal Linux de la machine virtuelle est également possible, mais c'est
payant.
a = 1.5
Entrer b et c : 10.2 5.1
Delta = 73.44
x1 = -6.25657
x2 = -0.543429
1 # Test du cas a == 0
2 !./a.out
a = 0
a = 1.25
Entrer b et c : 45.6 3.8
Delta = 2060.36
x1 = -36.3965
x2 = -0.0835251
Equivalent C de eq2d_v1.cpp
Dans le cas particulier de cet exemple simple, la principale différence entre les deux langages
concerne:
Exemple: pour afficher le manuel d'utilisation de la fonction printf il suffit d'utiliser la ligne
de commande: man 3 printf;
Sans le nombre 3 (numéro de section) le manuel affiché sera celui de la commande printf
de Linux.
1 %%writefile eq2d_v1.c
2 // eq2d_v1.c
3 // Equivalent C de eq2d_v1.cpp
4
5 #include <stdio.h>
6 #include <math.h>
7
8 int main() {
9 float a, b, c, delta, x1, x2;
10 printf("a = "); scanf("%f", &a);
11 if (a == 0) exit(1);
12 printf("Entrer b et c: "); scanf("%f %f", &b, &c);
13 delta = b*b - 4*a*c;
14 printf("delta = %f\n", delta);
15 if (delta < 0) printf("Pas de solutions réelles \n");
16 else if(delta == 0) printf(" x1 = x2 = %f\n",-b/(2*a));
17 else {
18 x1 = (-b-sqrt(delta))/(2*a);
19 x2 = (-b+sqrt(delta))/(2*a);
20 printf("x1 = %f\n x2 = %f\n",x1, x2);
21 } printf("\n");
22 return 0;
23 }
24
Writing eq2d_v1.c
Vérification de la création du fichier eq2d_v1.c
1 ls -lt eq*
/usr/bin/gcc
1 !man 3 exit
NAME
exit - cause normal process termination
SYNOPSIS
#include <stdlib.h>
DESCRIPTION
The exit() function causes normal process termination and the value of
status & 0377 is returned to the parent (see wait(2)).
All open stdio(3) streams are flushed and closed. Files created by
tmpfile(3) are removed.
RETURN VALUE
The exit() function does not return.
ATTRIBUTES
For an explanation of the terms used in this section, see
attributes(7).
┌──────────┬───────────────┬─────────────────────┐
│Interface │ Attribute │ Value │
├──────────┼───────────────┼─────────────────────┤
│exit() │ Thread safety │ MT-Unsafe race:exit │
└──────────┴───────────────┴─────────────────────┘
The exit() function uses a global variable that is not protected, so it
is not thread-safe.
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
NOTES
The behavior is undefined if one of the functions registered using
atexit(3) and on_exit(3) calls either exit() or longjmp(3). Note that
a call to execve(2) removes registrations created using atexit(3) and
on_exit(3).
The use of EXIT SUCCESS and EXIT FAILURE is slightly more portable (to
NAME
sqrt, sqrtf, sqrtl - square root function
SYNOPSIS
#include <math.h>
sqrtf(), sqrtl():
_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
|| /* Since glibc 2.19: */ _DEFAULT_SOURCE
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
DESCRIPTION
These functions return the nonnegative square root of x.
RETURN VALUE
On success, these functions return the square root of x.
ATTRIBUTES
For an explanation of the terms used in this section, see
attributes(7).
┌─────────────────────────┬───────────────┬─────────┐
│Interface │ Attribute │ Value │
├─────────────────────────┼───────────────┼─────────┤
│sqrt(), sqrtf(), sqrtl() │ Thread safety │ MT-Safe │
└─────────────────────────┴───────────────┴─────────┘
CONFORMING TO
C99, POSIX.1-2001, POSIX.1-2008.
1 %%writefile eq2d_v1.c
2 // eq2d_v1.c
3 // Equivalent C de eq2d_v1.cpp
4
5 #include <stdio.h>
6 #include <math.h> // Compiler avec l'option -ml
7 #include <stdlib.h>
8
9 int main() {
10 float a, b, c, delta, x1, x2;
11 printf("a = "); scanf("%f", &a);
12 if (a == 0) exit(1);
13 printf("Entrer b et c: "); scanf("%f %f", &b, &c);
14 delta = b*b - 4*a*c;
15 printf("delta = %f\n", delta);
16 if (delta < 0) printf("Pas de solutions réelles \n");
17 else if(delta == 0) printf(" x1 = x2 = %f\n",-b/(2*a));
18 else {
19 x1 = (-b-sqrt(delta))/(2*a);
20 x2 = (-b+sqrt(delta))/(2*a);
21 printf("x1 = %f\n x2 = %f\n",x1, x2);
22 } printf("\n");
23 return 0;
24 }
25
Overwriting eq2d_v1.c
1 # Compilation avec l'option -lm (nécessaire pour les fonctions de la bibliothèque math
2 !gcc eq2d_v1.c -lm
1 ls -lt a*
1 !./a.out
a = 1
Entrer b et c: -2 1
delta = 0.000000
x1 = x2 = 1.000000
1 !./a.out
a = 45.123
Entrer b et c: 3.21 2.9
delta = -513.122742
Pas de solutions réelles
1 !./a.out
a = 0
Recompilation de la version C en choisissant le nom de
l'exécutable
Se fait, comme pour C++, à l'aide de l'option -o de gcc,
Sans oublier l'option -lm nécessaire pour l'utilisation de sqrt standard,
Sinon le compilateur suppose qu'on veut utiliser notre propre sqrt.
Mode commande ou mode interactif ou mode conversationnel (c'est ce quon fait avec le
langage bash, et on aura l'occasion de le faire aussi on Python. Si j'oublie, rappelez-moi.);
Mode programme ou scripting, come on va le tester sur cet exemple..
Un programme Python est un script dont la traduction en langage machine se fait au moment de
l'exécution par un interpréteur.
Sous Linux l'interpréteur Python est un utilitaire, nommé python3, qui s'utilise de la même façon
que g++, gcc, et n'importe quelle commande système.
1 %%writefile eq2d_v1.py
2 # eq2d_v1.py
3
4 import math # pour la fonction math.sqrt
5 import sys # pour la fonction sys.exit
6
7 a = float(input("a = "))
8
9 if (a == 0):
10 sys.exit(1)
11 b = float(input("b = "))
12 c = float(input("c = "))
13 delta = b * b - 4 * a * c
14 print("delta = ", delta)
15
16 if (delta < 0):
17 print("Pas de solutions réelles")
18 elif (delta == 0):
18 elif (delta == 0):
19 print("x1 = x2 = ", -b / (2 * a))
20 else:
21 print("x1 = ", (-b-math.sqrt(delta)) / (2*a))
22 print("x2 = ", (-b+math.sqrt(delta)) / (2*a))
23
Writing eq2d_v1.py
1 ls -lt eq*
1 !python3 eq2d_v1.py
a = 1
b = 2
c = 1
delta = 0.0
x1 = x2 = -1.0
a = 0
a = 1
b = -2
c = 1
delta = 0.0
x1 = x2 = 1.0
Test du cas a == 0
1 %run eq2d_v1.py
1 %%writefile eq2d_v2.py
2 # eq2d_v2.py
3
4 import math # pour la fonction math.sqrt
5 import sys # pour la fonction sys.exit
6
7 a = int(input("a = "))
8
9 if (a == 0):
10 sys.exit(19)
11 b = int(input("b = "))
12 c = int(input("c = "))
13 delta = b * b - 4 * a * c
14 print("delta = ", delta)
15
16 if (delta < 0):
17 print("Pas de solutions réelles")
18 elif (delta == 0):
19 print("x1 = x2 = ", -b / (2 * a))
20 else:
21 print("x1 = ", (-b-math.sqrt(delta)) / (2*a))
22 print("x2 = ", (-b+math.sqrt(delta)) / (2*a))
23
Writing eq2d_v2.py
1 %run eq2d_v2.py
2. Fermer le notebook actuel, en cliquant sur le croix x de son onglet dans la fenêtre de votre
navigateur,
3. Accéder à votre drive (par le menu Applications Google/Drive de l'onglet gmail) puis
chercher et ouvrir votre copie personnelle du notebook sauvegardée (en double cliquant
sur son nom),
points communs,
points de différence.
Autres exemples: en jouant sur les différentes conditions (instructions if) et leur ordre, créer de
nouvelles versions du même programme (commencre par exemple par la condition delta > 0, ou
appliquer exit quand delta==0 et non pas quand a==0, etc.)