fichier de révision pour l`examen final

INF130 Ordinateurs et programmation
Hiver 2015 – Préparation en vue de l’examen Final
Enseignants : Francis Bourdeau, Samuel Deslauriers-Gauthier, Frédérick Henri et Hugues Saulnier
INFORMATIONS SUR L’EXAMEN FINAL :
Pondération : 40 % de la note finale
Durée : 3 heures
Documentation permise : Aucune documentation n’est permise.
Un aide-mémoire est fourni en annexe.
Autres informations :
L’examen final comporte 6 questions (11 si on compte les sousquestions).
6 questions nécessitent l’utilisation de tableaux.
9 questions nécessitent l’utilisation d’enregistrements.
1 question porte sur les objets d’Excel.
1 question porte sur les formulaires.
0
Question 1
On retrouve dans la feuille « Table pays » des informations sur divers pays du monde (voir la figure cidessous).
a) Définissez le type t_pays qui permet de conserver les informations d’un enregistrement (une ligne)
de la feuille « Table pays ».
1
b) Écrivez une fonction nommée km_carre_par_habitant qui reçoit un t_pays et qui retourne le
nombre de kilomètres carrés disponible pour chaque habitant. À titre d’exemple, puisque le
2
Canada a une superficie de 9 984 670 km et qu’il y a 34 834 841 habitants, il y a donc environ 0.287
km par habitant (où 0.287 ≈ 9 984 670 / 34 834 841).
2
2
c) Écrivez une fonction nommée minimum_km_carre_par_habitant qui reçoit un tableau de
t_pays et qui retourne l’indice de l’élément contenant le pays dont les habitants disposent du
plus petit nombre de kilomètres carrés par habitant.
3
d) Écrivez une fonction nommée liste_pays_religion qui reçoit un tableau de t_pays ainsi
qu’une chaîne de caractères contenant un nom de religion. Elle retourne un tableau de t_pays
dans lequel on retrouve les pays dont la principale religion correspond à la valeur du second
paramètre. Si le tableau reçu ne contient aucun pays dont la principale religion correspond à celle qui
est demandée, la fonction retourne alors un tableau vide (non alloué).
4
e) Écrivez une fonction prochaine_ligne_vide qui ne reçoit aucun paramètre et qui retourne le
numéro de la prochaine ligne vide dans la feuille « Table pays ». À titre d’exemple, si l’on appelle
la fonction et que la table contient les données visibles dans la figure de la question 1 a), alors la
fonction retourne 7.
À NOTER : Vous pouvez supposer que les noms de pays débutent toujours à la deuxième ligne et se
trouve toujours dans la première colonne.
5
f) Écrivez une fonction ligne_pays qui reçoit une chaîne de caractères contenant un nom de
pays et qui retourne le numéro de ligne dans la feuille « Table pays » qui contient un pays
portant ce nom. Si aucun pays dans la feuille ne porte ce nom, la fonction retourne -1.
À titre d’exemple, si la fonction reçoit « Croatie », elle retourne la valeur 5. Cependant, si elle reçoit la
valeur « Brésil », elle retourne la valeur -1 puisque ce pays n’est pas présent dans la feuille.
À NOTER : Vous pouvez supposer que les noms de pays débutent toujours à la deuxième ligne et se
trouve toujours dans la première colonne.
6
g) Écrivez une fonction nommée ajouter_pays qui reçoit un t_pays et qui tente de l’ajouter dans
la feuille « Table pays ». Si un pays portant le même nom est déjà présent, elle retourne False.
Sinon, elle ajoute le pays dans la première ligne vide de la feuille et retourne True.
7
Question 2
Soit les définitions de type suivantes :
Public Type t_pixel
rouge As Double
vert As Double
bleu As Double
End Type
' L’intensité du rouge est dans l’intervalle [0, 1].
' L’intensité du vert dans l’intervalle [0, 1].
' L’intensité du bleu dans l’intervalle [0, 1].
Public Type t_imageRGB
tableau_pixels() As t_pixel
hauteur As Integer
largeur As Integer
End Type
' La matrice des pixels de l’image.
' Hauteur du tableau tableau_pixels.
' Largeur du tableau tableau_pixels.
a) Écrivez une fonction nommée moyenne_couleurs qui reçoit un t_pixel et qui retourne la
moyenne de ses trois champs.
8
b) Écrivez une procédure nommée couleur_a_noir_et_blanc qui reçoit un t_imageRGB et qui
convertit cette image en noir et blanc. Pour transformer une image en noir et blanc, il faut parcourir
tous les pixels de l’image et appliquer la transformation ci-dessous.
Pixel en couleur
Pixel en noir et blanc
ቌ
ሺ‫ݎ‬, ‫ݒ‬, ܾሻ
‫ݎ‬
‫ݒ‬
ܾ
,
,
ቍ
‫ݎ‬+‫ݒ‬+ܾ
‫ݎ‬+‫ݒ‬+ܾ
‫ݎ‬+‫ݒ‬+ܾ
ቀ
ቁ ቀ
ቁ ቀ
ቁ
3
3
3
On constate qu’il faut donc diviser chaque couleur du pixel par la moyenne des trois couleurs du pixel.
9
c) Écrivez une fonction nommée image_deux_fois_plus_grosse qui reçoit un t_imageRGB et
qui retourne un t_imageRGB dont la taille est deux fois plus grande (en hauteur et en largeur).
Le tableau ci-dessous offre un exemple du résultat attendu lorsqu’on double la taille d’une minuscule
image 2 x 2.
Image originale
Image deux fois plus grosse
(0.2, 0.2, 0.2)
(0.5, 0.5, 0.5)
(0.2, 0.2, 0.2)
(0.2, 0.2, 0.2)
(0.5, 0.5, 0.5)
(0.5, 0.5, 0.5)
(0.1, 0.1, 0.1)
(0.3, 0.3, 0.3)
(0.2, 0.2, 0.2)
(0.2, 0.2, 0.2)
(0.5, 0.5, 0.5)
(0.5, 0.5, 0.5)
(0.1, 0.1, 0.1)
(0.1, 0.1, 0.1)
(0.3, 0.3, 0.3)
(0.3, 0.3, 0.3)
(0.1, 0.1, 0.1)
(0.1, 0.1, 0.1)
(0.3, 0.3, 0.3)
(0.3, 0.3, 0.3)
2
2
4
4
On constate que chaque pixel dans l’image originale se répète 4 fois dans l’image agrandie.
10
11
Question 3
Soit un formulaire nommé formulaire_horloge.
label_heures
label_minutes
spin_heures
spin_minutes
bouton_annuler
bouton_ok
Complétez les sous-programmes suivants qui se trouvent dans le formulaire.
Option Explicit
' Cette variable globale privée permet de savoir si l'utilisateur
' a annulé la saisie. Il est également possible d'utiliser
' l'attribut "tag" du formulaire pour obtenir un résultat similaire.
Private global_utilisateur_a_annule As Boolean
'------------------------------------------------------------------'
SOUS-PROGRAMMES PUBLICS
'------------------------------------------------------------------'
' UTILISATEUR_A_ANNULE
'
' Cette fonction retourne True si l’utilisateur a annulé et False
' si ce n’est pas la cas.
'
' PARAMÈTRES : Aucun.
'
' VALEUR DE RETOUR : True si l’utilisateur a annulé et False
'
dans le cas contraire (type : Boolean).
'
Public Function utilisateur_a_annule() As Boolean
End Function
12
'
' GET_HORLOGE
'
' Cette procédure assigne les heures et les minutes entrées par
' l’utilisateur aux paramètres qu’elle reçoit.
'
' PARAMÈTRES :
'
- heure : (SORTIE) recevra les heures saisies par l’utilisateur
'
(type : Integer).
'
- minutes : (SORTIE) recevra les minutes saisies par
'
l’utilisateur (type : Integer).
'
' VALEUR DE RETOUR : Aucune.
'
Public Sub get_horloge(ByRef heures As Integer, _
ByRef minutes As Integer)
End Sub
'------------------------------------------------------------------'
ÉVÉNEMENTS PRIVÉS
'------------------------------------------------------------------' Cette procédure s’exécute lorsque la boîte de dialogue devient la
' fenêtre active. On y fixe le temps de l’horloge à 6:00.
Private Sub UserForm_Activate()
End Sub
13
' On note que l’utilisateur a annulé et on cache le formulaire.
Private Sub bouton_annuler_Click()
End Sub
' On note que l’utilisateur n’a pas annulé et on cache le formulaire.
Private Sub bouton_ok_Click()
End Sub
' On ajuste l'étiquette des heures en fonction de la valeur du contrôle
' spin_heures.
Private Sub spin_heures_Change()
End Sub
' On ajuste l'étiquette des minutes en fonction de la valeur du
' contrôle spin_minutes.
Private Sub spin_minutes_Change()
End Sub
14
Question 4
Un alliage est une combinaison d’un métal et d’au moins un autre élément du tableau périodique. Il est
possible de calculer la masse molaire moyenne d’un alliage en faisant la somme des masses atomiques
des éléments de l’alliage multipliées par leur pourcentage molaire.
À titre d’exemple, l’argent sterling se compose de 87.9 % d’argent et de 12.1 % cuivre. Puisque les
masses atomiques de l’argent et du cuivre sont respectivement de 107.87 g/mol et de 53.55 g/mol, on
trouve que la masse molaire moyenne de l’argent sterling est de 101.2978 g/mol (cette valeur provient du
calcul 0.879 * 107.87 + 0.121 * 53.55).
Soit les trois types de donnée suivants :
Public Type t_element
nom As String
symbole As String
est_un_metal As Boolean
masse_atomique As Double
End Type
'
'
'
'
Public Type t_composant
symbole As String
pourcentage_molaire As Double
End Type
' Le symbole de l’élément.
' Dans l’intervalle [0, 1].
Public Type t_alliage
nom As String
tab_composants() As t_composant
nb_composants As Integer
End Type
Hydrogène, Hélium, etc.
H, He, Li, etc.
True si l’élément est un métal.
En g/mol.
' Bronze, acier, etc.
' Ce qui compose l’alliage.
' Le nombre d’éléments dans l’alliage.
Écrivez une fonction nommée masse_molaire_alliage qui reçoit un t_alliage ainsi qu’un
tableau de t_element contenant tous les éléments du tableau périodique. Elle retourne la masse
molaire de l’alliage reçu.
15
16
Question 5
Voici une série de types définis qui peuvent représenter la carrière d’un joueur de hockey dans la LNH.
Public Type t_donnees_hors_glace
equipe As String
salaire As Double
no_chandail As Integer
End Type
' L'équipe actuelle du joueur.
' Le salaire actuel du joueur.
' Le numéro de chandail du joueur.
Public Type t_statistique
matchs As Integer
buts As Integer
passes As Integer
points As Integer
penalite As Integer
End Type
' Le nb. de match joué durant la saison.
' Le nb. de but obtenu durant la saison.
' Le nb. de passes obtenues durant la saison.
' Le nb. de points obtenus durant la saison.
' Les minutes de pénalité durant la saison.
Public Type t_annee_carriere
statistique As t_statistique
' Les données de matchs d'un joueur.
information As t_donnees_hors_glace ' Les données sur le contrat d'un joueur.
End Type
Public Type t_joueur
nom As String
nationnalite As String
position As Integer
saisons() As t_annee_carriere
nb_saisons As Integer
End Type
' Le nom du joueur (ex : "Sydney Crosby").
' Le pays de naissance du joueur (ex : "Canada").
' La position d'un joueur (ex : "gardien").
' Les données sur chaque saison d’un joueur
' son nombre de saisons dans la LNH
Écrivez une fonction nommée tab_moyennes_minutes_penalites qui reçoit un tableau de
t_joueur. Pour chaque joueur du tableau, elle :
1.
fait la somme de toutes les minutes de pénalités du joueur au cours de sa carrière;
2.
divise cette somme par le nombre de saisons du joueur dans la LNH.
Elle retourne un tableau contenant ayant la même dimension que le tableau reçu et contenant les
valeurs obtenues.
En d’autres termes, si la fonction reçoit un tableau contenant 3 joueurs, elle retourne un tableau de 3
nombres réels correspondant au nombre moyen de minutes de pénalité par saison de chacun des
joueurs.
17
18
Annexe : Aide-mémoire
Types de données
Boolean
Byte
Integer
Long
Single
Double
String
Objets et collections
True ou False
0 à 255
-32 768 à 32 767
-2147483648 à 2147483647
-3,4×1038 à 3,4×1038
-1,79×10308 à 1,79×10308
Séquence de caractères
Application
Window
Windows
Workbook
Workbooks
Worksheet
Sheets
Range ou Cells
Microsoft Excel
Une fenêtre
Collection de fenêtres
Un classeur
Collection de classeurs
Une feuille
Collection de feuilles
Collection de cellules
Déclaration d’une variable
Déclaration d’une référence à un objet
Dim nom_variable As type
nom_variable = valeur
Dim nom_référence As classe
Set nom_référence = nom_objet
Exemple
Exemple
Dim une_feuille As Worksheet
Set une_feuille = ActiveSheet
Dim i As Integer
i = 1
Fonctions de manipulation d’une chaîne de caractères
Len :
Mid :
Left :
Right :
UCase :
LCase :
IsNumeric :
Val :
Asc :
Chr :
InStr :
Longueur de la chaîne
Sous-chaîne
Début d’une chaîne
Fin d’une chaîne
La chaîne transformée en majuscules
La chaîne transformée en minuscules
Chaîne représente un nombre
Transforme une chaîne en nombre
Code ASCII d’un caractère
Symbole ASCII d’un code ASCII
Position d’une chaîne dans une autre.
Len("Allo") retourne 4
Mid("Allo toi", 3, 4) retourne "lo t"
Left("Allo", 2) retourne "Al"
Right("Allo", 2) retourne "lo"
UCase("Allo") retourne "ALLO"
LCase("Allo") retourne "allo"
IsNumeric("Allo") retourne False
Val("123") retourne 123
Asc("A") retourne 65
Chr(65) retourne "A"
InStr("Salut", "lu") retourne 3
InStr("Salut", "w") retourne 0
Tableaux statiques
Tableaux dynamiques
Dim nom(1 To n, ...) As type
Dim nom() As type
Exemples
Exemples
Dim tab1(1 To 10) As Integer
Dim tab2(1 To 10, 1 To 10) As Double
Dim tab1() As Double
ReDim tab1(1 To 10)
ReDim Preserve tab1(1 To 25)
Fonctions prédéfinies
Exemples
LBound : Borne inférieure du tableau
UBound : Borne supérieure du tableau
Dim tab1(1 To 10, 5 To 25) As Double
LBound(tab1, 1) retourne 1
UBound(tab1, 1) retourne 10
LBound(tab1, 2) retourne 5
UBound(tab1, 2) retourne 25
Types définis par l’utilisateur
Exemple
portée Type nom_du_type
champ1 As type
champ2 As type
…
End Type
Public Type pont
nom As String
annee_construction As Integer
longueur As Double
End Type
Opérateurs
... arithmétiques :
... relationnels :
... logiques :
... de concaténation :
Exemples
+ - * / \ Mod ^
< <= = >= > <>
And Or Not
&
17 Mod 5 vaut 2 et 5 ^ 3 vaut 125
15 <> 13 vaut True
"Allo" & " toi" vaut "Allo toi"
Instructions conditionnelles
Exemple
If expression booléenne Then
...
ElseIf expression booléenne Then
...
Else
...
End If
If x > 0
Call
ElseIf x
Call
Else
Call
End If
Facultatif
19
Then
MsgBox(x & " est positif")
< 0 Then
MsgBox(x & " est négatif")
MsgBox(x & " vaut 0")
Boucles
…avec une condition d’entrée (3 syntaxes)
…avec une condition de sortie (2 syntaxes)
While expression booléenne
…
Wend
Do Until expression booléenne
…
Loop
Do
Do
…
Loop While expression booléenne
…
Loop Until expression booléenne
…avec un compteur
Exemple
For compteur = a To b Step saut
...
Next compteur
For i = 5 To 1 Step -1
Call MsgBox(i)
Next compteur
Exemple
…parcourant une collection
For Each élément In collection
...
Next element
Dim cellule As Range
For Each cellule In Range("A1:A9")
cellule.value = 0
Next cellule
Procédures
Fonctions
portée Sub nom(paramètres)
...
End Sub
portée Function nom(paramètres) As type
...
nom = valeur de retour
End Function
Accès à une plage de données
Exemples
Feuille.Range(référence)
Feuille.Range(cellule1, cellule2)
Feuille.Cells(ligne, colonne)
Feuille.Rows(numéro)
Feuille.Columns(numéro)
Range("A1:E5")
Range(Cells(1, 1), Cells(5, 5))
Cells(1, 1)
ActiveSheet.Rows(1)
ActiveSheet.Columns(3)
Propriétés d’un objet de la classe Range
Exemples
.Cells :
.Column :
.Count :
.Font :
.Formula :
.Row :
.Value :
.CurrentRegion
Range("A1:E10").Cells(3, 2)
'
Range("C6").Column
'
Range("A1:E10").Count
'
Range("A1").Font.Bold = True
Range("A1").Formula = "=3 * 4"
Range("C6").Row
'
Cells(1, 1).value = 5
Cells(1, 1).CurrentRegion
Cellule dans une plage
Colonne de la cellule
Nombre de cellules dans la plage
Police de la plage
Formule dans la cellule
Ligne de la cellule
Valeur de la cellule
Plage des cellules adjacentes
Méthodes et propriétés diverses
Feuille.Rows(n).Delete :
Collection.Count :
.ListIndex
.Value
Vaut 6
Exemples
Efface une ligne
Nb. éléments de la
collection
Propriétés d’un objet ComboBox (liste
déroulante)
.AddItem(chaine)
.Clear()
.ListCount
Cellule B3
Vaut 3
Vaut 50
Ajoute un élément à la liste
Vide la liste
Nombre d’éléments dans la liste
Indice de l’élément courant (-1 si
aucun élément n’est sélectionné)
Valeur de la sélection courante
ActiveSheet.Rows(2).Delete
ActiveSheet.Rows.Count ' Nb. de lignes.
WorkSheets.Count
' Nb. de feuilles.
Exemples
Liste.AddItem(“ETS”) ' Ajoute ETS à la liste
Liste.Clear
Liste.ListCount
Liste.ListIndex = 0 ' Sélectionne le premier
' élément de la liste.
If (Liste.Value = “ETS”) Then
Fonctions nécessaire à l’accès aux fichiers
Retourne un numéro de fichier disponible
Ouvre un fichier
Exemples
FreeFile()
Open
Close
Print #
Input #
Ferme un fichier préalablement ouvert
Écrit des données dans un fichier texte
Lit une ligne dans un fichier texte
Put #
Écrit dans un fichier binaire
Get #
Lit dans un fichier binaire
numero_fichier = FreeFile()
Open "test.txt" For Output As numero_fichier
Open "test.bin" For Binary Access Write As _
numero_fichier
Close #numero_fichier
Print #numero_fichier, "Bonjour"
Dim ligne As String
Input #numero_fichier, ligne
Dim tab_entiers(10) As Integer
Put #numero_fichier, tab_entiers
Dim tab_entiers(10) As Integer
Get #numero_fichier, , tab_entiers
20