Showing posts with label limbajul C++. Show all posts
Showing posts with label limbajul C++. Show all posts

Monday, December 14, 2015

Limbajul C. Un cronometru simplu cu ciclu de intarziere

Aplicatia urmatoare simuleaza un cronometru care afiseaza timpul pana la o valoare (ore, minute, secunde) introdusa de utilizator. 

Valoarea sau, mai exact, conversia acesteia in secunde trebuie sa fie mai mica decat numarul secundelor care echivaleaza 24 de ore (==86400).

O structura cu trei variabile int este folosita pentru a stoca timpul curent. O functie Display afiseaza acest timp, secunda cu secunda, parametrul functiei fiind variabila structura.

In mod uzual se folosesc pointeri la structura pentru a evita copierea intregii structuri in parametrul formal. In cazul de fata, nefiind vorba de o structura foarte 'voluminoasa', s-a optat pentru transferul prin valoare.

Sunday, December 6, 2015

Limbajul C. Implementarea unei stive cu un tablou monodimensional

O stiva este o colectie de elemente de acelasi tip procesata dupa principiul LIFO, last in, first out. Asta inseamna ca procesarea se face intotdeauna la "capatul din dreapta", adica introducerea de element nou, stergerea unui element si citirea elementelor din stiva se realizeaza pornind de la ultimul element adaugat.

Implementarea pe baza unui tablou monodimensional, numit in continuare 'stack', are o anumita valoare didactica dar si limitari, care pot fi depasite prin folosirea unei liste inlantuite, caz ce va fi detaliat intr-o postare ulterioara.

index: 0  stack[0]: neinitializat

Sunday, November 29, 2015

Limbajul C. Adunarea intregilor lungi. Aspecte netriviale intr-o problema aparent banala.

Puterm reprezenta, in conformitate cu tipurile de baza din limbajul C, numere intregi pozitive de la 0 la 2^32 - 1 sau numere intregi cu semn in domeniul: -2^31, +2^31 - 1.

Intrucat limbajul nu impune restrictii (dar sistemul de operare si compilatorul pot impune restrictii!) asupra dimensiunii tablourilor de intregi (== asupra memoriei alocate static), putem imagina un sistem de citire si afisare a numerelor intergi lungi de o dimensiune convenabila utilizatorului, fiind, de asemenea, posibila si simularea operatiilor aritmetice cu astfel de numere.

Desigur, trebuie tinut cont de mecanismul de transport: daca doua cifre situate pe pozitii corespunzatoare dau, adunate, un rezultat mai mare decat valoarea bazei de reprezentare, in cazul de fata 10, trebuie adunat 1 (== valoarea transportului) la rezultatul adunarii cifrelor de pe urmatoarea pozitie si, de asemenea, verificat iar rezultatul prin comparatie cu baza etc.

Este clasicul algoritm invatat in clasa a 2-aJ

Friday, November 27, 2015

Limbajul C. Pointeri la functii. Un mic reminder al algoritmului GCD (Greatest Common Divisor)

O functie este stocata in memorie la o adresa, exact ca o variabila iar adresa functiei respective se obtine utilizand numele functiei, fara paranteze si parametri formali, exact cum utilizam numele unui tablou pentru a asigna adresa sa unui pointer la tipul elementelor tabloului. 

Faptul ca o functie este stocata (incarcata) de compilator la o anumita adresa permite utilizarea unui pointer la functia respectiva.

Sintaxa declararii unui pointer la functie:

tip_return_functie (* ptrf)( lista_de_parametri_formali_ai_functiei );

Prima pereche de paranteze este necesara intrucat, in absenta acestor paranteze, declaratia respectiva ar fi prototipul unei functii numite ptrf cu lista specificata de parametri si care intoarce un pointer la tip_return_functie.

Wednesday, November 25, 2015

Limbajul C. "Insert a letter in string".

Fara prea multe comentarii (cu exceptia celor din cod :-), inca o problema din cursul de la University College Cork, menita sa fixeze notiuni precum siruri de caractere, tablouri, functii.

1.  Write and test a function that inserts a character anywhere in a string. The function should take the general form: strins(  char *string,  char character,  int position ).

Codul si printscreen-ul executiei:

Monday, November 23, 2015

Limbajul C. Matrice "X si 0". "X si 0" la consola pentru 2 jucatori


1.
 Codul urmator atribuie elementelor unei matrice bi dimensionale 3 x 3 valori de tip char (pentru o afisare corespunzatoare, trebuie introduse caractere alfanumerice, nu white-spaces) preluate de la tastatura sub forma unui sir.


Initial toate elementele matricii au valoarea '\0', neafisabila. Se pot introduce oricate caractere, oricum vor fi incarcate doar primele 9. Daca sunt introduse mai putin de 9 caractere, fie numarul acestora n, sirul de n caractere se va termina cu 'z' pe post de validator.

Codul si printscreen-ul:

Saturday, November 21, 2015

Limbajul C. Exercitii clasice cu siruri de caractere. MyStrcmp si eliminarea asa-numitelor white-spaces

1. Clasicul MyStrcmp

Doua siruri de caractere sunt "egale" daca au exact aceleasi caractere dispuse in aceeasi ordine.

O functie testeaza aceasta "egalitate" si intoarce zero in caz ca se verifica egalitatea.

Daca sir1 < sir2, adica daca verificarea, pentru un caracter oarecare, incepand cu primul, a codurilor ASCII, satisface inegalitatea, functia intoarce -1.

In caz contrar, intoarce +1.

Friday, November 20, 2015

Limbajul C. Mai multe probleme cu tablouri

Urmatoarele enunturi figureaza in cursul predat la University College Cork.

1. Se cere un program care citeste de la tastatura numere reale dubla precizie intr-un cuantum n specificat de utilizator, le stocheaza intr-un tablou de maximum 100 de elemente, calculeaza suma si media lor. La final se elimina din suma valorile extreme introduse, adica maximul si minimul. Se afiseaza tabloul initial apoi se realizeaza inversarea elementelor stocate in tablou, astfel incat primul devine ultimul etc.


Evident, se vor folosi functii definite de utilizator pentru fiecare sarcina specificata.

Wednesday, November 18, 2015

Limbajul C. Numere prime, numere prietene, Fibonacci, listarea valorilor unei functii pe un interval

Toate problemele de mai jos sunt enunturi adaptate sau luate ca atare din cartea scrisa de V.Iorga & colaboratorii, "Programare in C/C++. Culegere de probleme", ISBN 973-568-800-X aparuta in 2003.

Toate enunturile reprezinta probleme de programare procedurala.

1. Descompunerile unui numar par ca suma de numere prime. Problema P2_3. 

Teorie: daca n este un numar par, adica n = 2*k iar k e un intreg oarecare,
atunci o cale ar fi determinarea tuturor numerelor prime pana la n, fie m numarul
acestor numere prime. Scazand din n fiecare dintre cele m numere si verificand daca
rezultatul scaderii este tot numar prim, aflam descompunerile cerute de problema.

Codul si printscreen-ul executiei:

Tuesday, November 17, 2015

Limbajul C. O ecuatie neliniara rezolvata cu metoda bisectiei.


Problema urmatoare reprezinta proiectul de mid-term al cursului predat la University College Cork. Enuntul - sa se rezolve prin metoda bisectiei urmatoarea ecuatie neliniara:

sin(2x/5) - x + 1 = 0.

O prima observatie este ca avem o suma de doua functii continue, deci functia-rezultat este continua.

Ecuatia se poate rescrie sin(2x/5) = x - 1, deci intr-o rezolvare "geometrica" ar trebui determinat punctul de intersectie al dreptei x - 1 cu graficul lui sin(2x/5), conform figurii urmatoare, desenata chinuit, cu pixul:-)