Exam 1 (module 1) Flashcards
Avantage d’un langage compilé?
Vitesse d’exécution plus rapide
Définition de portabilité d’un programme
Sa capacité à pouvoir être adapté en vue de fonctionner dans différents environnements d’exécution.
Action de modifier un programme pour qu’il puisse s’exécuter sur un autre environnement.
Le portage
(Vrai ou faux) Un compilateur donné est toujours spécifique au système d’exploitation pour lequel il a été conçu.
Vrai
Code source -> (1)? -> code source étendu -> (2)? -> il y a des erreurs -> (3)?
1-pre-processeur
2-compilateur
3-code source (repart au début)
compilateur -> pas d’erreurs -> (1)? -> (2)? -> il y a des erreurs -> (3)?
1-code objet
2-éditeur de liens
3-code source (retourne au début)
éditeur de liens -> pas d’erreurs -> ?
code exécutable
include <iostream></iostream>
Comment cette partie du code s’appelle-t-elle?
#include <math.h>
using namespace std;</math.h>
Directives pour la pré-compilation (gérées par le pré-processeur)
Nom de la partie du code qui se trouve où les *?
int main() {***}
Bloc principal
À quoi sert return 0 à la fin du programme?
À indiquer qu’il a bien fonctionné
Pourquoi déclarer les variables?
▪ taille de l’espace mémoire requis
▪ opérations associées
▪ codage, décodage
▪ lisibilité (choix des identificateurs)
▪ détection d’erreurs
Normes des noms de variables
◼ Suite de caractères (alphanumériques).
◼ Premier caractère : une lettre (ou _ ).
◼ Majuscules et minuscules
◼ Seulement les 32 premiers caractères sont « significatifs ».
Est-ce que la variable suivante est initialisée?
int unEntier;
Non, elle est juste déclarée
Façons d’initialiser une variable (mettons qu’on veut que la valeur de unEntier soit de 5)
int unEntier = 5;
int unEntier (5);
int unEntier {5};
(Vrai ou faux) Dans un if, le else est nécessaire
Faux, else est toujours facultatif
Autre façon d’écrire:
if ( n > 1 )
{
i = i + 1;
}
else
{
i = i – 1;
}
( n > 1 ) ? i = i + 1 : i = i – 1;
<condition>?<valeur>:<valeur>;
</valeur></valeur></condition>
Comment ça marche les switch / case?
switch( variable )
{
case 1 : cout «_space;“un” «_space;endl; break;
case 2 : cout «_space;“deux” «_space;endl; break;
default: cout «_space;“erreur!” «_space;endl;
}
La valeur de l’expression (ici c’est variable) est comparée avec la valeur de chaque cas. Si il y a un match, le bloc associé est exécuté. Si aucun match, le bloc par défaut est exécuté. (break et default son optionels)
Structure d’une boucle while
while (condition)
{
… ;
}
exemple de condition : i<20
Structure d’une boucle do while et différence avec la boucle while
do
{
…;
} while (condition);
différence : ça rentre dans la boucle au moins une fois
Structure d’une boucle for
for (initialisation; condition d’arrêt; instruction de fin de boucle)
{…}
exemple:
for (int i = 2; i <= 10; i++)
{
…;
}
Ça sert à quoi de mettre unsigned devant un type de variable?
De forcer à avoir juste des valeurs positives.
char (nombre de bits et intervalle)
8 bits, [-127, 127] (code ASCII)
Différence entre float et double?
float : 32 bits (7 chiffres signif.)
double : 64 bits (15 chiffres signif. -> plus de précisoin)
Comment transformer une lettre majuscule en minuscule?
+ ‘a’ - ‘A’
Chiffre qui représente true (en C++)? Et false?
true : 1
false : 0
Constantes symboliques vs constantes typées
symboliques:
-Avant la compilation, le pré-processeur parcourt
l’ensemble du programme et remplace chaque
occurrence du symbole par la valeur définie.
-ex : #define TAUX_TPS 0.05f
typées:
-ex : const float TAUX_TPS = 0.05;
Analyse lexicale
Le compilateur identifie les différents symboles qui composent le programme
Crible
Le compilateur fait le tri parmi les symboles identifiés lors de
l’analyse lexicale entre les symboles utiles, les symboles inutiles
et les symboles qui s’adressent directement au compilateur.
Analyse syntaxique
Le compilateur cherche à retrouver la structure du programme.
Cette tâche est accomplie en analysant les symboles lexicaux.
C’est également durant cette étape que les erreurs de syntaxe
du programmeur sont détectées.
Analyse sémantique
Sert à détecter les autres erreurs que l’on peut commettre en
écrivant un programme, comme entre autres, les erreurs de
typage.
Qu’arrive-t-il lorsqu’on fait une opération sur des opérandes de types différents?
Appel au mécanisme de conversions des types des opérandes.
Hiérarchie de conversion de types
int → long → float → double → long double
valeur de z?
int x;
int y;
int z;
x = 5;
y = 14;
z = y / 3 + y / (x * 1.0f);
6 (4 + 2.8)
priorité de opérateurs
slide p.34 (non ça me temptais pas de recopier le tableau au complet lol)
C’est quoi un stream?
Séquence de caractères permettant de faire les opérations d’entrées/sorties.
ostream vs istream
ostream : gère les sorties (output)
ex : cout
istream : gère les entrées (input)
ex : cin
cout («_space;ou»_space;) ?
cout «
(et cin»_space;)
Une ostream peut être redirigée vers …
o l’écran (cout), la console d’erreur (cerr),
o le fichier d’historique (clog),
o un fichier (ofstream),
o un espace en mémoire (ostringstream).
Une istream peut être redirigée vers …
o le clavier (cin),
o un fichier (ifstream),
o un espace en mémoire (istringstream)
retour de chariot
“\n” ou endl
Comment demander son nom à l’utilisateur?
cout «_space;“Entrez votre nom : “ ;
string nom;
cin»_space; nom;
Comment lire une chaîne de caractères comprenant des
espaces ou des tab?
Faut faire un buffer (un tableau de caractères vide) et mettre ce que le getline prend dedans. (quand il y a un délimiteur en trop on ajoute .ignore() pour l’enlever)
char buffer[256];
cin.getline(buffer, 256);
string nomCompose;
nomCompose = buffer;
Comment fonctionne getline()?
getline(là où il stock ce qu’il extrait, nombre max de caractères qu’il extrait, délimiteur)
le délimiteur par défaut est \n, car c’est fait pour prendre des lignes
Quoi écrire pour pouvoir utiliser cin/cout?
include<iostream></iostream>
using namespace std; (juste dans les .cpp , PAS dans le .h)
Structure d’une fonction
“type du retour” nomFonction (type arg1, type arg2)
{
“corps de la fonction”
}
D’habitude on déclare le prototype d’une fonction dans le .h et on l’implémente dans le .cpp, mais si il faut le faire dans le même fichier (exam) on fait comment?
exemple:
int max (int a, int b); //déclaration
int main()
{
blablabla
int max (int a, int b) //implément.
{
…
}
}
Comment fonctionnent les variables locales à une fonction?
-portée limitée à la fonction
-À chaque appel de fonction, les variables locales sont définies, initialisées, utilisées et détruites après l’exécution de la fonction
Passage de paramètres par copie/valeur
Ne change pas la valeur des variables en dehors de la fonction
(voir slide p.67)
C’est quoi un pointeur?
Un pointeur est une variable qui contient l’adresse d’une autre variable.
(Vrai ou Faux) Les pointeurs sont tous codés sur le même nombre de bits
Vrai
(Vrai ou faux) Déclarer un pointeur réserve de la mémoire pour la variable pointée
Faux (réserve juste un emplacement pour le pointeur)
Comment faire un pointeur p qui pointe vers x (un entier)?
int* p; (pointe vers un int)
p = &x;
(& donne l’adresse de x)
Que fait * devant un pointeur?
Donne le contenu de la variable pointée (donc la valeur au lieu de l’adresse)
(Vrai ou faux) On a le droit de modifier l’adresse de variables déclarées dans un programme.
exemple:
int unEntier;
(&unEntier)++;
Faux! À ne PAS faire
Que signifie ad++ (ad est une adresse)?
ad désigne l’objet suivant en mémoire (ad+=10 et ad-=25 sont valides)
Qu’est-ce qu’un tableau et quand l’utilise-t-on?
Quoi : collection (regroupement) de variables de même type.
Quand : * pour conserver les mêmes informations sur
plusieurs objets différents.
(exemple: les notes des étudiants d’une classe)
* pour mémoriser des informations et revenir les
traiter plus tard (buffer).
Déclaration d’un tableau
-Donner un nom, un type et une taille
-Exemple:
#include <array>
std::array<int,5> monTableau;</array>
Que faire si un tableau a une taille fixe?
Définir cette taille par une constante! (plus simple après de la changer)
Exemple :
const int MAX_CASES = 100;
std::array<int, MAX_CASES> monTableau;
(Vrai ou faux) monTableau[1] donne le premier élément du tableau
Faux, ça donne le deuxième (l’indexation commence à 0 et fini à n-1)
Qu’est-ce que ce code fait? Et à quoi sert auto?
for (auto element : monTableau)
{
std::cout «_space;element «_space;” “;
}
-code : parcours tout le tableau au complet
-auto : détermine automatiquement le type
(si on veut modifier on passe par &, voir p.85)
Qu’est-ce qui est mis dans le tableau?
array<int, 5> monTableau2 {2, 4, 6};
2 4 6 0 0 (si on avait écrit {} ça aurait été juste des 0)
Comment éviter les problèmes d’accès hors-limite (débordement en dehors du tableau)?
➔ s’assurer en tout temps que la taille du tableau utilisé est suffisante pour contenir toutes les données que l’on compte utiliser.
➔ s’assurer en tout temps que l’indice utilisé ne dépasse pas les
bornes du tableau.
Comment déclarer un tableau de 5 lignes et 3 colonnes?
array<std::array<int,3>, 5> matrice;
-pour accéder à une case : matrice[0][1] = 5; ou
matrice.at(0).at(1) =5;
Comment remplir un tableau de 5 lignes et 3 colonnes?
array<std::array<int, 3>, 5> matrice2{
{
{1, 2, 3}, //une ligne de 3 colonnes
{6, 67, 7},
{4, 6, 9},
{2, 1, 2},
{92, 41, 3} //la 5eme ligne
}
}; //il y a 3 } à la fin (et au début)
Comment faire afficher un tableau 2d sous le bon format?
for (auto ligne : matrice_5x3)
{
for (auto element : ligne)
{
cout «_space;element «_space;“\t”;
}
std::cout «_space;endl;
}
(tab entre les colonnes et retour de chariote entre les lignes)
Initialisation d’une chaîne de caractères
include <string></string>
string chaine (“un mot”);
ou
string chaine = “un mot”;
Définition d’un fichier
-Séquence d’octets terminée par une « marque de fin de fichier »
(EOF).
-Vus comme des flux d’octets ou de caractères
Ce qu’il faut inclure pour utiliser des fichiers
include<fstream></fstream>
ofstream vs ifstream
ofstream : pour écrire dans un fichier
ifstream : pour lire un fichier
Comment ouvrir un fichier en écriture?
ofstream ofs {“FichierAEcrire.dat”,ios::out};
ou si on veut l’ouvrir plus tard
ofstream ofs;
// …
ofs.open(“FichierAEcrire.dat”,ios::app);
voir exemple p.103!
ios::out vs ios::app
ios::out : efface tout le contenu si le fichier existait déjà
ios::app : écrit après ce qu’il y a dans le fichier
(si il existait pas, il est créé dans les deux cas)
Lecture d’un fichier en mode texte
ifstream ifs {“FichierALire.dat”, ios::in};
//le in c’est pour lecture en mode texte sans modification
voir exemple p.105!
Passage de paramètres par référence
Permet de changer les valeurs des variables même après être sorti de la fonction
voir exemple p.69!
À quoi sert le passage de paramètres par référence constante? (pareil comme réf normale mais ajoute const avant le type)
-éviter la copie
-protéger la source contre les modifications
Passage de paramètres par adresse (pointeurs)
-fonction(&x, &y)
-&x c’est l’adresse directement, mais si on avait mis int& ref_x, ça aurait la référence de l’adresse
voir exemple p.71!