Ştiri:

Vă rugăm să citiţi Regulamentul de utilizare a forumului Scientia în secţiunea intitulată "Regulamentul de utilizare a forumului. CITEŞTE-L!".

Main Menu

Limbaje de programare

Creat de alina.d, Octombrie 26, 2009, 07:01:24 PM

« precedentul - următorul »

0 Membri şi 1 Vizitator vizualizează acest subiect.

Dendros

Acum m-ați dezorientat și mai mult. Pentru AlexandruLazăr: nu contează, pentru mine, că CommonLisp și Scheme sunt de nișă, fiindcă nu vreau să programez ca profesionist, ci doar de plăcere. Am înțeles că LISP e un limbaj general, chiar foarte general (am citit că paradigma Lambda, pe care se bazează LISP, e echivalentă cu cea a mașinii Turing, deci cu LISP se poate rezolva orice este algoritmic) și în același timp ușor de învățat, ceea ce e important pentru mine. Care ar fi problemele pe care le-aș putea avea ca începător cu LISP?
Pentru Adi: chiar nu se prinde de mine POO, am încercat să înțeleg și nu am reușit. Conceptul de obiect ce încapsulează datele și procedurile care prelucrează acele date îl înțeleg oarecum, dar moștenirea și polimorfismul nu și pace.
Mă interesează un limbaj ușor de învățat și generalist, nu unul profesional sau de largă răspândire.

Adi

Primul lucru pe care il faci cu un program e sa afisezi niste lucruri pe ecran, sa citesti un fisier, sa scrii un fisier, sa lucrezi cu stringuri, cu vectori, cu liste, cu map-uri. Pana aici nu ai nevoie de programare pe obiecte. C++ ofera programare pe obiecte, dar poti face chestii de baza fara ele. Sfatul meu e sa inveti direct C++.

Daca vrei sa faci programare just for fun, iti propun sa rezolvi niste probleme reale de stiinta, just for fun. Uite, iti propun una: a se masura numarul pi experimental. Uite cum faci. Iei un patrat cu latura 1 si in el inscrii un cerc cu raza 1. Arunci aleator cu o sageata undeva in patrat. Dupa ce arunci de un numer N suficient de mare, o sa vezi ca in N* a cazut pe cerc. Aria cercului impartita la aria patratului este masurata de tine ca si N*/N, ori asta e tocmai [tex]\frac{\pi R^2}{(2R)^2}=\frac{\pi}{4}[/tex]. Deci tot ce trebuie sa faci este sa vezi cum se fac numere aleatoare uniform distribuite intre 0 si 1 si sa le folosesti. Faci astfel si pe x si pe y. Pentru fiecare caz in care [tex]\sqrt{x^2+y^2}\le 1[/tex], atunci punctul e pe disc si se numara la N*. Fa asta si e deja un mare pas inainte.
Pagina personala: http://adrianbuzatu.ro

Dendros

Mai este până să rezolv prin programare problema dv. Încă nu am început, am nevoie și de cărți din care să învăț programare și algoritmică. E adevărat, se pare că sunt mai multe cărți despre C++, decât despre LISP, aici C++ ar fi mai convenabil. Da, ideea cu rezolvarea de probleme prin programare e bună. Eu mă gândeam la probleme de fizică, la ceva mai concret, nu neapărat la matematică.
Dar dacă mă apuc de C++, nu ajung până la urmă la POO, ceea ce doresc să evit?

Adi

De ce doresti sa eviti POO pana la urma? Poate din teama ca e prea grea? Ei bine, este foarte usoara. Deci daca o inveti in joaca, just for fun, dand de ea, e minunat.

Documentatie pentru C++ exista si pe internet. Gasesti practic nu doar tutoriale si exemple, dar si fiecare functie explicata bine cu teorie si exemple in siteuri oficiale de C++.

Iti pot propune si o problema de fizica. Se un punct fix cu masa M. Se da un punct material mobil de masa m. La momentul initial punctul m are pozitia x0, y0 si viteza vx0 vy0. Sa se afle pozitia corpului la momente succesive de timp prin metoda numerica, adica presupunandu-se ca la fiecare pas delta t corpul se misca cu viteza constanta. La final, a se verifica ca traiectoria corpului m este de fapt aproape o elipsa prin afisarea pozitiei la diverse momente de timp.

Pagina personala: http://adrianbuzatu.ro

Dendros

M-am gândit la un algoritm pentru problema de matematică expusă de dv. Dar ar putea fi complet greșit, sunt complet novice. Algoritmul nu l-am luat din vreo carte sau de pe Internet, mi-a venit în minte privind textul problemei. Arată astfel:
1. Se citește variabila N
2. Se inițializează cu 0 variabila N*
3. Am înțeles că practic orice limbaj are un generator de nr. aleatoare (rand, random, etc). Se inițializează o buclă cu N iterații, în corpul buclei se evaluează expresiile:
x=rand(0,1)
y=rand(0,1)
z=sqrt{x^2+y^2} (scuze de notație, nu am Latex)
Dacă z este mai mic sau egal cu 1, se incrementează cu 1 valoarea lui N*, altfel se trece la următoarea iterație.
4. După N iterații, bucla se termină și se trece la evaluarea expresiei (N*/N)*4, ar rezulta o valoare aproximativă a lui Pi.

Cum vi se pare?

Dendros

În privința problemei de fizică, pare o problemă de gravitație, întrucât ambele puncte au masă. Dar nu știu încă cum să exprim algoritmic asta.
Vă mulțumesc pentru probleme, sunt instructive.

Adi

Citat din: Dendros din Noiembrie 16, 2009, 03:45:56 PM
M-am gândit la un algoritm pentru problema de matematică expusă de dv. Dar ar putea fi complet greșit, sunt complet novice. Algoritmul nu l-am luat din vreo carte sau de pe Internet, mi-a venit în minte privind textul problemei. Arată astfel:
1. Se citește variabila N
2. Se inițializează cu 0 variabila N*
3. Am înțeles că practic orice limbaj are un generator de nr. aleatoare (rand, random, etc). Se inițializează o buclă cu N iterații, în corpul buclei se evaluează expresiile:
x=rand(0,1)
y=rand(0,1)
z=sqrt{x^2+y^2} (scuze de notație, nu am Latex)
Dacă z este mai mic sau egal cu 1, se incrementează cu 1 valoarea lui N*, altfel se trece la următoarea iterație.
4. După N iterații, bucla se termină și se trece la evaluarea expresiei (N*/N)*4, ar rezulta o valoare aproximativă a lui Pi.

Cum vi se pare?

Excelent!

Iar pentru Latex, avem un tutorial aici. Ecuatia e exct cum ai spus tu, trebuie doar sa pui un "\" inainte de sqrt si sa pui toata expresia intre [ tex ] si [ /tex ] fara spatii.
Pagina personala: http://adrianbuzatu.ro

Dendros

Citat din: AdiExcelent!

Iar pentru Latex, avem un tutorial aici. Ecuatia e exct cum ai spus tu, trebuie doar sa pui un "\" inainte de sqrt si sa pui toata expresia intre [ tex ] si [ /tex ] fara spatii.

Mulțumesc de calificativ. Îmi dau seama că expunerea algoritmului nu e riguroasă, nu sunt precizați în mod clar și detaliat pașii de urmat, dar pentru mine e ceva. Nu-mi vine să cred că am putut face asta, nu am mai programat niciodată. Vorbeam serios când am spus că nu am luat algoritmul din cărți sau de pe Internet, de aceea mi se pare incredibil.
Va trebui să văd și tutorialul despre Latex.

Adi

Citat din: Dendros din Noiembrie 16, 2009, 03:51:59 PM
În privința problemei de fizică, pare o problemă de gravitație, întrucât ambele puncte au masă. Dar nu știu încă cum să exprim algoritmic asta.
Vă mulțumesc pentru probleme, sunt instructive.

Algoritmul e descris in detaliu in cartea lui Feynman. Dar in mare e cam asa. Ai situatia initiala descrisa mai sus.
1. Calculezi distanta intre cele doua puncte.
2. Calculezi modulul acceleratiei gravitationale (KM/r2)
3. Calculezi componentele acceleratiei dupa 0x si 0y (caci stii directia ca este de la corpul m la Soarele considerat fix de masa M).
4. Apoi calculezi care este noua  pozitie si noua acceleratie a punctului m dupa un interval delta t cand se considera ca corpul se misca cu viteza constanta.
x1=x0+v0x*t+1/2t^2
v1=v0+v0x*t
Si la fel pentru y.

Apoi astea devin conditiile initiale pentru pasul urmator. Si poti sa iei 365 de pasi si atunci ai aproximatia ca in cursul unei zile Pamantul merge in jurul Soarelui cu viteza constanta. Si apoi vezi cati timp iti ia de calcul. Si daca nu e mult, poti sa faci ca fiecare pas sa fie doar o ora. Si tot asa.
Pagina personala: http://adrianbuzatu.ro

Dendros

Ah, acum e mai clar. N-am citit cartea lui Feynman, așa că n-am știut. Dar totuși nu mă pricep la metode numerice. Apropo, cu discuția asta sper că nu sunt offtopic, fiindcă autoarea topicului spunea că e despre limbaje de programare și curiozități în acest domeniu. Ce discutăm noi e o curiozitate?  :)

Adi

Citat din: Dendros din Noiembrie 16, 2009, 10:02:03 PM
Ah, acum e mai clar. N-am citit cartea lui Feynman, așa că n-am știut. Dar totuși nu mă pricep la metode numerice. Apropo, cu discuția asta sper că nu sunt offtopic, fiindcă autoarea topicului spunea că e despre limbaje de programare și curiozități în acest domeniu. Ce discutăm noi e o curiozitate?  :)

Pai tocmai la asta e esentiala programarea, la metode numerice. Si nu trebuie sa stii metode numerice. Practic rezolvi problema asta si la sfarsit zici "ah, astea erau de fapt metodele numerice ... iata ca nu e asa de complicat". Deocamdata nu e offtopic, nu iti fa griji. Daca cumva devine, mutam asta intr-un topic nou, fara sa iti reprosam tie ceva. Ma bucur ca te putem ajuta.

Ehe, dupa ce faci asta, banuiesti ca pasul urmator e sa nu mai presupui ca Soarele e fix :D. E aceeasi idee, numai ca acum forta gravitationala va actiona asupra ambelor corpuri (acum practic o neglijezi asupra soarelui). Si cu aia modelezi frumos cum doua corpuri de mase egale sau comparabile se rotesc in jurul unui centru comun, de exemplu la stelele duble. Si asa chiar faci stiinta reala, intelegand numeric chestii reale din natura.
Pagina personala: http://adrianbuzatu.ro

Mihnea Maftei

#26
Citat din: Dendros din Noiembrie 16, 2009, 03:26:48 AM
Pentru Adi: chiar nu se prinde de mine POO, am încercat să înțeleg și nu am reușit. Conceptul de obiect ce încapsulează datele și procedurile care prelucrează acele date îl înțeleg oarecum, dar moștenirea și polimorfismul nu și pace.
Mă interesează un limbaj ușor de învățat și generalist, nu unul profesional sau de largă răspândire.
Eu am invatat C++ in liceu, iar acum, la facultate, invat Java si C. Java mi se pare un limbaj frumos, clar, versatil. In plus, exista si multe resurse despre el.
Dendros, spui ca nu ai inteles mostenirea si polimorfismul (in cadrul programarii orientate pe obiecte). Mi se par niste chestii usor de inteles (desi numele lor suna poate pompos). Dar, ca intotdeauna, trebuie pur si simplu sa incepi cu bazele limbajului, sa faci exemple simple, apoi mai complicate.

Citat din: Dendros din Noiembrie 16, 2009, 09:36:45 PM
[...] nu am mai programat niciodată.
Daca doar citesti mult (vad ca ai citit despre mostenire si polimorfism) si nu faci niciun exemplu practic si apoi te astepti sa stii mult dintr-o data, nu merge... In plus, e si un proces frustrant daca faci asa.

HarapAlb

C si Java stie toata lumea, daca ai timp si curiozitate poti incerca sa vezi cu ce se mananca si LISP-ul.

Adi

Citat din: HarapAlb din Noiembrie 17, 2009, 01:35:00 AM
C si Java stie toata lumea, daca ai timp si curiozitate poti incerca sa vezi cu ce se mananca si LISP-ul.

Numai ca el nu stie nici C, nici Java, ca sa poata vedea cu ce se mananca LISP-ul. De fapt, el nu a facut nimic la programare niciodata, nici macar la scoala, daca inteleg corect.
Pagina personala: http://adrianbuzatu.ro

Dendros

Citat din: AdiNumai ca el nu stie nici C, nici Java, ca sa poata vedea cu ce se mananca LISP-ul. De fapt, el nu a facut nimic la programare niciodata, nici macar la scoala, daca inteleg corect.
Așa este, nu am făcut niciodată programare. Referitor la ce a spus Mihnea, e adevărat că doar am citit mult, fără să aplic ce am citit, dar motivul a fost unul simplu: până recent nu am avut calculator. Ce am postat de când m-am înscris pe forum și până acum câteva luni a fost de pe calculatoare publice și ale unor prieteni. Poate vă surprinde asta, dar e adevărat. Chiar și așa cititul mi-a folosit, nu sunt complet ignorant la teorie, dar la practică sunt într-adevăr complet novice și sper să corectez asta.