Știință și tehnică

Hai la sortat vectori,
sau povestea celor cinci probleme
şi a algoritmului lui Ştirbu(?)

Deoarece aţi văzut titlul, cred că deja mintea v-a zburat către informatică... ei bine, da: vom vorbi despre un algoritm de sortatre... Dar, mai întâi, s-o luăm cu începutul: eram în clasa a noua şi iarna pe sfârşite... am auyit vorbindu-se pe la şcoală despre algoritmul ,,quicksort", cum că ar fi cel mai fantastic şi mai bombastic dintre toate şi că ar funcţiona astfel: 
1. se alege un element, la întâmplare;
2. se compară cu toate celelalte elemente din vector;
3. cele mai mici ca el i se aşază la stânga şi cele mai mari, la dreapta;
4. după care ,,se mai face o dată" şi iar o data, şi iar, si iar... până ce vectorul e sortat.
Dar, după spusele unora, la acea vreme, noi nu ştiam ,,cum să-l facem să mai facă o dată".
Între timp a mai venit şi vacanţa(cu trenu' din Franţa) şi într-o noapte plină ochi de insomnie... le declique est venu: ,,Ei rahat, nu ştiu! IF nu e sortat GOTO la-nceput !!!!!!!!!!!!!!!!!!!!!!!!!!", mi-am zis ,, acuma nu+mi mai rămâne decât să-l fac să meargă şi, en septembre, ego ad informaticam me laudabo". Peut-être, oi fi schiţat pe vreo foaie ceva şi, după asta, problemele au ,,commençat": am zis c-ar fi bine săl testez la 286, întrucât cei 16MHz ai lui îmi vor arăta foarte exact dacă această copie a lui quicksort e, vraiment, bună de ceva. De-aici, problema nr.1: n-am reuşit sa fac niciun compilator de C/C++ să funcţioneze ca lumea pe respectivul PC, dar, asta s-a rezolvat cu ajutorul limbajului QBASIC. Zis şi făcut... progrămelul l-am scris, dar s-a născut problema nr.2: ca sa-l testez de-adevăratelea, îmi trebuiau multe elemente...Resolu şi cu asta: un fişier secvenţial umplut cu 1000000 numere aleatorii, care să incapă în tipul INTEGER(2 octeţi). Mais, le problème no.3 est déjà venu: timpii scoşi trebuiau compraţi cu alţii déjà existenţi, şi asta chiar e simplu: bubblesort.
Programul meu arâta deci astfel:

DIM nr, i, etalon, mic, mare, ok, v1(10001), v2(10001)  AS INTEGER
DIM sec AS SINGLE
OPEN "nrsortat.in" FOR INPUT AS #105 REM #105 este identificatorul fişierului de intrare
OPEN "sort.out" FOR OUTPUT AS #108 REM #108 este identificatorul fişierului de ieşire
INPUT "How many numbers do you want to sort? ", nr
sec = TIMER
FOR i = 1 TO nr STEP 1
  INPUT #105, v1(i)
NEXT i
RANDOMIZE TIMER
x1: etalon = (INT(RND * 100000)) MOD nr
LET mic = 1
FOR i = 1 TO etalon - 1 STEP 1
  IF v1(i) <= v1(etalon) THEN
    v2(mic) = v1(i)
    mic = mic + 1
  END IF
NEXT i
FOR i = etalon + 1 TO nr STEP 1
  IF v1(i) <= v1(etalon) THEN
    v2(mic) = v1(i)
    mic = mic + 1
  END IF
NEXT i
LET v2(mic) = v1(etalon)
LET mare = mic + 1
FOR i = 1 TO etalon - 1 STEP 1
  IF v1(i) > v1(etalon) THEN
    v2(mare) = v1(i)
    mare = mare + 1
  END IF
NEXT i
FOR i = etalon + 1 TO nr STEP 1
  IF v1(i) > v1(etalon) THEN
    v2(mare) = v1(i)
    mare = mare + 1
  END IF
NEXT i
LET ok = 1
FOR i = 1 TO nr - 1 STEP 1
  v1(i) = v2(i)
  IF v2(i) > v2(i + 1) THEN ok = 0
NEXT i
LET v1(i) = v2(i)
IF ok = 0 GOTO x1
PRINT "Result: "; TIMER - sec; " seconds."
FOR i = 1 TO nr STEP 1
  PRINT #108, v1(i);
NEXT i
END

Taman când mă pregăteam să exclam ,,Algorilmul lui... lui... eu, adică al lui Ştirbu", fiindcă deja mi-l insuşisem,
,,merge perfect", a venit bomba: era de multe ori mai lent ca bubblesort, creşterea fiind aproape exponenţială. Astea ar fi nişte date concrete:

nr. de lemente:                     10                50              100                           500
timp bubblesort:                   0s.               0s.              6.054x(10^+2)s.       2.138s.
timp algoritmul meu:             0s.               0.169s.       0.330s.                      20.220s.

Asta m-a dezumflat complet... Dar, într-o altă noapte, une autre idée est venue: mi-am dat seama că el poate alege acelaşi element de mai multe ori...atunci, n-ar fi stricat sa-i adaug o bucăţică de cod, care să-l împiedice s-o mai facă... bucăţica s+a dovedit ditamai bucătoaia, şi aşa, problema nr.4 nascitur: umplea vectorul cu zerouri... pe asta am rezolvat-o acum puţin timp, mai precis în primele zile ale lui 2012, adică după aproape jumătate de an... cauza era, să spunem, o disfuncţionalitate a limbajului de programare: o variabilă nedeclarată este recunoscută automat ca fiind de tipul SINGLE, şi de aceea instrucţiunea în care in loc de ,,etalon" apărea ,,etaon" mi+a scăpat printre degete. După aşa o descriere, să arătăm codul:

DIM nr, i, etalon, mic, mare, ok, v1(10001), v2(10001), poz(10001) AS INTEGER
DIM elemente, pozitie, gata, contor AS INTEGER
DIM sec AS SINGLE
OPEN "nrsortat.in" FOR INPUT AS #105
OPEN "sort.out" FOR OUTPUT AS #108
INPUT "How many numbers do you want to sort? ", nr
sec = TIMER
FOR i = 1 TO nr STEP 1
  INPUT #105, v1(i)
  poz(i) = 1
NEXT i
LET elemente = nr + 1
RANDOMIZE TIMER
x1: contor = 0
LET elemente = elemente - 1
IF elemente = 0 THEN
  ok = 1
  GOTO x5
END IF
pozitie = (INT(RND * 100000)) MOD (elemente)
LET gata = 0
LET i = 1
DO WHILE contor <> pozitie
  IF poz(i) = 1 THEN contor = contor + 1
  i = i + 1
LOOP
etalon = i
poz(etalon) = 0
LET mic = 1
FOR i = 1 TO etalon - 1 STEP 1
  IF v1(i) <= v1(etalon) THEN
    v2(mic) = v1(i)
    mic = mic + 1
  END IF
NEXT i
FOR i = etalon + 1 TO nr STEP 1
  IF v1(i) <= v1(etalon) THEN
    v2(mic) = v1(i)
    mic = mic + 1
  END IF
NEXT i
LET v2(mic) = v1(etalon)
LET mare = mic + 1
FOR i = 1 TO etalon - 1 STEP 1
  IF v1(i) > v1(etalon) THEN
    v2(mare) = v1(i)
    mare = mare + 1
  END IF
NEXT i
FOR i = etalon + 1 TO nr STEP 1
  IF v1(i) > v1(etalon) THEN
    v2(mare) = v1(i)
    mare = mare + 1
  END IF
NEXT i
LET ok = 1
FOR i = 1 TO nr - 1 STEP 1
  v1(i) = v2(i)
  IF v2(i) > v2(i + 1) THEN ok = 0
NEXT i
x5:
LET v1(i) = v2(i)
IF ok = 0 GOTO x1
PRINT "Result: "; TIMER - sec; " seconds."
FOR i = 1 TO nr STEP 1
  PRINT #108, v1(i);
NEXT i
END

În ceea ce priveşte timpii, se prezintă cam aşa:
nr. elemente   10                  50                                  100                       500
timp               0s.                 6.054x(10^-2)                0.218s.                 6.429s.
ceea ce înseamnă e mai bine, dar, încă e lent...
Je viens de découvrir le cinquième problème: puţini sunt cei care cunosc limbajul QBASIC, aşa că, pentru ei, am să scriu ultimul cod în C(dar fără instrucţiunile destinate testării timpului, întrucât nu le ştiu):
 
#include <iostream.h>
#include <fstream.h>
#include <time.h>
#include <stdlib.h>

int nr,i,etalon,mic,mare,ok,v1[1001],v2[1001],poz[1001];
int elemente,pozitie,gata,contor;

ifstream f105("nrsortat.in");
ofstream f108("sort.out");

int main()
{
cout<<"How many numbers do you want to sort?"; cin>>nr;
for(i=1;i<=nr;i++)
{ f105>>v1[i]; poz[i] =1;}
elemente = nr+1;
srand(time(NULL));
x1: contor = 0;
elemente = elemente - 1;
if(elemente==0) {ok = 1; goto x5;}
pozitie = rand() % elemente;
gata = 0;
i=1;
while(contor != pozitie)
{ if(poz[i] == 1) {contor = contor+1;}
  i=i+1;
}
etalon = i;
poz[etalon] = 0;
mic = 1;
for(i=1;i<=etalon-1;i++)
{ if(v1[i] <= v1[etalon]) { v2[mic] = v1[i]; mic=mic+1;}}
for(i=etalon+1;i<=nr;i++)
{ if(v1[i] <= v1[etalon]) { v2[mic] = v1[i]; mic=mic+1;}}
v2[mic] = v1[etalon];
mare=mic+1;
for(i=1;i<=etalon-1;i++)
{ if(v1[i]>v1[etalon]) {v2[mare] = v1[i];mare=mare+1;}}
for(i=etalon+1;i<=nr;i++)
{ if(v1[i]>v1[etalon]) {v2[mare] = v1[i];mare=mare+1;}}
ok = 1;
for(i=1;i<=nr-1;i++)
{ v1[i] = v2[i];
  if(v2[i] > v2[i+1]) ok = 0;
}
x5:;
v1[i] = v2[i];
if(ok == 0) goto x1;
for(i=1;i<=nr;i++)
{ f108<<v1[i]<<' ';}
return 0;
}


Unora le place optica

In caz de ati ramas fara ocupatie, am sa va sugerez sa va apucati de optica.
Va propun un experiment foarte simplu si frumos.
Aveti nevoie de:
1. o lumanare(recomandat,  de tip pastila)
2. una sau mai multe bile transparente de sticla
3.un cleste/papagal

Inctructiuni:
1. aprindeti lumanarea la cativa centimetri de o suprafata verticala plana.
2. prindeti o bila de sticla cu ajutorul clestelui/papagalului si tineti-o la jumatatea distantei dintre suprafata plana si flacara.
3.In cazul in care pe suprafata plana exista o pata de lumina neclara, apropiati si/sau departati lumanarea(nota: mentineti in permanenta bila la jumatatea distantei), pana cand, pe suprafata respectiva, se va observa imaginea clara a flacarii.

Felicitari! Tocmai ati optinut o imagine reala, identica in dimensiuni si rasturnata a obiectului luminos. In acst caz, distanta dintre suprafata plana si flacara este egala cu cvadruplul distantei focale a bilei folostie pe post de lentila.

Pentru clarificare:




Nu vă jucați cu electricitatea

De data asta, am decis sa va arat cum va puteti face singuri o baterie.

Daca va intereseaza, urmati urmatoarele insrtuctiuni:
1. Luati doua borcane.
2. Intr-un borcan, faceti o solutie de CuSO4.
3.Taiati 2-3 baterii tubulare(de 1.5V). Atentie: pastrati carcasa metalica(caci este facuta din Zn) si aruncati pasta neagra de electroliti. Nota: A nu se folosi baterii alcaline, ci Zn-C.
4. Pastrati o placa de Zn deoparte, si pe celelate cantariti-le. Facet calculele pe reactia chimica
Zn+CuSO4 = Cu+ZnSO4, astfel incat, in cel de-al doilea borcan, sa preparati o alta solutie de CuSO4, care sa reactioneze, in totalitate cu cantitatea respectiva de Zn.
5. Reactia va dura mult. Ex: in cazul meu(borcane de 800ml pline), a durat 1,5 zile.
6. Daca reactia s-a finalizat, pregatiti o punte de sare: cativa centimetri de furtun, umplut cu o solutie   NaCl, si astupat la capete cu vata.
7. Introdiceti puntea de sare, cu un capat intr-un borcan si unul in celalalt.
8. Pregatiti un electrod de Cu(sarma/placuta) si introduceti-l in solutia de CuSO4; introduceti si placa de zinc ramasa, in solutia de ZnSO4.
9. Luati un voltmetru, si conectati-l cu borna pozitiva la electrodul de cupru si cu borna negativa la electrudul de zinc.
10. Masurati tensiunea electromotoare astfel obtinuta.

Pentru a clarifica, v-am pregatit urmatorul video-clip. Vizionare placuta!


Computere vechi

Sal'tare!

De data asta, haideti sa mai lasam masinile si sa ne uitam asupra sculei-bascule, pe care o prefera mai toata lumea din ziua de azi: o magaoaie de dimensiunea unei cutii "cari e voarti dejdeapti...ca doar stii sa faca multi, bai oameni bai". Pe romaneste: magaoaia aia se numeste calculator.
Primul calculator a fost construit pe la mijlocul anilor '40, se numea ENIAC si a functionat timp de vreo douazeci de ani la universitatea din Pensylvenia. Era alcatuit den vreo cateva panouri de circuite insirate de-a lugul unor pereti, si, se programa...ei bine..."cu clestele"... Adica se fixau niste conductori intre diverse puncte ale retelei electrice, si asta insemna o operatie. Deoarece avea vreo 20000 de tuburi electronice, ventilatia salilor in care era asezat, chiar era o problema... Si-apoi, pe langa ca la fiecare pornire i se ardeau vreo cinci lampi, dupa ce te chinuiai ore, zile, poate chiar saptamani ca sa intocmesti un program, tot ceea ce stia el sa afiseze ca date de iesire era... un octet; da, opt becuri albe; bec stins=0; bec aprins=1.
Ei...
Trecute-au ele multe de atunci,
Trecura anii,
Ca dusmanii...


Si pe-a lor franghie-n panta,
Se ivi de-odat' un Feilx
Se ivi si un Coral


Ia apoi cu Commodoru'...
Haide, si cu Robotronu'...



...am ajuns aici, adica la subiect. 

Hai sa va spun o poveste:

Demult, odata, acum doi ani, eram foarte suparat...imi murise rasnita... 
Si ,intr-o seara, mesteream eu ceva prin casa, si... la un moment-dat am realizat ca imi trebuia o unealta...nu mai stiu care...
 Apoi, tot cautand prin dulapul cu sculele lu' tata, am dat peste niste placi de calulator, si dedesupt un HDD, sub care o panglica(pentru porturile parallele de pe placa de baza). 
Si zic:
"Bun...l-am gasit pe 286...". Cum am mai zis... aveam rasnita defecta... Pai si-atunci, ia sa-mi fac eu o alta rasnita...si iau piesele la studiat: 
  • procesor : AMD 80286 , 10 MHz(cu optiunea Turbo, 16) , an de fabricatie: 1982(??????)
  • BIOS: AMI; dar ce sa te faci cand ai doua chip-uri pe care scrie AMI, probabil ca unul e AMI-Diags, dar inca nu m-am convins daca e adevarat
  • placa video: VGA ULTRA
  • si mai era acolo si o placa de retea si una de comunicatii(porturile Serial si Parallel)
  • dar ce sa te faci cand nu ai RAM-i ? Ei...era incus in placa de baza...
Nota: Mai folosisem calculatorul respectiv cand aveam vreo sase ani...si...din greseala i-am distrus MS-DOS-ul, si tata l-a demontat(fiindca tot era vechi)...caracasa o aruncase...si voia sa mai faca nu mai stiu eu ce si cu componentele...dar a uitat...

M-am chinuit vreo cateva zile pana am reusit sa fac rost si de o sursa cu portuuri P8/P9, monteaza-l si da-i drumul... 
Apoi ce sa-mi vada ochii: 1024 KB de RAM??? 512 KB de placa video ???
10 MB de HDD??? Ei de fapt, erau 40, fiidca la inceput gresisem setarile, dar asta m-a costat doua reinstalari de MS-DOS(la inceput 5.0, mai apoi 6.22)...si NC... si Windows 3.1...si nervi intinsi la maxim de fiecare data... S-apoi, dupa cum stim, de la Windows 3.1 incoace, toate sistemele de operare de la Microsoft lucreaza in modul "enhanced"...pentru care e nevoie de procesor 386, sau mai nou(dovada: la Win 3.1/WFW 3.11, in Control panel, exista fereastra "Enhanced", iar mie, la 286 nu imi apare)... si il mesteca foarte greu...

Dar...pana la urma, e distractiv. In caz de v-am facut curiosi, va invit sa vizionati urmatorul film, in care l-am inregistrat pe 286(stiu ca imaginea e proasta asa ca promit un alt film, cat de curand).




In caz de v-am facut dornici de o asemenea experienta, urmati urmatoarele instructiuni:
  • descarcati si instalati DOSBox;
  • instalati Windows 3.1/3.11, in interiorul DOSBox;
  • insalati, din Windows setup, driver-ul S3-SVGA(pentru placa video);
  • insalati, din Control panel/Drivers driver-ul Sound Blaster 1.5;
  • de acum este alegerea dumneavoastra ce veti mai instala/ folosi/sterge;
Nota: gasiti kit-urile de care aveti nevoie, plus multealtele pe
www.vetusware.com  .