Sunteți pe pagina 1din 3

Algoritmi si structuri de date – Informatica&Matematică, anul 1(2021-2022) ASD04AlgLiniari

ALGORITMI FUNDAMENTALI

Algoritmi liniari

Definiţie: Algoritmii care pot fi descrişi folosind numai comenzi/instrucţiuni de citire (în
pseudocod: citeste), scriere (în pseudocod: scrie) şi atribuire (în pseudocod: ) se numesc
algoritmi liniari.

R1 (1*).
Enunţul problemei: Determinaţi algoritmul pentru transformarea unui moment de timp din
ore-min-sec în secunde. De exemplu, 1h 20m 15s = 4815 s.
Metoda de rezolvare:
Ţinând cont de faptul că 1h = 3600s şi 1min = 60s:
1h 20m 15s = 1*3600 + 20*60 + 15 = 4815 s
Vom considera cazul general, în care să avem variabilele nr_ore,
nr_min, nr_sec în locul datelor numerice de mai sus
(1, 20, respectiv 15), iar numărul total de secunde îl vom calcula
în variabila T (Atenţie: C/C++ este case sensitive, adică face
diferenţă între litere mari şi litere mici). Astfel, date de intrare (ce
variabile trebuie cunoscute înainte de a începe algoritmul) sunt:
nr_ore, nr_min, nr_sec, iar data de ieşire (variabilele a cărot
valoare va fi afişată) este T.
Descrierea algoritmului în pseudocod:
citeste nr_ore,nr_min,nr_sec *de exemplu: 1, 20, 15
T  nr_ore*3600 + nr_min*60 + nr_sec
scrie T *nr. total de secunde
Descrierea algoritmului în C++(CodeBlocks):
#include <iostream> //pt. cin, cout
using namespace std;
int main()
{
//declaram toate variabilelor
int nr_ore,nr_min,nr_sec,T;
//datele de intrare
cout<<"Dati numarul de ore: "; cin>>nr_ore;
cout<<"Dati numarul de minute: "; cin>>nr_min;
cout<<"Dati numarul de secunde: "; cin>>nr_sec;
//calculam nr. total de secunde
T = nr_ore*3600+nr_min*60+nr_sec;
//afisam valoarea variabilei de iesire
cout<<"Numarul total de secunde = "<<T<<endl;
return 0;
}
Rulare:
Dati numarul de ore: 1 <Enter>
Dati numarul de minute: 20 <Enter>
Dati numarul de secunde: 15 <Enter>
Numarul total de secunde = 4815

1
Algoritmi si structuri de date – Informatica&Matematică, anul 1(2021-2022) ASD04AlgLiniari

R2 (2*).
Enunţul problemei: Determinaţi algoritmul pentru conversia inversă, adică din secunde în
ore-min-sec. De exemplu, 7432s = 2h 3m 52s.
Metoda de rezolvare:
Întâi, calculăm câte ore “încap” în numărul total de
secunde dat:
7432 3600
7200 2
=232
Se observă că numărul de ore se determină ca fiind câtul
împărţirii numărului total de secunde la 3600. Numărul
de secunde rămase este 232. În cazul general, vom împărţi variabila T ce memorează numărul
total de secunde la 3600, iar câtul reprezintă numărul de ore.
Apoi, se determină numărul de minute care “încap” în secundele rămase prin împărţirea
la 60.
232 60
180 3
=52
Câtul acestei împărţiri reprezintă numărul de minute, iar restul reprezintă numărul de secunde
rămase. Aşadar, 7432s = 2h 3m 52s.
Descrierea algoritmului în pseudocod:
citeste T *de exemplu 7432
nr_ore  câtul împărţirii lui T la 3600
T  restul împărţirii lui T la 3600 *mai departe T = 232
nr_min  câtul împărţirii lui T la 60
nr_sec  restul împărţirii lui T la 60
scrie nr_ore, nr_min, nr_sec *datele de ieşire

Descrierea algoritmului în C++(CodeBlocks):


#include <iostream>
using namespace std;

int main()
{
//declaram toate variabilelor
int nr_ore,nr_min,nr_sec,T;
//data de intrare
cout<<"Dati numarul total de secunde: "; cin>>T;
//calculam nr. total de secunde
nr_ore = T/3600; //in C/C++: intreg/intreg = cat
T = T%3600; //sau T %= 3600;
nr_min = T/60; //câtul impartirii T la 60
nr_sec = T%60; //rest impartire T la 60
//afisam valorile variabilelor de iesire
cout<<"Numarul de ore = "<<nr_ore<<endl;
cout<<"Numarul de minute = "<<nr_min<<endl;
cout<<"Numarul de secunde = "<<nr_sec<<endl;
return 0;
}
Rulare:
Dati numarul total de secunde: 7432 <Enter>
Dati numarul de ore: 2
Dati numarul de minute: 3
Dati numarul de secunde: 53

2
Algoritmi si structuri de date – Informatica&Matematică, anul 1(2021-2022) ASD04AlgLiniari

Pentru studenții avansați în algoritmică:

1. Se citește de la tastatură un CNP (SAALLZZJJNNNC – 13 cifre). Descrieți un algoritm


printr-un program C++ care citește de la tastatură CNP-ul ca număr natural, extrage data
nașterii și stabilește dacă este persoană de sex bărbătesc sau femeiesc (se vor lua în
considerare doar valorile 1 și 2). De exemplu, pentru CNP = 1980627035033, data nașterii
este 27.06.98 și este persoană de sex bărbătesc, iar pentru CNP = 2971203035033, data
nașterii este 3.12.97 și este persoană de sex femeiesc.
2. Să se descrie un algoritm pentru a exprima o sumă de lei citită de la tastatură în număr
minim de bancnote în valoarea de 1 leu, 5 lei, 10 lei, 50 lei, 100 lei, 200lei şi 500 lei. De
exemplu, 932 lei = 1 bancnotă de 500lei + 2 bancnote de 200lei + 3 bancnote de 10lei +
2 bancnote de 1 leu, iar 435 lei = 2 bancnote de 200lei + 3 bancnote de 10 lei + 1 bancnotă
de 5 lei.
3. Pentru avansați: Să se descrie un algoritm pentru a determinara distanța dintre două puncte
de pe Pământ, date prin coordonatele geografice exprimate în grade zecimale (latitudine 
[-900, 900] – la 00 este Ecuatorul și longitudine  [-1800, 1800]). De exemplu, coordonatele
Universitatii din Pitești din Targu din Vale sunt (44.854735, 24.881994), iar a Facultății de
matematică-informatică, Universitatea București sunt (44.435695, 26.101216).

Se va folosi algoritmul lui Haversine:

Date de intrare: P1(lat1, long1) și P2(lat2, long2)


R ← 6371 //raza Pamantului (in km)
Δlat ← (lat1 - lat2) * π / 180 //dif.latit. convertită în radiani
Δlong ← (long1 - long2) * π / 180
A ← sin2 (Δlat/2) + cos(lat1) * cos(long1) * sin2 (Δlong/2)
C ← 2*atan2( A , 1  A ) //atan2(x,y)=tan(x/y)
D ← R*C
Dată de ieșire: D.

S-ar putea să vă placă și