Travail pratique 1
Guy Francoeur :copyright: édition H2021
L’objectif d’apprendre et réaliser un programme réaliste à l’aide du langage C. Cette fois nous allons un peu plus loin dans notre processus de création et de réflexion. Vous devez dans ce travail livrer un programme et du coude source de qualité qui tient compte de notions vues. Spécifiquement vous devez lire et produire des données sur l’entrée et la sortie standard respectivement.
De plus, vos sources seront maintenues dans un gestionnaire de version/source de type git.
La compréhension et la prise de décision sont aussi des objectifs à atteindre durant la mise en oeuvre, la réalisation, de vos travaux.
Le travail est à réaliser individuellement.
Sujet
Chaque session nous avons un sujet unique que nous traînons pendant plusieurs semaines. Cette fois encore, je continue avec cette bonne habitude. L’avantage est que nous n’avons pas à apprendre des sujets différents pour chaque travail pratique. Ainsi nous pouvons vraiment concentrer l’effort sur ce qui est important, c’est-à-dire la construction et la maintenance de logiciels. Pour nous c’est avec le langage C. Un langage de programmation important qui produit des logiciels dits performants, mais il n’en serait rien sans des programmeurs qui savent ce qu’ils font.
TSX-C est un projet qui concerne la bourse de Toronto. Nous allons manipuler des indices boursiers et les données qui s’y rattachent.
Description du travail
Vous devez dans un fichier nommé tp1.c
coder la fonction main()
du projet. Ce système
gère des données en entrée (stdin) et en sortie (stdout). La précision des manipulations est importante.
Il serait dommage de faire perdre à nos clients des sommes d’argent importantes, car nous avons livré des
programmes qui ne sont pas efficaces ou inexacts. Une erreur va surement faire la Une de l’actualité.
La date de livraison est importante et doit être respectée.
Le rôle du programme tp1.c
et de son exécutable est de traiter toutes les lignes de données. Dans
certains cas vous avez à produire des données sur le canal (stdout) de sortie standard. Le résultat
en sortie est celui qui sera évalué.
Le programme exécutable peut être lancé en ligne de commande avec différentes syntaxes :
$ ./tp1
$ cat file.dat | ./tp1
$ head -n 100 file.txt | ./tp1
$ ./tp1 < indices.txt
...
Vous devez réaliser le travail selon les contraintes suivantes:
- Les fichiers d’entête standard sont tous permis et uniquement ceux-ci;
Les questions (limitez-vous à max 2) devront toutes être posées dans le forum de discussion GitHub section Issues;Vous devez contribuer aux questions posées au moins une fois maximum deux fois;- Une demande de solution (réponse), comment faire ceci ou cela sera considéré comme un plagiat;
- Votre travail sera réalisé et livré dans le dépôt distant
inf3135-h2021
, toujours privé; - Les fichiers seront maintenus dans la branche nommée
tp1
; - La branche
main
commedéfaut
est pour les rétroactions et commentaires de l’enseignant; - Ne garder que les fichiers essentiels dans votre projet (dépôt distant);
- La gestion des répertoires doit se faire de façon complète à partir de votre répertoire de travail;
- votre répertoire de travail étant :
./
; - Vous ne pouvez pas utiliser
..
ou la commandecd
dans votre travail;
- votre répertoire de travail étant :
- La simplicité de vos livrables est exigée. Aucun code ésotérique ne sera accepté.
Définition :
- ésotérique : Se dit d’un mode d’expression, d’une œuvre qui n’est compréhensible que des initiés;
Synonyme :
- mystérieux : Qui est incompréhensible ou inexplicable;
Source : Larousse FR
Code emprunté
Si vous empruntez du code, vous devez ajouter une balise comme celle-ci
// CDSE - CODE DE SOURCE EXTERNE
// CDSE - SOURCE : url ou nom de la personne
// CDSE - RAISON DE L'EMPRUNT : blabla...
// CDSE DEBUT
... code c ici ...
// CDSE FIN
Détails du travail pratique
getQuote.sh
Dans un premier temps vous devez créer un fichier de script bash nommé getQuote.sh
. Le rôle de ce script
est de récupérer les données de chacun des indices listés dans le fichier ./data/indices.txt
.
Votre script va récupérer les données de chacun des indices en format JSON à l’aide du url suivant
https://query1.finance.yahoo.com/v7/finance/quote?symbols={INDICE}.to
et sauvegarder les
fichiers dans le répertoire ./data/
. Un fichier par indice nommé {INDICE}.json
. {INDICE}
est
par exemple le mot BCE
.
Exemples du contenu du fichier indices.txt
K
BCE
BNS
BLU
BMO
Exemple de données en format JSON
{
quoteResponse: {
result: [
{
language: "en-US",
region: "US",
quoteType: "EQUITY",
quoteSourceName: "Delayed Quote",
triggerable: true,
currency: "CAD",
exchange: "TOR",
shortName: "KINROSS GOLD CORP.",
longName: "Kinross Gold Corporation",
messageBoardId: "finmb_297179",
exchangeTimezoneName: "America/Toronto",
exchangeTimezoneShortName: "EST",
gmtOffSetMilliseconds: -18000000,
esgPopulated: false,
marketState: "CLOSED",
fiftyTwoWeekLowChangePercent: 1.3375001,
fiftyTwoWeekRange: "4.0 - 13.59",
fiftyTwoWeekHighChange: -4.24,
fiftyTwoWeekHighChangePercent: -0.3119941,
fiftyTwoWeekLow: 4,
fiftyTwoWeekHigh: 13.59,
earningsTimestamp: 1620763200,
earningsTimestampStart: 1620763200,
earningsTimestampEnd: 1620763200,
trailingAnnualDividendRate: 0.06,
trailingPE: 8.820756,
trailingAnnualDividendYield: 0.006486486,
epsTrailingTwelveMonths: 1.06,
epsForward: 0.13,
sharesOutstanding: 1258300032,
bookValue: 5.242,
fiftyDayAverage: 9.248788,
fiftyDayAverageChange: 0.1012125,
fiftyDayAverageChangePercent: 0.010943326,
twoHundredDayAverage: 10.600584,
twoHundredDayAverageChange: -1.2505836,
twoHundredDayAverageChangePercent: -0.11797309,
marketCap: 11766040576,
forwardPE: 71.92308,
priceToBook: 1.7836704,
sourceInterval: 15,
exchangeDataDelayedBy: 15,
tradeable: false,
firstTradeDateMilliseconds: 789921000000,
priceHint: 2,
regularMarketChange: 0.10000038,
regularMarketChangePercent: 1.0810852,
regularMarketTime: 1613163600,
regularMarketPrice: 9.35,
regularMarketDayHigh: 9.42,
regularMarketDayRange: "9.0 - 9.42",
regularMarketDayLow: 9,
regularMarketVolume: 4925454,
regularMarketPreviousClose: 9.25,
bid: 9.35,
ask: 9.38,
bidSize: 0,
askSize: 0,
fullExchangeName: "Toronto",
financialCurrency: "USD",
regularMarketOpen: 9.18,
averageDailyVolume3Month: 4464011,
averageDailyVolume10Day: 4198057,
fiftyTwoWeekLowChange: 5.3500004,
dividendDate: 1616025600,
market: "ca_market",
symbol: "K.TO"
}
],
error: null
}
}
tp1.c
Dans un deuxième temps vous devez travailler, dans votre programme tp1.c
, avec le fichier indices.txt
et les fichiers json
que vous avez téléchargés.
Vous devez récuperer pour chacun des indices les valeurs suivantes :
- fiftyTwoWeekLow
- fiftyTwoWeekHigh
- regularMarketPrice
- trailingAnnualDividendYield
Vous allez produire un tableau (une liste, un classement) des indices tel que dans la sortie ci-bas :
Sortie
Ici vous avez un exemple visuel seulement, les données ne sont pas valider ou vérifiable. Les indices sont sorties dans l’ordre qui’ils sont lus.
Exemple (colonnes : indice, classement, classe-dividend, prix marché, le dividend)
K C-1 DIV-1 9.35 0.00%
BCE C-2 DIV-2 19.77 3.77%
BNS C-3 DIV-2 90.99 4.77%
BLU C-1 DIV-1 11.34 2.22%
BMO C-4 DIV-3 77.50 7.77%
- Une tabulation est utilisé entre les colonnes.
Formules
C-1 | C-2 | C-3 | C-4 |
---|---|---|---|
<=25% | <=50% | <=75% | <=100% |
Cx = 1 - ((fiftyTwoWeekHigh - regularMarketPrice) / ( fiftyTwoWeekHigh - fiftyTwoWeekLow))
DIV-1 | DIV-2 | DIV-3 |
---|---|---|
<=3% | <= 6% | > 6% |
Contrainte additionnelle tous les nombres doivent être convertie en entier (long int) pour effectuer un calcule. Nous gardons trois décimales, ce qui veut dire que nous allons multiplier par 1000 et laisser tomber les autres décimales. Donc aucun calcul avec des float ou des doubles.
Makefile
Il est obligatoire d’inclure un fichier Makefile
dans votre projet pour faciliter la compilation
et les autres actions requises. Le makefile doit être complet. Un Makefile sans dépendance n’est surement pas complet.
Celui-ci doit minimalement offrir les services suivants :
- la cible
tp1
doit exister et la commande doit l’exécutabletp1
; - La commande
make
employée seule est similaire dans son comportement àmake tp1
; - Lorsqu’on entre
make clean
, le projet revient dans son état d’origine, c’est-à-dire son état lors de la récupération initiale; - Lorsqu’on entre
make indices
vous devez construire le fichierindices.txt
tel que décrit plus haut; - La cible
quote
exécute le scriptgetQuote.sh
- Les programmes seront compilés et évalués avec les options suivantes :
-Wall -Werror=vla -pedantic -std=c11
;-Wall -Werror=vla -pedantic -std=c11 -O2
;-Wall -Werror=vla -pedantic -std=c11 -Werror
;-Wall -Werror=vla -pedantic -std=c11 -Werror -O2
;
Complément
-std=c11
indique au compilateur de traiter le code selon le standard C11 (2011) (et donc de rejeter certaines extensions comme celles de GNU par exemple);-pedantic
permet de signaler les avertissements, ou warnings, selon la norme ISO;-Wall
permet de signaler un grand nombre d’autres warnings décrit dans le man gcc;-Werror=vla
indique au compilateur que la déclaration de tableaux de longueur variable n’est pas permise.
En effet, la grande permissivité de C réduit l’aide du compilateur (lorsqu’il n’y a pas d’option) pour traquer certaines erreurs et les mauvaises pratiques de programmation.
.gitignore
- Votre projet (dépôt distant) doit contenir uniquement les fichiers strictement nécessaires;
- Votre projet ne doit pas contenir de fichiers
objet
oubinaire
par exemple; - Le répertoire
data/
ne doit pas se retrouver dans le dépot distant.
README.md
Votre projet doit contenir un fichier nommé README.md
qui décrit le contenu et qui respecte le
format Markdown. Il doit minimalement contenir les informations ci-bas :
# Travail pratique X
## Auteur
Un tableau de deux colonnes `nom colonne` et la `valeur`
Identité Prénom Nom
CodeMS ab123456
CP ABCD12345678
## Votre fierté
<expliquez brièvement comment faire fonctionner votre projet>
## Difficultés rencontrées
<décrire les difficultés>
## Références
<citez vos sources ici>
## Listes Exigences
<une liste `check list` de toutes les fonctionnalités réalisées>
## Statut et auto-évaluation
<indiquez si le projet est complété ou s'il y a des bogues>
Remise
La totalité de votre travail doit être remise au plus tard le 21 mars 2021 à 22h59 HE (heure du Québec). Après cette date, une pénalité de 10 points par jour de retard sera appliquée.
Aucune remise par courriel ne sera acceptée (le travail sera considéré comme non remis).
La remise se fait obligatoirement par l’intermédiaire de la plateforme Github
.
Le nom de votre dépôt doit être inf3135-h2021
(en minuscules). Celui-ci est obligatoirement, privé.
Vous devez ajouter l’utilisateur guyfrancoeur
comme collaborateur. La demande de collaboration est le
moyen de rendre votre livrable accessible.
Votre projet devrait minimalement contenir, à la racine du dépôt, les fichiers de type Unix/Linux
et ascii
suivants :
- Un fichier
tp1.c
contenant le code source de votre projet, ainsi que votre fonctionmain
; - Un fichier
getQuote.sh
contenant vos instructions en fonction des requis; - Un fichier
README.md
selon le format proposé; - Un fichier
reflexion.md
qui démontre le processus de réflexion durant le travail; - Un fichier nommé
Makefile
complet et optimal; - Un fichier nommé
cp.txt
qui contient votre code permanent en majuscule; - Un fichier
.gitignore
.
Bonus
- Un fichier
YAML
nommétp1.yml
dans le répertoire approprié (pour avoir le bonus).
L’usage de la commande rm
dans votre travail est permise. Avec de grands pouvoirs viennent de grandes responsabilités.
Les travaux seront corrigés sur le serveur Java. Vous devez donc vous assurer que votre programme fonctionne tel que livré, sans modification sur celui-ci.
Barème de correction
Critère | Sous-critère | Points |
---|---|---|
Récupération | récupération sans problème et dépôt privée | 1.0 |
Makefile | complet et minimal (optimal) | 2.0 |
Compilation | sans avertissement ni erreur | 2.0 |
Fonctionnalité A | tests seront lancés (comparaison binaire) | 3.0 |
Fonctionnalité B | tests seront lancés (comparaison binaire) | 6.0 |
Branche (git) | nommée tp1 (branche de développement) | 1.0 |
Branche main | vide | 1.0 |
Fichier Unix | 1.0 | |
Markdown | 1.0 | |
Bonus | GitHub Action (YAML) | 1.0 |
Professionnel | Ne brise pas le processus de correction | 2.0 |
Total | 21/20 |
FIN.
Guy Francoeur :copyright: édition H2021