momente şi schiţe de informatică

Articolul 50

Creat: 2011/oct       Comentarii

30 de ani | bookmarklet | jQuery | media școlară birocratică | screencast

Acesta ar fi al 50-lea articol pe care îl public pe acest site… N-a fost greu să văd printre subiectele pe care le-am abordat, ceva legat de această "aniversare": din nou, calculul mediei şcolare! Dacă media "calculată cu două zecimale exacte" are partea fracţionară cel puţin 0.5, atunci media trebuie rotunjită "în sus" (altfel, media se va rotunji "în jos").

Datorită restricţiei ferme "cu două zecimale exacte" - media şcolară a notelor 9, 10, 10 şi 9 pe teză este "exact" 9.49 (deci nu se dă 10, ci doar 9). Însă adevărul este că media respectivă este 9.4999... ceea ce este exact 9.50 (şi ar trebui încheiat 10, fără nicio teamă…).

0.(9) = 1 (cea mai simplă justificare)

Dăm aici cea mai simplă justificare a faptului că 0.999... = 1 (cu consecinţa firească a egalităţilor q.4999... = q.50): media aritmetică a "capetelor" x = 0.999... şi 1 este (x + 1) / 2.
Dar 1.999... / 2 = 0.999... (fiindcă împărţirea - prin algoritmul binecunoscut - continuă la nesfârşit); deci (x + 1) / 2 = x adică, media aritmetică este egală cu unul dintre "capete" - ceea ce nu se poate întâmpla decât dacă acestea coincid: 0.999... = 1.

Altfel - demonstraţia riguroasă este un exerciţiu elementar (de clasa a XI-a) şi poate fi redată scurt: seria geometrică de raţie 0.1 reprezentată de 0.111... converge la 0.1 / (1 - 0.1) = 1 / 9 şi înmulţind cu 9, obţinem 0.999... = 1.

"Help" pentru Media dinamică

O aplicaţie presupune o anumită interacţiune cu utilizatorul; prin urmare trebuie căutată o formă de prezentare cât mai "intuitivă", încât să nu fie necesare indicaţii suplimentare de folosire.

Uneori considerăm necesare totuşi, nişte "explicaţii" (vezi Situaţii şcolare, sau Factoriale) şi eventual, ar fi de considerat anexarea unei demonstraţii vizuale a folosirii aplicaţiei respective.

Prezentăm aici o modalitate de a realiza o asemenea demonstraţie vizuală; pentru ilustrare alegem pe cea mai simplă, dintre aplicaţiile încorporate pe site-ul nostru: "Media dinamică" (n-ar necesita aceasta vreun "help", dar… este legată de tema precizată la început).

Folosind Display Ruler (din Firefox, Web Developer) determinăm elementele poziţiei-ecran în care apare postată aplicaţia respectivă:

  

Acum putem invoca programul recordmydesktop (ajustând Y pentru a ţine seama că sunt deschise bara de meniu şi bara de navigare):

     recordmydesktop -x 825 -y 195 --width 200 --height 55 \
                     --no-sound --overwrite --fps 25 \
                     -o medyn.ogv

Operăm pe aplicaţia respectivă - urmărind să evidenţiem maniera de lucru specifică - şi în final, stopăm înregistrarea (prin CTRL-C în terminalul din care lansasem recordmydesktop). Redăm aici "filmul" rezultat astfel:

Urmărind această demonstraţie se poate constata că am relaxat condiţiile, faţă de plugin jQuery pentru media şcolară: acum, notele pot fi introduse şi separându-le prin spaţiu (sau alt caracter non-cifră). Această "relaxare" este de fapt o concesie faţă de obiceiurile utilizatorului comun; altfel, ar trebui să fie clar că nu este necesar nici un separator în şirul notelor (fiindcă notele mai mici decât 10 sunt de câte o singură cifră, iar "0" poate urma numai după un "1").

Rescrierea pluginului pentru Media dinamică

În vechea versiune, dacă utilizatorul tasta altceva decât cifră atunci apărea NaN (Not a Number) drept "medie" - ceea ce transmitea în mod tacit mesajul "n-are ce căuta spaţiul, în şirul notelor" (dar de obicei, utilizatorul comun interpreta prin "programul este defectuos"). Am rescris "programul", renunţând la mesaje tacite şi implicând direct concesia menţionată mai sus:

(function($) {
    // elementele statice necesare: un paragraf cu Note, Teza, Medie
    var pNTM = ['<p style="font-size:12px;margin-top:0em;width:200px;"> Note:<input type="text" value="91010" size="6"/>',
                ' Teza:<input type="text" style="text-align:center;width:16px;" value="9" size="1"/>',
                ' <span style="color:brown;">9.49</span></p>'];
    function mediadyn(jqObj) { // se va ataşa unui obiect jQuery 'jqObj'
        jqObj.after(pNTM.join('')); // înscrie în DOM paragraful NTM
        // referinţe prealabile la obiectele N, T, M
        var jqP = jqObj.next(), 
            jqNote = jqP.find('input:first'),
            jqTeza = jqP.find('input:last'),
            jqMed = jqP.find('span:first');
        // acţiunea de executat la tastarea notelor/tezei
        jqP.find('input').keyup(function() {
            var note = jqNote.val(), // şirul notelor tastate curent
                teza = jqTeza.val() || 0,
                nr_car = note.length, 
                nr_note = nr_car, 
                m = 0, med = 0; 
            for(var i = 0; i < nr_car; i++) {
                var q = note.charAt(i);
                switch(q) {
                    case '0': m += 9; nr_note --; break;
                    case '1': 
                    case '2': 
                    case '3': 
                    case '4': 
                    case '5': 
                    case '6': 
                    case '7': 
                    case '8': 
                    case '9': 
                        m += parseInt(q); break;
                    default: nr_note --; // ignoră non-cifrele (spaţiul)
                }
            } 
            if(nr_note) // media aritmetică, cu două zecimale exacte
                med = parseInt((m / nr_note)*100) / 100; 
            if(teza) { // media şcolară cu două zecimale exacte
                med = (parseInt(teza) + 3 * med) / 4; 
                med = parseInt(med * 100) / 100; 
            }
            jqMed.html("<b>" + med + "</b>"); // înscrie media (cu două zecimale)
        });
    };
    // extinde jQuery cu obiectul mediadyn()
    $.fn.mediadyn = function() { 
        return mediadyn(this);
    };
})(jQuery);

Bineînţeles, am încorporat pe site şi acest modul javaScript - dar… nu în forma pezentată mai sus.

Postarea pe site a fişierelor javaScript

Pe site-ul nostru avem mai multe aplicaţii şi implicit, mai multe fişiere javaScript (mai mult sau mai puţin voluminoase). În acest caz este recomandată comasarea şi compresarea fişierelor respective (dat fiind că pentru a reda o pagină sau alta, browserul va trebui să încarce în prealabil fişierele conexe). Folosim în acest scop UglifyJS (a căuta pe Google termenul uglifyjs); de exemplu, pentru fişierul în care am scris programul de mai sus:

     uglifyjs  bookml-jq.js  >  boojml.ugl.js

Redăm pentru comparaţie, statisticile corespunzătoare celor două fişiere:

Câştigul "urâţirii" fişierului (792 bytes versus 2219) este evident…

Comentarii - Articolul 50

Oct. 25, 2011, 12:17 p.m. - vb

De fapt m-am păcălit: am constatat ulterior (numărând totuşi articolele listate pe ani din all_articles) că acesta este doar al 49-lea articol…

Dar atunci, tema aleasă - media şcolară: 9.``49`` versus 9.``50`` - chiar se potriveşte; doar că (renunţând să mai modific) va trebui de-acum să amân ideea unui "articol aniversar" - poate pentru momentul 100…

Dec. 10, 2011, 12:23 p.m. - vb

Iniţial (două luni în urmă) "Articolul 50" era foarte concis, vizând numai justificarea cea mai simplă a egalităţii 0.(9) = 1. Acum l-am rescris complet, vizând (ca de obicei) mai multe chestiuni legate de tema respectivă ("tema" anunţată de titlu nu consta în calculul propriu-zis al mediei…).

Nov. 10, 2012, 11:06 a.m. - Alex Mînzățanu

Bună ziua! Nu știu dacă vă mai aduceți aminte de mine ...Sunt un fost elev de al dumneavoastră, am ajuns acum in anul 2 de facultate(Fac.de Informatică din Iași) și incep să adopt din ce in ce mai mult deprinderile descrise la orele de matematică(sau cele suplimentare de Linux/php/bash).Pană acum nu am avut mari probleme dar ieri am primit o temă(programare sub Linux--eu UBUNTU) și sincer singurul om la care m-am putut gandi a-ți fost dumneavoastră.Nu am nevoie de programarea in sine(aici mă descurc destul de bine) ci de ideea de cum aș putea implementa și de cum aș putea scăpa de probleme de concurență.V-aș fi sincer RECUNOSCĂTOR. Enunțul problemei îl aveți aici in caz că doriți să vă da-ți cu părerea https://drive.google.com/0B3lk3KZRzlxaSWtjZnR2TVhQams

Nov. 10, 2012, 11:20 a.m. - Alex Mînzățanu

Link nou http://fenrir.info.uaic.ro/~mihai.minzatanu/tema-Computer-Networks

Media Dinamică

Articolul 50

Drumuri

ŞahStartTemp

25
32
17
4
19
34
14
3
26
33
16
5
31
24
15
18
35
20
2
13
27
6
9
23
30
11
8
21
28
12
22
29
10
7

Ambiţiile Cavalerului

Localităţi

Judeţ:

Constituirea unei baze de date colectând cu Python de pe web

Bliţuri

Load another random Bliţ

//slightchess

Decoraţiuni hiperbolice

SALARII 2017

//bacMath
variante BAC matematică

Bacalaureat 2015 -
de la forma microsoftizată, la R

modelare ŞAH, I-XX
construcţia unui PGN-browser()

Linux şi aplicaţii Web
în 24 de ore

Orar şcolar - exemplu
după un orar generat de "aSc Orare"

Orar Adjust
ajustează orarul şcolar