QReferate - referate pentru educatia ta.
Cercetarile noastre - sursa ta de inspiratie! Te ajutam gratuit, documente cu imagini si grafice. Fiecare document sau comentariu il poti downloada rapid si il poti folosi pentru temele tale de acasa.



AdministratieAlimentatieArta culturaAsistenta socialaAstronomie
BiologieChimieComunicareConstructiiCosmetica
DesenDiverseDreptEconomieEngleza
FilozofieFizicaFrancezaGeografieGermana
InformaticaIstorieLatinaManagementMarketing
MatematicaMecanicaMedicinaPedagogiePsihologie
RomanaStiinte politiceTransporturiTurism
Esti aici: Qreferat » Documente informatica

Notiuni fundamentale de programare



Notiuni fundamentale de programare



Programarea este disciplina informatica ce are ca scop realizarea de programe care sa constituie solutiile oferite cu ajutorul calculatorului unor probleme concrete. Programatorii sint acele persoane capabile sa implementeze intr-un limbaj de programare metoda sau algoritmul propus ca solutie respectivei probleme, ce se preteaza a fi solutionata cu ajutorul calculatorului. Dupa nivelul de implicare in efortul de rezolvare a problemelor specialistii in programare pot fi impartiti in diverse categorii: analisti, analisti-programatori, ingineri-programatori, simpli programatori, etc. Cu totii au insa in comun faptul ca fiecare trebuie sa cunoasca cit mai bine programare si sa fie capabil, nu doar sa citeasca, ci chiar sa scrie "codul sursa", adica programul propriu-zis. Din acest punct de vedere cunostintele de programare sint considerate "ABC-ul" informaticii si sint indispensabile oricarui profesionist in domeniu.




1.Cele trei etape ale rezolvarii unei probleme cu ajutorul calculatorului


In rezolvarea sa cu ajutorul calculatorului orice problema trece prin trei etape obligatorii: Analiza problemei, Proiectarea algoritmului de solutionare si Implementarea algoritmului intr-un program pe calculator. In ultima etapa, sub acelasi nume, au fost incluse in plus doua subetape cunoscute sub numele de Testarea si Intretinerea programului. Aceste subetape nu lipsesc din "ciclul de viata" a oricarui produs-program ce "se respecta" dar , pentru simplificare, in continuare ne vom referi doar la primele trei mari etape.

Daca etapa implementarii algoritmului intr-un program executabil este o etapa exclusiv practica, realizata "in fata calculatorului", celelalte doua etape au un pronuntat caracter teoretic. In consecinta, primele doua etape sint caracterizate de un anumit grad de abstractizare. Din punct de vedere practic insa, si in ultima instanta, criteriul decisiv ce confera succesul rezolvarii problemei este dat de calitatea implementarii propriuzise. Mai exact, succesul solutionarii este dat de performantele programului: utilitate, viteza de executie, fiabilitate, posibilitati de dezvoltare ulterioare, lizibilitate, etc. Cu toate acestea este imatura si neprofesionala "strategia" programatorilor incepatori care, neglijind primele doua etape, sar direct la a treia fugind de analiza si de componenta abstracta a efortului de solutionare. Ei se justifica cu totii prin expresii puerile de genul: "Eu nu vreau sa mai pierd vremea cu "teoria", am sa fac programul cum stiu eu. Cita vreme nu va face altcineva altul mai bun decit al meu, nu am de ce sa-mi mai bat capul !".


2.Cum se stabileste corectitudinea si eficienta solutionarii ?


Este adevarat ca ultima etapa in rezolvarea unei probleme - implementarea - este decisiva si doveditoare, dar primele doua etape au o importanta capitala. Ele sint singurele ce pot oferi raspunsuri corecte la urmatoarele intrebari dificile: Avem certitudinea ca solutia gasita este corecta ? Avem certitudinea ca problema este complet rezolvata ? Cit de eficienta este solutia gasita ? Cit de departe este solutia aleasa de o solutie optima ?

Sa mentionam in plus ca literatura informatica de specialitate contine un numar impresionant de probleme "capcana" pentru incepatori, si nu numai pentru ei. Ele provin majoritatea din realitatea imediata dar pentru fiecare dintre ele nu se cunosc solutii eficiente. De exemplu, este dovedit teoretic ca problema, "aparent banala" pentru un calculator, a proiectarii Orarului optim intr-o institutie de invatamint (scoala, liceu, facultate) este o problema intratabila la ora actuala (toate programele care s-au realizat pina acum nu ofera decit solutii aproximative fara a putea spune cit de aproape sau de departe este solutia optima de orar).

Citi dintre programatorii incepatori n-ar fi surprinsi sa afle ca problema "atit de simpla" (ca enunt), a carei solutionare tocmai au abandonat-o, este de fapt o problema dovedita teoretic ca fiind intratabila sau chiar insolvabila algoritmic ? Partea proasta a lucrurilor este ca, asa cum ciupercile otravite nu pot fi cu usurinta deosebite de cele comestibile, tot astfel problemele netratabile pot fi cu usurinta confundate cu niste probleme usoare la o privire rapida si lipsita de experienta.

Daca ar fi sa sintetizam in cite un cuvint efortul asupra caruia se concentreaza fiecare din cele trei etape - analiza, proiectarea si implementarea- cele trei cuvinte ar fi: corectitudine, eficienta si impecabilitate. Etapa de analiza este singura care permite dovedirea cu argumente riguroase a corectitudinii solutiei, iar etapa de proiectare este singura care poate oferi argumente precise in favoarea eficientei solutiei propuse.

In general problemele concrete din informatica au in forma lor initiala sau in enunt o caracteristica pragmatica, fiind foarte ancorate in realitatea imediata. Totusi ele contin in formularea lor initiala un grad mare de eterogenitate, diversitate si lipsa de rigoare. Fiecare dintre aceste "defecte" este un obstacol major pentru demonstrarea corectitudinii solutiei. Rolul esential al etapei de analiza este acela de a transfera problema "de pe nisipurile miscatoare" ale realitatii imediate de unde ea provine intr-un plan abstract, adica de a o modela. Acest "univers paralel abstract" este dotat cu mai multa rigoare si disciplina interna, avind legi precise, si poate oferi instrumentele logice si formale necesare pentru demonstrarea riguroasa a corectitudinii solutiei problemei. Planul abstract in care sint "transportate" toate problemele de informatica este planul sau universul obiectelor matematice iar corespondentul problemei in acest plan va fi modelul matematic abstract asociat problemei. Demonstrarea corectitudinii proprietatilor ce leaga obiectele universului matematic a fost si este sarcina matematicienilor. Celui ce analizeaza problema din punct de vedere informatic ii revine sarcina (nu tocmai usoara) de a dovedi printr-o demonstratie constructiva ca exista o corespondenta precisa (o bijectie !) intre partile componente ale problemei reale, "dezasamblata" in timpul analizei, si partile componente ale modelului abstract asociat. Odata descoperita, formulata precis si dovedita, aceasta "perfecta oglindire" a problemei reale in planul obiectelor matematice ofera certitudinea ca toate proprietatile si legaturile ce exista intre subansamblele modelului abstract se vor regasii precis (prin reflectare) intre partile interne ale problemei reale, si invers. Atunci, solutiei abstracte descoperite cu ajutorul modelului matematic abstract ii va corespunde o solutie reala concretizata printr-un algoritm ce poate fi implementat intr-un program executabil.

Aceasta este calea generala de rezolvare a problemelor si oricine poate verifica acest fapt. De exemplu, ca si exercitiu, incercati sa demonstrati corectitudinea (adica sa se aduca argumente precise, clare si convingatoare in favoarea corectitudinii) metodei de extragere a radicalului invatata inca din scoala primara (cu grupare cifrelor numarului in grupuri cite doua, etc . ) sau a algoritmului lui Euclid de determinare a celui mai mare divizor comun a doua numere prin impartiri intregi repetate. Desigur nu pot fi acceptate argumente copilaresti de forma: "Algoritmul este corect pentru ca asa l-am invatat!" sau "Este corect pentru ca asa face toata lumea !" din moment ce nu se ofera o argumentatie matematica riguroasa.

Ideea centrala a etapei a doua - proiectarea unui algoritm de solutionare eficient poate fi formulata astfel: din studiul proprietatilor si limitelor modelului matematic abstract asociat problemei se deduc limitele inferioare ale complexitatii minimale ("efortului minimal obligatoriu") inerente oricarui algoritm ce va solutiona problema in cauza. Complexitatea interna a modelului abstract si complexitatea solutiei abstracte se va reflecta imediat asupra complexitatii reale a algoritmului, adica asupra eficientei de solutionare a problemei. Acest fapt permite prognosticarea inca din aceasta faza - faza de proiectare a algoritmului de solutionare - a eficientei practice, masurabila ca durata de executie, a programului.


3. Notiunile fundamentale ale programarii: algoritm, limbaje de descriere a algoritmilor, program, limbaje de programare


3.1. Algoritmul



Se stie ca la baza oricarui program sta un algoritm (care, uneori, este numit metoda de rezolvare). Notiunea de algoritm este o notiune fundamentala in informatica si intelegerea ei, alaturi de intelegerea modului de functionare a unui calculator, permite intelegerea notiunii de program executabil. Vom oferi in continuare o definitie unanim acceptata pentru notiunea de algoritm:


Definitie. Prin algoritm se intelege o multime finita de operatii (instructiuni) elementare care executate intr-o ordine bine stabilita (determinata), pornind de la un set de date de intrare dintr-un domeniu de valori posibile (valide), produce in timp finit un set de date de iesire (rezultate).


Cele trei caracteristici esentiale ale unui algoritm sint:


Determinismul - dat de faptul ca ordinea de executie a instructiunilor algoritmului este bine precizata (strict determinata).

Acest fapt da una din calitatile de baza a calculatorului: "el" va face intotdeauna ceea ce i s-a cerut (prin program) sa faca, "el" nu va avea initiative sau optiuni proprii, "el" nu-si permite sa greseasca nici macar odata, "el" nu se va plictisi ci va duce programul la acelasi sfirsit indiferent de cite ori i se va cere sa repete acest lucru. Nu aceeasi situatie se intimpla cu fiintele umane (Errare humanum est). Oamenii pot avea in situatii determinate un comportament non-deterministic (surprinzator). Acesta este motivul pentru care numerosi utilizatori de calculatoare (de exemplu contabilii), datorita fenomenului de personificare a calculatorului (confundarea actiunilor si dialogului "simulat" de programul ce ruleaza pe calculator cu reactiile unei personalitati vii), nu recunosc perfectul determinism ce sta la baza executarii oricarui program pe calculator. Exprimindu-se prin propozitii de felul: "De trei ori i-am dat sa faca calculele si de fiecare data mi-a scos aceleasi valori aiurea!" ei isi tradeaza propria viziune personificatoare asupra unui fenomen determinist.

Universalitatea - data de faptul ca, privind algoritmul ca pe o metoda automata (mecanica) de rezolvare, aceasta metoda are un caracter general-universal. Algoritmul nu ofera o solutie punctuala, pentru un singur set de date de intrare, ci ofera solutie pentru o multime foarte larga (de cele mai multe ori infinita) de date de intrare valide. Aceasta este trasatura de baza care explica deosebita utilitate a calculatoarelor si datorita acestei trasaturi sintem siguri ca investitia financiara facuta prin cumpararea unui calculator si a produsului-soft necesar va putea fi cu siguranta amortizata. Cheltuiala se face o singura data in timp ce programul pe calculator va putea fi executat rapid si economicos de un numar oricit de mare de ori, pe date diferite !

De exemplu, metoda (algoritmul) de rezolvare invatata la liceu a ecuatiilor de gradul doi: ax2+bx+c=0, se aplica cu succes pentru o multime infinita de date de intrare: (a,b,c)IAxAxA

Finitudinea - pentru fiecare intrare valida orice algoritm trebuie sa conduca in timp finit (dupa un numar finit de pasi) la un rezultat. Aceasta caracteristica este analoga proprietatii de convergenta a unor metode din matematica: trebuie sa avem garantia, dinainte de a aplica metoda (algoritmul), ca metoda se termina cu succes (ea converge catre solutie).

Sa observam si diferenta: in timp ce metoda matematica este corecta chiar daca ea converge catre solutie doar la infinit (!), un algoritm trebuie sa intoarca rezultatul dupa un numar finit de pasi. Sa observam deasemenea ca, acolo unde matematica nu ofera dovada, algoritmul nu va fi capabil sa o ofere nici el. De exemplu, nu este greu de scris un algoritm care sa verifice corectitudinea Conjecturii lui Goldbach: "Orice numar par se scrie ca suma de doua numere prime", dar, desi programul rezultat poate fi lasat sa ruleze pina la valori extrem de mari, fara sa apara nici un contra-exemplu, totusi conjectura nu poate fi astfel infirmata (dar nici afirmata!).


3.2. Descrierea algoritmilor


Doua dintre metodele clasice de descriere a algoritmilor sint denumite Schemele logice si Pseudo-Codul. Ambele metode de descriere contin doar patru operatii (instructiuni) elementare care au fiecare un corespondent atit schema logica cit si in pseudo-cod.

In cele ce urmeaza vom insira doar varianta oferita de pseudo-cod intrucit folosirea schemelor logice s-a redus drastic in ultimii ani. Schemele logice mai pot fi intilnite sub numele de diagrame de proces in anumite carti de specialitate ingineresti. Avantajul descrierii algoritmilor prin scheme logice este dat de libertatea totala de inlantuire a operatiilor (practic, sageata care descrie ordinea de executie, pleaca de la o operatie si poate fi trasata inspre orice alta operatie). Este demonstrat matematic riguros ca descrierea prin pseudo-cod, desi pare mult mai restrictiva (operatiile nu pot fi inlantuite oricum, ci trebuie executate in ordinea citirii: de sus in jos si de la stinga la dreapta), este totusi perfect echivalenta. Deci, este dovedit ca plusul de ordine, rigoare si simplitate pe care il ofera descrierea prin pseudo-cod nu ingradeste prin nimic libertatea programarii. Totusi, programele scrise in limbajele de asamblare, care sint mult mai compacte si au dimensiunile mult reduse, nu ar putea fi descrise altfel decit prin scheme logice.


Atribuirea var:=expresie;


Intrare/Iesire Citeste var1, var2, var3, . ;

Scrie var1, var2, var3, . ; sau Scrie expresia1, expresia2, expresia3, . ;


Conditionala Daca <conditie_logica> atunci instructiune1 [altfel instructiune2];


Ciclurile - Exista (din motive de usurinta a descrierii algoritmilor) trei tipuri de instructiuni de ciclare. Ele sint echivalente intre ele, oricare varianta de descriere putind fi folosita in locul celorlalte doua, cu modificari sau adaugiri minimale:


Repeta instructiune1, instructiune2, . pina cind <conditie_logica>;


Cit timp <conditie_logica> executa instructiune;


Pentru var_contor:=val_initiala pina la val_finala executa instructiune;


In cazul ciclurilor, grupul instructiunilor ce se repeta se numeste corpul ciclului iar conditia logica care (asemenea semaforului de circulatie) permite sau nu reluarea executiei ciclului este denumita conditia de ciclare sau conditia de scurt-circuitare (dupa caz). Observam ca ciclul de tipul Repeta are conditia de repetare la sfirsit ceea ce are ca si consecinta faptul ca corpul ciclului se executa cel putin odata, in mod obligatoriu, inainte de verificarea conditiei logice. Nu acelasi lucru se intimpla in cazul ciclului de tipul Cit timp, cind este posibil ca instructiunea compusa din corpul ciclului sa nu poata fi executata nici macar odata. In plus, sa mai observam ca ciclul de tipul Pentru . pina la contine (in mod ascuns) o instructiune de incrementare a variabilei contor.

In limba engleza, cea pe care se bazeaza toate limbajele actuale de programare acestor instructiuni, exprimate in limba romana, le corespund respectiv: 2. Read, Write; 3. If-Then-Else; 4. Repeat-Until, Do-While, For. Sa observam ca, mai ales pentru un vorbitor de limba engleza, programele scrise intr-un limbaj de programare ce cuprinde aceste instructiuni este foarte usor de citit si de inteles, el fiind foarte apropiat de scrierea naturala. Limbajele de programare care sint relativ apropiate de limbajele naturale sint denumite limbaje de nivel inalt (high-level), de exemplu limbajul Pascal, spre deosebire de limbajele de programare mai apropiate de codurile numerice ale instructiunilor microprocesorului. Acestea din urma se numesc limbaje de nivel scazut (low-level), de exemplu limbajul de asamblare. Limbajul de programare C are un statut mai special el putind fi privit, datorita structurii sale, ca facind parte din ambele categorii.

Peste tot unde in pseudo-cod apare cuvintul instructiune el poate fi inlocuit cu oricare din cele patru instructiuni elementare. Aceasta substituire poarta numele de imbricare (de la englezescul brick-caramida). Prin instructiune se va intelege atunci, fie o singura instructiune simpla (una din cele patru), fie o instructiune compusa. Instructiunea compusa este formata dintr-un grup de instructiuni delimitate si grupate in mod precis (intre acolade in C sau intre begin si end in Pascal).

Spre deosebire de pseudo-cod care permite doar structurile noi formate prin imbricarea repetata a celor patru instructiuni (caramizi) in modul precizat, schemele logice permit structurarea in orice succesiune a celor patru instructiuni elementare, ordinea lor de executie fiind data de sensul sagetilor. Repetam ca desi, aparent, pseudo-codul limiteaza libertatea de descriere doar la structurile prezentate, o teorema fundamentala pentru programare afirma ca puterea de descriere a pseudo-limbajului este aceeasi cu cea a schemelor logice.

Forma de programare care se bazeaza doar pe cele patru structuri se numeste programare structurata (spre deosebire de programarea nestructurata bazata pe descrierea prin scheme logice). Teorema  de echivalenta a puterii de descriere prin pseudo-cod cu puterea de descriere prin schema logica afirma ca programarea structurata (aparent limitata de cele patru structuri) este echivalenta cu programarea nestructurata (libera de structuri impuse). Evident, prin ordinea, lizibilitatea si fiabilitatea oferita de cele patru structuri elementare (si asta fara a ingradi libertatea de exprimare) programarea structurata este net avantajoasa. In fapt, limbajele de programare nestructurata (Fortran, Basic) au fost de mult scoase din uz, ele (limbajele de asamblare) sint necesare a fi folosite in continuare doar in programarea de sistem si in programarea industriala (in automatizari).


3.3 Programul


Prin program se intelege un sir de instructiuni-masina care sint rezultatul compilarii algoritmului proiectat spre rezolvarea problemei dorite ce a fost descris intr-un limbaj de programare (ca si cod sursa).

Etapele realizarii unui program sint:

Editarea codului sursa, etapa ce se realizeaza cu ajutorul unui program editor de texte rezultatul fiind un fisier Pascal sau C, cu extensia .pas sau .c (.cpp)

Compilarea, etapa de traducere din limbajul de programare Pascal sau C in limbajul intern al micro-procesorului, si este realizata cu ajutorul programului compilator Pascal sau C si are ca rezultat un fisier obiect, cu extensia .obj (in limbajul C) sau .exe (in limbajul Pascal)

Link-editarea, etapa la care se adauga modului obiect rezultat la compilare diferite module continind subprograme si rutine de biblioteca, rezultind un fisier executabil (aceasta etapa este comasata in Turbo Pascal sau Borland Pascal cu etapa de compilare), cu extensia .exe

Executia (Run), etapa de lansare in executie propriu-zisa a programului obtinut, lansare realizata de interpretorul de comenzi al sistemului de operare (command.com pentru sistemele DOS+Windows)

Observam ca aceste patru (sau trei, pentru Turbo Pascal) etape sint complet independente in timp unele de altele si necesita utilizarea a patru programe ajutatoare: Editor de texte, Compilator Pascal sau C, Link-editor si Interpretorul de comenzi al S.O. In cazul mediilor de programare integrate (Turbo sau Borland) comandarea acestor patru programe ajutatoare precum si depanarea erorilor de executie este mult facilitata.

Deasemenea, merita subliniat faptul ca in timp ce fisierul text Pascal sau C, ce contine codul sursa, poate fi transportat pe orice masina (calculator) indiferent de micro-procesorul acesteia urmind a fi compilat 'la fata locului', in cazul fisierului obiect acesta nu mai poate fi folosit decit pe masina (calculatorul) pentru care a fost creat (datorita instructiunilor specifice micro-procesorului din care este compus). Deci, pe calculatoare diferite (avind micro-procesoare diferite) vom avea nevoie de compilatoare Pascal sau C diferite.

In plus, sa remarcam faptul ca fisierele obiect rezultate in urma compilarii pot fi link-editate (cu grija !) impreuna chiar daca provin din limbaje de programare diferite. Astfel, un program rezultat (un fisier .exe sau .com) poate fi compus din module obiect care provin din surse diferite (fisiere Pascal, C, asamblare, etc.).

4. Secretul invatarii rapide a programarii



Exista posibilitatea invatarii rapide a programarii ?

Desigur. Experienta predarii si invatarii programarii ne-a dovedit ca exista metode diferite de invatare a programarii, mai rapide sau mai lente, mai temeinice sau mai superficiale. Din moment ce se doreste invatarea rapida a programarii inseamna ca, pentru cel ce doreste aceasta, problemele ce isi asteapta rezolvarea cu ajutorul calculatorului sint importante sau stringente. Am putea chiar presupune ca solutionarea lor rapida este un deziderat mai important decit invatarea programarii. Tocmai de aceea, fiind constienti de acest fapt, vom prezenta in continuare una din cele mai rapide metode de invatare a programarii.

Sa observam mai intii ca pentru invatarea unei limbi straine este necesara comunicarea si vorbirea intensa a acelei limbi. Cu totii am putut constata ca daca exista o motivatie sau nevoie puternica de a comunica in acea limba, cel putin pentru o perioada de timp, procesul de invatare a ei este foarte rapid. De exemplu, daca ne aflam intr-o tara straina sau daca dorim apropierea de o persoana straina (mai ales daca este atragatoare si de sex opus . ) categoric vom constata ca am invatat mult mai iute limba respectiva. Si aceasta datorita faptului ca efortul de invatare a fost mascat in spatele efortului (intens motivat!) de a comunica si de a ne face cunoscute intentiile si gindurile.

La fel, pentru invatarea rapida si cu usurinta a programarii efortul trebuie indreptat, nu spre "silabisirea" limbajului de programare, ci spre rezolvarea de probleme si spre scrierea directa a programelor de solutionare a acestora. Concentrindu-ne asupra problemelor ce le solutionam nici nu vom observa cind si in ce fel am invatat sa scriem programe. La urma urmei, programarea este doar un instrument, doar o unealta "de scris", si nu un scop in sine. Daca vrei iute sa inveti sa scrii, conteaza cum sau in ce mina tii stiloul ? .

Nu trebuie deloc neglijat si un al doilea 'factor secret'. Asa cum "meseria nu se invata, ci se fura", tot astfel programarea se poate invata mult mai usor apelind la ajutorul unui profesor sau a unui specialist. Acesta, prin experienta si cunostintele sale de specialitate ne poate ajuta sa pasim alaturi de el "pe carari batatorite" si intr-un ritm sustinut.

In concluzie, intr-o descriere plastica si metaforica, metoda secreta cea mai rapida de "ascensiune" in programare este metoda "privirii concentrate spre virf, cu ghidul alaturi si pe carari batatorite".




Nu se poate descarca referatul
Acest document nu se poate descarca

E posibil sa te intereseze alte documente despre:


Copyright © 2024 - Toate drepturile rezervate QReferat.com Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site.
{ Home } { Contact } { Termeni si conditii }