IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Au Pied Levé - À Main Levée

[TUTORIEL] Représentation graphique (pyramide) de la structure d'une population

Noter ce billet
par , 01/04/2021 à 11h00 (250 Affichages)
Exercice corrigé d’algorithmique (Force 4/7)

Public :
  • étudiants
  • débutants
  • et pourquoi pas, enseignants

Contenu :
  • Algorithme,
  • Algorigramme
  • Logique séquentielle
  • Logique combinatoire
  • Langage SQL
TUTORIEL

Représentation graphique (pyramide) de la structure d'une population

■ ■ ■ SOMMAIRE DU BILLET ■ ■ ■

  • AVANT-PROPOS
    • Présentation du sujet et du type de document
    • Motivations et raisons ayant poussé à étudier le sujet
    • Précision de l’objectif poursuivi
    • Difficultés rencontrées

  1. La problématique
    • Anecdote
    • Pyramide des sélections des internatioaux français d'athlétisme
    • Pyramide des longévités des internatioaux français d'athlétisme
  2. La table BDD
  3. L'algorithme de la pyramide des sélections
    • Les variables
    • Les données
    • Les traitements
  4. Le programme

  • ANNEXE
    • Commandes HP-PCL/5
    • Commandes HP-GL/2
■ AVANT-PROPOS

Une pyramide est constituée de deux histogrammes juxtaposés où le premier critère, les effectifs, est porté horizontalement et le second critère, ordonné verticalement.

  • Présentation du sujet et du type de document

    Il s’agit de disséquer pédagogiquement l’algorithme d’un programme de représentation graphique de la structure d’une population sous la forme d’une pyramide.

    À l’origine, c’est une interrogation à propos de l’âge des candidats aux formations académiques qui a inspiré la programmation d’une représentation graphique de cette population sous la forme d’une pyramide des âges.

    La population administrative de la pyramide des âges étant hétérogène, il a été préférable pour simplifier la pédagogie de ce tutoriel, de choisir une population homogène, sans considération de grade, ni de situation administrative.

    Pour cet exercice corrigé, la population choisie, portée horizontalement, concerne les internationaux français d’athlétisme et le critère ordonné verticalement concerne leur nombre de sélections.

    Dans un contexte bureautique, Excel ferait sans doute ça bien mieux mais nous sommes dans un contexte de gestion d’une Base de Données Informix ISQL.

  • Motivations et raisons ayant poussé à étudier le sujet

    Observer pédagogiquement la réalisation d’un programme de gestion original, complet, simple, intéressant.

    Montrer que le développement est autant une affaire de technicité que de créativité.

    Le programme proposé (Pyramide des sélections des internationaux d’athlétisme) permet d’aborder deux logiques différentes mais complémentaires, la logique séquentielle et la logique combinatoire. L’une et l’autre sollicitent une forme de réflexion différente.

    Le programme, de type batch, est structuré en deux parties :

    1. La première partie construit la table temporaire des données à l’aide de requêtes SQL.
      Son algorithme fait appel à la logique séquentielle.

    2. La deuxième partie, c’est la procédure proprement dite qui traite la table temporaire.
      Son algorithme fait appel à la logique combinatoire.

  • Précision de l’objectif poursuivi

    C’est l’application de ce que disait Napoléon Bonaparte :

    « Un bon croquis vaut mieux qu’un long discourt ».

    L’algorithme a un intérêt pédagogique mais pas seulement, il peut servir de modèle pour représenter graphiquement sous forme d’une pyramide ou d’un simple histogramme horizontal bien d’autres structures mettant en rapport deux critères à comptabiliser. Son utilisation ne dépend que de notre imagination.

    Trois exemples parmi d’autres :

    • Nombres de stages/mois ayant fait l’objet d’une convocation des stagiaires par courriels.
    • Bénéfices mensuels générés grâce à l’envoi des convocations par courriels plutôt que par envoi postal.
    • Nombre de candidats à un concours selon leurs notes à une épreuve, selon leurs notes d’admissibilité ou d’amission.

  • Difficultés rencontrées

    Le challenge était de trouver parmi plus de 2.000 programmes développés, un programme "référent" susceptible de devenir un tutoriel d’algorithmique représentatif de notre réalité de développeur. Les problématiques de gestion sont toutes très spécifiques et leurs programmes ne sont guère recyclables hors de leur contexte. Le programme-support de ce tutoriel n’est d’ailleurs que le substitut d’un programme réel.

    La première difficulté technique rencontrée concerne l’utilisation des langages HP-PCL/5 et HP-GL/2 des imprimantes Hewlett-Packard pour générer l’impression graphique d’un histogramme horizontal. La solution, c’est la documentation HP et l’expérience.

    La seconde difficulté technique concerne, lorsque c’est nécessaire, la conversion au format PDF du fichier d’impression. À l’époque, en 2002, le logiciel PCL2PDF ne savait pas convertir certains caractères semi-graphiques. Cela a nécessité le recours à des caractères de substitution (pipe, point central, underscore), d’où l’apparence particulière des pyramides jointes.


§ 1. La problématique

§ 1.1. Anecdote

Juin 2002, un vendredi soir… Malgré l’heure tardive, une poignée de responsables de la Formation Continue et l’informaticien qui développe leur application de gestion in situ, restent scotchés derrière leurs écrans. La semaine a été particulièrement intense et les esprits ont du mal à décrocher, à envisager la rupture du week-end et surtout à anticiper la rupture imminente des deux mois de vacances. Finalement, avant de partir, ils se retrouvent pour un moment de convivialité autour d’un apéritif "improvisé". Les échanges alternent préoccupations professionnelles du moment et défoulements habituels sur l’informatique et l’informaticien.

C’est dans ce contexte informel que quelqu’un suggère :

- "Ce serait intéressant d’avoir une idée de l’âge de nos futurs stagiaires ? Vous en pensez quoi ?"

- "Une pyramide des âges, ça vous conviendrait ? J’ai ce qu’il faut dans ma Base de Données :
la date de naissance et la civilité de tout le personnel de l’académie."

- "Ça va te demander du temps, non ? Et c’est bientôt les vacances !"

- "Disons pour la fin de semaine prochaine. Je n’ai aucune idée de la façon dont je vais m’y prendre mais je verrai bien."

J’aime cette façon de travailler. On se parle, une idée germe et donne du grain à moudre pour un nouveau programme. J’ai le week-end pour y réfléchir.

Au final, ce sera une pyramide des âges paramétrable :

  • des personnels de l'académie
  • des personnels administratifs
  • des personnels enseignants
  • des personnels de l'académie flagués
  • des personnels administratifs flagués
  • des personnels enseignants flagués

Le programme terminé me donne une autre idée. Je développe en parallèle, en live bien sûr, une application de gestion des Examens-Concours. Rien de plus facile à partir de ma pyramide des âges de programmer un diagramme horizontal en bâtons pour visualiser diverses structures de la population des candidats en fonction de leurs notes à une épreuve, de leurs notes d’admissibilité ou de leurs notes d’admission.

Et puis, 10 mois plus tard, le statisticien de la Fédération Française d’Athlétisme me transmet son fichier des internationaux. Toujours à partir de ma pyramide des âges, je peux créer rapidement une pyramide des sélections et une pyramide des longévités.

Les algorithmes sont semblables, le premier critère reste une population, quelle qu’elle soit, et il n’y a que le deuxième critère qui change (âges, notes, sélections, longévités, etc.).

§ 1.2. Pyramide des sélections des internationaux français d’athlétisme

Nom : Pyramide H-F des sélections (Internationaux Français d'Athlétisme).jpg
Affichages : 55
Taille : 209,1 Ko

§ 1.3. Pyramide des longévités des internationaux français d’athlétisme

Nom : Pyramide H-F des longévités (Internationaux Français d'Athlétisme).jpg
Affichages : 52
Taille : 119,1 Ko

§ 2. La table BDD

create table "informix".ifa 
  (
    n_ifa integer not null constraint "informix".n103_4,
    selections integer,
    civilite char(3),
    nom_prenom char(100),
    nom_athlete char(100),
    nom_naiss char(20),
    nom_usage char(20),
    nom_div_1 char(20),
    nom_div_2 char(20),
    prenom char(20),
    jj_mm_aa char(10),
    d_naissance date,
    taille_poids char(10),
    taille smallint,
    poids smallint,
    specialite char(100),
    activite char(10),
    d_debut datetime year to year,
    d_fin datetime year to year,
    longevite smallint,
    flag char(1)
  );


§ 3. L'algorithme de la pyramide des sélections

Un programme batch est constitué de trois parties : les variables, les données et les traitements.


§ 3.1. Les variables

Le programme a besoin de ces huit variables de calcul :

{==============================================================================}
{}    VARIABLE ctr_hommes    INTEGER        { Longueur du bâton hommes         }
{}    VARIABLE ctr_femmes    INTEGER        { Longueur du bâton femmes         }
{}                                                                            {}
{}    VARIABLE ctr_count_H   INTEGER        { Nbre hommes même nbre sélections }
{}    VARIABLE ctr_count_F   INTEGER        { Nbre femmes même nbre sélections }
{}                                                                            {}
{}    VARIABLE tot_count_H   INTEGER        { Nbre total internationaux hommes }
{}    VARIABLE tot_count_F   INTEGER        { Nbre total internationaux femmes }
{}                                                                            {}
{}    VARIABLE pour_cent_H   FLOAT          { % hommes même nbre sélections    }
{}    VARIABLE pour_cent_F   FLOAT          { % femmes même nbre sélections    }
{==============================================================================}


§ 3.2. Les données

Dans un programme batch, les données nécessitent toujours la constitution d’une table temporaire unique à fournir aux traitements.

La constitution de cette table temporaire fait appel à une logique séquentielle dont les étapes successives, exécutée une seule fois, sont des requêtes SQL dont certaines fonctionnalités permettent de créer des attributs n’existant pas dans la BDD, comme le résultat d’un comptage, d’un calcul, d’un traitement particulier d’attribut (date, code…), etc.

Logique séquentielle de l’algorithme

L’algorithme ne se représente pas par un algorigramme graphique mais par une description linéaire de la démarche conceptuelle en termes simples, dans un langage naturel (pseudo langage).

ÉTAPES ALGORITHME PROGRAMME
1ère étape À partir de la table BDD "ifa" (Internationaux Français d’Athlétisme), constituer une table temporaire "t0" avec :

  • ifa_count_T = le nombre d’items de même identifiant "ifa_selections et ifa civilite"
  • ifa_selections = le nombre de sélections de chaque item de la table BDD "ifa"
  • ifa_civilite = la civilité de chaque item de la table BDD "ifa"
{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_T = nombre d'items "ifa_selection/ifa_civilite"                    }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_T,

           ifa.selections      ifa_selections,
           ifa.civilite        ifa_civilite

FROM       ifa

GROUP BY   ifa.selections,
           ifa.civilite

{=============================}  INTO TEMP t0;   {=============================}
2ème étape À partir de cette table temporaire "t0", déterminer le maximum d’items identiques "ifa_maximum".
Ce maximum constituera le bâton le plus grand du diagramme représenté par 800 pixels.
Dans notre contexte, le plus grand nombre d’items identiques concerne évidemment les internationaux n’ayant qu’une seule sélection.
Ce bâton qui sera la base de la pyramide devra être imprimé en dernier (voir la dernière étape de tri de la table temporaire finale).
{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_maximum = maximum d'items "ifa_selections/ifa_civilite"                  }
{             = le plus grand bâton du diagramme est représenté par 800 pixels }
{                                                                              }
{ Longueur    = ((ifa_count_T / ifa_maximum) * 800)                            }
{                                                                              }
{==============================================================================}

       MAX(ifa_count_T)        ifa_maximum

FROM       t0

{=============================}  INTO TEMP tT;   {=============================}
3ème étape À partir de la table temporaire "t0", déterminer le nombre total d’hommes (ifa_count_H).
{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_H = Nombre total d'Hommes                                          }
{                                                                              }
{ Pourcentage = (ifa_count_T / ifa_count_H) * 100                              }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_H

FROM       ifa

WHERE      ifa.civilite      = "M."

{=============================}  INTO TEMP tH;   {=============================}
4ème étape À partir de la table temporaire "t0", déterminer le nombre total de femmes (ifa_count_F).
{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_F = Nombre total de Femmes                                         }
{                                                                              }
{ Pourcentage = (ifa_count_T / ifa_count_F) * 100                              }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_F

FROM       ifa

WHERE      ifa.civilite     <> "M."

{=============================}  INTO TEMP tF;   {=============================}
5ème étape Constituer le fichier temporaire final à partir des informations des tables intermédiaires.

Trier ce fichier temporaire final :

  • en majeur par ordre décroissant des nombres de sélections.
    L’objectif est d’imprimer les plus grands nombres de sélections en premier.

  • en mineur par ordre croissant des civilités.
    L’objectif est de traiter l’item concernant les hommes (histogramme de gauche) avant celui des femmes (histogramme de droite).
{=============================}  SELECT  UNIQUE  {=============================}

           ifa_maximum         ifa_maximum,
           ifa_count_T         ifa_count_T,
           ifa_count_H         ifa_count_H,
           ifa_count_F         ifa_count_F,

           t0.*,

           ln.papier_blanc     ln_papier_blanc,
           ln.destination      ln_destination

FROM       t0,
           tT,
           tH,
           tF,
           ln

WHERE      ln.logname        = $p_logname

{===============================}  ORDER  BY  {================================}

           ifa_selections DESC,
           ifa_civilite   ASC

{==================================}  END  {===================================}

§ 3.3. Les traitements

Les traitements font l’objet d’un algorithme faisant appel à une logique combinatoire exécutée autant de fois que la table temporaire contient d’items.

Logique combinatoire : l’algorigramme

                                                        ┌─────────────────────────────┐
                                                 D-PROG │        Print en-tête        │
                                                        └──────────────┬──────────────┘
                                                                       │◄───────────────────────────────────────────────────────────────────────┐
                                                        ┌──────────────┴──────────────┐                                                         │
                                                 D-ITEM │ ctr_count_H  = 0            │                                                         │
                                                        │ ctr_count_F  = 0            │                                                         │
                                                        ├─────────────────────────────┤                                                         │
                                                        │  ifa_civilite :: "M."       │                                                         │
                                          = "M."        └──────────────┬──────────────┘        <> "M."                                          │
                                         ┌─────────────────────────────●─────────────────────────────┐                                          │
                          ┌──────────────┴──────────────┐                             ┌──────────────┴──────────────┐                           │
                          │ tot_count_H =               │                             │ tot_count_F =               │                           │
                          │ tot_count_H + ifa_count_T   │                             │ tot_count_F + ifa_count_T   │                           │
                          └──────────────┬──────────────┘                             └──────────────┬──────────────┘                           │
                                         └─────────────────────────────●─────────────────────────────┘                                          │
                                                        ┌──────────────┴──────────────┐                                                         │
                                                  INTER │  ifa_selections :: 0        │                                                         │
                                    = 0                 └──────────────┬──────────────┘                 > 0                                     │
                                   ┌───────────────────────────────────●───────────────────────────────────┐                                    │
                    ┌──────────────┴──────────────┐                                         ┌──────────────┴──────────────┐                     │
                    │    ifa_civilite :: "M."     │                                         │    ifa_civilite :: "M."     │                     │
                  = └──────────────┬──────────────┘<>                                     = └──────────────┬──────────────┘<>                   │
                 ┌─────────────────●─────────────────┐                                   ┌─────────────────●─────────────────┐                  │
  ┌──────────────┴──────────────┐     ┌──────────────┴──────────────┐     ┌──────────────┴──────────────┐     ┌──────────────┴──────────────┐   │
  │ ctr_count_H  = ifa_cout_T   │     │ ctr_count_H  = ifa_cout_T   │     │ Calcul longueur bâton gauche│     │ Calcul longueur bâton droite│   │
  │                             │     │                             │     │ Print du bâton Homme        │     │ rint du bâton Femme         │   │
  │                             │     │                             │     │ Rappel position du curseur  │     │ Rappel position du curseur  │   │
  │                             │     │                             │     │ Mémorisation du curseur     │     │ Mémorisation du curseur     │   │
  └──────────────┬──────────────┘     └──────────────┬──────────────┘     └──────────────┬──────────────┘     └──────────────┬──────────────┘   │
                 └─────────────────┬─────────────────┘                                   └─────────────────┬─────────────────┘                  │
                    ┌──────────────┴──────────────┐                                         ┌──────────────┴──────────────┐                     │
                    │              ϕ              │                                         │              ϕ              │                     │
                    └──────────────┬──────────────┘                                         └──────────────┬──────────────┘                     │
                                   └────────────────────────────────────●──────────────────────────────────┘                                    │
                                                         ┌──────────────┴──────────────┐                                                        │
                                                   INTER │  ifa_selections :: 0        │                                                        │
                                           = 0           └──────────────┬──────────────┘          <> 0                                          │
                                          ┌─────────────────────────────●─────────────────────────────┐                                         │
                           ┌──────────────┴──────────────┐                             ┌──────────────┴──────────────┐                          │
                           │ PRINT Nbre de sélections    │                             │     PRINT pour_cent_H       │                          │
                           │       non renseigné         │                             │     PRINT ctr_count_H       │                          │
                           │                             │                             │     PRINT ifa_selections    │                          │
                           │                             │                             │     PRINT ctr_count_F       │                          │
                           │                             │                             │     PRINT pour_cent_F       │                          │
                           └──────────────┬──────────────┘                             └──────────────┬──────────────┘                          │
                                          └─────────────────────────────●─────────────────────────────┘                                         │
                                                         ┌──────────────┴──────────────┐                                                        │
                                                  F-ITEM │              ϕ              │                                                        │
                                                         └──────────────┬──────────────┘                                                        │
                                                                        ●───────────────────────────────────────────────────────────────────────┘
                                                         ┌──────────────┴──────────────┐
                                                  F-PROG │     PRINT tot_count_H       │
                                                         │     PRINT tot_count_F       │
                                                         └─────────────────────────────┘




§ 4. Le programme

{================================ selections  =================================}
{                                                                              }
{   ACE    :  selections.ace                                                   }
{                                                                              }
{   SHELL  :  ../shell/selections                                              }
{                                                                              }
{   AUTEUR :  APL-AML                                                          }
{                                                                              }
{   Objet  :  Pyramide des sélections des Internationaux Français d'Athlétisme }
{                                                                              }
{   Date   :  10 Mars 2003                                                     }
{                                                                              }
{==============================================================================}

                           {========================}
{==========================} DATABASE gifa      END {==========================}
                           {========================}

{================================}  DEFINE  {==================================}
{}                                                                            {}
{}    PARAM[1] p_c_bdd       CHAR(1)                                          {}
{}    PARAM[2] p_logname     CHAR(8)                                          {}
{}                                                                            {}
{}    VARIABLE ctr_hommes    INTEGER                                          {}
{}    VARIABLE ctr_femmes    INTEGER                                          {}
{}                                                                            {}
{}    VARIABLE ctr_count_H   INTEGER                                          {}
{}    VARIABLE ctr_count_F   INTEGER                                          {}
{}                                                                            {}
{}    VARIABLE tot_count_H   INTEGER                                          {}
{}    VARIABLE tot_count_F   INTEGER                                          {}
{}                                                                            {}
{}    VARIABLE pour_cent_H   FLOAT                                            {}
{}    VARIABLE pour_cent_F   FLOAT                                            {}
{}                                                                            {}
{}    VARIABLE ESC           CHAR(1)                                          {}
{}    VARIABLE NEED_LINES    SMALLINT                                         {}
{}    VARIABLE NBR_LINES     SMALLINT                                         {}
{}    VARIABLE TOP_OF_PAGE   SMALLINT                                         {}
{}                                                                            {}
{==================================}  END  {===================================}

{==================================  INPUT  ===================================}
{}                                                                            {}
{     PROMPT FOR v_dp USING " OSMOSE : "                                       }
{}                                                                            {}
{===================================  END  ====================================}

{================================}  OUTPUT  {==================================}
{}                                                                            {}
{     REPORT TO PRINTER                                                        }
{}    REPORT TO PIPE "cat > ${LOGNAME}.prt"                                   {}
{}    TOP    MARGIN 0                                                         {}
{}    BOTTOM MARGIN 0                                                         {}
{}    LEFT   MARGIN 0                                                         {}
{}    TOP OF PAGE   "^L"                                                      {}
{}    PAGE   LENGTH 300                                                       {}
{}                                                                            {}
{==================================}  END  {===================================}

 
{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_T = nombre d'items "ifa_selection/ifa_civilite"                    }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_T,

           ifa.selections      ifa_selections,
           ifa.civilite        ifa_civilite

FROM       ifa

GROUP BY   ifa.selections,
           ifa.civilite

{=============================}  INTO TEMP t0;   {=============================}

{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_maximum = maximum d'items "ifa_selections/ifa_civilite"                  }
{             = bâton le plus grand du diagramme représenté par 800 pixels     }
{                                                                              }
{ Longueur    = ((ifa_count_T / ifa_maximum) * 800)                            }
{                                                                              }
{==============================================================================}

       MAX(ifa_count_T)        ifa_maximum

FROM       t0

{=============================}  INTO TEMP tT;   {=============================}

{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_H = Nombre total d'Hommes                                          }
{                                                                              }
{ Pourcentage = (ifa_count_T / ifa_count_H) * 100                              }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_H

FROM       ifa

WHERE      ifa.civilite      = "M."

{=============================}  INTO TEMP tH;   {=============================}

{=============================}  SELECT  UNIQUE  {=============================}
{                                                                              }
{ ifa_count_F = Nombre total de Femmes                                         }
{                                                                              }
{ Pourcentage = (ifa_count_T / ifa_count_F) * 100                              }
{                                                                              }
{==============================================================================}

              count(*)         ifa_count_F

FROM       ifa

WHERE      ifa.civilite     <> "M."

{=============================}  INTO TEMP tF;   {=============================}

 
{=============================}  SELECT  UNIQUE  {=============================}

           ifa_maximum         ifa_maximum,
           ifa_count_T         ifa_count_T,
           ifa_count_H         ifa_count_H,
           ifa_count_F         ifa_count_F,

           t0.*,

           ln.papier_blanc     ln_papier_blanc,
           ln.destination      ln_destination

FROM       t0,
           tT,
           tH,
           tF,
           ln

WHERE      ln.logname        = $p_logname

{===============================}  ORDER  BY  {================================}

           ifa_selections DESC,
           ifa_civilite   ASC

{==================================}  END  {===================================}

{=================================}  FORMAT  {=================================}

{----------------------} BEFORE GROUP OF ifa_selections {----------------------}

LET ctr_count_H  = 0
LET ctr_count_F  = 0

PRINT ESC, "&f0S";

{----------------------------  FIRST PAGE  HEADER  ----------------------------}

{------------------------------}  PAGE  HEADER  {------------------------------}

LET ESC     = ASCII 027

IF PAGENO = 1
THEN PRINT ESC,"E", ESC, "&k0g4S", ESC, "&l26a6.5C",
           ESC, ln_papier_blanc, ESC, "&a0L", ESC, "(s3B", ESC, "(10U",
           "Date du bilan : Le ", TODAY, 1 SPACE, ASCII 254, 1 SPACE, TIME
ELSE PRINT "Date du bilan : Le ", TODAY, 1 SPACE, ASCII 254, 1 SPACE, TIME

SKIP 2 LINES

PRINT "Pyramide des sélections Hommes/Femmes"

SKIP 2 LINE
{
PRINT COLUMN 90, PAGENO USING "###."
}
PRINT "┌────┬─────┬────────────────────────────────",
            "┬────┬────────────────────────────────┬─────┬────┐"

PRINT "│ %  │TOTAL│    HOMMES (de 1896 à 2002)     ",
            "│Nbre│    FEMMES (de 1918 à 2002)     │TOTAL│ %  │"

PRINT "├────┼─────┼────────────────────────────────",
            "┼────┼────────────────────────────────┼─────┼────´"

LET TOP_OF_PAGE = 1
{
PRINT ESC, "*p1100X", ifa_maximum
}
{-------------------------------  PAGE TRAILER  -------------------------------}

{------------------------------}  ON EVERY ROW  {------------------------------}

{--------------------------  TRAITEMENT FIN DE PAGE  --------------------------}

{------------------------  TRAITEMENT EN-TETE DE PAGE  ------------------------}

{------------------------  TRAITEMENT  LIGNE COURANTE  ------------------------}

IF ifa_civilite = "M."
THEN LET tot_count_H = tot_count_H + ifa_count_T
ELSE LET tot_count_F = tot_count_F + ifa_count_T

IF ifa_selections > 0
THEN IF ifa_civilite = "M."
     THEN BEGIN
          LET ctr_count_H = ifa_count_T
          LET ctr_hommes  = 1100 - ((ifa_count_T / ifa_maximum) * 800)

          PRINT ESC, "*p", ctr_hommes USING "<<<<", "x-30Y";

          LET ctr_hommes  = 1100 - ctr_hommes

          PRINT ESC, "*c", ctr_hommes USING "<<<<", "a30b0P",
                ESC, "&f1S",
                ESC, "&f0S";
          END
     ELSE BEGIN
          LET ctr_count_F =   ifa_count_T
          LET ctr_femmes  = ((ifa_count_T / ifa_maximum) * 800) + 1

          PRINT ESC, "*p1250x-30Y",
                ESC, "*c", ctr_femmes USING "<<<<", "a30b0P",
                ESC, "&f1S",
                ESC, "&f0S";
          END
ELSE IF ifa_civilite = "M."
     THEN LET ctr_count_H = ifa_count_T
     ELSE LET ctr_count_F = ifa_count_T

{----------------------} AFTER GROUP OF ifa_selections  {----------------------}

LET pour_cent_H = 0
LET pour_cent_F = 0

IF ctr_count_H > 0 THEN LET pour_cent_H = (ctr_count_H / ifa_count_H) * 100
IF ctr_count_F > 0 THEN LET pour_cent_F = (ctr_count_F / ifa_count_F) * 100

IF pour_cent_H < 0.1 THEN LET pour_cent_H = ""
IF pour_cent_F < 0.1 THEN LET pour_cent_F = ""

IF ctr_count_H = 0 THEN LET ctr_count_H = ""
IF ctr_count_F = 0 THEN LET ctr_count_F = ""

IF ifa_selections IS NOT NULL
THEN PRINT ESC, "&f1S",
           "│",
           pour_cent_H    USING "#&.#",
           "│",
           ctr_count_H    USING "# ###",
           "│                                │",
           ifa_selections USING " ## ",
           "│                                │",
           ctr_count_F    USING "# ###",
           "│",
           pour_cent_F    USING "#&.#",
           "│"
ELSE BEGIN
     PRINT ESC, "&f1S",
           "├────┼─────┼────────────────────────────────",
                 "┼────┼────────────────────────────────┼─────┼────´"

     PRINT ESC, "&f1S",
           "│    │",
           ctr_count_H    USING "# ###",
           "│Nbre de sélections non renseigné│",
           ifa_selections USING " ## ",
           "│Nbre de sélections non renseigné│",
           ctr_count_F    USING "# ###",
           "│    │"
     END

{------------------------------}  ON LAST ROW  {-------------------------------}

PRINT "├────┼─────┼────────────────────────────────",
            "┼────┼────────────────────────────────┼─────┼────´"

PRINT "│    │",
      tot_count_H USING "# ###",
      "│TOTAL HOMMES                    │    ",
      "│TOTAL FEMMES                    │",
      tot_count_F USING "# ###",
      "│    │"

PRINT "└────┴─────┴────────────────────────────────",
            "┴────┴────────────────────────────────┴─────┴────┘"

{==================================}  END  {===================================}

{=================================== SHELL ====================================}
{
# selections

clear

echo "┌PYRAMIDE DES SÉLECTIONS────────────────────────────────────────────────┐"
echo "│                                                                       │"
echo "└───────────────────────────────────────────────────────────────────────┘"
echo ""

cd ../shell

if test -f $(LOGNAME).prt
   then rm $(LOGNAME).prt
fi

SMSO=`tput smso`
RMSO=`tput rmso`

tput cup 3 0
echo " Traitement en cours... \c"

sacego -q ../ace/selections $BDD $LOGNAME

cat $(LOGNAME).prt | sed -f ../bull/isoTOpcl.sed > $(LOGNAME).pcl

../bull/pcl2pdf $(LOGNAME).pcl $(LOGNAME).pdf

cat $(LOGNAME).prt | sed -f ../bull/ISOtoPC-8.sed > $(LOGNAME).tmp
mv  $(LOGNAME).tmp $(LOGNAME).prt
lp  $(LOGNAME).prt > /dev/null

echo " TERMINE"
}
{==============================================================================}





■ ANNEXE

  • Commandes HP-PCL/5

    ┌───────────────────────────── COMMANDES HP─PCL/5 ─────────────────────────────┐
    │                                                                              │
    │ IMPORTANT : Respecter l'ordre des commandes                                  │
    │                                                                              │
    ├────────────────────── COMMANDES DE CONTRÔLE DE TRAVAUX ──────────────────────┤
    │                                                                              │
    │ ESC E     = RÉINITIALISATION                                                 │
    │ ESC &l0S  = RECTO SEUL              : Mode d'impression                      │
    │ ESC &l1S  = RECTO VERSO             : Marge reliure en long                  │
    │ ESC &l2S  =                         : Marge reliure en large                 │
    │ ESC &a0G  = PAGE SUIVANTE           : Sélection du côté de la feuille        │
    │ ESC &a1G  = RECTO                   : Sélection du côté de la feuille        │
    │ ESC &a2G  = VERSO                   : Sélection du côté de la feuille        │
    │                                                                              │
    ├─────────────────────── COMMANDES DE CONTRÔLE DE PAGE ────────────────────────┤
    │                                                                              │
    │ ESC &k0G    = TERMINAISON DE LIGNE  : CR = CR; LF = LF; FF = FF              │
    │                                                                              │
    │ ESC &l1H    = PROVENANCE DU PAPIER  : Bac supérieur                          │
    │ ESC &l4H    = PROVENANCE DU PAPIER  : Bac inférieur                          │
    │ ESC &l5H    = PROVENANCE DU PAPIER  : Bac A3 (HP 5Si, HP 8000)               │
    │                                                                              │
    │ ESC &l26A   = FORMAT DU PAPIER      : Format A4                              │
    │ ESC &l27A   = FORMAT DU PAPIER      : Format A3                              │
    │                                                                              │
    │ ESC &l1O    = ORIENTATION           : À l'italienne                          │
    │ ESC &l0O    = ORIENTATION           : À la française                         │
    │                                                                              │
    ├──────────────────────── MARGES ET LONGUEUR DU TEXTE ─────────────────────────┤
    │                                                                              │
    │ ESC &9      = EFFACEMENT DES MARGES : Marges horizontales                    │
    │ ESC &a6L    = MARGE DE GAUCHE       : 6 colonnes                             │
    │ ESC &l90U   = MARGE DE GAUCHE       : 90 décipoints (200 = 12mm)             │
    │ ESC &l#E    = MARGE SUPÉRIEURE      : # Nbre de lignes                       │
    │ ESC &l0E    = MARGE SUPÉRIEURE      : En nombre de lignes (0)                │
    │ ESC &l66F   = HAUTEUR DU TEXTE      : En nombre de lignes (66)               │
    │ ESC &l57P   = HAUTEUR DE PAGE       : En nombre de lignes (57)               │
    │                                                                              │
    ├─────────────────────── ESPACEMENT DES LIGNES ────────────────────────────────┤
    │                                                                              │
    │ ESC &l#C    = ESPACEMENT DES LIGNES : # Nbre de pas en 1/48"                 │
    │ ESC &l0C    = ESPACEMENT DES LIGNES : Index vertical = 0                     │
    │ ESC &l8C    = INDEX DE MOUVEMENT VMI: En 1/48" (=> 15 décipoints)            │
    │ ESC &l0C    = INDEX DE MOUVEMENT VMI: Index vertical = 0                     │
    │ ESC &l6D    = ESPACEMENT DES LIGNES : 6 lignes/pouce (=> ESC, "&l8C")        │
    │ ESC &l8D    = ESPACEMENT DES LIGNES : 8 lignes/pouce (=> ESC, "&l6C")        │
    │                                                                              │
    │ ESC &k0G    = TERMINAISON DE LIGNE  : CR = CR; LF = LF; FF = FF              │
    │                                                                              │
    ├───────────────────────────────── POLICES ────────────────────────────────────┤
    │                                                                              │
    │ ESC (1F     = JEU DE SYMBOLE        : ISO 69 : Français                      │
    │ ESC (10U    = JEU DE SYMBOLE        : PC-8                                   │
    │                                                                              │
    │ ESC &k4S    = DENSITE DE LA POLICE  : Élite (12.0)                           │
    │ ESC &k2S    = DENSITE DE LA POLICE  : Comprimé (16.5-16.7)                   │
    │                                                                              │
    │ ESC &(s0S   = STYLE   DE LA POLICE  : Romain                                 │
    │ ESC &(s1S   = STYLE   DE LA POLICE  : Italique                               │
    │                                                                              │
    │ ESC &(s0B   = GRAISSE DE LA POLICE  : Normal                                 │
    │ ESC &(s3B   = GRAISSE DE LA POLICE  : Gras                                   │
    │                                                                              │
    │ ESC (s0P    = ESPACEMENT POLICE PR. : Espacement fixe                        │
    │ ESC (s1P    = ESPACEMENT POLICE PR. : Espacement proportionnel               │
    │                                                                              │
    │ ESC (s#H    = DENSITE POLICE PRINC. : # nbre de caractères par pouce         │
    │ ESC &k0S    = DENSITE POLICE PRINC. : 10.0 caractères par pouce              │
    │ ESC &k2S    = DENSITE POLICE PRINC. : Comprimé (16.5-16.7)                   │
    │                                                                              │
    │ ESC (s40V   = TAILLE POLICE PRINC.  : Taille en nombre de points             │
    │                                                                              │
    │ ESC (s3T    = TYPE POLICE PRINC.    : Type de caractères courrier            │
    │ ESC (s4148T = TYPE POLICE PRINC.    : Type de caractères Univers             │
    │ ESC (s4101T = TYPE POLICE PRINC.    : Type de caractères CG Times            │
    │ ESC (s0T    = TYPE POLICE PRINC.    : Type de caractères LinePrinter         │
    │ ESC (10U ESC (s0p16.67h8.5v0s0b0T   : Type de caractères LinePrinter         │
    │                                                                              │
    ├───────────────────────── POSITIONNEMENT DU CURSEUR─ ─────────────────────────┤
    │                                                                              │
    │ ESC &f0S    = SAUVEGARDE CURSEUR    : Sauvegarde de la position du curseur   │
    │ ESC &f1S    = RAPPEL     CURSEUR    : Rappel de la position du curseur       │
    │                                                                              │
    │ ESC &a#R    = POSITIONNEMENT CURSEUR: vertical en nombre de points           │
    │ ESC &aR     = POSITIONNEMENT CURSEUR: En haut a gauche                       │
    │ ESC &a#V    = POSITIONNEMENT CURSEUR: Vertical   en nombre de décipoints     │
    │                                       RELATIF OU ABSOLU                      │
    │                                       1 inch = 720 decipoints                │
    │                                       (exemple : ESC &a+200V)                │
    │ ESC &a#H    = POSITIONNEMENT CURSEUR: Horizontal en nombre de décipoints     │
    │ ESC &a#C    = POSITIONNEMENT CURSEUR: Horizontal en nombre de colonnes       │
    │ ESC =       = POSITIONNEMENT CURSEUR: 1/2 saut de ligne                      │
    │                                                                              │
    ├────────────────────────────── Soulignemement ────────────────────────────────┤
    │                                                                              │
    │ ESC &d0D    = SOULIGNEMENT         : Soulignement actif continu              │
    │ ESC &d3D    = SOULIGNEMENT         : Soulignement actif flottant             │
    │ ESC &d@     = SOULIGNEMENT         : Soulignement désactivé                  │
    │                                                                              │
    ├───────────────────────── Séquence d'initialisation ──────────────────────────┤
    │                                                                              │
    │ PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";      │
    │ PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"                        │
    │                                                                              │
    ├─────────────────────────── iIpression LANDSCAPE ─────────────────────────────┤
    │                                                                              │
    │ PRINT ESC, "&k2S", ESC, "&l1o76p4H", ESC, "&l6C", ESC, "&a15L", ESC, "(1F";  │
    │                                                                              │
    ├──────────────────────────────────────────────────────────────────────────────┤
    │                                                                              │
    │ Impression A4 (Extrait de ../ace/om.ace)                                     │
    │                                                                              │
    │ PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";      │
    │                                                                              │
    │ IF if_omp_non = "N"                                                          │
    │ THEN PRINT ESC, ln_pre_imprime,  ESC, ln_destination;                        │
    │ ELSE PRINT ESC, ln_papier_blanc, ESC, ln_destination;                        │
    │                                                                              │
    │ IF p_traitement = "D"                                                        │
    │ THEN PRINT ESC, "&l1X"                                                       │
    │ ELSE PRINT ESC, "&l2X"                                                       │
    │                                                                              │
    │ SKIP 1 LINE                                                                  │
    │                                                                              │
    │ PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"                        │
    │                                                                              │
    ├──────────────────────────────────────────────────────────────────────────────┤
    │                                                                              │
    │ Impression A4 ou A3 (Extrait de ../ace_1/confirme.ace)                       │
    │                                                                              │
    │ IF p_format = "A4"                                                           │
    │ THEN PRINT ESC, "E", ESC, "&f0S", ESC, "&k0g4S", ESC, "&l26a1h0o1x7C",       │
    │            ESC, "&a5L", ESC, "(10U", ESC, "(s3B";                            │
    │ ELSE PRINT ESC, "E", ESC, "&f0S", ESC, "&k0g4S", ESC, "&l27a5h1o1x7C",       │
    │            ESC, "&a105L", ESC, "(10U", ESC, "(s3B";                          │
    │                                                                              │
    ├──────────────────────────────────────────────────────────────────────────────┤
    │                                                                              │
    │ Impression RECTO/VERSO + formulaire (Extrait de ../ace_mj/mj_convoc.ace)     │
    │                                                                              │
    │ 1. RECTO                                                                     │
    │                                                                              │
    │ IF PAGENO = 1                                                                │
    │ THEN PRINT ESC, "&k0g4S", ESC, "(10U", ESC, "&l1S", ESC, "&l6.5c0e1X",       │
    │            ESC, "&aR", ESC, "&a1g7L", ESC, "&9";                             │
    │ ELSE PRINT ESC, "&l6.5c0E", ESC, "&aR", ESC, "&a1g7L", ESC, "&9";            │
    │                                                                              │
    │ etc.                                                                         │
    │                                                                              │
    │ 2. VERSO                                                                     │
    │                                                                              │
    │ PRINT ESC,"&a0G", ESC,"&a7480v1910H", ESC,"*c760a230b15g2P", ESC,"*v0n1O"    │
    │                          Y    X             L   H                            │
    │ IF  tj_c_tj   = "SE"                                                         │
    │ THEN  PRINT FILE "../file/fd_se.file"                                        │
    │ ELSE  PRINT FILE "../file/fd_ie.file"                                        │
    │                                                                              │
    │ 3. ../file/fd_se.file :                                                      │
    │                                                                              │
    │ ESC, "&l8c0e69F", ESC, "&aR", ESC, "9", ESC, "&l0O", ESC, "&l0C"             │
    │                                                                              │
    │ ESC, "&f0S", ESC, "(10U", ESC, "(s0p12h10v0s0b3T", ESC, "&a+180V, etc...     │
    │ etc... ESC, "&l6D", ESC, "&f1S"                                              │
    │                                                                              │
    └──────────────────────────────────────────────────────────────────────────────┘
    
    Premières séquences d'échappement d'un programme d'édition :
    
    {================================}  DEFINE  {==================================}
    {}                                                                            {}
    {}    VARIABLE ESC             CHAR(1)                                        {}
    {}                                                                            {}
    {==================================}  END  {===================================}
    
    {------------------------------}  PAGE  HEADER  {------------------------------}
    
    LET ESC = ASCII 027
    
    PRINT ESC, "E", ESC, "&l8c0e70F", ESC, "&aR",ESC, "9", ESC, "&l0o6.5C";
    PRINT ESC, "(10U", ESC, "(s0p12h10v3b3T", ESC, "&a7L"
    
    {------------------------------------------------------------------------------}
    
    PRINT ESC, "(s1p14v3b16602T"
    PRINT "Texte…"
    PRINT ESC, "(s0p10v0b3T"
    
    {------------------------------------------------------------------------------}
    

  • Commandes HP-GL/2

    ┌───────────────────────────── COMMANDES HP─GL/2 ──────────────────────────────┐
    │                                                                              │
    │Avec un minimum de commandes HP-GL/2, on peut facilement ajouter un peu de    │
    │fantaisie à l qualité bureautique que permet déjà le langage HP-PCL 5/6 avec  │
    │ses commandes usuelles.                                                       │
    │                                                                              │
    │La séquence ci-dessous :                                                      │
    │                                                                              │
    │  - INnitialise (IN) et Sélectionne la Plume (SP),                            │
    │  - PU (Pen Up), le stylo est levé et se déplace vers les coordonnées (x,y)   │
    │  - génère un rectangle,                                                      │
    │  - grise l'intérieur de ce rectangle,                                        │
    │  - imprime en défonce un texte en police Univers,                            │
    │  - remet le type de remplissage en noir pour mettre fin au remplissage       │
    │    "fantaisie" précédent,                                                    │
    │  - réinitialise la police principale.                                        │
    │                                                                              │
    │Défonce : remplissage des caractères du texte en blanc uni.                   │
    │                                                                              │
    │PRINT COLUMN  20, ESC, "%0B", "IN", "SP1",                                    │
    │                  "PU2200,6600", "EA5680,6860", ESC, "%0A",                   │
    │                  ESC, "*c1030a80b45g2P", ESC, "*v0n1O", ESC, "*v1T",         │
    │                                                                              │
    │                  ESC, "(s1p14v3b4101T",                                      │
    │                  ESC, "*p+60y+60X", "ORDRE DE MISSION ",                     │
    │                  ESC, "(s1p12v3b4101T",                                      │
    │                  " (modification)", ESC, "*v0T"                              │
    │PRINT             ESC, "(s0p10v0b3T"                                          │
    │                                                                              │
    │PCL2PDF (2007) :                                                              │
    │                                                                              │
    │Si l'on est amené à utiliser ce logiciel pour générer un fichier PDF il faut  │
    │qu'il gère mal cette séquence. Le rectangle apparaît dissocié de l’espace     │
    │grisé. Par contre, le rendu du grisé est d'une bien meilleure qualité.        │
    │                                                                              │
    └──────────────────────────────────────────────────────────────────────────────┘
    





FIN - Exercice corrigé d’algorithmique (Force 4/7)

Représentation graphique (pyramide) de la structure d'une population


Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Viadeo Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Twitter Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Google Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Facebook Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Digg Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Delicious Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog MySpace Envoyer le billet « [TUTORIEL] Représentation graphique (pyramide) de la structure d'une population » dans le blog Yahoo

Mis à jour 24/02/2024 à 08h15 par APL-AML

Catégories
Programmation , ■ ALGORITHMIQUE