Atelier 04: Programmer, Automatiser
Note : (facultatif) S’il y a des questions dans ce labo, répondez y dans un fichier nommé
./labo/reponse-labo-XX.md
. XX
étant le numéro de l’atelier. Le fichier doit être dans un format Markdown
.
Utiliser un projet privé
nommé inf3135-h2021
pour déposer le fichier demandé.
Utiliser le même format de fichier pour tous les exercices.
Format du fichier Markdown
- Atelier {01..08} (Header 1)
- Exercice {1..n} (H2)
- Question {1..n} (H4)
- S
2
.E3
.Q1
(strong)est une valeur qui change bien sûr
- La réponse dans une section script (code block)
Note: Il est recommandé de versionner vos réponses aux exercices à l’aide de Git (en ligne de commande). Un seul dépôt est amplement suffisant pour tous les laboratoires.
Pourquoi versionner vos exercices avec Git: afin de vous entraîner à utiliser le logiciel (les commandes) naturellement. —-
Objectif de l’atelier : Livrer rapidement
1 - Programmer
Vous devez produire plusieurs programmes et produire plusieurs exécutables. Tous les programmes ont une fonction int main()
.
Les programmes sont les suivants :
progA.c
: aura une fonctionestTrie(int _a[], unsigned long _size)
pour savoir si le tableau d’entier est trié;- Le programme retourne, si le tableau est trié, un des codes de retour :
- 1 si trié
- 20 si non trié;
- Le programme retourne, si le tableau est trié, un des codes de retour :
progB.c
: aura une fonctioncompte(int _a[], unsigned long _size)
qui compte le nombre qui s’y retrouve le plus souvent;- Le programme retourne via le code de retour le décompte du nombre le plus souvent vu dans le tableau;
progC.c
: aura une fonctioninverse(unsigned char _a[], unsigned long _size)
qui inverse le tableau;- Le programme retourne via le code de retour le premier élements dans le tableau après le traitement;
Rappel le type char
est un très petit entier.
exemples afin de bien démarrer
int estTrie(int _a[]);
int main (){
// exemple de declarations + initialisation
int tab[] = {0,2,3,47,5,43,3,2,6,90,12,34,65,6,89,8};
...
unsigned long size = sizeof(tab)/sizeof(int); //le nombre d'elements
int ret = estTrie(tab, size); //exemple d'appel
...
}
int estTrie(int _a[], unsigned long _size) {
//votre implementation
}
2 - Makefile pour automatiser (la compilation…)
Finalement, créez un fichier Makefile
qui automatise les étapes de compilation du numéro précédent.
- Vous devez produire un Makefile complet qui compile :
progA
en une étape de compilation;progB
en deux étapes de compilation;progC
vous décidez ce que vous voulez.- La prise de décision est importante dans ce cours;
- Ajoutez à ce fichier Makefile une cible
clean
qui supprime le fichier.o
ainsi que l’exécutable; -
Utiliser
-std=c11 -Wall -pedantic
comme option de compilation. - Versionnez l’état actuel de votre projet avec Git.
Questions :
- Q1. Votre
Makefile
fonctionne-t-il, et quelle commande le prouve ? - Q2. Est-ce que le format (la structure) du fichier est important ?
- Q3. Puis-je changer le nom du fichier Makefile ?
- Q4. Quelle est la commande pour créer un exécutable (le programme A) ?
- Q5. Quelle est la commande pour supprimer les fichiers ?
- Q6. Quelle cible est la cible par défaut du Makefile ?
- Q7. Est-ce possible de retourner un code de retour négatif ?
3 - Remise
Vous devez travailler avec le gestionnaire de version git et GitHub. Il est important de faire une demande
de collaboration à JocelynBedard
pour que votre travail soit récupéré. Votre dépôt doit être nommé inf3135-h2021
en minuscule. La branche atelier04
doit exister, car c’est dans celle-ci que vous allez pousser vos fichiers.
Vous avez jusqu’à 23h59 le jour de l’atelier pour finir le travail. Vous ne devez jamais pousser des fichiers binaires dans votre gestionnaire de version.
Toujours inclure dans tous vos livrables un fichier nommé cp.txt
qui contient uniquement votre
code permanent
en majuscule.
Finalement, les fichiers suivants devraient exister : *.c
, Makefile
, cp.txt