Anterior (a vedea "Hello World!" şi Subrutină performantă pentru calculul factorialelor) am realizat o subrutină în limbaj de asamblare pentru n!. Într-o primă etapă, factorialul se obţine în forma binară (în baza 2^32); în a doua etapă, se converteşte la baza 10^9 şi implicit la forma zecimală uzuală. Forma binară se obţine în 0-5 secunde (n <= 100000); însă conversia la forma zecimală durează cam de cinci ori mai mult.
Este posibilă optimizarea secvenţei de conversie… dar de ce să se ocupe serverul de conversie? (şi nu browserul). Serverul trebuie să returneze rezultatul - punct! Iar rezultatul este în cazul de faţă o valoare numerică brută, în formă binară (cel mult, hexazecimală). Cel care l-a cerut (nu serverul), trebuie să ştie ce vrea să facă cu rezultatul obţinut - să-l afişeze treaba lui cum, sau să-l utilizeze ca atare (ca valoare numerică) în calcule proprii ulterioare.
Cererea http://<HOST>/cgi-bin/amifac.cgi?1234 primeşte de la server factorialul numărului 1234, în hexazecimal. Aplicaţia rezultată este pusă la dispoziţie on-line: click pe link-ul Factoriale din bara de meniu; interfaţa conţine şi o funcţie javascript de conversie la baza 10 a unui şir de cifre hexazecimale de orice lungime (folosind schema lui Horner).
Creem un server PHP (inclusiv pentru Windows cu XAMPP) care foloseşte Ymacs (permiţând în plus, încărcare şi scriere de fişiere de pe disc).
Realizarea unei aplicaţii Web implică lucrul într-un editor de text (pe mai multe fişiere, de diverse tipuri) şi "verificări" în browser. Integrând Ymacs, avem acum acest câştig metodologic: aplicaţia se poate dezvolta (sau/şi expune pas cu pas) lucrând numai în browser: într-un Tab al browserului se încarcă şi se editează corelativ fişierele necesare (folosind bufferele Ymacs), într-un alt Tab se testează aplicaţia pe parcursul lucrului.
Definim un obiect G care în primul rând, conţine trei containere - respectiv pentru Note, Teză şi Medie; acestea sunt ele însele nişte obiecte (şi anume nişte obiecte predefinite), încât putem folosi proprietăţile şi metodele specifice lor (în cadrul obiectului G definit de noi).
Note şi Teză sunt "de tip" <input>; ca obiect, un <input> are predefinite nişte metode de interacţiune - onClick(), onKeypress(), onKeyup(), onMouseover(), etc. iar acestea se pot "redefini" pentru a răspunde în modul dorit unor evenimente precum apăsarea unei taste sau click în cadrul containerului aferent, sau în exteriorul lui, etc.
Redefinim în obiectul G, metodele onKeyup() pentru <input>-urile Note şi Teză, în aşa fel încât fiecare tastare (sau ştergere) de notă/teză să declanşeze procedura de calcul şi înscriere a mediei.
După definirea astfel a obiectului G, adăugăm o funcţie care să-l creeze conform specificaţiilor lui şi să-l anexeze documentului. În final, includem totul în "paranteze de invocare" (...)();, astfel că toate variabilele implicate rămân ne-vizibile din afară şi pe de altă parte, funcţia finală (care şi ea trebuie inclusă în paranteze de invocare) va fi pusă în execuţie imediat după încărcarea scriptului.
După ce o punem la punct astfel, transformăm aplicaţia rezultată într-un bookmarklet: eliminăm comentariile şi spaţiile (folosind un compressor), eventual escapăm şi codificăm URL anumite caractere şi apoi adăugăm scriptul rezultat în Bookmarks (implicând pseudo-protocolul javascript: în loc de obişnuitul http:).
De regulă, Algoritmul lui Dijkstra este formulat cu "tablouri paralele": d[] pentru distanţe şi p[] pentru predecesori; acestea trebuie prevăzute în cadrul programului apelant (la nivel global) - fiind folosite inclusiv pentru transmiterea rezultatelor. Unele limbaje permit însă extinderea obiectelor pe parcursul execuţiei (în sensul adăugării de noi proprietăţi) - ceea ce permite integrarea rezultatelor în structura de date transferată algoritmului de către programul apelant.
var W = {
'A': [ ['B', 5], ['C', 3], ['E', 2] ],
'B': [ ['D', 6], ['C', 2] ],
...
};
W['A'].dist = 0; // nodul de start
W['B'].dist = 4; W['B'].prec = 'C';
W['C'].dist = 3; W['C'].prec = 'A';
Manuale versus programator (implementarea unui algoritm de teoria grafurilor)
Povestea arborelui parţial minimal
Implementarea clasică (apoi, folosind o structură priority_queue<double>) a algoritmului lui Prim
Compromisuri între stil şi eficienţă; biblioteci şi interfeţe
demersurile aplicaţiei Knight
modelarea "problemei calului" (ca graf şi ca obiect de memorie), folosind javaScript
reprezentarea vizuală a grafului în fereastra browserului
modelarea căutării unui drum hamiltonian (backtracking)
backtracking compus cu un algoritm euristic
principiul lui Warnsdorff (1823): continuă pe acel drum din care vei avea cât mai puţine ramificaţii - altfel spus, iterează recomandarea evidentă: dacă ai de ales între a face un ultim pas până la destinaţie şi respectiv a ocoli, atunci încearcă mai întâi prima variantă
Revenim asupra unor construcţii javaScript din Ambiţiile Cavalerului; vizam drumuri hamiltoniene pe graful săriturii calului - dar poate fi mulţumit Sir Knight? …cavalerii ăştia erau în stare să susţină o cauză până-n pânzele albe.
Cursivitatea recursivităţii (reformulare "tail recursion")
de la 'too much recursion' la formula iterativă
Array .prototype .q_sort = function(beg, end) { /* QuickSort */ }
de fapt, metoda existentă sort() este tot ceea ce este necesar! restul poate fi (ca aici) un exerciţiu didactic de prezentare a unor aspecte de lucru cu obiecte Javascript.
Rezolvarea unei probleme de matematică (de exemplu, demonstrarea convergenţei unui şir) poate fi sugerată de rezultatele investigaţiei printr-un program adecvat.
În cadrul documentului HTML ar fi suficient să prevedem următoarele elemente:
— două elemente <input>, pentru a permite utilizatorului să precizeze gama de termeni de calculat (rangul iniţial şi rangul final);
— un element <div> destinat scrierii termenilor şirului, pe măsură ce vor fi calculaţi;
— un <button> a cărui acţionare prin click să declanşeze calculul şi scrierea termenilor respectivi
— un <script> care să modeleze funcţia de calculare a termenilor şirului.
(click pe diagramă, pentru altă poziţie)
Problema damelor
randomizare, backtracking (javascript).
Elemente de DOM (Document Object Model) pentru reprezentarea în browser a soluţiilor.
O mică aplicaţie pentru calculul determinanţilor şi pentru rezolvarea sistemelor de ecuaţii liniare;
totodată, o mare semnalare: sindromul lipsă de idei (sau, criza de idei).
Am întâlnit elevi pasionaţi de informatică, dar care nu învaţă decât la "Informatică". Mai bine zis, deşi sunt pasionaţi de informatică, nu învaţă decât "la Informatică". Abandonarea efortului de cunoaştere propus în Liceu pentru diversele discipline, poate avea drept rezultat firesc lipsa de idei.
La nivel de individ, lipsa de idei decurge din îngustimea domeniului de interes şi din necorelare…
Dar "lipsa de idei" este mai ales o stare comună, specifică sistemelor închise (care nu mai pot oferi perspective reale de dezvoltare) şi nu se poate să nu fie remarcată.
Selectaţi numerele din casetă şi înscrieţi propriile numere; click pe butonul 'CMMDC' va furniza cel mai mare divizor comun al numerelor respective.
Se exemplifică realizarea unui gadget (determinarea CMMDC); funcţia javaScript necesară conţine două funcţii "private": o funcţie de reducere "divide et impera" şi o funcţie care produce CMMDC a două numere (în javaScript, funcţiile sunt obiecte - încât pe lângă variabile obişnuite pot conţine şi alte obiecte, inclusiv alte funcţii).
Câte cifre are n! şi care sunt cifrele iniţiale? Câte cifre zecimale are 22009 şi care sunt primele câteva cifre?
Există n încât n! să aibă n cifre zecimale? Există n încât n! să aibă n cifre hexazecimale?
Modelarea comparativă a calculului factorialelor în bazele 10, 106, 216 (în javaScript).
Cel mai mare număr natural care are Z cifre zecimale este 10Z - 1; cel mai mare număr natural care are T cifre în baza 256 este 256T - 1. Rezultă că Z = T * lg(256) ≈ T * 2.40824, adică:
reprezentarea în baza 256 necesită de minimum 2.4 ori mai puţine "locaţii" decât cea în baza 10, iar operarea bazată pe reprezentarea în baza 256 necesită de 2.4 ori mai puţine operaţii "cifră cu cifră" decât cea bazată pe reprezentarea zecimală obişnuită.
A vedea şi Factoriale (aplicaţie accesibilă şi de pe bara de meniu).
CCD Vaslui mi-a oferit 24 de ore (în martie-aprilie 2011) de introducere în Linux şi iniţiere în dezvoltarea de aplicaţii Web - pentru profesori de informatică, dar care folosesc curent numai Windows şi nu au experienţă de lucru pe Web.
//web24.docere.ro prezintă (cu cizelarea cuvenită) lecţiile desfăşurate. Aici prezentăm unele elemente de substrat - motivaţii, tehnici metodologice - ale acestei încercări pe 24 de ore.
Avem la şahPGN un "browser" propriu pentru partide de şah. Un asemenea instrument ar trebui să poată fi configurat pentru a fi utilizat în mai multe contexte posibile; vizăm aici posibilitatea de a-l integra într-o pagină Web care angajează partide de şah.
Pe de altă parte, partida analizată reflectă corelaţia dintre centralizare şi atacul pe flanc (specifică de altfel nu numai pentru şah, dar de exemplu şi în tenis, sau alte jocuri).
Media dinamică
Linux şi aplicaţii Web
în 24 de ore
Orar şcolar
documentaţie Sphinx
ŞahStartTemp