; ************************************************************ ; Programme: BULLETIN.TXT version PEP813 sous Windows ; ; Ce programme effectue le calcul d'un bulletin scolaire. ; ; Le bulletin est calculé à partir de 4 travaux pratiques dont le meilleur compte pour 45%, ; le deuxième meilleur 35%, le troisième meilleur 20% et le quatrième est oublié. ; ; auteur: Bernard Martin ; code permanent: non applicable ; courriel: martin.bernard@uqam.ca ; date: Eté 2020 ; cours: INF2171 ; *********************************************************** ; STRO msgbien,d ; bienvenue début: LDX 0,i LDA etudiant,d ; étudiant #X ADDA 1,i CPA 25,i ; maximum de 25 étudiants dans une classe BRLE max25 STRO msgmax25,d BR classe max25: STA tempo,d STRO msgdata1,d DECO tempo,d ; 1er ou 2ième ou 3ième ou 4ième ... CHARO "e",i CPA 1,i BRNE pasprem CHARO "r",i pasprem: STRO msgdata2,d ; ; lire 4 notes ; lecture: CALL LECTURE ; lire une note au terminal ; LDA nombre,d ; et l'inscrire dans le tableau des notes STA tableau,x ADDA total4,d STA total4,d ADDX 2,i CPX 8,i ; 4 notes BRLT lecture LDX avcaract,d CPX 10,i BRNE erreur ; STA total4,d ; total des 4 notes ASRA ; /4 ASRA ; STA moyenent,d ; pour calculer la moyenne partie entière ASLA ASLA ; SUBA total4,d ; une décimale différente de zéro ? BREQ decimal1 NEGA ; calculer cette partie décimale ASLA ADDA 1,i CPA 7,i BRNE decimal1 ADDA 1,i decimal1:STA moyendec,d ; partie décimale de la moyenne ; ; le meilleur TP compte pour 45%, ; le deuxième meilleur pour 35%, le troisième meilleur pour 20% et le quatrième est délaissé ; LDX 0,i calcul: STX compteur,d ; 0-45% 1-35% 2-20% LDA 0,i STA grand,d ; le plus grand <- 0 STA position,d ; position (X) dans le tableau LDX 0,i ; ; déterminer les 3 plus grandes notes ; boucle: LDA grand,d CPA tableau,x ; le plus grand ? BRGE petit LDA tableau,x STA grand,d STX position,d ; position retenue petit: ADDX 2,i CPX 8,i ; 4 notes ? BRLT boucle ; ; le plus grand se trouve à "position" ; LDX position,d LDA tableau,x ; valeur du plus grand NEGA STA tableau,x ; remplacée par sa valeur négative afin de la mettre de côté NEGA LDX compteur,d ; 0-45% 1-35% 2-20% LDBYTEX bareme,x CALL MULTIPLI ; note * % (45,35 ou 20) ; ADDA totalf,d ; total pour les notes finales STA totalf,d ; LDX compteur,d ; 3 notes à calculer ADDX 1,i CPX 2,i BRLE calcul ; LDA totalf,d ; arrondir le total des notes finales ADDA 5,i LDX 100,i CALL DIVISE ; ne conserver que la partie entière ; STX quotient,d STA reste,d STRO msgnotf,d ; NOTE FINALE DECO quotient,d CHARO '.',i ; ; 1 seule décimale requise pour la note finale ; LDA reste,d LDX 10,i CALL DIVISE ; STX quotient,d ; note moyenne DECO quotient,d STRO msgmoy,d DECO moyenent,d ; partie entière CHARO '.',i DECO moyendec,d ; partie décimale ; ; division par 10 pour ne conserver que 3 chiffres ; LDA totalf,d ADDA 5,i ; arrondir LDX 10,i CALL DIVISE ; ADDX etudtot,d ; totaliser toutes les notes finales de tous les étudiants de la classe STX etudtot,d ; ; divise note finale / 100 ; LDA totalf,d ; arrondissement de la note finale ADDA 50,i LDX 100,i CALL DIVISE ; STX totalf,d STX tempo,d LDX etudiant,d ASLX LDA tempo,d STA notes,x ; sauver la note d'un étudiant de la classe ; ; calcul de l'écart-type ; o= R [(S((X-u)^2))/(N)]. ; LDX 0,i addcarré:STX sauvex,d LDA tableau,x ; TP BRGE positif NEGA ; rendre positif positif: SUBA totalf,d STA tempo,d ; ; (note - moyenne )^2 ; LDX tempo,d CALL MULTIPLI ; ADDA totalc,d STA totalc,d ; total pour racine carrée LDX sauvex,d ADDX 2,i CPX 8,i ; 4 notes BRLT addcarré ; /4 ASRA ; /2 ANDA 0x7FFF,i ; rendre positif ASRA ; /2 STA nombre,d CALL RACINE ; racine carrée ; STRO msgécart,d ; écart-type DECO racine,d ; LDA etudiant,d ; compte le nombre d'étudiants ADDA 1,i STA etudiant,d ; ; préparation pour le prochain étudiant ; init: LDA 0,i STA total4,d STA totalc,d STA totalf,d STA grand,d BR début ; ; sommaire pour tous les étudiants de la classe ; classe: STRO msgetud,d DECO etudiant,d ; affichage du nombre d'étudiants LDA etudiant,d BREQ fini STA diviseur,d LDA etudtot,d LDX diviseur,d CALL DIVISE ; calcul de la moyenne des notes finales de la classe ; ASLA ; arrondissement possible ? CPA diviseur,d BRLT pasarrn ADDX 1,i pasarrn: STA reste,d STX quotient,d STRO msgmoyt,d ; LDA quotient,d ; élimination de la décimale LDX 10,i CALL DIVISE ; STX moyen,d STA reste,d DECO moyen,d ; moyenne avec une décimale CHARO '.',i DECO reste,d ; ; calcul de l'écart-type ; o= R [(S((X-u)^2))/(N)]. ; LDX 0,i etudsu: STX sauvex,d ASLX LDA notes,x SUBA moyen,d STA tempo,d LDX tempo,d CALL MULTIPLI ; (X-u)^2 ; ADDA totalc,d STA totalc,d LDX sauvex,d ADDX 1,i CPX etudiant,d BRLT etudsu LDX etudiant,d CALL DIVISE ; / N ; STX nombre,d ; arrondissement ? ASLA CPA etudiant,d BRLT rien ADDX 1,i rien: NOP0 ; ; racine carrée du nombre ; STX tempo,d LDA tempo,d CALL RACINE ; STRO msgecart,d ; écart-type DECO racine,d ; fini: STRO msgfin,d STOP ; ;LECTURE: saisie d'une note au terminal ; ; Aucun paramètre ; LECTURE: LDA 0,i STA premier,d ; initialisation de la première note lue LDA -1,i STA nombre,d ; s'assurer qu'une note sera lue lire: CHARI caract,d LDA avcaract,d ;analyse du caractère lu CPA "\n",i ;caractère "Entrée" ? BREQ finlire1 ;oui, on termine la saisie CPA ",",i BREQ finlire2 ; ; multiplication par 10 du nombre déjà saisi ; et vérification si le nombre excède 32767 (débordement) ; ; ex: 1234 est construit par 1*10+2=12, 12*10+3=123, 123*10+4=1234 ; ; ; le caractère lu doit être compris entre 0 et 9 ; STA premier,d CPA '0',i BRLT pasnombr CPA '9',i BRGT pasnombr SUBA '0',i ;transformons le caractère ASCII en décimal STA sauveA,d LDA nombre,d ;inutile de multiplier si le nombre est égal à 0 BRLT pasmult ASLA ; * 2 ASLA ; * 4 ADDA nombre,d ; * 5 ASLA ; * 10 STA nombre,d BR addition pasmult: LDA 0,i STA nombre,d addition:LDA sauveA,d ADDA nombre,d CPA 100,i ; note maximale 100 BRGT erreur STA nombre,d BR lire pasnombr:BR erreur ; finlire1:LDA premier,d ; "enter" indiquant la fin des données ? BREQ classe CPX 6,i ; maximum 4 notes BRNE erreur finlire2:LDA nombre,d BRLT erreur RET0 ; erreur: STRO msgerr,d ; ; élimination des caractères du tampon d'entrée ; relire: LDA avcaract,d CPA "\n",i BREQ enter CHARI caract,d BR relire enter: BR init ; ;MULTIPLI: effectue la multiplication par additions successives ; ; Passage des paramètres par les registres ; ; IN: reg A : multiplicande ; reg X : multiplicateur ; ; OUT: reg A : produit ; reg X : 0 ; MULTIPLI:CPX 0,i ; Faire "multiplicateur" tours de boucle BREQ zér0 ; on n'a pas à multiplier si le nombre est 0 STA MulcandE,d BRGT PositiF NEGA NEGX PositiF: STA MulcandE,d LDA 0,i ; Initialiser l'accumulateur additioN:ADDA MulcandE,d SUBX 1,i BRNE additioN ; Faire un autre tour si non nul zér0: RET0 STOP ; MulcandE:.BLOCK 2 ; #2d ; ;DIVISE: effectue la division par soustractions répétitives ; ; Passage des paramètres par les registres ; ; IN: reg A : dividende ; reg X : diviseur ; ; OUT: reg A : reste ; reg X : quotient ; DIVISE: STX diviseuR,d LDX 0,i ; quotient soustraI:ADDX 1,i SUBA diviseuR,d BRGE soustraI SUBX 1,i ; défaisons la dernière soustraction ADDA diviseuR,d RET0 diviseuR:.BLOCK 2 ; #2d ; ;RACINE: effectue la racine carrée ; ; Passage des paramètres par le registre A ; ; IN: reg A : nombre à extraire ; reg X : quelconque ; ; OUT: reg A : racine carrée ; reg X : 0 ; RACINE: STA nombreR,d ; nombre à extraire LDA 0,i ; initialise la racine carree STA racine,d CPA nombreR,d BRGE FINRAC suivanT: LDA racine,d ADDA 1,i STA racine,d LDX racine,d ; initialise le multiplicateur LDA 0,i ; initialise le produit multI: ADDA racine,d SUBX 1,i BRNE multI ; fin de la multiplication lorsque le nombre d'occurrences = 0 CPA nombreR,d BREQ FINRAC ; fin du calcul lorsque produit = nombre BRLT suivanT ; calcul suivant lorsque produit < nombre SUBA nombreR,d CPA racine,d BRLT FINRAC ; fin lorsque produit - nombre < racineine carree LDA racine,d ; arrondir lorsque produit - nombre >= racineine carree SUBA 1,i STA racine,d FINRAC: RET0 nombreR: .BLOCK 2 ; #2d nombre à extraire ; msgbien: .ASCII "Bienvenue au programme BULLETIN qui calcule" .ASCII "\nles notes d'étudiants." .ASCII "\nVous devrez entrer les 4 notes des travaux pratiques." .ASCII "\nex:40,50,60,50" .ASCII "\nPour terminer, faire uniquement la touche ENTREE.\x00" msgdata1:.ASCII "\n\nEntrez les notes du \x00" msgdata2:.ASCII " étudiant: \x00" msgécart:.ASCII "% Ecart-type: \x00" msgecart:.ASCII "\nEcart-type des notes finales du groupe: \x00" msgerr: .ASCII "\nEntrée invalide\x00" msgetud: .ASCII "\n\n\nNombre d'étudiant(s): \x00" msgfin: .ASCII "\n\nFin normale du programme BULLETIN.\x00" msgmax25:.ASCII "\n\nCe programme ne traite que 25 étudiants au maximum.\x00" msgmoy: .ASCII "% Moyenne: \x00" msgmoyt: .ASCII "\nMoyenne des notes finales du groupe: \x00" msgnotf: .ASCII "\nNote finale: \x00" ; bareme: .BYTE 45 ; meilleure note .BYTE 35 ; 2ième meilleure note .BYTE 20 ; 3ième meilleure note notes: .BLOCK 10 ; #2d5a (25 notes maximum dont 5 visibles) .BLOCK 40 tableau: .BLOCK 8 ; #2d4a (4 notes) ; avcaract:.BLOCK 1 caract: .BLOCK 1 ; #1h caractère lue compteur:.BLOCK 2 ; #2d 1-45% 2-35% 3-20% dividend:.BLOCK 2 ; #2d pour la division diviseur:.WORD 10 ; pour la division par 10 etudiant:.BLOCK 2 ; #2d numéro de l'étudiant etudtot: .BLOCK 2 ; #2d totalisation de toutes les notes grand: .BLOCK 2 ; #2d la plus grande note moyen: .BLOCK 2 ; #2d moyenne pour le sommaire moyendec:.BLOCK 2 ; #2d moyenne partie décimale moyenent:.BLOCK 2 ; #2d moyenne partie entière mulcande:.BLOCK 2 ; multiplicande mulcateu:.BLOCK 2 ; multiplicateur nombre: .BLOCK 2 ; #2d nombre position:.BLOCK 2 ; #2d position dans le tableau des notes premier: .BLOCK 2 ; #2d indicateur de la première note produit: .BLOCK 2 ; produit quotient:.BLOCK 2 ; #2d résultat de la division racine: .BLOCK 2 ; #2d racine carrée reste: .BLOCK 2 ; #2d résultat de la division sauveA: .BLOCK 2 ; #2d copie de sauvegarde regA sauvex: .BLOCK 2 ; #2d copie de sauvegarde regX tempo: .BLOCK 2 ; #2d champ temporaire total4: .BLOCK 2 ; #2d total des 4 notes lues totalc: .BLOCK 2 ; #2d total lors des carrés pour l'écart-type totalf: .BLOCK 2 ; #2d total des notes finales .END