INF3135_H2021

Construction et maintenance de logiciels (langage C)

View project on GitHub

Travail pratique 1

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 comme dé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 commande cd dans votre travail;
  • 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écutable tp1;
  • 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 fichier indices.txt tel que décrit plus haut;
  • La cible quote exécute le script getQuote.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 ou binaire 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 fonction main;
  • 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