Aplicatii de Geografie in C++
Obiectivul lectiei
Dupa aceasta lectie, vei sti sa rezolvi probleme reale de geografie (fusuri orare, distante, densitate) folosind C++.
Dupa aceasta lectie vei putea:
- Sa calculezi ora in alt fus orar pornind de la ora din Romania
- Sa convertesti distante intre kilometri si mile
- Sa calculezi densitatea populatiei si sa clasifici rezultatul
- Sa aproximezi aria unei regiuni din grade geografice
- Sa calculezi timpul de calatorie in ore si minute
Aplicatii de Geografie in C++
Geografia foloseste multe calcule: distante intre orase, diferente de fus orar, densitatea populatiei, conversii de unitati. Aplicatiile pe care le folosesti zilnic (Google Maps, aplicatii meteo, GPS) sunt programe care fac exact aceste calcule. In aceasta lectie vom invata sa scriem programe C++ care rezolva probleme reale de geografie.
Vom folosi date reale din Romania si din lume: populatia tarii, suprafata judetelor, fusurile orare ale capitalelor importante. Astfel, lectia de informatica se leaga direct de ce inveti la geografie.
💡 Tipuri de date folosite
In problemele de geografie folosim float pentru distante, suprafete si densitati (au zecimale). Pentru populatie putem folosi int sau long (numere mari, fara zecimale). Pentru ore si fusuri orare folosim int (valori intregi 0-23).
Pamantul este impartit in 24 de fusuri orare, cate unul pentru fiecare ora din zi. Romania se afla in fusul orar UTC+2 (sau UTC+3 vara, cand se aplica ora de vara). Cand in Bucuresti este ora 12:00, in New York (UTC-5) este ora 5:00, iar in Tokyo (UTC+9) este ora 19:00.
Cum calculam ora la destinatie?
Pasul 1: Transformam ora din Romania in ora UTC: ora_utc = ora_ro - 2 (valabil iarna; vara Romania e UTC+3, deci ora_utc = ora_ro - 3)
Pasul 2: Adaugam fusul destinatiei: ora_dest = ora_utc + fus_dest
Pasul 3: Ajustam daca rezultatul iese din intervalul 0-23
Executie pas cu pas - ora in Romania = 14, destinatie = Tokyo (UTC+9):
| Pas | Actiune | ora_ro | fus_dest | ora_dest |
|---|---|---|---|---|
| 1 | Citire ora_ro = 14 | 14 | ? | ? |
| 2 | Citire fus = 9 | 14 | 9 | ? |
| 3 | ora_dest = 14 - 2 + 9 = 21 | 14 | 9 | 21 |
| 4 | 21 >= 0 si 21 < 24 => OK | 14 | 9 | 21 |
| 5 | Afiseaza: "21:00" | 14 | 9 | 21 |
⚠ Atentie la trecerea peste miezul noptii!
Daca rezultatul este negativ (de exemplu, -3), adaugam 24 si obtinem 21 (ora din ziua precedenta). Daca rezultatul este peste 24 (de exemplu, 27), scadem 24 si obtinem 3 (ora din ziua urmatoare). Aceasta ajustare este esentiala pentru un calculator de fusuri orare corect.
Tabel de referinta - fusuri orare importante:
| Oras | Fus UTC | Diferenta fata de RO |
|---|---|---|
| Londra | UTC+0 | -2 ore |
| New York | UTC-5 | -7 ore |
| Los Angeles | UTC-8 | -10 ore |
| Tokyo | UTC+9 | +7 ore |
| Sydney | UTC+11 | +9 ore |
In majoritatea tarilor din lume se folosesc kilometri pentru a masura distantele. Insa in SUA, Marea Britanie si cateva alte tari se folosesc mile. Cand citesti ca un oras american este la "50 miles" distanta, trebuie sa stii cat inseamna asta in kilometri.
Factorul de conversie:
1 km = 0.621371 mile
1 mila = 1.60934 km
O mila vine din latina ("mille passus" = o mie de pasi). In Roma antica, un soldat roman facea aproximativ 1000 de pasi dubli, ceea ce inseamna circa 1.5 km.
Observa cum am folosit if-else pentru a permite conversie in ambele directii. Programul intreaba utilizatorul ce tip de conversie vrea, apoi cere valoarea si calculeaza rezultatul. Aceasta este o imbunatatire fata de un program care face conversie doar intr-o singura directie.
Distante celebre in km si mile: Bucuresti-Brasov: 166 km (103 mile), Bucuresti-Constanta: 225 km (140 mile), maraton olimpic: 42.195 km (26.22 mile).
Alte conversii utile in geografie:
| Din | In | Factor |
|---|---|---|
| km2 | mile2 | * 0.386102 |
| hectare | km2 | / 100 |
| mile nautice | km | * 1.852 |
| picioare (feet) | metri | * 0.3048 |
Mila nautica (folosita in navigatie maritima si aviatica) este diferita de mila terestra! O mila nautica = 1.852 km, in timp ce o mila terestra = 1.609 km. Viteza navelor se masoara in noduri (1 nod = 1 mila nautica pe ora).
💡 De ce exista doua sisteme de masura?
Sistemul metric (km, m, cm) a fost inventat in Franta in timpul Revolutiei Franceze (1799) si este folosit de majoritatea tarilor. Sistemul imperial (mile, picioare, inch) este mult mai vechi si vine din Anglia medievala. SUA nu a trecut la sistemul metric deoarece costul inlocuirii tuturor semnelor rutiere, instrumentelor si manualelor ar fi fost enorm. De aceea, programatorii trebuie sa scrie programe de conversie intre cele doua sisteme.
Densitatea populatiei arata cati locuitori traiesc pe un kilometru patrat. Este un indicator important care ne spune cat de aglomerat este un teritoriu. O densitate mare inseamna zone urbane (orase), iar una mica inseamna zone rurale sau slab locuite.
Formula:
densitate = populatie / suprafata
Unitate de masura: locuitori/km2 (se citeste "locuitori pe kilometru patrat")
Date reale pentru comparatie:
| Tara/Oras | Populatie | Suprafata (km2) | Densitate |
|---|---|---|---|
| Romania | 19,000,000 | 238,397 | ~80 loc/km2 |
| Bucuresti | 1,800,000 | 228 | ~7,900 loc/km2 |
| Mongolia | 3,300,000 | 1,564,116 | ~2 loc/km2 |
| Monaco | 39,000 | 2 | ~19,500 loc/km2 |
Observa diferentele extreme: Mongolia are doar 2 locuitori pe km2 (desert si stepa), iar Monaco are aproape 20,000 (oras-stat foarte mic si aglomerat). Romania este undeva la mijloc, cu o densitate medie.
Comparatie interesanta: Densitatea Bucurestiului (~7,900 loc/km2) este de aproape 100 de ori mai mare decat a Romaniei in ansamblu (~80 loc/km2). Aceasta diferenta enorma se datoreaza faptului ca populatia nu este distribuita uniform: orasele mari concentreaza milioane de oameni pe suprafete mici, in timp ce zonele rurale si montane sunt slab locuite. Fenomenul de concentrare a populatiei in orase se numeste urbanizare si este un trend global.
💡 Densitate vs. populatie totala
Nu confunda densitatea cu populatia totala! China are 1.4 miliarde de locuitori (cea mai mare populatie), dar densitatea sa (~150 loc/km2) este mult mai mica decat a Bangladeshului (~1,300 loc/km2) care are doar 170 milioane de locuitori dar pe o suprafata foarte mica. Densitatea ne spune cat de aglomerat este un teritoriu, nu cat de populat este in total.
Executie pas cu pas - populatie = 19000000 (Romania), suprafata = 238397:
| Pas | Actiune | Rezultat |
|---|---|---|
| 1 | cin >> populatie (19000000) | populatie = 19000000 |
| 2 | cin >> suprafata (238397) | suprafata = 238397 |
| 3 | densitate = 19000000 / 238397 | densitate = 79.699 |
| 4 | 79.699 >= 50 si 79.699 < 150 | "Densitate medie" |
⚠ Atentie la tipul de date!
Populatia Romaniei este 19,000,000 - un numar mare. Tipul int poate stoca maxim ~2 miliarde, deci pentru populatii de tari mici si medii merge. Dar pentru populatia Chinei (1.4 miliarde) sau Indiei (1.4 miliarde) ai nevoie de long sau float. E o buna practica sa folosesti float pentru populatie in calcule de densitate, ca sa eviti impartirea intreaga.
Pe harta, distantele se masoara uneori in grade geografice. Un grad de latitudine (nord-sud) corespunde aproximativ 111 km pe suprafata Pamantului. Putem folosi aceasta aproximare pentru a calcula aria unei regiuni dreptunghiulare.
Conversie grade -> km:
1 grad latitudine = ~111 km
Aria in km2 = (latime_grade * 111) * (lungime_grade * 111)
Exemplu: Romania se intinde pe aproximativ 2.5 grade latitudine si 5 grade longitudine. Aria aproximativa: (2.5 * 111) * (5 * 111) = 277.5 * 555 = ~154,012 km2. Aria reala este 238,397 km2 - diferenta vine din faptul ca Romania nu este un dreptunghi perfect si ca gradul de longitudine variaza cu latitudinea.
Aceasta metoda de aproximare este utila pentru estimari rapide, dar pentru calcule precise se folosesc formule mai complexe care tin cont de curbura Pamantului (formula Haversine). Cu cat zona este mai aproape de poli, cu atat aproximarea dreptunghiulara devine mai imprecisa, deoarece meridianele se apropie unul de altul spre poli.
💡 De ce am folosit const?
Valoarea 111 (km per grad) este o constanta fizica - nu se schimba niciodata. Am declarat-o ca const float KM_PER_GRAD = 111; in loc sa scriem "111" de mai multe ori in cod. Daca ar trebui sa folosim o valoare mai precisa (110.574 km), am schimba-o intr-un singur loc.
O problema practica frecventa: daca stim distanta dintre doua orase si viteza medie de deplasare, cat dureaza calatoria? Aceasta combina geografia (distante reale) cu fizica (formula v = d/t).
Executie pas cu pas - distanta = 250 km, viteza = 80 km/h:
| Pas | Actiune | Rezultat |
|---|---|---|
| 1 | timp = 250 / 80 | 3.125 ore |
| 2 | ore = (int)3.125 | 3 ore |
| 3 | minute = (3.125 - 3) * 60 | 7 minute |
| 4 | Afiseaza | "3 ore si 7 minute" |
Trucul important este conversia (int)timp care pastreaza doar partea intreaga (numarul de ore complete). Apoi inmultim partea fractionara cu 60 pentru a obtine minutele. Acesta este un pattern util pe care il vei folosi si in alte contexte.
💡 Ce inseamna (int)timp?
Aceasta se numeste type casting (conversie de tip). Cand scrii (int)3.125, C++ taie zecimalele si pastreaza doar 3. Nu rotunjeste - pur si simplu ignora tot ce este dupa virgula. Alte exemple: (int)7.99 = 7, (int)0.5 = 0. Este diferit de rotunjire, unde 7.99 ar deveni 8.
Distante reale intre orase din Romania:
| Traseu | Distanta (km) | La 80 km/h | La 120 km/h |
|---|---|---|---|
| Bucuresti - Brasov | 166 | 2h 04min | 1h 23min |
| Bucuresti - Cluj | 450 | 5h 37min | 3h 45min |
| Bucuresti - Timisoara | 533 | 6h 39min | 4h 26min |
| Bucuresti - Constanta | 225 | 2h 48min | 1h 52min |
Poti verifica aceste calcule cu programul de mai sus! Introdu distanta si viteza si compara rezultatul cu tabelul.
Observa cum diferenta de viteza (80 km/h vs 120 km/h) afecteaza semnificativ durata calatoriei. Pe traseul Bucuresti-Cluj, diferenta este de aproape 2 ore! Aceasta este una dintre justificarile pentru constructia de autostrazi, care permit viteze mai mari si reduc semnificativ timpul de deplasare. Aplicatiile GPS precum Google Maps sau Waze fac exact aceleasi calcule, dar tin cont si de conditiile de trafic in timp real.
In aceasta lectie ai invatat sa rezolvi 5 tipuri de probleme de geografie cu C++:
| Problema | Formula cheie | Tip de date |
|---|---|---|
| Fus orar | ora_dest = ora_ro - 2 + fus (iarna) / ora_ro - 3 + fus (vara) | int |
| Conversie km/mile | mile = km * 0.621371 | float |
| Densitatea populatiei | dens = pop / suprafata | float |
| Aria in grade | aria = lat*111 * lung*111 | float + const |
| Timp calatorie | timp = dist / viteza | float + cast |
Observa ca toate problemele urmeaza acelasi pattern: citeste date -> aplica formula -> interpreteaza rezultatul. Diferenta este doar in formula folosita si in modul de afisare. Cu cat rezolvi mai multe probleme, cu atat acest pattern devine mai natural.
💡 Sfaturi pentru probleme de geografie
1. Foloseste float pentru densitati si distante - mereu au zecimale.
2. Foloseste int pentru ore si fusuri orare - sunt valori intregi.
3. Declara constantele cu const (ex: KM_PER_GRAD = 111).
4. Verifica mereu cu date reale - daca densitatea Romaniei iese 800 in loc de 80, ai o eroare.
5. Adauga clasificari cu if-else pentru a interpreta rezultatele numeric.
Exerseaza Calcule Geografice
Cursul te invata. Practica te face expert.
Citeste populatia si suprafata unei tari (in km2). Calculeaza si afiseaza densitatea populatiei. Clasifica zona: sub 50 = "slab populata", 50-150 = "medie", peste 150 = "dens populata".
238397
float si apoi if-else pentru clasificare.Citeste o distanta in kilometri si converteste-o in mile. Apoi afiseaza si cate ore ar dura sa parcurgi acea distanta cu masina (la 90 km/h) si pe jos (la 5 km/h).
Cu masina: 1.11 ore
Pe jos: 20 ore
float mile = km * 0.621371; si float timp_masina = km / 90.0;Citeste ora curenta in Romania (0-23) si fusul orar al destinatiei. Afiseaza ora la destinatie. Trateaza corect cazurile cand ora trece peste miezul noptii (ora negativa sau peste 24).
-5
-8
ora_dest = ora_ro - 2 + fus_dest; Apoi: if (ora_dest < 0) ora_dest += 24;Citeste distanta dintre doua orase (km) si viteza medie (km/h). Calculeaza si afiseaza timpul de calatorie in format "X ore si Y minute" (nu in ore cu zecimale).
80
100
float timp = dist / viteza; apoi int ore = (int)timp; si int min = (timp - ore) * 60;Creeaza un program care calculeaza diverse statistici pentru o tara. Urmeaza pasii:
cin >> populatie >> suprafata;, apoi densitate = populatie / suprafata; si foloseste if/else. Pentru mile patrate: float mi2 = km2 * 0.386102;
Exercitii practice
Exercitiul 1 (Nivel minim) - Convertor kilometri in mile
Cerinta: Citeste o distanta in kilometri si afiseaza cat inseamna in mile, folosind factorul din lectie: 1 km = 0.621371 mile. Declara variabilele cu tipul float, pentru ca rezultatul are zecimale. Afiseaza atat valoarea in km, cat si valoarea in mile, cu unitatile de masura scrise. Verifica programul cu distanta Bucuresti - Brasov (166 km): trebuie sa iti dea aproximativ 103.15 mile.
Vezi rezolvarea
Programul are cei 3 pasi obisnuiti: citeste, aplica formula, afiseaza.
Verificare pe hartie: 166 * 0.621371 = 103.147586, iar cout afiseaza implicit 6 cifre semnificative, deci pe ecran apare 103.148 mile (aproximativ 103.15). Se potriveste cu tabelul din lectie, unde Bucuresti - Brasov apare ca 166 km (103 mile).
Atentie la tipul de date: daca declari int km, mile;, zecimalele se pierd si obtii 103 in loc de 103.148. Pentru distante se foloseste mereu float.
Exercitiul 2 (Nivel standard) - Densitatea populatiei cu clasificare
Cerinta: Citeste populatia si suprafata (in km²) ale unei regiuni. Calculeaza densitatea cu formula densitate = populatie / suprafata si afiseaza rezultatul cu unitatea loc/km^2. Apoi, cu if-else, afiseaza si clasificarea: sub 50 = "Zona slab populata", intre 50 si 150 = "Densitate medie", peste 150 = "Zona dens populata". Testeaza cu Bucuresti (populatie 1800000, suprafata 228) - rezultatul trebuie sa fie in jur de 7894 loc/km² si mesajul "Zona dens populata".
Vezi rezolvarea
Formula este o simpla impartire, dar tipul de date conteaza: populatia se declara float ca sa nu se faca impartire intreaga.
Verificare pas cu pas pentru Bucuresti: 1800000 / 228 = 7894.736..., afisat 7894.74. Prima conditie (7894.74 < 50) este falsa, a doua (7894.74 < 150) este tot falsa, deci se executa ramura else si se afiseaza Zona dens populata.
Alte teste din lectie: Romania (19000000 si 238397) da 79.699 loc/km² si "Densitate medie"; Mongolia (3300000 si 1564116) da 2.10982 loc/km² si "Zona slab populata".
Ordinea conditiilor conteaza: scrii intai pragul cel mai mic (50), apoi pe cel mijlociu (150). Daca inversezi ordinea, toate valorile mari intra gresit pe prima ramura.
Exercitiul 3 (Nivel performanta) - Planificator de calatorie cu fus orar
Cerinta: Scrie un program care citeste patru date: ora plecarii din Romania (numar intreg, 0-23), distanta de parcurs (km), viteza medie (km/h) si fusul orar al destinatiei (de exemplu 0 pentru Londra, 9 pentru Tokyo). Programul trebuie sa afiseze (1) durata calatoriei in format "X ore si Y minute" si (2) ora locala la care ajungi la destinatie, ajustata corect daca se trece peste miezul noptii. Foloseste tot ce ai invatat in lectie: timp = distanta / viteza, type casting (int)timp pentru ore, (timp - ore) * 60 pentru minute si formula fusului orar ora_dest = ora_ro - 2 + fus_dest cu ajustarea in intervalul 0-23.
Test de control: plecare la ora 22, distanta 250 km, viteza 80 km/h, fus destinatie 9 (Tokyo) → durata 3 ore si 7 minute, ora sosirii 8:07.
Vezi rezolvarea
Schita de rezolvare (structura si pasii, nu programul de-a gata - pe acela il scrii tu):
- Declara variabilele cu tipul potrivit:
intpentru ora plecarii si pentru fusul destinatiei (sunt valori intregi),floatpentru distanta, viteza si timp (au zecimale). - Citeste cele patru date cu
cin, fiecare cu mesajul lui de invitare. - Calculeaza durata:
timp = distanta / viteza;apoi desparte-o inint ore = (int)timp;siint minute = (timp - ore) * 60;. - Calculeaza ora sosirii in ora Romaniei: aduni orele de drum la ora plecarii.
- Converteste in ora destinatiei cu formula fusului orar: scazi 2 (Romania este UTC+2 iarna) si aduni fusul destinatiei.
- Ajusteaza rezultatul in intervalul 0-23: cat timp este negativ adaugi 24, cat timp este 24 sau mai mare scazi 24. Atentie: dupa ce aduni si orele de drum, si diferenta de fus, rezultatul poate iesi cu mai mult de 24 din interval, deci foloseste
whilein loc de un singurif. - Afiseaza durata si ora sosirii.
Criterii de reusita - programul tau este corect daca:
- Pe testul de control (22, 250, 80, 9) afiseaza durata "3 ore si 7 minute" si ora sosirii 8:07. Verificare pe hartie: 250 / 80 = 3.125 ore; ore = 3; minute = 0.125 * 60 = 7. Ora in Romania la sosire: 22 + 3 = 25, adica 1 (dupa scaderea lui 24). La Tokyo: 1 - 2 + 9 = 8.
- Pe un test fara trecere peste miezul noptii da tot rezultatul corect: plecare 14, distanta 1600 km, viteza 800 km/h, fus 0 (Londra) → durata 2 ore si 0 minute, ora sosirii 14:00.
- Ora afisata este mereu intre 0 si 23 - niciodata negativa si niciodata 24 sau mai mare.
- Minutele sunt mereu intre 0 si 59.
- Fiecare valoare afisata are unitatea ei scrisa (ore, minute, ":00" pentru ora).
Daca vrei sa duci exercitiul mai departe: adauga un mesaj care spune si daca ajungi in ziua urmatoare sau in ziua precedenta fata de plecare.
Ce ai invatat astazi
- Ai invatat sa calculezi ora in alt fus orar:
ora_dest = ora_ro - 2 + fus_dest(iarna) si ai inteles de ce exista ajustarea pentru miezul noptii - Ai descoperit conversia km ↔ mile:
mile = km * 0.621371sikm = mile * 1.60934 - Ai calculat densitatea populatiei:
densitate = populatie / suprafatasi ai clasificat-o cuif-else - Ai aproximat aria unei regiuni geografice din grade in km2 folosind constanta
KM_PER_GRAD = 111 - Ai calculat timpul de calatorie in ore si minute folosind type casting:
(int)timpsi(timp - ore) * 60
Vrei mai mult?
Provocare: Extinde planificatorul de calatorie (Exercitiul 3): dupa ce calculezi ora de sosire in fusul destinatiei, foloseste if-else pentru a afisa daca ajungi ziua sau noaptea (ora intre 6 si 22 inclusiv = "ziua", altfel = "noaptea").
De ce? Formula ora_dest = ora_ro - 2 + fus_dest poate iesi negativa sau peste 23 (de exemplu -3 sau 27), ceea ce nu are sens ca ora din zi. Ce operator din C++ (deja intalnit la impartirea intreaga) poti folosi ca sa aduci automat rezultatul inapoi in intervalul 0-23, indiferent cat de mare sau mic iese calculul?
Deschidere: Exact acest calcul sta in spatele ceasului din telefon, care iti arata automat ora corecta cand calatoresti in alta tara, sau al aplicatiilor de tip World Clock folosite de piloti si calatori.