CATEGORII DOCUMENTE |
Programarea calculatoarelor
De ce facem acest curs?
. Unii, pentru a dobandi cunostinte de baza legate de utilizarea si programarea unui calculator in special in programarea structurata, si
. Altii, pentru consolidarea, ordonarea si abordarea academica a unor cunostinte pe care le au deja.
Ce facem la aceasta disciplina?
. Notiuni de baza pentru a comunica unitary atunci cand vorbim despre un calculator
. Structura si functionarea unui calculator
. Programele conexe unui calculator
. Notiuni de Ingineria programarii, utilizarea calculatoarelor in diverse domenii
. Prezentarea unei perspective asupra limbajelor si tehnologiilor utilizate in programare
Ce facem la aceasta disciplina?
. Introducere in programare folosind limbajul C
. Tipuri standard, constante, variabile, expresii
. Functii standard de citire/scriere, instructiuni simple
. Instructiuni selective
. Instructiuni ciclice
. Functii si tipuri definite de utilizator, parametri
. Tipuri de date structurate, tipul tablou, tipul sir de caractere, structuri
. Pointeri
Evaluarea
. Test grila (c14): 30 intrebari din TOT cursul/ 20 min
. Examen pe calculator: 90 minute
- Programarea 1: in sesiune
- Programarea 2, programarea 3 (cu plata): pe parcursul semestrului 2.
- Pentru partial si programarile 2 si 3 se vor face inscrieri cu o saptamana inainte de examen pentru a putea face o programare pe ore a intrarii la examenul pe calculator. Pentru programarea 1 se va face o programare automata conform componentei grupelor programate pentru examen.
. Cerintele, modul de notare si desfasurare a examenului vor fi afisate la avizierul de la ASPC/CC si de la sala B019 pe tot parcursul semestrului.
Rezultatele examenului
. Vor fi afisate la Avizierul salii B019 dupa trecerea in procesele verbale care se trimit la secretariat (cpii).
. Verificati corectitudinea situatiei dvs. pentru a nu avea probleme cu situatia finala!!
. Aceeasi recomandare pentru toate disciplinele
Decan de an
. cititi regulamentul primit la deschiderea anului
. www.upt.ro
- site Universitatea "Politehnica"
- regulament,
- biblioteca,
- facultati
. www.aut.upt.ro - Departamentul de Automatica si Informatica Aplicata: informatii despre desfasurarea practicii de vara (Students Summer Practice Regulations), cursuri, dascali, orar, informatii despre activitatea de laborator.
. Ierarhia administrativa in Facultatea de Automatica si Calculatoare
- Decan - Prof.dr.ing. Octavian PROSTEAN
- Prodecan - Prof. dr.ing. Mircea POPA
- Prof. dr.ing. Mircea STRATULAT
Decan de an
Directori de departamente:
Automatica si Informatica Aplicata
Conf.dr.ing. Ioan SILEA
Calculatoare Prof.dr.ing. Vladimir CRETU
Decan de an
. Ierarhia profesionala universitara tehnica
- Profesor
- Conferentiar
- Sef de lucrari
- Asistent
- Preparator
Competente
. competente.xls
. Pl_inv.doc
Era informatiei:
Oameni,
Informatie&Tehnologie
Telegraful original creat de Samuel
Morse (emisie/receptie) 1837
. primul instrument care a transformat informatia in semnal electric si a transmis-o la distanta (pattern)
. emitatorul (in fata) avea coduri de tip vale-deal (similare codului Morse, cu liniute si puncte)
. receptorul (in spate) tiparea aceste patternuri, refacand codurile vale-deal prin miscarea fata-spate a unui electromagnet care raspundea semnalelor de la emitator
Telegraf Morse/Vail - 1844 -
. Emitatorul
. Cu
el s-a transmis primul mesaj de test pe linia
Telegraf Morse/Vail - 1844
. Receptorul
. Cu
el s-a receptat primul mesaj de test pe linia
Telegraph Co.
. Folosit intens pentru a afla valoarea actiunilor la bursa
. Util pentru a lua decizii rapide si a le transmite la bursa
. comunitatea oamenilor de afaceri a folosit la inceput cel mai intensiv telegraful
Cablul peste
. Primul cablu prin care s-a transmis informatie peste ocean - eroare)
. 1866 - succes
. in stanga - un tip de cablu care a fost utilizat ~100 de ani
. in dreapta - cablu coaxial, parte a primului cablu de telefonie transatlantic, 1956
Primele echipamente de telefonie
Alexander Graham Bell
. in dreapta - telefoane mai vechi bazate pe principiul crearii unor modele electrice variablie in fire, dupa miscarea unui ac in sus si in jos, intr-un lichid (probleme de statica)
. in stanga - telefoane mai noi bazate pe principiul inductiei magnetice
Magneto-telefon
. Primul aparat de telefonie in care emisia si receptia se realizau cu acelasiechipament
Instrumente pentru prelucrarea informatiei
. Stetoscop medical
. masina de calcul de tip Hollerith, pantograf cu compostor,sorter
. Arithmeter (dreapta) - companiile de asigurari (speranta de viata)
. cerute de industrializarea masiva din sec. 19
Progrese in comunicare
. Microfon NBC
. Difuzor Magnavox
. Radio Echophone
'Cathedral' (1934
. Telefon Western Electric Scissor
. Aparat Edison pentru bursa
Masina ENIGMA
. razboi mondial - masini care transmiteau informatia codificat
. 1 trilion de modele diferite de coduri
. polonezi/englezi, americani
. masina germana Enigma cu 4 rotoare (pentru codare)
. in spate - "bomba" -pentru decriptare (dezvoltarea componentelor electronice)
ENIAC - Electrical Numerical Integrator and Computer
. calculator
electronic digital dezvoltat si construit de armata
. folosit ptentru calcule balistice complexe
. a deschis drumul industriei de calculatoare postbelice
Record Player (45 rpm) - RCA -anii '50
. Rock and Roll si '45' au "crescut" impreuna
Homebrew Computer (
. 'counter culture"
. pionierii dezvoltarii calculatoarelor personale
Apple I
Steve Jobs and Steve
Wozniak, cei mai faimosi membri aiHCC au proiectat in1976 un "kit computer"
Linie de asamblare robotizata intr-o fabrica de automobile
. robot de sudura in puncte
. realizeaza munci monotone, repetitive sau periculoase
. integrati in retele care controleaza intregul proces de productie
Echipa IPC urmareste sa va transmita si:
. Instrumente de dezvoltare a abilitatii de a rezolva probleme
. Posibilitatea de cunoastere a rolului abstractizarii
. Recunoasterea solutiilor alternative
. Urmarirea subiectelor in dinamica reala
. Implicatii etice, juridice, sociale (vandalism, drepturi de proprietate, profesionalism, securitate)
. Abilitati de comunicare in limbaj profesionist
Succes!
C2
Programarea Calculatoarelor
Capitolul 1
Notiuni fundamentale utile in
programarea calculatoarelor
Localizarea cursului
1. Cum sunt utilizate sistemele de calcul
(SC)?
2. Cum sunt implementate SC?
3. Ce pot face SC si cat de bine?
Sistem de calcul - includem tot, de la o componenta
hardware sau software simpla la o retea de calculatoare
Localizarea cursului
Raspuns la intrebarea 1:
. Stiinta
. Iniginerie
. Productie
. Comert
. Domeniul militar, etc.
Localizarea cursului
. Raspuns la intrebarea 2
. Cum lucreaza un calculator (H/S) pe diferite
niveluri.
. Implementarea este rezultatul unui proces de
proiectare care implica o descriere succesiva
si de detaliu a sistemului - intregul proces de
scriere a unui program vs. scrierea unui
program in limbaj de nivel scazut.
Localizarea cursului
. Raspuns la intrebarea 3
. Necesar: modele teoretice (masina Turing,
etc.) care in particular precizeaza ce nu poate
face un calculator
. Eficienta in utilizarea resurselor (timp. spatiu),
performanta (rezultate, intarzieri,.), siguranta,
securitatea, gradul de incredere,
disponibilitatea.
SUMAR
. 1.1. Comunicarea
- Limbaje de programare
- Etape de baza care trebuie urmate pentru rezolvarea
unei probleme pe calculator
- Algoritmi
. 1.2. Sisteme de numeratie utilizate in lucrul cu
calculatorul
- Sisteme de numeratie
- Conversia zecimal-binar-hexazecimal
- Operatii binare
- Coduri de reprezentare a datelor (numerice,
alfanumerice)
. 1.3. Structura si functionarea unui calculator
- Hardware (microrocesor, executia unui program
reflectata la nivel hardware, memoria interna
1.1. Comunicarea
Limbaje de programare
Dupa modul de abordare a rezolvarii problemelor cu calculatorul limbajele pot fi:
_procedurale - atunci cand rezolvarea problemei urmeaza anumite etape si utilizeaza structuri fundamentale (Pascal, C, etc.)
_ neprocedurale - ele se bazeaza pe reguli si sunt mai apropiate de limbajul si modul de rationare natural (limbajele pentru inteligenta artificiala: Prolog, Lisp).
Comunicarea
_orientate pe obiecte (C++, Java)
_pentru
aplicatii Web (PHP,
_pentru aplicatii distribuite sau mobile
_pentru aplicatii de conducere a robotilor si masinilor unelte
Etape de baza care trebuie urmate pentru rezolvarea unei probleme pe calculator
_analiza problemei - se stabileste exact CE subprobleme trebuie sa rezolve programul
_programarea - reprezentarea problemelor intr-un mod adecvat pentru rezolvarea asistata de calculator
_implementarea - scrierea programului care rezolva problema intr-un anumit limbaj de programare
Etape de baza care trebuie urmate pentru rezolvarea unei probleme pe calculator
Problema care trebuie rezolvata
Reprezentarea problemei
Rezolvarea problemei folosind un limbaj de programare
Fig. 1.1. Abordarea rezolvarii unei probleme cu calculatorul
Informatica aplicata
. O disciplina care incearca sa construiasca o baza stiintifica pentru un numar mare de domenii
- Proiectarea si programarea calculatoarelor
- Prelucrarea informatiilor
- Rezolvarea algoritmica a problemelor
. Stiinta algoritmilor
- Domenii: matematica, inginerie, psihologie, management, lingvistica, etc
- Programare - principii de baza ale instrumentelor de programare utilizate in prezent, evolutie si probleme
Algoritm
. Ansamblu de etape prin care se defineste modul in care poate fi dusa la indeplinire o anumita sarcina
. Un set ordonat de pasi executabili, descrisi fara echivoc, care definesc un proces finit
. Reprezentarea algoritmilor in calculator -> program -> software
Algoritmul lui
Algoritmi
. Primesc si transmit informatie
. Rezolva o problema
. Sunt in forma conceptuala - trebuie sa fie reprezentate intr-o forma in care pot sa fie communicate unui calculator - prin setul de instructiuni (gramatica si limbaj)
- limbaj de programare
- paradigme de programare
Algoritmi
. Descoperire
. Reprezentare
. Analiza
. Executie
. Comunicare
. Limite
1.2. Sisteme de numeratie utilizate in lucrul cu calculatorul
Sisteme de numeratie utilizate in lucrul cu calculatorul
_Un sistem de numeratie este constituit din ansamblul regulilor de reprezentare a numerelor folosind cifre. Cifrele sunt simbolurile utilizate pentru reprezentarea numerelor
_Sistemele de numeratie pot fi pozitionale sau nepozitionale.
Sisteme de numeratie utilizate in lucrul cu calculatorul
_Sistemul de scriere roman este un system nepozitional care reprezinta numerele prin compunerea cifrelor in mod repetat incepand cu cele mari si obtinand valoarea numarului prin insumarea lor.
_ Sistemele pozitionale au asociata o baza care reprezinta numarul total de cifre utilizate.
Sisteme de numeratie utilizate in lucrul
cu calculatorul
_Spre deosebire de oameni care lucreaza in mod normal in baza 10 de numeratie, calculatorul este construit sa lucreze cu numere reprezentate in baza 2.
_Se pare ca explicatia utilizarii bazei 10 este aceea ca avem 10 degete si primele calcule s-au facut pe aceste'instrumente'. '
Sisteme de numeratie utilizate in lucrul cu calculatorul
_Informatia elementara vehiculata in calculator este bitul (in l. engl. binary digit sau bit = bucatica). El poate avea valoarea 0 sau 1. Aceste valori corespund fizic unor anumite nivele de tensiune, in functie de circuitele electronice cu care este construit calculatorul.
_'Cuvintele' pe care le intelege calculatorul sunt formate din 8 biti si se numesc octeti (l. engl. bytes).
Sisteme de numeratie utilizate in lucrul
cu calculatorul
_1 K sau 1 Kilo octet (1 Kilo byte) = 1024 bytes (210)
_1 M sau 1 Mega octet (1 Mega byte) = 1024 K (220)
_1G sau 1 Giga octet (1 Giga byte) = 1024 M (230)
_Calculatoarele folosesc baza de numeratie 2 sau cele doua derivate din aceasta: octal si hexazecimal. Acestea reprezinta cifrele caracteristice in grupari de triade sau tetrade (8=23, 16=24).
Sisteme de numeratie utilizate in lucrul
cu calculatorul
Conversia binar - zecimal
_Un numar poate fi scris din baza 10 in binary descompunand prin impartiri repetate la doi numarul zecimal si scriindu-l dupa puterile lui 2.
_Exemplu:
77 = 64 + 13 = 64 + 8 + 4 + 1 = 26 + 23 +22 + 20 =
0*27+1*26+0*25+0*24+1*23+1*22+0*21+1*20
Deci, 77 se scrie in binar 0100 1101
Conversia zecimal - binar -hexazecimal
_Pentru numere mari este incomoda scrierea unui sir lung de cifre 1 si 0.
_De aceea s-a trecut la utilizarea sistemului hexazecimal in care numerele sint scrise utilizand cifre si litere
_Vezi Tabelul 1. Reprezentarea numerelor, comparativ, in zecimal, binar si hexazecimal
Operatii binare
. Operatiile specifice cu numere reprezentate in binar sunt:
- SAU (OR),
- SI (AND),
- SAU EXCLUSIV (XOR) si
- deplasari la stanga si dreapta.
Operatii binare
Operatii binare
. O deplasare la stanga cu o pozitie, intr-un numar reprezentat in binar, este echivalenta unei inmultiri cu doi. Deplasarile cu mai multe pozitii la stanga sunt echivalente cu inmultiri cu 2 la puterea numarului de deplasari.
. Exemplu: 0000 1011 este reprezentarea binara a numarului zecimal . Daca realizam o deplasare cu doua pozitii la stanga obtinem numarul binar 0010 1100, adica in zecimal ( x 22). 11 11 44
Operatii binare
. O deplasare la dreapta cu o pozitie, intr-un numar reprezentat in binar, este echivalenta unei impartiri cu doi. Deplasarile cu mai multe pozitii la dreapta sunt echivalente cu impartiri cu 2 la puterea numarului de deplasari.
. Exemplu: 0011 1100 este reprezentarea binara a numarului zecimal . Daca realizam o deplasare cu doua pozitii la dreapta obtinem numarul binar 0000 1111, adica in zecimal ( / 22). 60 15 60
Coduri de reprezentare a datelor
. Avand in vedere ca utilizatorii opereaza in sistemul zecimal, iar calculatorul lucreaza in sistem binar, este necesar un sistem de conversie care sa faca posibila comunicarea facila intre utilizator si calculator. Acest lucru se realizeaza prin utilizarea codurilor numerice si alfa numerice.
Codurile numerice
. sunt codurile prin care pot fi reprezentate cele 10 cifre ale sistemului zecimal cu sau fara semnul asociat, utilizand o tetrada binara. Acestea au fost specifice calculatoarelor care prelucrau date numerice.
. Doua tipuri de coduri numerice mai cunoscute sunt: DCB - cod zecimal codificat binar si codurile numerice detectoare de erori prin metoda controlului de paritate sau imparitate (in transmisia datelor).
Codurile alfanumerice
. sunt utile pentru reprezentarea caracterelor: cifre, litere, semne de punctuatie, semne speciale.
. Coduri alfanumerice sunt:
- ASCII extins, ASCII - American Standard Code for Information Interchange.
- Unicode - foloseste modele pe 16 biti pentru reprezentarea fiecarui simbol (65 536 sabloane diferite)
- ISO - pe 32 de biti (17 x 106 simboluri)
Codurile alfanumerice
. Codul ASCII extins poate reprezenta 256 caractere.
. Spre exemplu literele mari sunt cuprinse intre 65 (Alt 65 pe tastatura calculatorului va determina afisarea literei A) si 90 (codul pentru litera Z).
. Literele mici au codurile cuprinse intre 95 si 122.
. Cifrele de la 0 la 9 au codurile intre 48 si 57.
. Dintre semne speciale, de exemplu, & are codul 38.
1.3. Structura si functionarea unui calculator
Hardware
Termenul desemneaza componentele
mecanice si electronice ale unui calculator
(inclusiv echipamentele periferice).
. Structura hardware a unui calculator contine:
. microprocesorul - dispozitiv de comanda;
. memoria (interna si externa);
. echipamente periferice (PI - periferice de intrare, PE - periferice de iesire).
Componente de baza
. Porti logice - dispozitive care produc rezultatul unei operatii logice (and, or.)
. Circuite basculante bistabile (flip-flop) - circuite care au la iesire una din cele doua valori fizice posibile (0 sau 1). Iesirea ramane stabile pana cand un impuls de la alt circuit are ca efect comutarea lui la cealalta valoare - stocheaza un bit
. Chip - contine milioane de cbb
Tehnologie
. Cbb fiind electronice pot fi actionate mai rapid decat cele pe suport magnetic sau optic. De aceea sunt folosite pentru constructia componentelor interne ale calculatorului.
. Cele pe suport magnetic sau care folosesc laser sunt folosite pentru componente externe deoarece chiar daca sunt mai lente au avantajul ca pastreaza informatia si dupa oprirea sursei de curent.
Microprocesorul
. este 'creierul' calculatorului.
. controleaza si comanda toate operatiile din calculator:
- Extrage din memoria interna a calculatorului, rand pe rand instructiunile programelor, le decodifica si transmite comenzi pentru executarea lor.
. Microprocesorul are doua componente principale:
- unitatea de comanda (UC) si
- unitatea aritmetica si logica (UAL).
Microprocesorul
. Unitatea de comanda controleaza functionarea tuturor componentelor calculatorului.
. Unitatea aritmetica si logica realizeaza operatiile aritmetice si deciziile logice.
. Parametrii care caracterizeaza unitatea de comanda sunt: numarul de instructiuni, lungimea unei instructiuni si viteza de executie.
Microprocesorul
. Pentru stocarea temporara a datelor cu care lucreaza UC are registre (registri) - necesare pentru realizarea imediata a unor operatii
- Memoria interna - stocarea datelor necesare pe termen scurt
- Memoria externa - stocare pe termen lung
Microprocesorul
Microprocesorul
. Instructiunile la nivelul UC si UAL (scriere, citire, operatii logice) sunt instructiuni in cod-masina.
. Un program este o secventa de astfel de instructiuni stocate in memoria interna
. Instructiunile in cod masina si sistemul de codificare constituie limbajul masina care defineste modul in
care comunicam calculatorului algoritmii pe care va trebui sa ii execute.
. Limbajul pe care il accepta microprocesorul - limbaj de asamblare
Microprocesorul
. O instructiune cod-masina are doua campuri
- Cod operatie (ex. shft,or, and,etc.)
- Operand (valoarea unui operand sau adresa valorii)
Executia unui program -
ciclul masina
. Extragere - UC solicita memoriei principale sa furnizeze urmatoarea instructiune care va fi executata; UC are adresa de memorie a instructiunii care va fi executata in registrul contorului programului.
Executia unui program -
ciclul masina
. UC plaseaza instructiunea din memorie in registrul de instructiuni si incrementeaza registrul contorului programului pentru a pregati adresa urmatoarei instructiuni.
. Decodificare - analiza campului codoperatie si operand.
. Executie - realizarea actiunilor conform instructiunii decodificate
. Reluarea ciclului.
Executia unui program - ciclul masina
Memoria interna
. cuprinde spatiul de memorare la care are acces procesorul, fara sa includa utilizarea canalelor de intrare-iesire ale calculatorului.
. Programele impreuna cu datele si rezultatele prelucrarilor sunt inregistrate in memoria interna sub forma de siruri de cifre binare.
. Parametrii memoriei interne sunt: capacitatea memoriei si timpul de acces.
Memoria interna
. Contine cuvinte organizate in octeti, fiecare avand asociata o adresa prin care locul sau este determinat in mod unic
Random Access Memory
RAM
In aceasta memorie se incarca temporar programele si datele curente care seprelucreaza pe calculator.
Ea poate fi scrisasau citita.
Continutul sau este volatil.(Se poate pierde in urma deconectarii calculatorului de la retea).
Evolutia capacitatii memoriei
Tipuri de memorie interna
RAM
. Modulele SIMM (Single In-line Memory Module ) sunt placi cu circuite imprimate avand lipite pe ele cipuri de memorie; bus de 32 biti
. Pe un SIMM poate fi montat un numar variabil de cipuri, pe o singura fata a placii sau pe amandoua.
. Pe una din laturile sale, modulul SIMM are un rand de contacte cositorite sau aurite.
. Modulele SIMM sunt montate in socluri speciale, prevazute cu mecanisme de blocare care fixeaza modulul in soclu.
. Modulele DIMM (Dual In-line MM); bus de 64 biti
Tipuri de memorie interna
RAM
. Exemple de memorii RAM:
-
- SDRAM (Synchronous Dynamic RAM).
. SDRAM sunt mai rapide si au o capacitate mai mare de stocare
Memorii si placi de baza
SIMM
Memorii si placi de baza
16 Mb EDO
4Mb EDO
32 Mb EDO
64 Mb SDRAM
32 Mb SDRAM
Tipuri de memorie interna
RAM
. Majoritatea adaptoarelor de tip VGA sau SVGA au incorporata o memorie RAM suplimentara necesara manipularii informatiei afisate current pe ecran si cresterii vitezei de reimprospatare a ecranului; VRAM (Video RAM)
Tipuri de memorie
interna
Read Only Memory (ROM)
_ programele si datele din acest tip de memorie sunt scrise de producator prin tehnici speciale si nu pot fi modificate de utilizator.
_ Poate fi doar citita.
_ O parte din acest tip de memorie se declanseaza la pornirea calculatorului si gestioneaza initializarea si incarcarea sistemului de operare.
_ La calculatoarele IBM-PC aceste memorii ROM contin programele prin care se realizeaza comunicarea cu perifericele: BASIC INPUT OUPUT SYSTEM, BIOS.
Tipuri de memorie interna
_CMOS este o memorie de tip RAM.
_Spre deosebire de memoria RAM ea are avantajul unui consum mai mic si ca urmare la deconectarea calculatorului ea ramane alimentata printr-un acumulator din calculator si pastreaza informatia inregistrata in ea.
_Contine informatii pentru BIOS si partea care se modifica.
Tipuri de memorie interna
_CACHE este o memorie speciala atasata microprocesorului care contribuie la marirea vitezei calculatorului prin doua proprietati:
_are timp de acces mic (similar registrelor microprocesorului) si
_evita o serie de operatii intermediare care apar in cadrul memoriei RAM in ceea ce priveste accesul la microprocesor.
Prezentari C3
. Memoria externa: .
. Periferice de intrare: .
. Periferice de iesire: .
Cursul 3
Sumar
. Memoria externa
- Tipuri de discuri: generalitati, floppy, hard, CD-ROM, DVD, flash, ZIP, alte dispozitive.
. Echipamente periferice
- de intrare (tastatura, mouse, scanner, )
- de iesire (monitor, imprimanta, )
. Arhitecturi de calculatoare (RISC, CISC; SISD,SIMD, MIMD, SIMD).
Memoria externa
. Este mai lenta decat cea interna pentru ca are in general parti mecanice
. Utila pentru ca memoreaza informatia pe termen lung
. Mai ieftina decat memoria interna
Tipuri de discuri - general
Discul magnetic: suportul de inregistrare a informatiei este un disc acoperit cu un strat magnetic fin.
Dispozitivul care gestioneaza discul realizand operatiile de scriere/citire se numeste unitate de disc.
Tipuri de discuri - general
. Informatia se inregistreaza pe piste (cercuri concentrice) care sunt impartite in sectoare.
. Operatiile de scriere/citire se fac la nivel de sector.
. Fiecare sector contine un numar fix de octeti (128, 112, 224) in functie de caracteristicile fizice ale discului.
. Caracteristicile unui disc sunt: capacitate de memorare, timp mediu de operare pe pista, viteza de transferare a informatiei.
Tipuri de discuri
. Disc flexibil: detasabil, cu o capacitate (in general) de 1,44 Mo. Dimensiune: 3,5" (inch).
. Pentru a putea fi folosite, dischetele trebuiau formatate. Operatia de formatare consta in inscrierea pe suprafata magnetica a unei dischete a unor semnale care impart aceasta suprafata intr-o serie de piste circulare concentrice (tracks) si fiecare pista intr-un numar de sectoare.
. Dimensiunea sectorului pe discheta este de 512 octeti.
Unitate de disc flexibil
Tipuri de discuri
. Hard-disc: se afla in calculator. Capacitatea de memorare este de ordinul sutelor de gigaocteti.
. Categorii de discuri - numite dupa interfata ce le comanda
. IDE (Integrated Drive Electronics) si
. SCSI (Small Computer System Interface). Discurile SCSI sunt mai rapide, dar si mai scumpe decat discurile IDE.
Hard disc - evaluare
performante
. Timp de cautare - timpul de deplasare a capului de citire de la o pista la alta
. Timp de intarziere - jumatate din timpul necesar pentru ca discul sa efectueze o rotatie completa sau timpul mediu in care datele ajung in pozitia capului de citire/scriere dupa ce acesta a fost adus in dreptul pistei dorite
. Timp de acces - suma precedentelor (ms)
. Viteza de transfer
Hard disc - generalitati
. Capetele de citire nu ating suprafata
discului si ca urmare viteza de rotatie este mai mare (3600-7200 rot/min) fata de cea a discurilor flexibile (3-400 rot/min)
. Pot fi afectate usor de praf
Unitate de hard disc
Tipuri de discuri
. Discurile compacte - CD-ROM (Compact Disk -
Read Only Memory)
. au capacitate mare de memorare, sunt rapide si ieftine.
. CD - RW
. se rotesc mai repede decat cele muzicale (audio)
. capacitate in general de 700 M
. potrivite pentru prezentari multimedia, pachete mari software (kit-uri)
. ZIP - drive (removable) - 100 Mocteti
Tipuri de discuri
. DVD (Digital Video Disc; Digital Versatile Disc, doar 3 litere )
. Inregistrare optica
. Capacitate, calitate si viteza mare
. 2 ore de "high-quality digital video" (un disc double-sided, dual-layer poate contine pina la 8 ore de video de inalta calitate sau 30 de ore de video de tip VHS).
Memorie tip "flash"
. Dispozitiv de tip "Solid state" - totul este electronic, nu mecanic, nu exista parti in miscare.
USB Compact flash memory
128 MB2 GB
Memorie tip flash
. Compact Flash, Smart Media, Memory Stick (in camerele foto)
. Pocket PC
Alte dispozitive de memorare
. RAID (Redundant Array of Inexpensive or Independent Disks) - pentru duplicarea datelor de pe disc prin furnizarea unei copii a datelor
. Unitati de banda magnetica (pentru copierea fisierelor pentru stocare sau transmitere)
Echipamente periferice de intrare si iesire
Periferice de intrare
A. Echipamente periferice de intrare
Acestea sunt dispozitivele de pe care se introduc datele pe calculator:
- tastatura,
- mouse,
- scanner,
- microfon,
- camera video, camera foto
- joystick, touchpad, trackball, etc.
Tastatura
Echipamente periferice de intrare
Tastatura lucreaza sincron cu dispozitivul de afisare si are inglobat un microprocesor care ii coordoneaza functionarea. In functie de rolul lor, tastele pot fi:
- taste obisnuite pentru editare;
- taste speciale de editare (Enter, Insert, Backspace);
- taste pentru deplasarea cursorului (stanga/dreapta, sus/jos);
- tastele numerice (in dreapta tastaturii),
- tastele functionale (F1, F2,F12) cu semnificatie in functie de programul care se utilizeaza.
Echipamente periferice de
intrare
. Mouse-ul este un dispozitiv cu doua sau trei butoane care se actioneaza prin apasare si are corespondent un cursor pe ecran.
. Scanner-ul permite introducerea textelor, imaginilor, fotografiilor prin codificare numerica si reproducerea imaginilor acestora. Principalele caracteristici: viteza de scanare, rezolutia, numarul de culori.
Periferice de iesire
B. Echipamente periferice de iesire
Acestea sunt dispozitivele prin care utilizatorul poate urmari executarea, desfasurarea si inregistrarea programelor
- monitorul
- imprimanta
- boxele.
Echipamente periferice de iesire
Monitorul este dispozitivul de afisare.
. Exista doua tipuri de afisare a informatiilor pe ecran:
. mod text (pentru afisarea caracterelor) si
. mod grafic (pentru desen si eventual un text).
Monitorul
. In modul text ecranul are 25x80 pozitii caracter (linii si coloane).
. In modul grafic interpretarea se face prin pixeli.
. Dimensiunea unui pixel caracterizeaza definitia monitorului iar densitatea pixelilor caracterizeaza rezolutia monitorului.
. Exista circuite de interfata intre monitor si calculator care se numesc adaptoare.
Monitorul
Cateva exemple de adaptoare/standarde:
- "istorice": Color Graphics Adapter (CGA) - afisau 4 culori simultan cu o rezolutie de 320 x 200 sau 2 culori pe 640 x 200 pixeli;
Enhanced Graphics Adapter (EGA) - pentru 640 x 350 pixeli; VGA / 640x480 (16 culori) -SVGA - 800x600 sau 1024x768, 1280x1024 etc.
Super Video Graphics Array
Monitorul
Colectiile de pixeli sunt folosite pentru reprezentari de imagin sub forma de
. harti
. .bmp - Bitmaps
. .tiff - Tag Image Format File
. . gif - Graphic Interchange Format
. fotografii
. . jpeg - Joint Photographic Experts Group
. format audio/video
. .mpeg - Motion Picture Experts Group
. imagini rotite-redimensionate
. .dxf - Drawing Interchange Format
Monitorul
Echipamente periferice de iesire
Imprimanta este utilizata pentru a tipari pe hartie documente, date, rezultate ale unui program, imagini, grafice, etc. Cateva caracteristici importante ale unei imprimante sunt enumerate in continuare:
. tipul imprimantei - caracterizeaza metoda de imprimare;
. viteza de tiparire (caractere pe secunda sau pagini pe minut);
. rezolutia (numar de puncte / inch - dpi);
. memoria proprie.
Imprimanta
Tipuri de imprimante:
. matriceale (cu ace: 9-24 de ace)
. cu jet de cerneala
. laser (cu rezolutie buna si viteza de 4-8 pag/min) - functioneaza pe principiul copiatoarelor.
Imprimanta
. dispozitivul care creeaza posibilitatea emiterii sunetelor de catre computer prin intermediul boxelor (speakers).
. Utilitatea unei placi de sunet:
- sunet stereo pentru programe
- eficacitatea programelor educationale
- efecte sonore in cadrul prezentarilor asistate
- creatia muzicala asistata
- efecte sonore asociate evenimentelor din programe
- transmiterea mesajelor audio
- ascultarea CD-urilor audio
- utilizarea computerului de catre persoane cu handicap
Placa de sunet
Echipamente periferice de iesire
. Modem - un sistem de comunicatie care permite transmiterea informatiei prin linie telefonica.
- Viteza de transmitere se exprima in bps (bits/bytes per second).
. Fax modem board - permit transferal informatiei din calculator prin linie telefonica
Arhitecturi de calculatoare
. Cu cat structura procesorului este mai complexa si programarea este mai simpla pentru ca este nevoie de o singura instructiune pentru a efectua o operatie, pe cand pentru o structura mai simpla, pentru aceeasi operatie ar fi necesara o secventa de mai multe instructiuni.
. Dar, structurile complexe sunt mai greu si mai scump de realizat.
Arhitecturi de calculatoare
. CISC (Complex Instruction Set Computer)
- calculator cu set complex de instructiuni
- O structura complexa cu ajutorul careia se poate decodifica si executa o gama mare de instructiuni
. RISC (Reduced Instruction Set Computer)
- o structura mai simpla, cu o multime limitata de instructiuni
CISC
Pentium (Intel Co) - exemplu de arhitectura CISC
RISC
PowerPC (Apple, IBM, Motorola) - exemplu de arhitectura RISC
Arhitecturi de calculatoare
Arhitecturi de calculatoare
. Calculatoare multiprocesor - reprezinta o solutie pentru cresterea capacitatii de transfer (cantitatea de operatii pe care le poate realiza un calculator pe unitatea de timp).
. Se folosesc mai multe procesoare pentru a realiza o anumita operatie
Arhitecturi de calculatoare - pentru prelucrarea paralela
. SISD (Single Instruction Stream, Single Data Stream) - arhitectura uzuala
Arhitecturi de calculatoare - pentru prelucrarea paralela
. SIMD (Single Instruction Stream, Multiple Data Streams) - mai multe procesoare conectate executa aceeasi secventa de instructiuni pe un set diferit de date -Recomandabil pentru aplicatii in care aceeasi operatie trebuie realizata asupra unor multimi de date diferite.
. MISD (Multiple MISD (Multiple Instruction Instruction Stream Stream, Single , Single Data Data Stream Stream)
Arhitecturi de calculatoare - pentru prelucrarea paralela
. MIMD (Multiple Instruction Streams, Multiple Data Streams) - diferite secvente de instructiuni sunt executate cu diferite seturi de date.
Prezentari pentru C4
. Sisteme de operare -
. Retele de calculatoare -
. Internet si WWW -
Curs 4
Sumar
. Programele conexe unui calculator
- Prelucrari intr-un calculator
- Software
- Sistem de operare (functii, exemple)
- Mediu de dezvoltare
- Program de aplicatie
. Retele de calculatoare
- generalitati,
- configuratii,
- hardware si software pentru retele,
- p2p, client/server
. Internet si WWW
- Reteaua Internet
- Extranet/Intranet
- WWW
- Protocoale
- Motoare de cautare
- Browser - Navigare
1.4. Programele conexe unui calculator
Prelucrari in calculator
. In functionarea sa, calculatorul poate opera prin patru tipuri de operatii elementare:
_ aritmetice;
_ logice;
_ transferul informatiei;
_ controlul fluxului programului.
. Aceste prelucrari se fac in limbaje masina, dependente de hardware.
. Limbajele de nivel inalt sunt independente de codul-masina si faciliteaza scrierea aplicatiilor intr-un limbaj asemanator cu cel al programatorului (natural).
Limbaje de programare
. Limbaje masina
Instructiuni masina - siruri binare
Limbaje de asamblare (pentru Intel 80486, Pentium, etc)
. Limbaje de nivel inalt
_
_ Pascal, C
_ Perl
Limbaje de programare
. Limbaje orientate pe obiecte C++ Java
. Limbaje orientate pe obiecte, declansate de evenimente (Event Driven) Visual BASIC
. Limbaje de programare bazate pe componente (Component-Based)
_ Visual BASIC.NET
_ C#
Software
. Pentru ca un calculator sa functioneze si sa rezolve problema pentru care este folosit este nevoie de programe. Acestea se regasesc in denumirea de software.
. Programele conexe unui calculator pot fi grupate astfel:
_ Sisteme de operare
_ Medii de dezvoltare
_ Programe de aplicatii.
Sistem de operare
. O colectie de programe care fac posibila utilizarea hardware-ului calculatorului.
. Dupa ce calculatorul este pus sub tensiune, controlul revine sistemului de operare (SO), prin intermediul caruia utilizatorul are acces la hardware.
Functiile unui sistem de operare
. manipularea intrarilor si iesirilor - SO realizeaza o interfata intre programele utilizator si dispozitivele de intrare/iesire prin utilizarea unor instructiuni simple;
. managementul fisierelor - datele si programele utilizatorilor sunt memorate de obicei in fisiere; sarcina SO este aceea de a crea fisiere si de a realiza operatiile specifice cu acestea;
. managementul diverselor programe - manipularea modului de rulare al programelor dupa prioritati si realizarea accesului mai multor programe care ruleaza in acelasi timp.
Exemple de sisteme de operare
. MS-DOS (MS - Disk Operating System)
. Windows x.x (x.x pentru diferite versiuni 3.1. 3.11), Windows 95,
. Windows 98, Windows NT, 2000, XP
. OS2
. Unix, Linux
Exemple de sisteme de operare
. UNIX (Bell Labs, 1969) a fost conceput ca un SO care sa fie simplu, elegant, scris mai mult in limbaj de nivel inalt (C) decat in limbaj de asamblare (doar nucleul) si sa permita reutilizarea codului.
. In timp i s-au adaugat facilitati pentru lucrul in retea (conectare la distanta, transfer de fisiere, servicii de posta electronica) una din cele mai importante fiind accesul si gestionarea in comun a resurselor.
. Unul din punctele slabe ale acestui SO il constituie interfata-utilizator. Exista progrese realizate pentru a depasi acest neajuns si a folosi interfete tip ferestre (X-windows, Suntools, NextStep, Motif, OpenLook, etc.)
Mediu dedezvoltare
. un program complex care asigura suportul necesar dezvoltarii aplicatiilor.
. are prevazute functii de
- editare a programului,
- salvare,
- compilare,
- link-editare,
- depanare, etc.
. Astfel de medii sunt Turbo Pascal, Turbo C, Borland C (pentru C++) si Visual C, Visual Basic in Microsoft Visual Studio 6; Microsoft Visual Studio .NET.
Programele de aplicatii
programele dedicate unui anumit scop, unei anumite aplicatii a utilizatorului (programe educationale, de invatare, de contabilitate, pentru medicina, pentru aplicatii industriale, etc.).
1.5. Retele de calculatoare. Internet
1.5.1. Retele de calculatoare
Retelele de calculatoare
. reprezinta un sistem complex hardware si software format din mai multe calculatoare interconectate prin intermediul unei retele de comunicatie. Utilizarea lor implica comunicare distribuita care are urmatoarele avantaje:
_ flexibilitate (structurile se pot modifica mai usor)
_ acces al mai multor utilizatori la resurse hardware si software comune
_ fiabilitate.
Retelele de calculatoare
. Modelul clasic de prezentare al unei retele de calculatoare este cel de graf format din noduri (calculatoarele) si arce (liniile de comunicatie).
. Comunicatia se face prin cablu electric, fibre optice, unde electromagnetice (infrarosu, laser, radio), satelit.
Configuratii pentru retelele de calculatoare
. stea - comunicarea intre noduri se face prin intermediul nodului central;
. inel - fiecare nod comunica cu nodurile conexe;
. arbore;
. graf complet - fiecare nod este conectat cu toate celelalte noduri.
In functie de intinderea geografica retelele pot fi:
. retele locale (LAN - Local Area Network) pentru care distanta intre noduri este intre cativa metri si 1 km, de obicei retele plasate in cladiri sau grupuri de cladiri;
. retele intinse (WAN - Wide Area Network) pentru distante de la cativa kilometri la cateva sute de kilometri, intre orase sau tari;
. interconectari de retele intinse - intercontinentale.
Ethernet
= Tehnologie de conectare LAN (sute de m.zeci de km)
= Protocolul de comunicatie
= Standard de comunicare -> IEEE 802.3
. calea de comunicare - cablu coaxial de cupru -> pereche de cabluri rasucite, cu fibra optica
. rata de transfer: 10 Mbs; 100Mbs (Fast Ethernet); 1Gbs (Gigabit Ethernet);10Gbs .
Hub
. Dispozitiv de conectare pentru echipamentele (calculatoare, imprimante, etc.) dintr-o retele LAN
. "smart hub"
Modul de conectare
. Modul de conectare a calculatoarelor intr-o retea locala depinde de functiile pe care le au acestea in cadrul retelei.
. Daca orice utilizator conectat in retea are acces la resursele oricarui calculator, reteaua este de tip peer to peer.
. Daca unul sau mai multe calculatoare din retea au functii speciale (de control si gestiune a intregii retele) reteaua este realizata pe baza strategiei client-server.
P2P
Responsabilitati ca si client, in retea:
- Trimite comenzi la alte calculatoare pentru a cere un serviciu
- Primeste raspuns la cererile sale de servicii Responsabilitati ca si server, in retea:
- Primeste comenzi cereri de servicii de la alte calculatoare
- Proceseaza cererile de servicii, executand serviciul cerut
- Trimite raspuns cu rezultatul executarii serviciului
- Propaga cereri de servicii catre alte calculatoare
Client/server
Client/server
. file server, network server.
. statii de lucru, work stations.
. Un server are instalat un sistem de operare de retea (Novell, Windows NT, Windows 2000 Server, Linux, Unix) care gestioneaza fluxul de date, realizeaza comunicatia si alte activitati din retea.
Client/server
Pe statii este instalat un sistem de operare standard (Windows, etc.) si programe speciale care realizeaza comunicatia statiei cu server-ul si permit accesul la programele si fisierele de date de pe acesta.
Client/server
. Server-ul este un calculator mai puternic
. Statiile de lucru nu trebuie sa aiba neaparat o configuratie sofisticata, acest lucru fiind suplinit de accesul la server, prin care se materializeaza avantajul utilizarii acestui tip de retele: cost scazut, cu acces al mai multor utilizatori la resurse puternice.
Modul de conectare
. Cuplarea statiilor la server se face prin intermediul unei placi speciale de interfata.
. Network interface card conecteaza fizic un calculator la retea si controleaza fluxul informational bidirectional.
. PCMCIA (Personal Computer Memory Card International Association) - pentru conectarea calculatoarelor portabile (laptop)
1.5.2. Internet si WWW
Reteaua INTERNET
. Reteaua INTERNET este o infrastructura fizica, similara infrastructurii utilizate de retelele mondiale de telefonie.
. O mare parte din functiile utilizate pe Internet au ca suport sistemul telefonic.
Reteaua INTERNET
Diferenta dintre Internet si sistemul de telefonie consta in aceea ca, in timp ce sistemul de telefonie lucreaza in mod traditional cu semnale vocale traduse analogic (unde sonore), Internet este o retea digitala care transmite mesaje numerice compuse dintr-o serie de semnale de tip 'on-off', permitand astfel comunicarea intre computere.
Reteaua INTERNET
. Internet este mediul suport pentru comunicare.
. Internet nu este o colectie de informatii sau un serviciu.
. Folosim reteaua Internet pentru a obtine si a primi/raspandi informatii si servicii, dar acestea sunt lucruri diferite de ceea ce reprezinta reteaua Internet. Asa cum serviciul de telefonie ar fi inutil fara persoanele care il folosesc, tot asa reteaua Internet este inutila fara serviciile informationale care il utilizeaza.
Intranet/Extranet
. Intranet - retele particulare ale unor companii, protejate de accesul din exterior
. Extranet - folosesc tehnologia Internet pentru a crea retele externe companiei pentru a fi utilizate de catre furnizori sau clienti.
World Wide Web (WWW)
este un concept (dezvoltat la CERN - European Laboratory for Particle Physics, Elvetia, de catre o echipa condusa de Tim Berners-Lee) care cuprinde:
. o colectie de servere purtatoare de informatie (servere informationale);
. articole informationale (documente, pagini, imagini, etc.) stocate pe server;
. adresele articolelor informationale;
. legaturile intre diverse articole informationale.
WWW
. Spre deosebire de Internet care este o retea fizica, WWW este o retea de informatii conectate, prezentate sub diverse forme.
. Un document component al WWW poate contine texte formatate, imagini, hyperlink-uri (locurile din document unde utilizatorul poate parasi documentul curent pentru a se conecta la un altul, aflat intr-o
anumita legatura cu cel precedent); acest nou document poate fi orice tip de informatie accesibila pe Internet: sunet, video clip digital, conexiunea la o biblioteca sau un alt document text cu mai multe legaturi.
WWW
. documente hypertext
. termenul 'hypertext' nu este nou. Punerea lui in practica a fost impiedicata de limitarile tehnologice. Cel care a conturat pentru prima data conceptul hypertext a fost Ted Nelson in 1965.
WWW este constituit in principaldin 4 lucruri:
1. Conceptul: Web este conceput pentru o lume fara frontiere, in care TOATA informatia, din orice sursa poate fi accesata simplu.
2. Protocolul: WWW utilizeaza mai multe protocoale (ftp, gopher,etc.) dar si alte modalitati de comunicare:
. URL - Universal Resource Locator - pentru localizare in navigarea pe web.
. HTTP - Hypertext Transfer Protocol - pentru comunicatia dintre servere si browser-e.
3. Un complex software format din: client, server, gateway (modalitate de acces directionat pe un domeniu) - pentru manipularea informatiei.
4. O retea de informatii: pentru a permite comunicarea intre indivizii care doresc sa comunice.
Web
Interactiunea pe Web implica doua componente:
- un web server si
- un browser.
. Serverul este un proces 'daemon' intretinut de administratorul de sistem si de web.
Pentru a utiliza Web este nevoie in principal de doua lucruri:
. Utilizatorul trebuie sa aiba acces la Internet; accesul la Internet se poate realiza prin intermediul universitatilor, liceelor, societatilor comerciale, institutii guvernamentale sau prin intermediul furnizorilor de servicii Internet.
. Utilizatorul trebuie sa aiba acces la WWW printrun client-software (Netscape, Internet Explorer, Mozila Firefox, etc).
Navigare pe Web
Cel mai uzual mod de navigare (vizualizare a documentelor pe Web) este cel prin indicarea informatiei scoase in evidenta (highlighted) si selectarea ei prin click pe butonul mouse-ului.
. Informatia evidentiata din documente contine legaturi (hyperlinks) catre alte pagini WWW care la randul lor contin alte legaturi, s.a.m.d.
Documente Web
. Formatul de baza al documentelor de pe WWW in care apar hyperlinks este numit HTML (HyperText Markup Language).
. Documentele HTML contin texte si imagini intr-un anumit format si de asemenea legaturi (hyperlinks) catre alte informatii care pot fi documente HTML sau pot avea orice alt format inteles de produsul software al utilizatorului.
Protocoale
In timp ce serverele WWW utilizeaza protocolul HTTP pentru a transmite documentele HTML, legaturile prin
hyperlinks permit conectarea la informatii aflate pe servere care utilizeaza diferite protocoale: Gopher, FTP, etc.
sit (in engl. site)
. Un sit Web poate fi comparat cu o carte mai speciala, interactiva, colorata si care ne poate vorbi.
. Prin intermediul ei va puteti conecta la diverse surse de informatii pe care le contine acesta.
Motoare de cautare
. Pe WWW exista disponibila o cantitate mare de informatie care poate deveni covarsitoare.
. Pentru a putea gasi informatii despre un anumit subiect s-au dezvoltat mecanisme de localizare a acestuia: motoarele de cautare
si directoarele
Motoare de cautare
. utilizeaza programe de cautare pe WWW dupa un sir de caractere introdus de utilizator.
. Returneaza o lista de situri care se potrivesc cu cerintele cautarii si legaturile catre aceste situri.
. Exemple de motoare de cautare: Google, Yahoo, Altavista, Lycos.
Directoarele (istorie)
Directoarele reprezinta colectii catalogate si indexate de resurse WWW care au
fost selectate de catre profesionisti in informatie. Utilizatorul poate selecta
domeniul in care va efectua cautarea sau poate intra in subcategorii pentru a
realiza o cautare mai specializata Exista de asemenea posibilitatea de
cautare in orice moment pe intregul Web. Directoarele afiseaza rezultatele
cautarii in liste asemanatoare celor ale motoarelor de cautare, incluzand
legaturi catre siturile gasite. Unul dintre cele mai populare directoare de pe
Web este Yahoo (https://www.yahoo.com).
Diferentierea intre cele doua categorii este mai mult de ordin istoric, in prezent
tinzand ambele sa asigure aceleasi functii, cu acelasi suport.
Browser
. engl. to browse = a rasfoi
. un program care permite gasirea si vizualizarea informatiei de pe WWW.
- Acesta nu este nici informatie, nici serviciul de informatie, nici reteaua.
Browser
Fiecare browser are proprietati specifice si nume diferite pentru functiile pe care le pune la dispozitia utilizatorului, dar toate au aceleasi functii de baza:
. accesul la situri prin precizarea adresei de URL;
. tiparirea continutului sitului curent
. deplasarea inainte/inapoi intre siturile vizitate
. reintoarcerea in punctul de plecare ('Home') in orice moment al navigarii
. conexiunea intre pagini prin intermediul textului scos in evidenta (highlighted) sau subliniat;
. memorarea adresei de URL.
Browser
. Documentele pe care le manevreaza un browser sunt documente hypertext.
. Avantajul utilizarii hypertext-ului consta in usurinta cu care poate fi realizat accesul la mai multa informatie despre un subiect doar prin click pe numele acestuia.
Browser
Exemple de browser-e: Mozilla, Microsoft
Internet Explorer, Netscape Navigator.
(Istorice: Mozaic-precursor al lui Netscape, Lynx - text fara grafica).
Browser
. pune la dispozitia utilizatorului grafica deosebita, modalitati sofisticate de prezentare a paginilor si viteze mari de descarcare a documentelor (download).
. utilizeaza modul de lucru 'point-and-click' pentru a selecta conexiunile hypertext si meniuri 'dropdown' si butoane pentru a realiza navigarea si accesul la resursele de pe Internet.
Curs 5
Sumar
_Fazele rezolvarii unei probleme cu calculatorul
_ Ingineria programarii
_ Analiza problemei si proiectarea solutiei
_ Implementarea
_ Exploatarea si intretinerea programului
_ Proiectarea ascendenta si descendenta.
_Calculatoare de proces
_definire, tipuri
_control
_sisteme de reglare automata
_exemple (diagrame si aplicatii din realitate).
_Alte tipuri de calculatoare
1.6. Fazele rezolvarii unei probleme cu calculatorul
Ingineria programarii
_Se ocupa de problemele legate de elaborarea unui produs-program pe baza unor reguli, incluzand toate activitatile pornind de la enuntul problemei pana la obtinerea rezultatului aplicarii sale:
_specificarea,
_proiectarea,
_implementarea,
_scrierea documentatiei
_intretinerea produsului program.
Ingineria programarii
_ precizarea cerintelor beneficiarului;
_ specificarea problemei;
_ proiectare algoritmului de rezolvare a problemei;
_ programarea propriu-zisa;
_ testarea produsului obtinut;
_ exploatarea si intretinerea produsului
_ redactarea documentatiei pentru fiecare faza.
Rezolvarea unei probleme cu ajutorul calculatorului presupune parcurgerea urmatoarelor faze :
1.6.1. Analiza problemei si proiectarea solutiei
_De obicei, beneficiarul da un enunt vag, incomplet sau inexact, iar executantul trebuie sa obtina de la client enuntul cat mai exact si conditiile pentru executia programului.
_Specificarea problemei este faza in care cerintele clientului sunt analizate si se genereaza un document care precizeaza exact ce trebuie sa faca produsul-program cerut.
Analiza problemei si proiectarea solutiei
Specificarea problemei poate fi facuta in limbaj natural sau in limbaj matematic.
Documentatia-specificatie trebuie sa contina:
_sarcinile exacte pe care trebuie sa le realizeze produsul;
_datele de intrare;
_rezultatele cerute;
_restrictiile la care este supus programul.
Analiza problemei si proiectarea solutiei
_ Dupa stabilirea specificatiei urmeaza modelarea matematica si cautarea unei metode pentru rezolvarea problemei.
_ Aceste activitati rezulta in conceperea algoritmului si constituie etapa de proiectare a programului.
_ In aceasta etapa echipa de proiectare
_ va defini structura produsului care trebuie realizat (componente, module) si
_ va stabili:
_ structurile de date
_ algoritmii folositi.
Analiza problemei si proiectarea solutiei
_Exista doua sub-etape in cadrul proiectarii:
_proiectarea in ansamblu - unde se decide structura produsului pornind de la specificatii. Aceasta se descompune in module si se precizeaza scopul fiecareia si interfata dintre module (adica datele care sunt transferate intre module).
_proiectarea in detaliu - se refera la fiecare modul (sub-algoritm) in parte.
Analiza problemei si proiectarea solutiei
Algoritmii sunt descrisi:
_prin scheme logice (reprezentarea grafica a algoritmului cu operatiile reprezentate sub forma unor blocuri unite prin linii cu sageti care indica succesiunea lor - expresiva);
_prin limbaj pseudo-cod (limbaj algoritmic derivate din limbajul matematic).
1.6.2. Implementarea
_ Aceasta etapa consta in traducerea algoritmului intr-un limbaj de programare si include:
- alegerea limbajului de programare (daca este cazul);
- editarea programului - cu ajutorul mediilor de programare cu care se va compila sau cu un editor oarecare;
- compilarea programului: se trece de la programulsursa la programul-obiect (in limbaj cod-masina) si se
corecteaza erorile de sintaxa.
Implementarea
testarea programului: pune in evidenta erorile de proiectare (atunci cand exista) datorita carora apar rezultate eronate din fazelor anterioare. Acestea sunt puse in evidenta la executia programului cu date de test.
"Testarea programelor poate fi un mijloc eficient de a indica prezenta erorilor, dar din pacate nu si un mijloc de a demonstra absenta lor".
depanarea programului: descoperirea erorilor.
1.6.3. Documentarea procesului
_Scrierea documentatiei programului cuprinde:
_documentatia de realizare - documentatia care explica modul in care a fost conceput programul
_documentatie de exploatare sau utilizare - documentatia prin care se explica modul de functionare al programului.
1.6.4. Exploatarea si intretinerea programului
_ Exploatarea este faza in care executia programului se face cu date reale.
_ In timpul ciclului de viata al unui program apar diferite modificari ale acestuia determinate de:
_ unele erori ramase nedescoperite in faza de validare;
_ dezvoltarea programului prin cerinte noi;
_ perfectionarea programului. Acestea constituie impreuna faza de intretinere.
Exploatarea si intretinerea programului
_Ultima faza din existenta unui program este "pensionarea" sa.
_Dupa un numar de ani de folosire programul nu mai corespunde:
_s-au modificat conditiile in care lucreaza beneficiarul,
_a fost cumparat un nou calculator sau
_modificarile ar costa mai mult decat un program nou.
1.6.5. Proiectarea ascendenta si descendenta
Exista doua metode generale de proiectare a algoritmilor, a caror denumire provine din modul de abordare a rezolvarii problemelor:
_metoda descendenta si
_metoda ascendenta.
Proiectarea descendenta
_ Proiectarea descendenta (top-down) porneste de la problema care trebuie rezolvata pe care o descompune in sub-probleme independente, care la randul lor pot fi descompuse in sub-probleme.
Proiectarea descendenta
(top-down)
Step-wise refinement (metoda rafinarii succesive) este un proces de detaliere pas cu pas a specificatiei si are urmatoarele avantaje:
_amana detaliile de programare (nu ne gandim cum se vor rezolva sub-problemele, ci care sunt ele si conexiunile dintre ele;
_ permite lucrul in echipe mari, fiecare cu subproblema ei.
Proiectarea ascendenta
(bottom-up)
_ porneste de la sub-algoritmii existenti pe care ii asambleaza in alti sub-algoritmi pentru a ajunge in final la algoritmul dorit. Se va scrie mai intai sub-algoritmul apelat si apoi cel care apeleaza.
_Dezavantaj: erorile de integrare vor fi detectate tarziu, abia in faza de integrare.
2. Notiuni despre calculatoare de proces
Calculatoare de proces
_ Calculatoarele de proces (sau industrial PCs), sunt adaptate operatiilor de control al proceselor care, in general, nu necesita capacitate mare de memorare si nici echipamente periferice complexe si
_ Calculatoarele de proces sunt calculatoarele specializate pe rezolvarea problemelor legate de conducerea automata a proceselor.
_ Din punctul de vedere al datelor pe care le prelucreaza calculatoarele sunt de doua tipuri:
_ analogice si
_ numerice.
Calculatoarele analogice
_Calculatoarele analogice opereaza cu date sub forma de cantitati fizice ce variaza continuu (presiune, tensiune, temperatura, turatie) si furnizeaza rezultate sub aceeasi forma - marimi fizice.
_Datele de intrare sunt acceptate direct de la instrumentele de masura, aceasta determinand cresterea operativitatii culegerii datelor.
Calculatoarele numerice
_Calculatoarele numerice lucreaza cu reprezentari ale numerelor reale sau caractere codificate numeric.
_Problemele se rezolva prin calcule (adunari, scaderi, inmultiri, impartiri) si folosind memoria disponibila.
Notiuni despre calculatoare de proces
In cazul proceselor din realitatea inconjuratoare apare necesitatea controlarii acestora.
Unui proces i se pot asocia:
_marimi de intrare - marimi care actioneaza asupra procesului;
_marimi de iesire - marimi furnizate de proces;
_structura - model care caracterizeaza procesul (model matematic in timp sau operational).
Schema simplificata a elementelor asociate unui process:
Sisteme de reglare automata
_Procesele pot apartine celor mai variate domenii: industrial (proces chimic, un circuit electric, un motor), economic, social, medical, financiar,
etc.
_Pentru ca marimile de iesire ale unui proces sa aiba o variatie dorita este necesara plasarea
procesului intr-o structura sistemica numita sistem de reglare automata.
Structura unui sistem de reglare automata
Sisteme de reglare automata
_w(t) - variatia marimii de prescriere (variatia dorita pentru marimea de iesire)
_(t) - variatia erorii intre variatia marimii de prescriere si variatia marimi de reactie r(t), care reflecta variatia marimii de iesire, y(t).
(t)=w(t)-y(t)
c(t)=k*(t)
Rolul calculatorului de proces
Rolul calculatorului de proces este acela de a compara marimea de iesire cu marimea dorita si de a transmite mai departe catre proces o comanda, mentinand parametrii de functionare ai acestuia intre anumite limite.
_Exemplu: Sera cu punerea in evidenta a unui sistem de reglare a temperaturii si a concentratiei de bioxid de carbon.
Sistem de reglare a temperaturii intr-o sera
Sistem de reglare a cantitatii de bioxid de carbon intr-o sera
Exemple de "industrial PCs"
iPPC-SS370A3-XP
Stainless Steel Industrial Intel P-3 Slim
Panel PC with Touchscreen - caracteristici
. 12.1" TFT Color LCD Display Resistive Touch Screen Stainless Steel Case Meets IP-65 Requirements Up to Intel 1.3 GHz P-3 CPU High Performance CPU Fan 512MB Memory (Expandable to 1 G)
Slim Floppy Drive Slim CD-ROM Drive 20 Gbyte EIDE Hard Drive Integrated Graphics Controller Dual 10/100 BT Ethernet Audio AC 97 CODEC
. 3 x
RS-232 Serial Ports 1 x RS-232/422/485 Configurable Serial Ports 2 x LPT1
SPP/EPP/ECP) 1 x IrDA TTL Level Digital IO. 4 In and 4 Out Compact FlashT Socket Hardware Monitor: CPU Vcore, Vcc, CPU/ System Fan Speed and Temperature detection PS/2 Keyboard and Mouse Interface
Optional Removable Hard Drive Bays Software Supported Watch Dog Timer Windows XP Professional
1 x half size PCI Expansion Slot Rackmount Kit Available Windows XP Professional or Windows 2000
iMPC Series Industrial Panel PC with
Touchscreen
Exemple de "industrial PCs"
iMPC Series Industrial Panel PC
with Touchscreen
. 15" - 17" TFT Color LCD Display
3M Resistive Touch Screen
Aluminum Front Panel w/
Programmable Keys
Meets IP-65 Requirements
Intel 2.8 GHz P-4 CPU
High Performance CPU Fan
512MB DDR Memory
Full Size Expansion Slots for ISA and
PCI
3.5" Floppy Drive
40 Gbyte EIDE Hard Drive
Intel 865G-ICH5 System Chip Set
Integrated AGP 4x/8x Graphics
Controller
Dual 10/100 BT Ethernet
. 800 MHz FSB
Audio AC 97 CODEC
2 x RS-232 Serial Ports
2 x RS-232/422/485 Configurable
Serial Ports
1 x
LPT1
SPP/EPP/ECP)
1 x IrDA
Compact FlashT Socket
Hardware Monitor: CPU Vcore, Vcc,
CPU/
S ystem Fan Speed and Temperature
detection
PS/2 Keyboard and Mouse Interface
Optional Removable Hard Drive Bays
Software Supported Watch Dog Timer
Model 810-05
Exemple de "industrial PCs"
Model 810-05 - caracteristici
. Integrated 12.1' TFT LCD display
. Motherboard or 14-slot PCI/ISA backplane available
. Three shock mounted drive bays - 1ea 5.25' and 2ea
3.5'
. Positive pressure cooling with three fans
. Modular in design for easy service and integration
. Easily modified for custom applications
StimMaster
. Bucla de reglare si controlul adaptiv au ca rezultat diminuarea atrofierii musculaturii, imbunatatirea
circulatiei si disparitia spasmelor musculare (Petrofsky).
. StimMaster contine senzori localizati in ergometru, care furnizeaza feedback continuu catre calculator. Acesta controleaza ritmul de pedalare prin stimularea la nivelul muschilor ducand la o miscare de pedalare ritmata.
. Calculatorul cuprins in StimMaster monitorizeaza continuu evolutia pacientului la un interval de 1/40 dintr-o
secunda si comanda valorile marimilor in asa fel incat acestea sa corespunda nevoilor pacientului.
Exemplu de calculator
de proces medical
Control al circulatiei
trenurilor/controlul locomotivei
Control al circulatiei
trenurilor/controlul locomotivei
Controlul zborurilor prin calculator
PC5_a.pdf
Alte tipuri de calculatoare
Tablet PC
Pocket PC
Palm OS
Smartphone
_ Frecventa: 120 MHz
_ RAM: 16 MB
_ Sistem de operare:
Windows Smartphone
_ Dimensiuni: 119.8 x
50.1mm x 23.5 mm
_ Masa: 126.5g
Smartphone
_ Harrier - a Windows Mobile Pocket PC Phone Edition handheld.
_ Phone and the Harrier PDA (personal digital assistant) comes with a high resolution display screen, a full slide out keyboard and an inbuilt camera with flash.
_ The Harrier runs Windows Mobile 2003 Second Edition, comes with 128MB RAM, 64MB ROM, Intel XScale 400 MHz processor. It has a 65K color TFT 240 x 320 touchscreen display. It is also
Bluetooth enabled, and can be used as a high speed modem for a laptop or desktop computer.
_ has camera on the back, not in front, so it is impossible to make videotelephony with it and, most importantly, it doesn't support the most common 3G standard: WCDMA/UMTS. Lack of built-in Wi-Fi is
also very discouraging
Curs 6
Sumar
_Introducere in limbajul C
. mediul de dezvoltare Turbo C
. etapele dezvoltarii unui program in C
. structura unui program in C
. identificatori, variabile, constante, instructiuni.
_Tipuri de date standard
. intreg
. real
3. Introducere in limbajul C
Aparitia limbajului C
_ Util pentru a scrie compilatoare, editoare, sisteme de operare, aplicatii
_ A fost dezvoltat si implementat pe sistemul de operare UNIX pentru DEC (Digital Equipment Corporation) PDP11 (1972)
_ Limbajul B (Ken Thomson) - BCPL (Martin Richards)
_ 1978 Brian Kernighan &Dennis M. Ritchie: "The C Programming Language" (ed. 2:1989)
Limbajul de programare C
_ ~ 5000 limbaje de programare
_ Unix (prima versiune) - pentru PDP 11 in limbaj de asamblare
_ C - pentru Unix -> pentru sisteme de operare
_ OS/2 (IBM) - asamblare -> C
_ Pentru a scrie programe care fac apel la serviciile SO se folosesc usor rutinele scrise in C (citirea unui fisier, crearea unui proces, etc.)
_ API (Application Programmers Interfaces) - pentru Unix, Windows NT, OS/2 definesc o interfata in C catre SO.
_ Numar mare de biblioteci scrise in C.
PC_1.C
Kernighan despre limbajul C
Un interviu cu Brian Kernighan, iulie 2000 - Mihai Budiu mihaib+@cs.cmu.edu;
https://www.cs.cmu.edu/~mihaib/
. C are cel mai bun echilibru pe care l-am vazut vreodata intre putere si expresivitate.
. Poti face aproape orice vrei programand intr-un fel destul de evident si ai intotdeauna un model mental bun a ceea ce se va intampla pe calculator; poti prezice destul bine cat de repede o sa mearga, intelegi ce se petrece si iti da libertate totala sa faci ce vrei. . dar in ceea ce priveste realizarea a ceva fara prea mult efort, nu am vazut nimic mai bun pana in ziua de azi.
. Exista alte limbaje reusite pentru aplicatii specifice, dar daca ar fi sa esuez pe o insula pustie cu un singur
compilator, as vrea un compilator de C.
Kernighan despre limbajul C
Un interviu cu Brian Kernighan, iulie 2000 - Mihai Budiu
mihaib+@cs.cmu.edu; https://www.cs.cmu.edu/~mihaib/
. Nu pot comenta despre trasaturile negative; iti reamintesc ca C este in intregime creatia lui Dennis Ritchie. Eu am contribuit doar la popularizarea sa, si in particular nu pot spune ce e greu si ce e usor de compilat in C.
. Sunt cateva lucruri gresite in C: instructiunea switch putea fi mai bine proiectata, precedenta unora dintre operatori este gresita dar astea sunt lucruri marunte si lumea a invatat sa le evite.
. Cred ca adevarata problema a limbajului C este ca nu-ti pune la dispozitie destule mecanisme pentru a scrie programe cu adevarat mari, pentru a crea ziduri de protectie in interiorul programelor, care izoleaza feluritele bucati. Nu se pune problema ca nu poti face astfel de lucruri, ca nu poti simula programare orientata pe obiecte sau alte metodologii de programare in C, poti sa faci toate astea, dar compilatorul si
limbajul nu te vor ajuta.
. Dar daca luam in considerare ca C are aproape 30 de ani si ca a fost creat cand calculatoarele erau minuscule in comparative cu ceea ce avem acum, cred ca e o creatie admirabila, care a trecut de testul scurgerii timpului extrem de bine. Nu sunt multe lucruri pe care le-as schimba in C.
Standardul
ANSI C
_American National Standard Institute: ANSI C standard (1983 - 1989) - numarul documentului: #X3J11/99-090
_Update: 1999
_Defineste: arhitectura, sintaxa, functiile bibliotecii C standard.
3.1. Mediul de programare
Turbo C
_Un mediu de programare pune la dispozitia programatorului facilitati de scriere si depanare a unui program intr-un anumit limbaj.
_Mediul de programare Turbo C se bazeaza pe limbajul C.
_Acest mediu are un compilator care "traduce" programul scris in C intr-un executabil.
_IDE - Integrated Development Environment
Ecranul contine trei zone:
_Meniul principal
_Fereastra de editare
_Descrierea tastelor functionale
Mediul de programare TC pune la dispozitia programatorului :
_Un editor de texte
_Un compilator
_Un link-editor
_Un sistem de 'help'
_Ferestre multiple
_Posibilitatea de depanare a programului (Debug)
Crearea unui program implica urmatoarele etape clasice
Compilatoare C pentru diverse platforme
_Mainframes
_Personal computers (Borland C++, Microsoft Visual C++)
_Microcontrolere
_Procesoare numerice de semnal (Digital Signal Processors:DSP).
Compilare - Asamblare - Link-editare
3.2. Structura unui program in TC
Un program in TC este structurat in general in trei parti:
_Sectiunea "#"
_Declaratii
_Instructiuni
Structura unui program
(ANSI C)
_ Declaratii de functii
_ Declaratii de variabile externe
_ Apelul functiei main()
_ Definitii de functii
Pe parcurs - Comentarii /*.*/
Structura unui program in TC
Sectiunea "#" - contine directive (include) si macroninstructiuni (define) - incep cu '#'. Efect include: trateaza textul din fisierul specificat in #include ca si cand ar face parte din programul curent.
_Biblioteca C standard
_Program C -> module = functii
_Functiile din biblioteca standard - operatii: intrare, iesire, matematice, etc.
_C Preprocessor (in C Reference Card - ANSI)
Structura unui program in TC
Declaratii - in aceasta sectiune programatorul defineste (PC_2.C) toate entitatile pe care le va folosi in program: constante, variabile, functii.
Toate aceste entitati vor avea un nume.
Aceste nume (simboluri) sunt indentificatorii.
Identificatorii
_ Identificatorii trebuie sa inceapa cu o litera (mare sau mica) sau caracterul de subliniere (underscore) si contin litere, cifre si caracterul de subliniere.
_ TC face diferentiere intre litere mari si litere mici (este 'case-sensitive').
_ TC1, Tc1, tc1 corespund unor identificatori diferiti.
_ ANSI C: lungimea unui identificator:
_ 31 pentru identificator intern
_ 6 pentru identificator extern
PC_3.C
Identificatori
_Identificatorii in C pot fi:
_cuvinte rezervate
_cuvinte utilizator.
Cuvintele rezervate
. sunt cuvintele predefinite ale limbajului C. Acestea nu se declara in program, au o semnificatie stabilita la constructia limbajului. Pot fi:
- cuvinte cheie: parti din program, instructiuni sau parti de instructiuni (const, if, for).
- cuvinte standard: desemneaza constante, tipuri si functii standard (int, double, printf, scanf, sin, cos, INT_MAX).
Cuvintele utilizator
. sunt cuvinte stabilite de catre programator pentru a desemna entitati ale programului sau (constante, variabile, tipuri, functii, etichete).
.
sunt create prin specificarea intr-o declaratie (de tip, variabila,
. exemple: matr, i, num12, NumPrim, etc.
. ANSI C permite ca identificatorii care incep cu
_ doua caractere de subliniere sau
_ un caracter de subliniere urmat de litera mare sa fie asociate doar pentru utilizarea de catre compilator.
Variabile/constante
. Variabilele sunt cantitati care isi pot modifica valoarea in cursul executiei programului, in timp ce constantele raman fixe.
Constantele pot fi
. numere intregi sau reale (constante numerice);
. siruri de caractere (constante alfanumerice);
. constante simbolice (identificatori).
Constante numerice
_Numerele pot fi cu semn sau fara semn. Numerele intregi pot fi prezentate in baza 10 sau 16.
_Exemple: 0xd->13; 0xA5; 10*16+5=165; 0xFF->255
_Numerele reale se pot scrie
_ parte intreaga.parte fractionara
_ mantisaEexponent.
_Exemple: 2,75 -> 2.75; 3*106 -> 3e6;
-2*10-2 -> -2e-2.
PC_4.C
Constante alfanumerice
. In acest caz caracterele au asociate coduri.
. Acestea reprezinta pozitia intr-un tabel standard care include toate caracterele accesibile pentru un anumit
calculator.
_ Pentru IBM PC se foloseste ASCII (American Standard
Code for Information Interchange) cu 256 de caractere, de la 0 la 255, reprezentate in memorie pe 1 octet.
. Exemple: ' '-> 32 ; '*' -> 42; 'A' -> 65; 'a' -> 97.
. Cifrele si literele mari si mici ocupa zone compacte crescator si alfabetic. In C, sirurile de caractere reprezinta o succesiune de caractere intre ghilimele.
Constante alfanumerice
. Numarul de caractere din sir se numeste lungimea sirului. Daca lungimea sirului este 0 sirul este vid.
. Nu toate caracterele ASCII au asociat un caracter care poate fi tiparit, acestea fiind caracterele de control (1 - 31): Line Feed, Carriage Return, Esc.
PC_5.C
Instructiuni
. cu ajutorul instructiunilor programatorul descrie operatiile care actioneaza in momentul executiei programului asupra entitatilor declarate anterior.
Instructiuni
PC_6.C
C - limbaj in care se pot
- scrie/citi texte
- lua decizii
- repeta anumite actiuni
- realiza diverse operatii
Baza pentru alte limbaje si exemplu de programare structurata
4. Tipuri de date
Tipuri de date
. Datele pot fi variabile sau constante
. Fiecare data are un anumit TIP
. Tipul = multime de valori careia i se poate asocia un nume.
. Valorile sunt constantele de un anumit tip.
. Tipurile pot fi:
_standard: intreg, real (simpla/dubla precizie), caracter, etc.
_definite de utilizator.
Modificatori
. Definesc lungimea spatiului de memorie allocate variabilei
- short
- long
- signed
- unsigned
. In ANSI C: short int int long int float double long double
Tipuri standard
- void int float char
- long short signed double unsigned
. char, signed char, unsigned char
. int, signed int, unsigned int
. short int, signed short int, unsigned short int
. long int, signed long int, unsigned long int
. float
. double
. long double
. Toate declaratiile care incep cu int vor fi implicit si signed.
. Daca este prezent orice alt modificator de tip, atunci int poate lipsi, pentru ca este subinteles.
4.1. Tipul intreg
. Orice tip intreg este o submultime a multimii numerelor intregi.
. int
4 octeti fara semn
[0,4 294 967 295] unsigned long
int
4 octeti cu semn
[-2.147.438.648,
2.147.438.647]
long int
2 octeti fara semn
[0, 65535] unsigned int
2 octeti cu semn
[-32768, 32767] int
short int
Reprezentare in memorie
Domeniul de valori
Tip si modificator
Tipul intreg
. Constante standard asociate tipului intreg
- INT_MAX (valoarea maxima a tipului 'int'): 32767
- INT_MIN (valoarea minima a tipului 'int'): -32768
- LONG_MAX (valoarea maxima a tipului 'long int'): 2 147 483 647
- LONG_MIN (valoarea minima a tipului 'long int'): -2 147 483 648
- SHRT_MAX (valoarea maxima a tipului 'short int'): 32767
- SHRT_MIN (valoarea minima a tipului 'short int'): -32768
- UINT_MAX (valoarea maxima a tipului 'unsigned int'): 65535
- ULONG_MAX(valoarea maxima a tipului 'unsigned long int'): 4 294 967 295
- USHRT_MAX (valoarea maxima a tipului 'int'): 65535. (limits.h)
Exemple pentru unsigned int si int
Exemplul 1
int main ()
Exemplul 2
int main () PC_7.C
Tipul intreg - operatii
. relatii (operatorii relationali: >, >=, <, >=, = =, !=)
- 0 considerat fals, orice altceva diferit de 0 este adevarat
. operatii aritmetice (+, -, *, /, %)
. operatii logice
- pe bit (bitwise or |, bitwise and &, bitwise xor ^)
- pentru variabile (and &&, or | |)
Tipul intreg - operatii
AND: 3 & 7
3 = 00000011
7 = 00000111
OR: 3 | 7 =7
<< deplasare la stanga
>> deplasare la dreapta
00000011
Tipul intreg - operatii
. Incrementare x++; ++x
x - > x+1 (dupa folosire, respectiv inainte de folosire)
. Decrementare x--; --x
x - > x-1
. Functii standard cu argument si rezultat intreg:
abs(x);
abs (x) = |x| PC_8.C
PC_9.C
4.2. Tipul real
. Numerele reale sunt exprimate in virgule mobila (floating point format).
. In TC exista 3 variante de tipuri reale.
Tipul real - operatii
. relatii: se aplica operatorii relationali clasici, iar rezultatul este o valoare intreaga - pe care o interpretam adevarata sau falsa ( >, >=, <, >=, ==, !=) 17.4 < 21.3 - true
. operatii aritmetice: cu operanzi reali si rezultat de tip real.
Operatori : + , - , * , /
5/2 cu rezultatul 2, iar 5/2.0 cu rezultatul 2.5.
Tipul real
Observatie:
Rezultatele operatiilor asupra intregilor in calculator sunt exacte, spre deosebire de cele asupra numerelor reale care sunt in general aproximative din cauza modului lor de reprezentare limitat (datorita erorilor de rotunjire).
Tipul real - functii standard
. abs(x);
abs (x) = |x|
. pow(x,y); pow10(x);
xy 10p
. sqrt(x); sin(x), cos(x), tan(x).; x in radiani
. log(x), log10(x), exp(x);
(math.h)
double - double
(stdlib.h)
Tipul real - functii standard
. ceil(x);returneaza valoarea argumentului x rotunjit la cel mai apropiat intreg in sus
. floor(x); returneaza valoarea argumentului x rotunjit la cel mai apropiat intreg in jos
. floor(16.3) = 16; ceil(16.3) = 17;
floor (-1.71) = -2; ceil(-1.71) = -1;
floor(-3.4)=-4; ceil(-3.4)=-3;
floor(0.5) = 0; ceil (0.5)= 1;
floor(-0.5) = -1; ceil (-0.5) = 0.
Tipul real - functii standard
. double modf(double x, double *ipart); returneaza partea fractionara a numarului x si memoreaza partea intreaga in ipart.
. PC_x10.C
. double fmod (double x, double y) calculeaza x modulo y, restul impartirii lui x la y x = ay + f; 0<f<y
Tipul real - functii standard
. double poly (double x, int grad, double coef[]);
. Genereaza un polinom in x cu gradul precizat in cel de-al doilea argument ('grad') si coeficientii in tabelul 'coef'. Returneaza valoarea polinomului pentru valoarea
argumentului data in variabila x.
rez=poly(4.0,3,val);
double val[] =
p(x)=7 x^3 - 2.3 x^2 +3 x +2 cu arg x=4
rez = 7*4^3 - 2.3*4^2 + 3*4 + 2 =
- Nu e ANSI C -
Generarea numerelor aleatoare
. int rand (void) Genereaza un numar pseduo-aleator in domeniul 0..RAND_MAX
. void srand(unsigned seed)
Prin apelul acestei functii cu valoarea argumentului 1, generatorul de numere aleatoare este reinitializat.
stdlib.h
time.h
Generarea numerelor aleatoare
. int random (int num) returneaza un numar aleator intre 0 si num- 1.
. void randomise (void)
Prin apelul acestei functii generatorul de numere aleatoare este initializat cu o valoare aleatoare.
stdlib.h
time.h
Nu sunt ANSI C
Curs 7
Sumar
. Tipul caracter - tip standard, tipul logic - definit de utilizator
. Constante (standard si definite de utilizator)
. Variabile
. Evaluarea expresiilor in C (precedenta, operatori, conversie de tip)
4.3. Tipul caracter
. Definit prin cuvantul standard char
. multimea valorilor este reprezentata de multimea caracterelor posibile
. se reprezinta pe un octet
. pentru caracter cu semn (implicit sau folosind modificatorul signed) domeniul de variatie este -128.127, iar pentru caracter fara semn (unsigned) domeniul de variatie este 0.255 (in ambele cazuri 256 valori).
car1 = 'A';
car2 = 'a';
car3 = 'n'; /* newline */
car4 = 't'; /* tab */
unsigned car_x;
Tipul caracter
. In C multimea caracterelor este o submultime a numerelor intregi, de aici si dilema daca o variabila care contine un caracter trebuie definita int sau char.
. Dilema poate sa apara, spre exemplu, in cazul in care
folositi functia getchar() - functie din biblioteca C, stdio.h, care returneaza caracterul citit dupa ce l-a
convertit in intreg fara semn.
. Daca valoarea este caracter+eof atunci variabila va fi declarata int, daca valoarea citita nu va fi niciodata eof,
atunci variabila se declara char.
Tipul caracter
. 'x'
- primul este un caracter, folosit pentru a produce valoarea numerica a caracterului x din setul de caractere al calculatorului;
- al doilea este un sir de caractere care contine un singur caracter (litera x) si un 0.
Tipul caracter - operatii si functii
standard
. Se pot aplica operatorii si apela functiile standard ca si pentru int.
. Relatii - intre operanzi de tip caracter
'C'<'D' este adevarat, '8'<'6' este fals
PC_x11.C
PC_x12
4.4. Tipul logic
. exista ca tip standard in unele limbaje de nivel inalt, nu si in C, dar se poate defini foarte usor;
. Valorile logice (in C, ca rezultat al unei comparatii) sunt: fals (zero) si adevarat (orice valoare diferita de zero).
Tipul logic
. una dintre variantele cele mai eficiente (timp, memorie) este urmatoarea: typedef int boolean
# define TRUE (1)
# define FALSE (0)
Tipul logic - operatii
. operatori relationali: = ,< ,>,<=,>= ,<>
Rezultatul aplicarii operatorilor relationali asupra operanzilor este o valoare logica.
. operatii logice: not - negatie (!)
or - disjunctie (||)
and - conjunctie (&&)
Tipul logic - operatii
Tipul logic
(end-of-file)
eof functie din io.h care indica atingerea sfarsitului unui fisier si care are valoarea 1 daca s-a atins sfarsitul
fisierului si 0 in caz contrar. In caz de eroare valoarea este -1.
EOF
(stdio.h) este o
ajunge la sfarsitul unui fisier. Aceasta valoare este utila pentru testarea unei conditii.
PC_x13.C PC_x14.C
5. Constante. Variabile.
Expresii in C
Constante. Variabile. Expresii in C
. Instructiunile unui program prelucreaza date
- constante
- variabile
Constante. Variabile. Expresii in C
. Declaratiile prezinta variabilele care vor fi utilizate intr-un program si specifica tipul lor (eventual si valorile lor initiale).
. Operatorii specifica actiunea care trebuie facuta cu variabilele sau constantele.
. Expresiile combina variabile si constante pentru a produce valori noi.
5.1. Constante
. Constantele pot fi:
- explicitate chiar prin valoarea lor (numere, siruri de caractere);
- desemnate prin identificatori (nume simbolice)
. standard (INT_MAX, INT_MIN.)
. definite de utilizator
Constante definite de utilizator
. se definesc prin intermediul identificatorilor
. definirea implica asocierea la identificator, a unor valori descrise
- explicit (numere, caractere) sau
- care rezulta prin evaluarea unei expresii (operanzii trebuie sa fie constante, iar operatorii de tipul constantei care se defineste)
. functiile simple care apar in expresie se evalueaza la compilare (abs).
Exemple de constante definite de utilizator
const m=-3;
const n=abs(m)-1;
PC_x15.C
Definitia unei constante definite de utilizator
const identificator <= expresie_constanta>;
const nume_functie(const <type>*<variable name> ;)
. const - cuvant rezervat
. identificator - numele constantei
.
expresie
-
-
- expresie formata din operatii si functii simple aplicate numai asupra unor constante
Asigura valori nemodificabile
Constante
. O
. Pentru hexa literele a,b,c.pot fi mari sau mici, dupa 0x sau 0X.
. Constantele lungi: 123L.
. Constantele hexazecimale pot fi urmate de un L pentru a le considera long.
Constante
. Constantele reale se pot scrie 234.987e-3 sau -0.432E3
.
Orice
. E , e - acelasi lucru
. Aceste constante sunt double, in afara cazului in care sunt urmate de f, F - float sau l, L - long double.
Constante
. Constantele reale se pot scrie
234.987e-3 sau -0.432E3
. 1.0 2. .1 2.634 .125 2.e5
2.e+5 .125e-3 2.5e5 3.1E-6
Constante
. Valoarea unei constante caracter este valoarea numerica a caracterului in setul de caractere al calculatorului.
- Spre exemplu, in setul de caractere ASCII, caracterul zero, sau '0', are valoarea 48, aceasta fiind diferita de valoarea numerica 0.
- '0' in loc de valoarea 48, face ca programul sa fie independent de o valoare particulara.
- Constantele caracter participa in operatiile numerice la fel ca oricare alte numere, cu toate ca, cel mai adesea ele sunt folosite in comparari cu alte caractere.
- Secventele escape au asociata o valoare intreaga care poate fi stocata intr-un char.
Secvente escape
question mark (semnul intrebarii) ?
double quote (ghilimele) '
quote (apostrof) '
backslash
vertical tab v
tab t
carriage return r
newline n
form feed f
backspace b
bell a
Reprezinta Secventa
Constante
. O constanta-sir este o secventa compusa din zero sau mai multe caractere intre ghilimele duble
- "Imi place limbajul C"
- '' - un sir vid
. " si " sunt delimitatori.
. Aceleasi secvente escape folosite pentru constantele caracter se aplica si pentru siruri;
- ' - caracterul ghilimele duble.
Expresii constante
. O
expresie
. Astfel
de expresii sunt evaluate la compilare si nu la executie si pot fi folosite in
orice loc in care poate sa apara o
#define MAXLINE 1000
char line[MAXLINE+1];
sau
secunde = 60 * 60 * ore
Avantajele utilizarii constantelor definite
de utilizator
. programul devine mai clar prin folosirea numelor simbolice care caracterizeaza valoarea numerica pe care o reprezinta;
. creste gradul de generalitate al programului (modificari doar la inceput)
. se precizeaza explicit ca valorile respective nu trebuie modificate.
Constante intregi cu tipuri diferite
Conform standardului ANSI C
. O
. Constantele simple hexazecimale vor utiliza lista urmatoare: int unsigned int long unsigned long
. Daca
dupa
. Daca sufixul este l sau L: long unsigned long
. Daca sufixul este u saU si l sau L poate fi doar unsigned long
. Un
compilator bun avertizeaza atunci cand
PC_x16.C
Calificatori - qualifiers
. Calificatori de tip: const, volatile
. Cuvintele cheie const si volatile pot fi aplicate oricarei declaratii - chiar si pentru structuri, enumerare sau in
situatii in care se foloseste typedef. Operatiunea se numeste calificare a declaratiei.
volatile i;
volatile int j;
const long q;
const volatile unsigned long int rt_clk;
struct volatile vs;
.
Este permisa declararea adresei unei date care nu este o
. Se poate astfel utiliza pointerul pentru a vizualiza data, fara a face modificari.
. Plasarea adresei unei date declarate const intrun pointer nu este permisa.
PC_x17.C
Calificatori
Exemplul PC_x17.C
. In acest
exemplu se observa ca este posibila preluarea adresei unei constante, generarea
unui pointer catre o entitate care nu este
. Obiectele constante au rostul de a mentine valori nemodificate.
char c;
char *const cp = &c;
. cp este pointer catre un caracter (cu sau fara const este acelasi lucru)
. const arata ca cp nu trebuie modificat, desi entitatea catre care indica poate fi modificata; pointerul este constant, nu si entitatea catre care indica acesta.
. const char *cp;
. cp est un pointer obisnuit, care poate fi modificat, dar entitatea catre care indica nu poate fi modificata.
. Ca urmare, in functie de caz, pointerul sau entitatea catre care indica pot fi modificabile sau nu.
volatile
. Indica faptul ca o variabila poate fi modificata de catre o rutina din fundal (background routine).
. Sintaxa: volatile <definitie date> ;
. Fiecare referire la variabila respective va reincarca continutul din memorie mai degraba, fara sa profite de faptul ca in anumite situatii exista o copie a acesteia intr-un registru.
volatile
. Acest calificator de tip este utilizat in principal atunci cand se realizeaza programe in limbaj C pentru sisteme in timp real sau embedded.
. Spre exemplu, daca scrieti cod care controleaza un echipament (hardware device) si plasati valorilor necesare in registre, la adrese absolute cunoscute.
Pentru detalii despre volatile consultati fisierul volatile.doc si fisierele
co_vo1.c si co_vo2.c
5.2. Variabile
. Orice variabila care apare intr-un program in limbaj C trebuie declarata; se face astfel legatura intre numele simbolic al variabilei si tipul sau
int m,n;
float mat[20] [20];
double v,w;
char ch1,ch2;
Variabile
. O variabila reprezinta de fapt numele simbolic al unei locatii de memorie
. Prin declararea variabilei i se asociaza locatiei de memorie
- un nume si
- un tip
. aici se va memora o valoare de tipul declarat
Declararea unei variabile
tip_var identificator;
. identificator - poate fi unul singur sau o lista de identificatori despartiti prin virgula, daca exista mai multe variabile de acelasi tip
. tip_var - indicarea tipului variabilei
Variabile
. Cand se declara o variabila, i se poate asigna o valoare.
. Variabilele intregi sunt folosite pentru a memora numere intregi.
int contor;
int nr_studenti = 165;
. Variabilele reale, referite si ca variabile float, stocheaza numere exprimate in virgula flotanta (floating point numbers)
float variabila = 0.0;
float numar_real = 1234567.89;
. Variabilele caracter stocheaza valorile unui caracter
char prima_litera = 'A';
char o_litera= 'X';
5.3. Evaluarea expresiilor in C
. O expresie implica efectuarea unor operatii asupra unor operanzi (constante, variabile, apeluri de functii),
iar rezultatul evaluarilor este o valoare.
. Tipul acestei valori este tipul expresiei. Acesta poate fi determinat din aproape in aproape urmarind tipul rezultatului fiecarei operatii in ordinea de evaluare a expresiei.
Expresii
. Expresiile in C sunt construite combinand operatori si operanzi.
. x = a+b*(-c)
- operatorii sunt =, + * and -
- operanzii sunt variabilele x, a, b,c.
. Parantezele sunt folosite pentru a grupa subexpresii.
. Operatorii sunt binari (cu doi operanzi) sau unari (cu un operand).
. Tipurile precizate prin cuvintele int si float sunt tipuri aritmetice; tipul pointer e altceva.
PC_18.C
Expresiile in C se pot construi
astfel
E = expresie simpla <operatori relationali expresie simpla>
. operatorii relationali: <, <=, >, >=, <>, =, IN
. o expresie simpla se compune din:
- termeni
- operatori aditivi (+, -, OR, XOR)
. un termen contine
- factori
- operatori multiplicativi (*,/,%,and,<<,>>)
Un factor poate fi
.
. variabila (reprezentata prin valoare)
. & urmat de o variabila
. NOT alt factor
. + sau - alt factor
. apel de functie
. conversie de tip
. o expresie intre paranteze
Operatorii
. Multiplicativi: *, /, %
- Operatiile aritmetice de inmultire si impartire asupra numerelor reale si intregi; impartirea a doi intregi produce un rezultat trunchiat (catre zero), iar restul impartirii se refera doar la numere intregi.
- Daca impartirea nu este exacta si nici unul dintre cei doi operatori nu este negativ rezultatul impartirii (/) este pozitiv si rotunjit catre zero; pentru a se obtine restul se foloseste %.
9/2 == 4 si 9%2 == 1
- Daca unul dintre operatori este negativ, rezultatul impartirii (/) poate fi intregul cel mai apropiat de rezultatul real, dintr-una din parti, si semnul rezultatului operatiei % poate fi pozitiv sau negativ.
- Depinde de implementare.
- Conversiile aritmetice obisnuite se aplica ambilor operanzi.
Operatorii
. Aditivi:+, -
- Adunarea si scaderea: + si - operatori binari
- Operatori unari: + si - .
- Conversiile aritmetice obisnuite se aplica ambilor operanzi ai operatiilor aditive (pentru operatorii binari, evident).
- Asupra operanzilor unari se aplica doar conversiile integrale.
Operatorii
. Binari: asociati cu operatiile pe bit.
PC_x19.C
Operatorii
. Atribuire
Operatorii compusi
Rezultatul unei atribuiri are valoarea si tipul datei careia i-a fost atribuit.
Operatorii
. Incrementare/decrementare
- Operatori unari: -- si ++
- x++; ++x; x--; --x;
PC_x20.C
Operatorul &
. operator de adresare (se plaseaza in fata operandului
. & identificator - astfel se reprezinta adresa din memorie a entitatii desemnate prin identificator
Exemplu: int x; &x -> adresa lui x
Evaluarea expresiilor
. Evaluarea unei expresii se face intr-o anumita ordine tinand seama de regulile de prioritate sau precedenta.
. Gruparea operatorilor: asociativitate.
. Atribuirea de prioritati operatorilor - precedenta
a + b * c + d
se grupeaza ca
a + (b * c) + d
. Multi operatori in C - 15 niveluri de precedente
Precedenta
Observatii Directia de asociere Operatorul
Precedenta
. Regulile de precedenta sunt important de cunoscut
- pentru a sti cum sa scrieti expresiile care vor fi evaluate in ordinea corecta
- pentru a citi corect expresiile scrise de altcineva.
. Prima regula pentru o evaluare corecta este sa identificati operatorii unari.
_ m***p se interpreteaza ca m inmultit cu o expresie in care apar p si cativa operatori unari *.
_ a + -b++ + c _ a + -(b++) + c
. Operatiile cu aceeasi prioritate se evalueaza (ca si in matematica) de la stanga la dreapta.
Precedenta
. Oricat de complicata ar fi o expresie care contine diverse tipuri, tipul subexpresiilor va fi dat de tipul operanzilor din subexpresie.
. (float)(j/i) va utiliza impartirea in intreg si apoi va face conversia in float.
. (float)j/i va forta impartirea in real.
PC_x21.C
Evaluarea expresiilor
. Expresiile logice care contin operatorii OR si AND pot fi evaluate:
- complet
- partial (in scurt-circuit) - in fiecare subexpresie care contine operatorul AND sau OR se evalueaza primul operand si apoi in functie de valoarea acestuia si de tipul operatiei se continua sau nu evaluarea celui de-al doilea operand.
. Daca primul operand al unei operatii AND rezulta false atunci cel de-al doilea operand nu se mai evalueaza si rezultatul operatiei va fi false
. Daca primul operand al unei operatii OR este true, atunci cel de-al doilea operand nu se mai evalueaza, rezultatul operatiei fiind true.
Conversia de tip - cast
. Conversie de tip - de regula, in C se efectueaza transformari asupra unor variabile dintr-o expresie.
int i=10;
double x=i*2;
. Compilatorul va observa ca i se atribuie lui x o valoare de tip int si va efectua automat o conversie in double.
. In principiu, in orice expresie in care apare un tip mai 'mic' si unul mai 'mare', are loc o conversie a celui 'mic' catre cel 'mare'.
. Putem cere o conversie explicita folosind constructia
(tip)expresie.
double x=10.25;
int i=(int)x;
Conversia de tip
. Pentru a transforma valoarea unei expresii in conformitate cu un anumit tip se foloseste conversia de tip.
. Structura sintactica a conversiei de tip include un identificator de tip urmat de o expresie intre paranteze rotunde.
Expresii - conversii
. In cazul in care sunt prevazute conversii de intregi (short, char, operatii pe bit, tip enumerare) se aplica urmatoarele reguli:
- daca un tip referit prin int poate cuprinde toate valorile tipului original, atunci valoarea este convertita la int;
- in caz contrar conversia se va face la unsigned int.
. In acest mod se conserva atat valoarea cat si semnul tipului original.
Spre exemplu, un caracter este tratat cu semn sau fara semn in functie de implementare.
. Acest gen de conversii sunt frecvente, fiind parte a conversiilor aritmetice uzuale, aplicandu-se operanzilor asociati cu operatorii unari +, -, ~ (not) sau cu shift. De asemenea se aplica si in cazul in care o expresie este argumentul unei functii pentru care nu a fost precizat nici un tip in cadrul prototipului.
. In cazul conversiilor intre tipuri de intregi, daca noul tip cuprinde toate valorile vechiului tip, atunci valoarea ramane nemodificata.
Expresii - conversii
. Conversia din tipul float in intreg are ca effect trunchierea partii fractionare. Daca tipul intreg nu poate cuprinde valoarea ramasa, atunci comportamentul este nedefinit - un fel de depasire
(overflow).
. Conversia float -> double -> long double, nu prezinta probleme, fiecare tip mai lung putand cuprinde valoarea tipului inferior si ca urmare, nu se pierde nimic.
. In cazul in care conversia are loc invers, daca valoarea se afla in afara domeniului de cuprindere comportamentul este nedefinit.
. Daca valoarea este cuprinsa in domeniu, dar nu poate fi cuprinsa exact, rezultatul va fi dat de una dintre valorile cele mai apropiate care pot fi cuprinse, in functie de implementare. Aceasta inseamna ca va avea loc o pierdere de precizie.
Expresii - conversii
. Daca operanzii dintr-o expresie au tipuri diferite, atunci va avea loc o conversie, astfel incat sa se obtina un tip comun pentru rezultat.
. Reguli pentru conversii:
- Daca unul dintre operanzi este long double, atunci celalalt este convertit la long double si acesta va fi si tipul rezultatului;
- Daca unul dintre operanzi este double atunci si celalalt este convertit la double si acesta va fi si tipul rezultatului;
- Daca unul dintre operanzi este float, atunci celalalt este convertit la float si acesta va fi si tipul rezultatului;
- Daca unul dintre operanzi este unsigned long int, atunci celalalt este convertit la unsigned long int si acesta va fi si tipul rezultatului;
- Daca unul dintre operanzi este long int, atunci celalalt este convertit la long int si acesta va fi si tipul rezultatului;
- Daca unul dintre operanzi este unsigned int, atunci celalalt este convertit la unsigned int si acesta va fi si tipul rezultatului;
- Daca ambii operanzi sunt de tip intreg, int, atunci rezultatul este de tip intreg, int.
PC_x22.C
cast
. In cazul in care rezultatul obtinut nu are tipul dorit, atunci se poate folosi o constructie numita cast (distribuire, atribuirea unui anumit rol).
. Plasarea unui nume de tip intre paranteze rotunde conduce la construirea unui operator unar numit cast.
. Exemplu : (int).
. Un operator cast face ca rezultatul evaluarii expresiei din dreapta sa sa aiba tipul dorit.
. Spre exemplu, daca impartim doi intregi, a/b, nu vom avea nici un rest. Pentru a forta obtinerea partii
fractionare putem folosi fie o variabila intermediara de tip float, fie operatorul cast.
PC_x23.C
cast
pointer to function returning int (int (*)()) int (*f)();
pointer to int (int *) int *ip;
array of char (char [30]) char x[30];
float (float) float f;
int (int) int x;
Tip Cast Declaratie
Un interviu cu Brian Kernighan
Mihai Budiu -- mihaib+@cs.cmu.edu
https://www.cs.cmu.edu/~mihaib/
iulie 2000
Cuprins
Introducere
Interviul
Cartile lui Brian Kernighan
Introducere
Pentru
al doilea an consecutiv am avut sansa de a obtine o slujba de vara la laboratoare
mai prestigioase din lume, numarind nu mai putin de 11 premii Nobel. De Bell Labs se
leaga evenimente epocale din istoria tehnicii de calcul: John Bardeen, Walter Brattain si
William Shockley au descoperit aici in 1947 efectul de tranzistor, Arthur L. Schawlow, si
Charles H. Townes au inventat in 1958 Laserul, Claude Shannon a fundamentat teoria
informatiei in 1948, Ken Thomson si Dennis Ritchie au creat sistemul de operare Unix in
1969 pentru care Ritchie a sintetizat limbajul C, care a evoluat apoi tot aici prin munca
lui Bjarne Stroustrup in 1984 in C++.
Anul trecut m-am ``aventurat'' sa cer autorilor cartii care descrie limbajul C, Dennis
Ritchie si Brian Kernighan, un autograf. Anul acesta mi-am luat inima in dinti si am
solicitat un interviu domnului Brian Kernighan. Acesta a raspuns cu foarte mare
amabilitate:
Date:
To: Mihai Budiu
From: Brian Kernighan
Subject: re: odd request
sure, no problem. i'm probably pretty boring, but since
i don't read romanian, you can make things up
come by any time; i'm mostly around.
brian
(sigur, nici o problema. sunt probabil destul de plictisitor, dar pentru ca nu citesc
romaneste poti inventa tot felul de lucruri. vino oricind, sunt prin preajma.)
Iata aici textul interviului transcris dupa inregistrarea facuta cu ajutorul unui calculator
echipat cu un microfon. Versiunea in limba engleza a interviului va fi disponibila din
pagina mea de web, pentru a demonstra ca de fapt nu am inventat mare lucru.
Versiunea in limba romana
M:Care e modul corect in care se pronunta numele dumneavoastra? Am auzit ca nu este
chiar cum ne-am astepta.
K:Se pronunta Karnihan. Litera ``g'' nu se aude.
Figura 1: Brian Kernighan
M:Ati ales sa lucrati in informatica intr-o perioada in care aceasta nu era cea mai
evidenta alegere pentru o cariera. Ce ne puteti spune despre cum ati facut aceasta
alegere si ce ginditi retroactiv despre aceasta decizie?
K:E adevarat ca am inceput sa lucrez cu calculatoarele, probabil pe la mijlocul anilor
saizeci, cind lucrurile erau destul de la inceput, si am facut-o din accident. Cred ca am
vazut primul meu calculator in 1963, era un IBM 650 destul de vechi; nu am inceput
programarea serioasa decit prin 1964 cind eram in student in ultimul an. Dar era foarte
amuzant, si era inainte ca informatica sa fie un ``domeniu'' de sine-statator. Cind am mers
la studii postuniversitare exista un program de informatica in departamentul de inginerie
electrica
de la universitatea
exista un domeniu academic separat al informaticii, ci doar o parte a unui departament
care avea un calculator sau ceva oameni interesati de calcule, asa ca am intrat si eu in
domeniu, in intregime accidental. Dar a fost un accident norocos, pentru ca in mod
evident au fost o multime de intimplari interesante in domeniu.
M:Ati lucrat in acest domeniu multa vreme, si ati fost un jucator important in evolutia
informaticii. Unele din lucrarile dumneavoastra au influentat profund domeniul. Puteti
arata unele dintre lucrurile pe care le considerati avansuri fundamentale in informatica
in ultimii 30 de ani; ce schimbari de paradigma crede,ti ca s-au petrecut?
K:Cred ca a fost un numar mare de schimbari, nu neaparat in informatica [ca stiinta], ci
in calculatoare in general. Evident, faptul ca hardware-ul a devenit enorm de rapid: legea
lui
timp de 30 de ani are un impact enorm; unele parti ale acestei schimbari depind de
informatica, dar nu toate. Pe de alta parte, lucrurile cu care sunt mai familiar, si in care
sunt mai interesat tehnologic, este folosirea feluritelor limbaje de programare in asa fel
incit sa fim mai capabili sa transmitem masinilor ceea ce vrem sa facem. Cresterea in
domeniul limbajelor de programare, a tehnologiilor care ne permit sa intelegem cum sa
exprimam comenzile pentru masini, a avut de asemenea un impact enorm. Desigur, pe
masura ce masinile deveneau mai puternice iti puteai permite sa aloci mai multe resurse
pentru a folosi limbaje care nu ar fi fost eficiente cu 25 sau 30 de ani in urma, dar care
acum sunt perfect utilizabile. Alte schimbari importante sunt imbunatatirile algoritmice,
teoria NP-completitudinii, care ne permite sa gindim despre ceea ce este greu si ceea ce
este usor de calculat. Dar in ceea ce ma priveste lucrurile pe care le gasesc cele mai
interesante sunt dezvoltarile in domeniul limbajelor de programare.
M:De-a lungul timpului ati lucrat in foarte multe domenii: algoritmi pentru grafuri,
software engineering, scule software, tipografie digitala, dar cea mai mare parte din
cercetarea dumneavoastra este in limbaje de programare. Care sunt interesele
dumneavoastra curente in cercetare?
K:[rizind] E interesant, ceea ce am facut in ultimele zile este sa mesteresc (hack-uiesc) la
probabil cele mai vechi radacini ale mele in domeniul prezentarii computerizate de
documente, sau tipografie digitala, daca preferi. Am luat eqn, care e un program pe care
Lorinda Cherry si cu mine l-am scris in 1974, si il convertesc pentru a produce rezultate
in XML sau HTML, in asa fel incit sa putem pune mai usor formule matematice in pagini
de web. Mai multe persoane au incercat sa faca acest lucru in felurite moduri, dar nici
unul dintre ele nu pare sa mearga prea bine, sau sa fie terminat. Noi avem nevoie de asa
ceva, asa ca eu lucrez la un program C pe care l-am scris literal cu mai mult de 25 de ani
in urma. E un program C foarte mic, si ma distreaza foarte tare sa incerc sa-l transform.
Asta e unul din lucrurile pe care le fac, un lucru marunt, dar e amuzant sa te intorci si sa
faci ceva la care te-ai ostenit cu atita vreme in urma.
Un alt lucru la care lucrez acum este un limbaj numit AMPL, pe care David Gay si cu
Bob Fourer si cu mine l-am creat. AMPL este un limbaj folosit pentru a specifica
probleme de optimizare, ca de exemplu pentru a descrie probleme de programare lineara,
dar nu numai. Incercam sa finisam produsul pentru a putea fi folosit in procese mai
complicate: de exemplu am invelit sistemul cu o interfata orientata pe obiecte ca sa poata
fi ingropat in alte programe sau folosit ca un obiect CORBA sau COM.
Astea sunt cele doua lucruri de care ma ocup acum.
M:Daca tot am vorbit despre limbaje de programare, se mai compileaza vechiul
program eqn?
K:Da, se mai compileaza. Probabil ca nu l-am mai compilat de cinci sau zece ani, si s-a
compilat fara nici o problema. E un program C foarte mic si simplu; cred ca l-am
convertit la ANSI C la sfirsitul anilor '80. Ceea ce fac acum este mai ales sa tai din el,
pentru ca limbajul de iesire este mult mai simplu decit inainte.
M:Cei mai multi oameni va cunosc probabil din cauza cartii de C, asa ca o sa va pun
doua intrebari legate de C. Limbajul C a avut o influenta enorma; care credeti ca sunt
trasaturile sale cele mai valoroase?
Figura 2: Cartea de C
K:C are cel mai bun echilibru pe care l-am vazut vreodata intre putere si expresivitate.
Poti face aproape orice vrei programind intr-un fel destul de evident si ai intotdeauna un
model mental bun a ceea ce se va intimpla pe calculator; poti prezice destul bine cit de
repede o sa mearga, intelegi ce se petrece si iti da libertate totala sa faci ce vrei. C nu te
constringe in vreun fel, nu te obliga sa folosesti un anumit stil de programare; pe de alta
parte nu iti ofera o gramada de facilitati, nu are o biblioteca gigantica, dar in ceea ce
priveste realizarea a ceva fara prea mult efort, nu am vazut nimic mai bun pina in ziua de
azi. Exista alte limbaje reusite pentru aplicatii specifice, dar daca ar fi sa esuez pe o insula
pustie cu un singur compilator, as vrea un compilator de C.
M:De fapt C este si limbajul meu de programare favorit, si pe care l-am folosit pentru
majoritatea programelor mele. Dar de cind am inceput sa scriu compilatoare pentru C,
trebuie sa marturisesc ca limbajul mi se pare mai putin placut: unele optimizari sunt
foarte greu de facut. Care sunt din punctul dumneavoastra de vedere trasaturile negative
ale limbajului?
K:Nu pot comenta despre trasaturile negative; iti reamintesc ca C este in intregime
creatia lui Dennis Ritchie. Eu am contribuit doar la popularizarea sa, si in particular nu
pot spune ce e greu si ce e usor de compilat in C. Sunt citeva lucruri trivial gresite in C:
instructiunea switch putea fi mai bine proiectata, precedenta unora dintre operatori este
gresita, dar astea sunt lucruri marunte si lumea a invatat sa le evite. Cred ca adevarata
problema a limbajului C este ca nu-ti pune la dispozitie destule mecanisme pentru a scrie
programe cu adevarat mari, pentru a crea ziduri de protectie in interiorul programelor,
care izoleaza feluritele bucati. Nu se pune problema ca nu poti face astfel de lucruri, ca
nu poti simula programare orientata pe obiecte sau alte metodologii de programare in C,
poti sa faci toate astea, dar compilatorul si limbajul nu te vor ajuta. Dar daca luam in
considerare ca C are aproape 30 de ani si ca a fost creat cind calculatoarele erau
minuscule in comparatie cu ceea ce avem acum, cred ca e o creatie admirabila, care a
trecut de testul scurgerii timpului extrem de bine. Nu sunt multe lucruri pe care le-as
schimba in C.
Citeodata scriu in C++ in loc de C. Cred ca C++ este practic un limbaj prea mare, desi
pentru fiecare din elementele lui exista un motiv de a exista. Cind scriu un program C de
orice dimensiune folosesc probabil 75, 80 sau chiar 90% din elementele limbajului. Cu
alte cuvinte, cea mai mare parte a C-ului este folositoare indiferent de programul pe care
il scrii. Pe de alta parte, cind scriu C++, folosesc probabil mai putin de 10% din
elementele sale, iar despre celelalte 90% a's putea zice c'a nu le 'in'teleg. 'In sensul asta
pot argumenta ca C++ este un limbaj prea mare, desi C++ iti ofera multe din mecanismele
de care ai nevoie pentru a scrie programe mari: iti permite sa construiesti obiecte, si sa
protejezi reprezentarile lor interne cu o fatada solida de care nu poti trece. C++ are o
cantitate enorma de mecanisme utile pe care C nu ti le da.
M:Am o intrebare despre cercetarea in limbaje de programare. E interesant de exemplu
ca Java este foarte mult ridicat in slavi; comunitatea programatorilor se imparte intre
cei care lauda meritele si cei care critica lipsurile limbajului. Java intr-adevar a fost
inzestrat cu niste trasaturi care deriva din cercetare (cum ar fi colectorul de deseuri --
garbage collection), dar tot cercetatorii arata oricui vrea sa-i asculte erori de proiectare
(cum ar fi vectorii, care sunt covarianti). O cantitate enorma de cercetare se desfasoara
in limbaje de programare, si foarte multa cercetare interesanta in domeniul limbajelor
de programare functionale, dar nu se prea vad rezultatele acestei cercetari in ``lumea
reala'', adica in limbajele pe care le folosesc programatorii obisnuiti in munca de lor de
zi cu zi. In locul acestor limbaje academice apar din senin limbaje ad-hoc, cum ar fi Perl
si Python. Unde vedeti buba, ce nu functioneaza cum trebuie?
K:Asta
este din pacate o intrebare foarte buna, si exista o oarecare rivalitate aici la
Labs intre un grup extrem de puternic de limbaje functionale si un grup care foloseste
limbaje ad-hoc, mai pragmatice. Sincer sa fiu, nu stiu de ce limbajele functionale nu au
succes. De exemplu ML, care este probabil cea mai buna combinatie, cea care ar trebui sa
domine: chiar daca e un limbaj extrem de atent proiectat, la care au contribuit mult timp o
multime de cercetatori, care a dat nastere la o cantitate enorma de tehnologii de
compilare, nu pare sa fie adoptat pe scara larga. Simplificind extrem, si probabil suparind
pe unii dintre prietenii mei, aparent singurul lucru care se face in ML sunt compilatoare
de ML [ride]. In mod intentionat exagerez, dar de fapt lucrurile cam asa stau, si nu stiu
exact de ce. Din punctul meu de vedere unul dintre motivele pentru care ML si alte
limbaje functionale nu au mai mult succes este pentru ca necesita o oarecare abilitate
matematica si o gindire mai abstracta, pe care o gramada de lume, in care ma includ si eu,
nu o poseda. In schimb limbajele ca C sunt extrem de operationale si poti vedea foarte
clar cum fiecare bucatica dintr-un program se translateaza direct intr-o actiune a
calculatorului. Poate daca as fi fost crescut si educat in alt fel as fi multumit cu ML si as
gasi C cam nesigur (unsafe), periculos si nu prea expresiv. Dar impresia mea este ca
limbajele functionale au fost create de o comunitate de oameni cu puternice inclinatii
matematice si ca au nevoie de un rationament matematic substantial, si ca atare nu vor fi
pe placul omului de rind.
M:Deci sugestia dumneavoastra ar fi ca cercetatorii sa coboare nivelul limbajului,
pentru a-i promova calitatile pozitive?
K:Nu am raspuns de fapt la partea a doua a intrebarii tale, de ce cercetarea in limbaje nu
a avut mai mult efect. Cred ca de fapt cercetarea a avut un efect, in domenii ca tehnologia
parserelor, generarea de cod, indiferent de limbajul in chestiune. Cercetarea a produs
scule de mare succes pentru a manipula limbaje, dar a avut mai putin efect in proiectarea
limbajelor insele.
Limbajele care au succes sunt foarte pragmatice, si sunt adesea ``patate'' pentru ca
incearca sa rezolve probleme reale. C++ este un exemplu excelent de limbaj care are o
gramada de hibe. Una dintre ele este ca incearca foarte tare sa ramina compatibil cu C: e
compatibil la nivelul fisierelor obiect, si e aproape compatibil la nivelul surselor. Din
cauza asta sunt o gramada de lucruri urite in limbaj, probleme sintactice ciudate,
comportari semantice bizare. Intr-un anume sens asta e foarte rau si nimeni nu ar trebui sa
faca asa ceva, dar unul dintre motivele pentru care C++ a avut atita succes este exact
motivul ca este compatibil cu C, si deci putea folosi bibliotecile C, putea fi invatat usor
de comunitatea programatorilor C, care deci puteau face tranzitia destul de usor fara a
trebui sa-si schimbe peste noapte obiceiurile. Ori asta nu e de loc adevarat in cazul ML,
care a fost proiectat in acelasi timp si in mare parte in acelasi loc [tot la Bell Labs], dar
care a atacat problema intr-un mod foarte radical. Din punct de vedere pragmatic C++ are
un succes enorm, dar pentru care a platit pretul compatibilitatii.
M:Deci sunteti avocatul evolutiei incrementale.
Vad ca sunteti autorul a cel putin opt carti, toate din ele scrise in colaborare. Deduc de
aici ca stilul dumneavoastra de cercetare este colaborativ?
K:Daca ai de gind sa scrii o carte, e al naibii de usor sa mai gasesti pe altul sa faca o parte
din treaba [ride]. Am fost foarte norocos sa am colaboratori excelenti la toate cartile
mele, si in sensul asta a fost foarte usor. E mult mai simplu de lucrat la o chestie mare,
cum e o carte, si care iti ia sase luni sau un an, daca ai pe cineva care lucreaza cu tine.
Asta te tine si cu picioarele pe pamint: daca o iei razna prea tare ai pe cineva care poate
sa te cirmeasca la loc pe directia cea buna.
Cred ca tot ce am facut am facut cu altcineva: e mai amuzant sa lucrezi cu alti oameni
decit sa te incui in birou si sa te chinui de unul singur. Si probabil ca sunt mai bun la a
gasi si a asculta pe cineva care are o idee buna, pentru ca apoi sa lucrez cu acea persoana
la dezvoltarea ideii decit la a gasi ideile eu insumi.
M:Daca tot am vorbit de statul cu picioarele pe pamint, lucrez la un proiect care
dezvolta niste programe mari, unele din functii fiind modificate de mai multi autori, care
schimba fiecare stilul de asezare in pagina dupa preferintele proprii. Ati publicat citeva
carti despre tehnici si stil de programare; s-a potrivit intotdeauna stilul dumneavoastra
cu al co-autorilor, sau ati avut probleme in a reconcilia gusturile?
K:[rizind] Asta e de asemenea o intrebare draguta. Ocazional am avut, nu ``probleme'',
nu e cuvintul potrivit, dar am avut discutii despre unde se pun acoladele, unde se pun
spatiile si cum se scriu numele de variabile. Cele mai multe din lucrurile astea au fost
marunte, in parte pentru ca coautorii mei sunt prin preajma si am crescut in acelasi mediu
cultural. Dar, de exemplu, cind Rob Pike si cu mine lucram la ``The Practice of
Programming'', cu citiva ani in urma, am avut discutii destul de intense despre lucruri
minore cum ar fi ``unde pui spatiile''. Tu cite spatii pui? Eu pun spatii dupa cuvinte ca if,
while si for, dar Rob nu pune. Am cistigat batalia aia, dar sunt alte batalii pe care le-am
pierdut, nu mai tin minte exact care. Cu siguranta ca nu am fost de acord 100%, dar am
rezolvat amiabil disputele.
Cu cit mai multi oameni lucreaza la ceva, si cu cit e programul mai mare, cu atit mai greu
o sa fie, si de la un moment dat trebuie sa stabilesti standarde pe care toata lumea le
respecta si metode mecanice ca de exemplu pretty-printer-e care te obliga sa joci dupa
reguli, pentru ca altfel pierzi prea mult timp si creste probabilitatea sa faci greseli.
M:Ati mentionat pretty-printer-ele; ce alte scule si medii de programare folositi?
K:Cind am de ales programez in Unix. Folosesc editorul de texte sam scris de Rob Pike;
nu folosesc Emacs. Cind nu pot folosi sam folosesc vi din motive istorice, si sunt chiar
foarte multumit de ed [rizind]; stiu, asta a aparut inainte ca tu sa te nasti. Si e partial un
motiv istoric: il stiam pe Bill Joy cind lucra la vi.
Nu folosesc debugger-e sofisticate, folosesc instructiuni de tiparire inserate in cod;
singurul lucru pentru care folosesc un debugger este sa obtin o lista a procedurilor de pe
stiva cind un program moare in mod neasteptat. Cind scriu cod pe Windows in mod
normal folosesc sculele Microsoft de dezvoltare: ele stiu exact unde sunt fisierele header
si alte fisiere importante, deci trebuie sa le folosesc chiar daca nu se potrivesc cu stilul
meu preferat de lucru. De asemenea in Windows imi instalez pachete de scule cum ar fi
mks care ofera utilitarele tipice Unix si programele standard cu care sunt obisnuit pentru a
cauta, compara, si asa mai departe.
M:Voi schimba din nou subiectul. Cind am venit in Statele Unite am fost extrem de
surprins sa descopar ca se face cercetare de foarte buna calitate, si cercetare
fundamentala -- adica cercetare care nu e in mod necesar directionata spre un produs
comercial sau pentru a genera profituri -- nu doar in universitati, ci si in citeva companii
mari. Ce ne puteti spune despre cercetarea la Lucent, o companie foarte mare, care e o
parte din fostul AT&T, o companie uriasa?
Figura 3: Logo-ul Bell Labs si Lucent
K:O sa-ti dau sloganul oficial, desi cred ca mult din el este in continuare adevarat.
Cercetarea a fost o parte importanta a companiei asteia de pe cind se chema ``The Bell
System'', si a ramas la AT&T si Lucent; Bell Labs serbeaza 75 de ani anul acesta. Cred ca
cercetarea a inceput pentru ca oamenii si-au dat seama ca sunt felurite lucruri pe care nu
stiu cum sa le faca dar pe care ar trebui sa invete sa le faca daca vor sa imbunatateasca
produsele sau serviciile pe care le vindeau. Desigur, in timpuri ancestrale serviciul de
baza era cel telefonic; in urma cu 30 sau 40 de ani tehnologia telefoniei a inceput sa
capete o din ce in ce mai puternica componenta informatica, si asta a adus cercetarea in
calculatoare aici. Cred ca acelasi lucru este adevarat pentru companii ca IBM care are de
asemenea laboratoare de cercetare extrem de eficiente. IBM e cu siguranta o alta
companie cu o traditie indelungata de incurajare a cercetarii.
Avem intrebarea interesanta ``cum justifica o companie banii cheltuiti pe cercetare?''.
Lucent la ora asta are cam 150 de mii de angajati, deci partea de cercetare, din care facem
parte tu si cu mine, e ceva mai putin de 1%, poate 1000 sau 1500 de oameni. Veniturile
anuale ale companiei sunt de 38 de miliarde de dolari in 1999, deci cheltuim cam 400 de
milioane de dolari anual pe cercetare ca sa ne tinem pe tine si pe mine in birouri
comfortabile gindind ginduri inaltatoare. Asta pare un fel destul de rezonabil de a investi,
o investitie cu risc mare, dar cu profituri potentiale mari. Trebuie tot timpul sa te gindesti
``unde o sa fim in citiva ani?'', ce fel de probleme ne chinuie acum, la care inca nu
cunoastem solutii, la care ar fi frumos sa avem solutii, chiar daca nu ne trebuie astazi,
pentru ca in viitor vom avea nevoie de ele. Din nefericire e greu sa-ti dai seama cum sa
faci astfel de lucruri, adesea e greu sa-ti dai seama care sunt problemele importante. Cred
ca cel mai bun mecanism pe care cineva l-a gasit pina acum e sa ia o mica suma de bani,
sa zicem 1%, 'si s'a angajeze o grupa de oameni brilianti, sa-i puna intr-un mediu in care
sunt incurajati sa vorbeasca unul cu altul, sa vorbeasca cu lumea din restul companiei, sa
afle ce fel de probleme are lumea din restul companiei; lumea din restul companiei este
incurajata sa vina la ei si sa zica ``puteti sa ne ajutati cu problema asta?'', si sa spere ca
acest proces aleator, si este un proces in multe feluri absolut aleator
M:[intrerupind] Dar nu numai atit: exista cercetare-dezvoltare in multe alte companii;
dar la Bell Labs cercetatorii sunt si incurajati sa publice!
K:Cred ca intrebarea este ``cum difera compania asta de alte companii prin faptul ca
publicam?'' Sunt mai multe lucruri la mijloc. Unul este ca scara noastra este mult mai
mare; Lucent Bell Labs este probabil in continuare cel mai mare laborator de cercetare
industriala din lume, facind cercetare de genul celei pe care o gasesti in universitati in
vremurile de demult, esentialmente cercetare fundamentala, nedirectionata pe produse.
IBM este cel putin comparabila, si Xerox intr-o oarecare masura, si sunt si alte companii
de genul asta. Una dintre diferente este ca aici, cel putin in grupul de calculatoare, dar si
in toate stiintele fizice, cercetarea este undeva intre cercetare industriala, puternic
orientata pe produs, si cercetare academica, in care fac treaba mai ales din curiozitate sau
pentru ca vor sa analizeze problemele in mai mare adincime. Un laborator industrial mare
este intins intre extremele astea: e mai focalizat pe lucrurile care sunt practice, dar in
acelasi timp are un deget in lumea universitara. Si trebuie sa faca asta, pe linga alte
motive, din cauza mecanismului de angajari. Motivul pentru care tu esti aici si nu la
Cisco, sa zicem, este ca Cisco nu face cercetare, Cisco cumpara companii. Cisco nu e un
loc rau, in multe privinte Cisco e un loc minunat, dar isi face treaba altfel decit Lucent.
Un alt lucru este ca, fiind un jucator in lumea academica pe linga cea industriala, noi
interactionam cu lumea din universitati pe post de colegi egali in rang, deci putem atrage
oameni ca tine, care vin aici pentru o vara si dupa aia poate vin inapoi permanent. In felul
asta avem un influx permanent de oameni buni. Dar trebuie sa-i dam inapoi ceva
sistemului. Trebuie sa te primim in companie, sa-ti aratam lucruri interesante, sa te lasam
sa publici articole, si trebuie sa scriem articole noi insine, pentru ca altfel nimeni nu o sa
ne creada ca facem lucruri interesante. Deci trebuie sa fim in mare parte membri care
participa la comunitatea academica, pe linga participarea la bunastarea companiei. Asta e
o problema interesanta si inca nerezolvata, cum sa faci ambele lucruri fara sa cazi prea
tare intr-o extrema sau cealalta.
M:L-ati mentionat pe Rob Pike; va este coautor la doua carti. As vrea sa va intreb
despre o prelegere foarte controversata pe care a tinut-o, al carei rezumat se gaseste la
https://www.research.bell-labs.com/who/rob/utah2000.pdf, in care dinsul argumenteaza
ca cercetarea in partea de sisteme (aplicata) in informatica este moarta. Ce ginditi
despre acest enunt?
K:Ca sa fiu sincer, Rob are aproape intotdeauna dreptate, desi nu as recunoaste asta in
fata lui [ride]. Doar am vazut textul prezentarii lui, fara sa fi fost prezent la fata locului,
dar cred ca in multe privinte are dreptate. Observatia lui este ca este foarte greu de lucrat
in sisteme: lucrurile se fac la scara prea mare pentru mediile academice, iar mecanismul
recompenselor in mediile academice este defectuos. Ca rezultat o mare cantitate a muncii
din sisteme tinde sa fie incrementala, si sa constea mai curind in evaluarea performantei
decit in sinteza unor combinatii noi si interesante. Nu stiu de ce lucrurile stau asa: poate
ca e greu pentru universitati sa obtina suportul necesar, poate dureaza prea mult --
observatia lui Rob este ca sistemele reale sunt construite in cinci ani sau mai mult, si cam
asta e durata unui doctorat -- deci e greu sa obtii ceva pe masura carierei unui student. Nas
zice ca cercetarea in sisteme este ``moarta'', dar cu siguranta nu este atit de vie cit ar
putea fi.
M:Daca tot am mentionat viata universitara, am vazut ca ati predat cel putin doua
cursuri la Princeton. As vrea sa va cer opinia despre educatia in informatica. Am auzit
plingeri din partea companiilor ca studentii din calculatoare invata prea multa teorie
inutila si nu stiu destul despre dezvoltarea de programe reale.
K:Am predat patru cursuri la Princeton si Harvard in ultimii patru sau cinci ani, la nivele
felurite, dar asta nu e suficient pentru a face din mine un expert in educatia in
informatica. Astea sunt niste scoli anume si eu am predat mai mult ciudatenii. Nu cred ca
universitatile ar trebui sa predea lucruri pe care trebuie sa le inveti la o scoala
profesionala; nu cred ca rolul universitatii este sa predea utilizarea lui, sa zicem, Visual
C++ si a mediului sau integrat de dezvoltare. Cred ca rolul universitatii este sa invete
studentii cum sa programeze intr-un anumit tip de limbaje, de exemplu orientate pe
obiecte, sa ajute studentii sa inteleaga meritele si dezavantajele unei familii de limbaje ca
C, C++ si Java, si relatia acestora vis-a-vis de limbaje de natura diferita, cum ar fi cele
functionale. Sa inveti studentii tehnicile de care au nevoie ca atunci cind intra intr-un
atelier Windows de software sa fie capabili sa scrie imediat programe COM nu e corect.
Nu asta trebuie sa faca universitatile, ele trebuie sa predea lucruri perene, care vor tine
pentru o viata, daca esti norocos, sau macar pentru 5, 10 sau 20 de ani, si acestea sunt
principii si idei. In acelasi timp, ar trebui sa ilustreze principiile si ideile cu cele mai bune
exemple posibile luate din practica curenta.
La Princeton am predat un curs introductiv, o combinatie de software engineering si
programare avansata: studentii, mai ales cei din anii mari, erau in general foarte
experimentati in felul de lucruri de care probabil ca industria are nevoie. Ei erau
comfortabili cu Visual C++, stiau cum sa ia componente de pe retea si sa le asambleze, si
puteau scrie aplicatii Java destul de sofisticate. Multe din lucrurile astea erau poate
invatate din slujbe de vara. Daca industria vrea oameni care au mai mult decit cunostinte
``inutile'' teoretice, ce ar trebui sa faca este sa ia acesti copii talentati din scoli si sa le
ofere slujbe de vara interesante, care complementeaza cunostintele teoretice cu detaliile
particulare ale diferitelor aplicatii. Lumea invata astfel de lucruri extrem de repede, si
daca invata lucruri interesante la slujbele de vara vor duce astfel de cunostinte si in
carierele lor academice. Am fost foarte impresionat de cite lucruri stiau studentii, pe care
nu le invatasera neaparat la scoala.
M:Vorbind despre studenti, ce sfaturi i-ati da unui student care intentioneaza sa urmeze
o cariera de cercetare? Poate unele domenii sunt mai fructuoase decit altele, sau poate
unele au devenit neinteresante?
K:Nu urma sfaturile mele despre cariera [ride]. Din nefericire nu cred ca exista nici un fel
de sfat bun. Cele mai interesante, pardon, nu ar trebui sa zic ``interesante'' -- domeniile
cele mai dificile sunt doar doua: unu, ca e prea greu sa scrii programe care merg, si doi,
ca e prea greu sa folosesti calculatoarele. Deci daca vrei teme asupra carora sa te apleci,
astea sunt doua pe care le poti incerca. Desigur, astea sunt destul de generale, [ride] exista
o multime de cazuri particulare cu care te poti juca. Daca faci progrese in orice directie
din domeniile astea, atunci ai oportunitatea de a continua cu o cariera academica sau poti
incerca sa faci avere intr-o companie nou creata (start-up). La ora asta se pare ca o
multime de oameni mai curind ar face avere intr- noua companie decit sa petreaca 5 sau 6
ani pentru a obtine un doctorat. Poate esti prost orientat [ride]Cred ca din nefericire cel
mai bun sfat pe care i-l poti da cuiva este ``fa ceea ce crezi ca este interesant, fa ceva care
crezi ca este amuzant si merita, pentru ca altfel oricum nu o sa poti sa o faci bine''. Dar
asta nu ajuta de loc.
M:Poate puteti ajuta fiind mai concret: puteti sa ne recomandati niste carti, de
calculatoare sau altceva, care credeti ca au avut o influenta mare asupra
dumneavoastra?
K:Singura carte de calculatoare pe care am recitit-o mai mult de odata, pe care de fapt o
iau la fiecare citiva ani si din care recitesc parti este ``The Mythical Man-Month'' (Miticul
om-luna), de Fred Brooks, o carte mare. In parte este foarte bine scrisa, in parte sfaturile
din ea, chiar dupa 25 de ani, sunt foarte relevante. Sunt desigur detalii care s-au schimbat,
unele lucruri le facem altfel din cauza ca avem mai multa mecanizare si mai multa putere
de calcul, dar este o cantitate enorma de sfaturi utile in cartea aia, asa ca o recomand cu
mare caldura. Este singura carte de calculatoare la care ma pot gindi pe care o recitesti
pentru o combinatie de placere si viziune.
Sunt alte carti pe care le recitesc si care sunt foarte relevante pentru oameni din
informatica. Carti despre cum se scrie, in engleza in cazul meu particular, ca ``Elements
of Style'' (elemente de stil) de Strunk si White. Ma reintorc si recitesc cartea asta la
fiecare citiva ani, pentru ca cred ca abilitatea de a comunica este probabil la fel de
importanta ca cea de a sta la tastatura si a scrie programe. Capacitatea de a explica ceea
ce faci este foarte importanta.
Exista de asemenea o carte grozava, ``Cum sa minti folosind statistica'', pe care o vei gasi
utila in propria ta cercetare [risete].
M:Voi schimba din nou directia. Unix si C au fost create la AT&T si la ora aceea au fost
lansate sub o licenta care era virtual o licenta open-source, pentru ca AT&T trebuia sa
faca asta: fiind un monopol avea o intelegere cu guvernul american, din cite inteleg, sa
nu faca bani din calculatoare. O multime de oameni afirma ca licenta liberala este
motivul enormei popularitati si influente pe care atit Unix si C le-au avut. Recent Lucent
a lansat Plan 9 sub o licenta open-source. Ce credeti despre acest ``nou'' fenomen opensource1?
K:Cred ca in mare parte e un lucru bun. Licenta originara Unix era, cum zici, facuta in
mare parte in acest fel pentru ca AT&T nu avea voie sa faca orice fel de alte afaceri decit
telefonie, deci nu puteau face bani pe software. Din cauza asta au luat decizia foarte
inteleapta de a da Unix practic pe gratis universitatilor. L-au vindut si comercial, dar pe
un pret de nimica, dar universitatile l-au primit pe degeaba, si ca atare o intreaga
generatie de studenti si profesorii lor s-a dezvoltat crezind ca Unix este felul in care se fac
calculatoare. Unix era cu siguranta mult mai productiv decit celelalte sisteme de operare
comerciale ale timpului, si pentru ca codul sursa era disponibil era usor sa-ti dai seama ce
se intimpla si sa faci imbunatatiri. In jurul Unix-ului s-a construit o comunitate de
utilizatori, interesati de Unix, motivati de aceleasi lucruri si care contribuiau si in felul
acesta sporeau valoarea sistemului prin colaborare.
Cred ca miscarea curenta open-source are foarte mult din acest caracter. Multe din sculele
dezvoltate open-source sunt bazate pe modele Unix. Linux este cel mai evident, pe
dinafara cel putin fiind clar bazat pe Unix; multe din programele de la Free Software
Foundation sunt reimplementari ale unor scule si limbaje standard din Unix.
Sunt desigur si alte proiecte care apar din interese comerciale stranii, cum ar fi Mozilla,
codul pentru Netscape, care e acum in domeniul public, si la care lumea de asemenea
contribuie.
Cred ca fenomenul open-source este in general un lucru bun. Nu sunt sigur ca va inlocui
vreodata cod specializat, profesional, solid, care este vindut pentru profit. Dar ce ar putea
realiza in multe cazuri, si cred ca reuseste perfect in cazul compilatoarelor de C, este sa
ofere o implementare de referinta si un standard de o calitate buna, pe care toate celelalte
implementari trebuie sa-l atinga, pentru ca altfel nu le cumpara nimeni. Cred ca in sensul
asta e un lucru bun.
Cit despre Plan 9, cred ca e prea tirziu, din pacate. Cred ca Plan 9 a fost o idee mareata si
ar fi trebuit lansat sub o licenta gen open-source cind a fost facut, cu opt ani in urma, dar
``tutorii'' nostri nu ne-au lasat. Cred ca au facut o greseala foarte costisitoare. Licenta
actuala gen open-source merita categoric, dar nu e clar daca Plan 9, cel putin ca sistem de
operare general, va avea impact, exceptind o mica nisa. Are multe calitati care-l fac
valoros in multe domenii, mai ales unde ai nevoie de un sistem mic si portabil, dar va
reusi sa smulga dominatia Linux-ului? Nu cred.
M:Ma pregatesc sa inchei pe o nota mai usoara, dar intii voi pune inca o intrebare mai
adinca. Interpolind din evolutia informaticii de pina acum, cum vedeti evolutia sa in
viitorul apropiat, si nu indraznesc sa intreb, cel indepartat?
K:[ride] Daca as putea prezice viitorul atunci as investi mai intelept si nu ar trebui sa fac
interviurile astea prost platite [n.b. interviul a fost gratuit]. Stii, de fapt sunt asa de
nepriceput la preziceri. Voi ghici ca intr-un sens situatia din informatica va fi aceeasi:
vom face multe progrese, vom putea face lucruri mai mari, vom putea construi lucruri
care sunt mult mai interesante si sofisticate decit cele pe care le puteam face cu zece ani
in urma. Daca te uiti la lucrurile care ruleaza pe PC-ul din fata noastra, sunt mult mai
puternice si mai flexibile decit cu zece ani in urma. Dar cantitatea de cod incilcit, peticit,
oribil care zace sub toate astea a crescut si ea enorm. Intr-un sens cred ca vom continua sa
facem progrese, dar vor fi tot timpul slinoase si pe jumatate neterminate. Pentru ca
oamenii mereu se apuca de mai mult decit pot face in mod rezonabil, tot timpul se intind
mai mult decit plapuma, si niciodata nu par sa se intoarca sa curete ce au facut inainte.
Celalalt lucru care ma cam ingrijoreaza este ca acum calculatoarele sunt peste tot, in tot
ce faci. Nu poti sa te intorci fara sa ai de-a face cu ceva care depinde in mod critic de
calculatoare, si din ce in ce mai multe din lucrurile astea conteaza. Nu conteaza daca
programul de inregistrat sunet din Windows merge sau nu
M:[intrerupind] Acum conteaza! [n.b. interviul acesta a fost facut folosind un PC si
software de captare si compresie de sunet]
K:daca pierdem interviul, la naiba cu el. Dar, de exemplu, cind o sa zbori inapoi la
echipamentele de pe Airbus 320, si sa nu faca nici o greseala; asta este doar un exemplu
dintre lucrurile care depind critic de abilitatea noastra de a scrie software care merge si sa
construim hardware care-l suporta, si cred ca inca nu stim sa facem asta bine. Facem
progrese, e clar mai bine, combinatia de limbaje si tehnici ca sculele de verificare ajuta,
dar avem aceeasi problema: pe masura ce intelegem mai bine cum sa facem lucrurile mici
ne apucam de unele mai mari si mai complicate si intr-un sens suntem mereu intre
crocodili pina la git.
M:Ultima mea intrebare este despre hobby-uri.
K:[rizind] Cine are timp de hobby-uri? Daca ma uit la hobby-urile mele din clipa asta,
cred ca se rezuma la citit. Cind nu ma distrez sau mesteresc la calculatoare, sau nu fac
chestii legate de slujba mea, citesc. De obicei carti de istorie, nu stiu de ce, e ciudat, dar
imi place sa citesc carti de istorie. De-a lungul vietii mele, in ultimii 20 sau 30 de ani, am
trecut prin tot felul de faze lungi de 3, 4, 5 ani in care m-am cufundat adinc in cite ceva.
Am trecut printr-o faza in care am incercat sa invat japoneza, si pot sa-ti zic, iti trebuie
mai mult de 3 ani ca sa inveti japoneza! Deci asta a fost un esec. Cind eram student
doctorand am petrecut cam cinci ani studiind karate, si am ajuns la un nivel in care
puteam aproximativ supravietui, dar am renuntat, si nu mai e parte din viata mea. Apoi
am avut o faza in care eram foarte interesat de investitii [la bursa], dar nici asta nu mi-a
schimbat viata, deci evident nu eram prea bun. Deci lucrul pe care il fac acum este sa
citesc mult.
M:Va multumesc foarte mult!
Cartile lui Brian Kernighan
https://www.research.bell-labs.com/who/bwk
R. Fourer, D. M. Gay, and B. W. Kernighan, AMPL: A Modeling Language for
Mathematical Programming, Duxbury Press, 1993, ISBN 0534509835
B. W. Kernighan and P. J. Plauger, The Elements of Programming Style,
McGraw-Hill, second edition 1988, ISBN 0070342075.
B. W. Kernighan and D. M. Ritchie, The C Programming Language, Prentice-
Hall, first edition 1978, ISBN 0131101633; second edition 1988, ISBN
0131103628.
B. W. Kernighan and P. J. Plauger, Software Tools, Addison-Wesley, 1976, ISBN
020103669X.
B. W. Kernighan and P. J. Plauger, Software Tools in Pascal, Addison-Wesley,
1981, ISBN 0201103427.
B. W. Kernighan and R. Pike, The Unix Programming Environment, Prentice-
Hall, 1984, ISBN 0139376992.
B. W. Kernighan and R. Pike, The Practice of Programming, Addison-Wesley,
1999, ISBN 0-201-61586-X.
A. V. Aho, B. W. Kernighan, and P. J. Weinberger, The AWK Programming
Language, Addison-Wesley, 1988, ISBN 020107981X.
Note
open-source1
Despre open-source vedeti si articolul meu ``Noua revolutie in software'', din PC
Report din iunie 1998.
Curs 8
Sumar
. Functii standard pentru citire/scriere: getchar, scanf, putchar, printf
. Instructiuni in limbaj C
- Simple
- Structurate: asociative, decizionale (if, switch).
6. Functii standard pentru citire/scriere
Functii standard pentru citire/scriere
. Operatiile de I/O nu sunt parte a limbajului C.
. Biblioteca standard de I/O, este formata dintr-un set de functii care asigura I/O standard pentru programele C.
. Programele care utilizeaza biblioteca standard de I/O sunt portabile (pot fi mutate de pe un sistem pe altul fara modificari).
. #include <stdio.h>
. Fisierul stdio.h defineste cateva macro-uri si variabile folosite de biblioteca standard de I/O.
6.1. Operatia de citire
. Operatia de citire se realizeaza prin apelul functiilor standard
- getchar si
- scanf. int getchar()
. Macro definit in stdio.h care returneaza urmatorul caracter citit de la intrarea standard (in general tastatura; alternativ poate fi un fisier).
Caracterul va fi convertit in intreg fara semn.
getcara.c
Operatia de citire
. Liniile de date de intrare ale unui program formeaza fluxul de intrare (terminat cu Ctrl-Z).
. Acest lucru este util in programele care citesc un numar oarecare de date. In cazul in care se ajunge la Ctrl-Z se marcheaza sfarsitul de fisier si valoarea lui EOF devine adevarata
. Prin testarea functiei eof se poate depista momentul epuizarii datelor de intrare.
Operatia de citire cu format -
scanf
. scanf (control, arg1, arg2,)
scanf citeste caractere de la intrarea standard, le interpreteaza conform formatului specificat in argumentul 'control' si memoreaza rezultatele in celelalte argumente, care sunt pointeri care indica unde vor fi depuse datele convertite.
Operatia de citire formatata
. Caractere de conversie:
- d - intreg zecimal
- o - intreg octal
- x - intreg hexazecimal
- h - intreg scurt
- c - un caracter (nu se mai ignora caracterele "spatii albe"; pentru a citi urmatorul character diferit de caracterele "spatii albe" se foloseste %1s.
Operatia de citire formatata
- s - un sir de caractere
- f - un numar in virgula flotanta; e are aceeasi semnificatie ca si f. Formatul prezentat la intrare pentru un float contine: un semn (optional); un sir de numere care pot sa contina un punct zecimal; un camp de exponent care este format din E sau e urmat de un intreg cu semn.
Operatia de citire formatata
. Caracterele de conversie d, o, x pot fi precedate de litera l pentru a indica un pointer catre long (nu catre un int) care apare in lista de argumente.
. De asemenea, litera l inainte de e sau f indica un pointer catre double (nu catre float) in lista de argumente.
Operatia de citire formatata
. Intre doua valori de intrare consecutive trebuie sa apara cel putin un character blank, tab sau newline .
int a;
float b;
char nume [30];
scanf('%d %f %s', &a , &b , nume);
scanf1.c
Operatia de citire formatata
exemplul scanf1.c
. Pentru
intrarea 16 -0.234
. se va asigna valoarea 16 lui a, valoarea - 0.234 lui b, iar sirul "Paris", terminat prin 0, variabilei nume
. Cele trei valori pot fi separate de oricate
blank-uri, tab-uri sau linii noi.
Operatia de citire formatata
Pentru operatiunea de citire formatata se parcurg urmatoarele etape:
- Pe linia de
intrare curenta,
incepand cu ultima pozitie dupa citirea anterioara, se cauta un sir de caractere care reprezinta o
Sirul de caractere astfel identificat este transformat din format extern in format intern.
- Valoarea care se obtine in urma conversiei se asigneaza variabilei indicate de pointerul argument si se inregistreaza in locatia de memorie indicata de acesta.
- Pozitia curenta in linia de intrare se actualizeaza in vederea unei citiri viitoare (la primul character care urmeaza dupa valoarea citita
Operatia de citire formatata
sscanf(string, control, arg1, arg
. realizeaza acelasi lucru ca si scanf, dar intr-un sir aflat la o adresa in memorie, nu intr-un fisier (standard de intrare).
. sscanf parcurge sirul string conform formatului din control si plaseaza valorile rezultate in argumentele arg1, arg2, etc. (trebuie sa fie pointeri).
sscanf1.c
6.2. Operatia de scriere
Functia standard de scriere putchar
int putchar(int c)
. Macro definit in stdio.h care plaseaza caracterul c la iesirea standard (in general ecranul, dar alternativ poate fi un fisier).
getput.c
Functia standard de scriere
putchar - exemplul getput.c
. Functiile 'isupper' si 'tolower' sunt macrouri definite in stdio.h.
. isupper testeaza care dintre argumentele sale este o litera mare, returnand in acest caz o valoare diferita de zero, sau o litera mica returnand in acest caz zero.
. tolower converteste o litera mare intr-una mica
Operatia de scriere cu format
printf
. Are ca rezultat afisarea pe ecran a valorilor expresiilor care apar ca argument incepand cu pozitia doi, in functia standard printf. printf(control, arg1, arg2,.)
. 'printf' converteste, formateaza si afiseaza argumentele sale catre iesirea standard in modul specificat de argumentul control
Sirul control contine doua tipuri de obiecte:
- caractere obisnuite care sunt copiate in fluxul de iesire si
- specificatii de conversie, fiecare determinand conversia si afisarea urmatorului argument din printf.
Operatia de scriere cu format
printf
. Fiecare specificator de conversie incepe cu si se termina cu un caracter de conversie.
. Intre si caracterul de conversie poate sa apara
- Un semn minus care indica alinierea la stanga a argumentului convertit.
- Un sir de cifre indicand o lungime minima
de camp. Numarul convertit va fi afisat intr-un camp care va avea cel putin lungimea precizata
prin acest sir, si daca este necesar campul va fi si mai lung. Daca
argumentul convertit are mai
putine caractere
decat lungimea precizata pentru
Operatia de scriere cu format
printf
- Un punct care separa lungimea campului de urmatorul sir de cifre.
- Un sir de cifre (precizia) care specifica numarul maxim de caractere dintr-un sir care vor fi afisate sau numarul de cifre care vor fi afisate la dreapta punctului zecimal pentru un tip float sau double.
- Un modificator de lungime, l, care precizeaza faptul ca data corespunzatoare este long si nu int.
Operatia de scriere cu format
printf
Caracterele de conversie sunt:
. d - argumentul este convertit in zecimal.
. o - argumentul este convertit in octal fara semn.
. x - argumentul este convertit in hexazecimal fara semn.
. u - argumentul este convertit in zecimal fara semn.
. c - argumentul este preluat ca un singur caracter
Operatia de scriere cu format
printf
. s - argumentul este un sir; caracterele din sir sunt afisate pana cand este intalnit caracterul de sfarsit de sir sau pana cand s-au afisat toate caracterele precizate prin indicatorul de precizie.
. e - argumentul este considerat float sau double si este convertit in notatia zecimala de forma
<->m.nnnnnnE<+sau->xx unde numarul de cifre de dupa punctul zecimal este specificat prin precizie; precizia implicita este 6.
. f - argumentul este considerat float sau double si este convertit in notatia zecimala de forma
<->mmm.nnnnnnE<+sau-> unde numarul de cifre de dupa punctul zecimal este specificat prin precizie; precizia implicita este 6. Precizia nu indica numarul de cifre semnificative pentru formatul f.
Operatia de scriere cu format
printf
. g - foloseste cel mai scurt dintre formatele %e sau %f; zerourile nesemnificative nu apar.
. In cazul in care caracterul de dupa % nu este un caracter de conversie, acest caracter este tiparit (spre exemplu % va fi tiparit cu %%).
printf1-3.c
7. Instructiunile limbajului C
Instructiunile limbajului C
. propozitii prin care se specifica actiunile care trebuie executate astfel incat sa se rezolve o anumita problema
. sintaxa:
<eticheta:> <instructiune_simpla>;
<eticheta:> <instructiune_compusa>;
Instructiunea simpla poate fi:
. instructiune vida - se foloseste atunci cand este necesara o instructiune, dar nu se doreste nici o actiune:
- poate servi ca si corp al unei instructiuni de ciclare
while
. instructiune de atribuire (=);
. apel de functie;
. instructiune de salt (goto);
Instructiunea structurata poate fi:
. structura asociativa
. structura selectiva
. structura ciclica
7.1. Instructiunile simple
Instructiunea de atribuire
. nume_de_variabila sau identificator de functie = expresie
. rezultatul executarii instructiunii este atribuirea valorii rezultate din evaluarea expresiei, entitatii din stanga operatorului de atribuire
. lvalue este operandul din stanga operatorului de atribuire. Va avea valoarea rezultata din atribuirea valorii din dreapta.
Instructiunea de atribuire
. exista un set de operatori de atribuire care se grupeaza de la dreapta la stanga
- lvalue expresie
- lvalue += expresie
- lvalue -= expresie
- lvalue *= expresie
- lvalue /= expresie
- lvalue %= expresie
- lvalue >>= expresie
- lvalue <<= expresie
- lvalue &= expresie
- lvalue v= expresie
- lvalue |= expresie
Instructiunea de atribuire
. Atunci cand se fac atribuiri trebuie sa se tina cont de tipurile entitatilor implicate;
. Daca ambii operanzi sunt de tip aritmetic operandul drept se converteste in tipul celui stang inainte de asignare.
. Surse de erori:
- tipuri ordinale submultimi ale aceluiasi tip
atrib1.c
- atribuirea real - intreg
atrib2.c
- tipuri reale diferite, tipul expresiei avand un domeniu mai larg decat cel al entitatii din stanga
atrib3.c
atrib4.c
Instructiunea de salt
Instructiunea de salt
. ! nu se recomanda folosirea
instructiunii go to
- nu face parte din principiile programarii structurate
. ca exceptie, se poate folosi go to atunci cand in program exista multe instructiuni imbricate de ciclare si s-au depistat erori si este necesar ca programul sa fie intrerupt; si pentru acest caz, exista insa doua proceduri predefinite care se recomanda pentru intreruperea controlata a unui program
Intreruperea controlata a unui program
break-continue
. break - determina iesirea fortata dintr-o instructiune ciclica sau decizionala (while, do, for, switch) si continuarea executiei programului cu prima instructiune de dupa aceasta instructiune;
. continue - determina saltul la sfarsitul celui mai interior ciclu while, do sau for care include apelul si continua cu iteratia urmatoare. In cazul instructiunilor while si do testarea se va executa imediat, iar in cazul instructiunii for controlul este preluat la faza de reinitializare.
Intreruperea fortata a executiei unui program: de la tastatura - Ctrl - Break; Ctrl - C.
7.2. Instructiuni structurate
7.2.1. Structura asociativa
. in cadrul ei se grupeaza mai multe instructiuni rezultand astfel o secventa sau o instructiune compusa
. instructiunile componente se executa secvential
. un blocul de instructiuni dintr-un program este o structura asociativa care incepe cu
. in cazul in care o secventa include o alta secventa, perechile se grupeaza dupa principiul parantezelor
. separatorul ; este obligatoriu dupa fiecare instructiune.
7.2.2. Structuri selective
. implica alegerea, in functie de o anumita valoare, a uneia sau mai multor variante din program
. IF
. SWITCH
Instructiunea IF
. Se mai numeste structura alternative sau decizionala
. Aceasta structura este utilizata pentru a selecta o alternativa, din doua posibile, in functie de o conditie care este reprezentata printr-o expresie cu rezultat de tip intreg care poate fi zero (conditia nu este indeplinita) sau diferita de zero (conditia este indeplinita
Instructiunea IF - sintaxa
IF (conditie) Bloc1
< ELSE
Bloc2 >
'Bloc1' si 'Bloc2' pot fi
- instructiuni simple
- structuri asociative (atunci cand sunt mai
multe operatii care trebuie executate)
Instructiunea IF - diagrama
Instructiunea IF
. In cazul in care exista mai multe instructiuni if suprapuse (imbricate), else se va asocia cu cea mai apropiata instructiune if
if (cond1)
if (cond2) concl1
else concl2
Instructiunea IF
Instructiunea IF
Instructiunea IF
if (cond1)
else concl2
. program care calculeaza valoarea unei functii pentru o valoare citita de la tastatura si apoi o afiseaza
pif.c
Instructiunea IF - diagrama programului pif.c
Instructiunea SWITCH - sintaxa
. selectie multipla
. se alege una dintre mai multe variante in functie de valoare unei expresii
. Sintaxa instructiunii CASE este:
SWITCH (selector)
Instructiunea SWITCH - sintaxa
. 'selector' - expresie care reprezinta elemental decizional (deosebit de elementul decisional de la if, care era o conditie)
. s1,s2,. - constante; constantele si selectorul trebuie sa fie de acelasi tip, iar cosntantele
trebuie sa fie distincte.
. bloc1,bloc2,. - instructiunile care se executa in functie de rezultatul evaluarii selectorului.
Instructiunea SWITCH
. La o parcurgere a instructiunii switch se va executa doar o varianta din cele n (in cazul in care este precizat break) sau daca nici una nu corespunde valorii selectorului exista alternative default.
switch1.c
Instructiunea SWITCH - diagrama
Instructiunea SWITCH - exemple
. programul SWITCH2/switch2g program care realizeaza prelucrari asupra caracterelor citite de la tastatura. Se tasteaza cate un caracter.
Daca este altceva decat cifra se semnaleaza eroare. Daca este 0,1,2 se neglijeaza, pentru restul numerelor pare se calculeaza patratul, iar pentru impare cubul valorii numerice corespunzatoare si se afiseaza. Programul se termina daca se tasteaza litera B.
. programele swif.c swswitch.c
Curs 9_10
Sumar
. Structuri ciclice (while, do-while, for)
. Functii
- Definire
- Declarare
- Apel
- Parametri formali
- Parametri efectivi
- Transmitere prin valoare, transmitere prin adresa/referinta
. Tipuri; typedef
. Tipul enumerare
7.2.3. Structuri ciclice
. implica reluarea executiei unui bloc de instructiuni in mod repetat in functie de o anumita conditie;
. conditia poate fi evaluarea unei relatii (adevarata sau falsa) sau poate defini un anumit domeniu de valori
. 3 categorii de structuri ciclice
- cu test initial WHILE
- cu test final DO-WHILE
- cu contor FOR (cu test initial)
Instructiunea WHILE - sintaxa
WHILE (expresie) instructiune
. instructiune se va executa atat timp cat valoarea logica a expresiei este adevarata
. daca expresia este falsa instructiunea nu se va executa niciodata
. pentru a iesi din ciclare in cadrul instructiunii (sau in expresie) trebuie sa se modifice valoarea expresiei (altfel se poate intra in cicluri infinite)
const n=5;.
int i,s;
i=1;s=0;
while (i < n) s=s+i;
Instructiunea WHILE - diagrama
Instructiunea DO-WHILE - sintaxa
DO bloc WHILE (expresie)
. 'bloc' - este format dintr-una sau mai multe instructiuni separate prin ;
. 'bloc' va fi executat in mod repetat atat timp cat 'expresie' va fi adevarata
. 'bloc' se va executa cel putin o data
Instructiunea DO-WHILE - diagrama
Instructiunea DO-WHILE - exemple
. sumwhi.c; sumdo.c
. daca intr-o instructiune do-while apare o alta instructiune do-while, cuvintele dowhile se grupeaza conform principiului parantezelor.
Instructiunea DO-WHILE - exemple
. dowhil.c prelucreaza un text,calculand numarul cuvintelor si al propozitiilor din care este alcatuit; textul se termina cu caracterul #
. restrictii:
- cuvintele sunt alcatuite numai din litere, fiind despartite prin orice caracter diferit de litera
- propozitiile sunt formate din cel putin 1 cuvant si se termina cu punct
- la inceputul propozitiilor se neglijeaza orice alt caracter in afara de litera sau #
Instructiunea FOR - sintaxa FOR (expresie1;expresie2;expresie3) instructiune
. 'instructiune' se va executa atat timp cat conditia precizata in 'expresie2' este adevarata, incepand cu o valoare precizata in 'expresie1' cu modificari aduse in 'expresie3';
. testul pentru ciclul for se face initial, iar in cazul in care conditia din 'expresie2' nu este adevarata, ciclul nu se va executa niciodata
Instructiunea FOR - diagrama
Instructiunea FOR
. In general, 'expresie1' si 'expresie3' sunt atribuiri sau apeluri de functii, iar 'expresie2' este o relatie. Oricare dintre cele trei poate lipsi, dar punctul si virgule trebuie mentinute.
. for1.c - for3.c
8. Functii
Functii
. Atunci cand se scriu programe complexe este necesara utilizarea unitatilor de program care in C sunt referite ca functii.
. Ele reprezinta prelucrari unitare care pot fi utilizate si in alte programe.
. Functiile sunt specifice programarii structurate.
. Pot fi standard sau definite de utilizator.
Functii
. Un program in limbaj C este format dintr-un program principal in care sunt definite functii care se apeleaza din functia main() sau unele din altele.
. In momentul cand se apeleaza o functie, programul va continua cu executarea instructiunilor din functia respectiva, iar la finalul acesteia se va reveni la instructiunea care urmeaza dupa apel in functia in care s-a facut apelul.
FinF.c
Atunci cand apeleaza o functie se realizeaza urmatoarele actiuni:
. Se intrerupe executia instructiunilor din unitatea apelanta
. Se realizeaza corespondenta intre numele parametrilor formali si valorile sau adresele argumentelor.
. Se creeaza variabile locale functiei cu rezervarea locatiilor de memorie.
. Se executa instructiunile din functie.
. Se desfiinteaza variabilele locale.
. Se revine in unitatea apelanta
Avantajele utilizarii functiilor
1. Pentru operatii care pot fi executate pentru diferite variabile de acelasi tip, declararea functiilor care le descriu se face o singura data, iar apelul ori de cate ori este nevoie.
2. Se obtine un program modularizat - mai usor de scris si depanat.
3. Functiile pot fi utilizate si in alte programe decat cele in care au fost declarate; aceasta se poate realiza in C folosind extern.
4. Functiile pot "ascunde" detalii ale operatiilor din program (incapsulare), pe care nu este nevoie sa le cunoastem, clarificand astfel intregul, si permitand modificari mai usoare.
Functii standard
. Functii din biblioteca standard de I/O: scanf, printf.
. Functii standard: abs, sqrt, sin, cos, etc.
Functia main()
. Functia main() este strict necesara intr-un program in C.
. Aceasta va returna catre sistemul de operare fie valoarea 0, fie 1:
- 0 - in cazul in care programul a fost executat cu succes;
- 1 - programul s-a terminat cu eroare.
. main() nu poate returna void (v. ANSI C).
Functia main()
. main() poate fi declarata
- fara parametri: int main(void) sau int main()
- cu doi parametri: int main (int argc, char*argv[])
. Pentru a iesi din functia main() se poate folosi si instructiunea exit:
- Pentru terminare normala: exit(0) sau exit EXIT_SUCCESS)
- Pentru terminare anormala: exit(1) sau exit(EXIT_FAILURE).
Functii - definitie, declaratie, apel
. Cand sunt definite de utilizator trebuie declarate/definite si apoi apelate.
. Declaratia va contine numele si tipul functiei si al parametrilor, fara a aloca spatiu in memorie (prototipul functiei), iar definitia contine in plus si descrierea datelor si prelucrarilor pe care le realizeaza functia.
. Apelul functiei se face printr-o instructiune de apel in care se indica numele functiei, iar daca este cazul sunt precizate si valorile curente, actuale ale parametrilor. Apelul are ca urmare activarea instructiunilor functiei.
Functii - definitie, declaratie
. Exemplu de declaratie:
. int exemplu_declaratieF (float arg1, int
arg2);
. Exemplu de definitie
. long la_patrat(int num)
Declararea functiilor
. Sintaxa unei functii:
tip_rez_functie nume_fct
(<lista_par_form>);
. nume_fct e folosit pentru apelul functiei.
. lista parametrilor formali - prin acestia se
transmit valori din functia aplelanta in
functia curenta
. bloc_instructiuni descrie continutul functiei.
Declararea functiilor
tip_rezultat nume_functie (lista_arg);
Declararea functiilor
. Tipul rezultatului functiei poate fi orice tip simplu sau structurat in afara de tablou.
. O functie se incheie cu instructiunea return cu sau fara parametru. O functie poate contine una sau mai multe instructiuni return.
. Daca return contine o expresie, valoarea acesteia este returnata catre unitatea apelanta ca si valoare a functiei apelate. In cazul in care expresia din return are un tip diferit de tipul functiei, va avea loc o conversie a valorii din expresie corespunzator unei atribuiri catre un obiect care are acelasi tip ca si functia.
Tipul functiei
typedef int F(void); defineste un tip de functie care nu are parametri si returneaza un intreg;
F f1,f2; f1 si f2 au tipuri compatibile cu F;
F f1 ; eronat
F f2() ; eronat
int f1 (void) ; corect: f1 are tip compatibil cu F
int f2 () ; corect: f2 are tip compatibil cu F
F *p(void) ; p returneaza un pointer catre o functie
F *Fp; Fp indica spre o functie care are tipul F.
Apelul functiilor
. O functie este activata prin evaluarea apelului prin numele functiei intr-o expresie.
. Apelul functiei utilizeaza o valoare obtinuta ca rezultat al functiei, direct utilizabila intr-o expresie.
. Se poate apela o functie in functie (se paseaza o functie catre alta)
Parametri formali si parametri
efectivi
. Parametrii formali apar in declaratia functiei. In lista parametrilor formali se precizeaza numele si tipul variabilelor utilizate de catre functie.
. Parametrii efectivi (sau actuali) apar in apelul functiei. Atunci cand se apeleaza functia, parametrii vor fi utilizati efectiv cu anumite valori.
f_imp.c
f_imp.c
. Pentru rezolvarea problemei expuse se vor lua in considerare urmatoarele:
- proba impartirii: D = I * C + R (deimpartit = impartitor * cat + rest)
- descompunerea catului in puteri ale lui doi C = an* 2n + an-1 * 2n-1 + + a2 * 22 + a1 * 21 + a0
f_imp.c; f_impnu.c
. Variabilele globale 'cit' si 'rest' pot fi declarate si in functie. Variabilele globale declarate si in functie sunt considerate suspendate si inaccesibile in blocul acesteia. Deci, instructiunile din corpul functiei pot declara variabile locale sau globale care nu sunt
suspendate. f_impnu.c
. variabilele globale care pot fi utilizate si in programul principal si in functie NU SE RECOMANDA; se restrange astfel independenta si gradul de generalitate al programului.
Parametri formali
. Transmiterea valorilor intre programul principal (sau alte functii) si o functie se realizeaza prin intermediul parametrilor formali.
. Lista parametrilor formali are urmatoarea sintaxa
(<tip 1 id1_1, id2_1.: tip2; tip 2 id2_1, id2_2,.: tip k &var.>)
Parametri formali
. Cum parametrii formali sunt identificatori carora li s-a asociat un tip, operatiile care se pot efectua cu ei sunt corespunzatoare tipurilor lor;
. Descrierea tipului unui parametru formal nu se poate face in lista parametrilor, ci intr-o definitie de tip care precede declaratia functiei.
Parametri formali
. Parametrii formali se comporta ca variabile locale in functie fiind recunoscuti numai in interiorul ei.
. Parametrii formali sunt folositi pentru o descriere generala a functiei.
. In cazul in care in declaratii s-a precizat un anumit numar de parametri formali, la apel trebuie sa apara acelasi numar de parametri efectivi.
Parametri efectivi
. Pot fi variabile sau expresii (valori constante)
. Tipul parametrilor formali si a celor corespunzatori efectivi/actuali se recomanda sa fie acelasi.
- In caz contrar, in limbajul C tipul parametrului efectiv este convertit automat la tipul parametrului formal.
Parametri - transmiterea prin valoare si transmiterea prin adresa/referinta
. Toti parametri sunt pasati prin valoare.
. Cum argumentele functiei sunt pasate prin valoare, nu se vor putea modifica in mod direct valorile variabilelor din apelul functiei.
. Apelul prin valoare este avantajos, in general conducand la programe mai compacte cu mai putine variabile inutile, deoarece argumentele pot fi tratate ca variabile locale initializate convenabil in functia apelata
Parametri - transmiterea prin valoare si
transmiterea prin adresa/referinta
. Exista si instrumente prin care se poate realiza transferul prin referinta
. Pentru a transfera un obiect X ca parametru prin referinta, se transfera adresa lui X. Se transmite un pointer catre X.
. In acest mod este posibil ca o functie sa modifice o variabila in functia care apelat-o. In apelul functiei se va preciza adresa variabilei a carei valori va fi modificata (creeaza un pointer la variabila), iar in declaratia functiei argumentul va fi precizat printr-un pointer, referind variabila in mod indirect prin el.
Exemple
. f_arg.c - calculul valorii unei functii pentru un argument citit de la tastatura
. cmm1.c
. cmm2.c
. swap1.c
. swap2.c
9. Tipuri definite de utilizator
Tipuri
. Un tip reprezinta o multime de valori careia i se asociaza un nume.
. Variabilele de un anumit tip primesc in timpul executiei programului valori din domeniul de valori
corespunzatoare tipului lor.
. Un utilizator poate defini tipuri de date specifice programului in care apar.
. Tipurile pot fi
. standard sau
. definite de utilizator.
Tipuri
Tipuri definite de utilizator - descriere
Descrierea unui tip se poate face:
. direct, la declararea variabilei tip x;
In acest caz tipul nu are nume-> tip anonim
Tipuri definite de utilizator - descriere
. printr-o definitie
Sintaxa unui tip utilizator este: typedef tip nume_tip;
- 'tip' - descrie noul tip creat de utilizator.
- 'nume_tip' (identificator) - numele tipului creat de
Tipuri definite de utilizator - descriere
. Cea de a doua varianta este necesara atunci cand:
- in program apar mai multe declaratii de variabile de acelasi tip definite de utilizator;
- se definesc tipurile parametrilor formali si tipurile functiilor declarate in program;
- se descriu structuri de date complexe (pentru claritate).
Tipuri definite de utilizator
Un identificator de tip poate fi referit in domeniul sau astfel:
. intr-o alta definitie de tip atunci cand se construiesc structuri complexe;
. intr-o declaratie de variabila
. intr-o declaratie de functie;
. intr-o lista de parametri formali.
Prin definirea tipului utilizator se descrie doar o multime de valori fara a se rezerva o zona de memorie corespunzatoare pentru a stoca valori de acest tip.
Tipuri definite de utilizator
. Pentru a utiliza o entitate de structura data in vederea executarii unei operatii este necesara
declararea unei variabile de tipul descris anterior de catre utilizator.
. Tip de date definit de utilizator: enumerare.
Tipul enumerare
. Tipul enumerare permite definirea unei multimi ordonate de valori notate prin identificatori definiti de utilizator.
. Acelasi identificator nu poate sa apara in doua tipuri enumerare distincte.
. Se creeaza un domeniu restrans de valori care sunt asociate apoi cu o variabila
Tipul enumerare
. Sintaxa:
typedef enum nume tip;
Exemple:
typedef enum
zile;
typdef enum actiuni;
. Valorile posibile asociate acestor tipuri sunt chiar identificatorii (luni, marti, adauga, sterge, etc.)
Tipul enumerare
. Referirea la un element al listei se face fie prin scrierea efectiva a elementelor, fie prin specificarea numarului de ordine al elementului respectiv in lista. miercuri -> 2
. Primul element din lista are numarul de ordine zero.
. Pentru referirea identificatorilor de tip enumerare este suficienta definirea lor in sectiunea 'typedef', dar se pot declara si variabile de tip enumerare, ele luand una din valorile din lista
zile z1,z2,z3;
Operatii cu variabile si constante de tip enumerare
Atribuire
. Se foloseste mai ales pentru claritate si
pentru a usura citirea programului. Variabilele de
acest tip pot fi variabile intermediare.
. Pot fi argumente in proceduri de scriere si citire,
dar doar ca intregi asociati si nu prin numele din
multimea enumerare; va fi citit/afisat numarul de
ordine corespunzator variabilei enumerare.
z1=joi;
Tipul enumerare
typedef enum element;
int an;
element elem;
switch (elem)
enumer.c
Curs 11
Sumar
. Tipuri structurate
- Tablou
Sir de caractere
- Structuri
10. Tipuri de date structurate
Date structurate
. Sunt ansambluri de valori care pot fi tratate fie ca un intreg, fie pe componente.
. Tipuri de date structurate:
- tablou
sir de caractere
- structura
- fisier
Tipuri de date structurate
. Se construiesc pe baza tipurilor de date simple tinand cont de urmatoarele metode de structurare:
- tablou: indexarea cu un tip ordinal a unor elemente de acelasi tip;
- structura: compunerea intr-o structura unica a mai multor tipuri diferite;
- fisier: scrierea pe un suport extern a unui numar oarecare de elemente de acelasi tip.
Date structurate - statice/dinamice
. tipurile precedente sunt tipuri statice. Zona de memorie in care se regasesc ramane aceeasi pe tot parcursul executiei programului;
. structurile dinamice (liste, arbori, stive) isi modifica dimensiunea in timpul executiei programului. Aceste structuri folosesc pointeri.
10.1 Structura TABLOU
. O structura de date cu numar fix de elemente de acelasi tip.
. Avantajul utilizarii structurii de tip tablou: folosind variabile indexate in loc de variabile simple se generalizeaza algoritmul de rezolvare a problemei si se simplifica astfel programul.
Structura TABLOU
. Sintaxa structurii tablou: tip_element nume_tablou [dim] < =>;
. 'dim' -
expresie intreaga
. 'tip_element' - tipul elementelor tabloului
. c1, c2,. valori initiale pentru elementele tabloului
. exemple:
int tablou [100];
int tablouMic [3]= ;
float matrice [2] [3];
float mat [2][3]=,};
Structura TABLOU
. un element dintr-un tablou se selecteaza indicand numele variabilei de tip tablou si valoarea corespunzatoare indicelui (intre paranteze drepte)
nume_tablou [indice]
- indicele poate lua valori intre 0 si dim-1 tablouMic[2]=3;
. operatiile care se pot efectua cu variabile de tip tablou sunt cele valabile pentru tipul de baza ('tip_element')
. se efectueaza operatii pe element
. Elementele tabloului multidimensional sunt memorate astfel incat ultimul indice variaza cel mai rapid.
Structura TABLOU
. tab1.c: citirea/scrierea elementelor unui vector (tablou unidimensional).
. tab2.c: citirea si afisarea valorii elementelor unei matrice (tablou bidimensional).
. tab3.c: verificarea elementelor commune a doi vectori.
Structura TABLOU
. tab4.c: sortarea unui sir de valori in ordine crescatoare (bubble-sort):
- se parcurge sirul, testand cate doua elemente consecutive;
- daca nu sunt in ordine crescatoare se schimba intre ele;
- sortarea se termina cand s-a terminat de parcurs sirul de valori.
10.2 Structura sir de caractere
. Astfel se reprezinta siruri de caractere de lungime variabila (mai mica sau egala cu o lungime maxima data
. Sintaxa structurii sir de caractere este: char nume_sir [const]
. O variabila de tip sir de caractere este o secventa continua de caractere terminate cu, si incluzand, caracterul nul (0).
. Un pointer la un sir este un pointer catre primul caracter al sirului.
. Lungimea unui sir este data de numarul caracterelor aflate inainte de caracterul nul.
sir_n.c
Structura sir de caractere
. Exemple:
const lungime = 79;
char linie [lungime]; ? .
char nume [20];
char sir[11];
sir = 'student'; 7 caractere
Structura sir de caractere
. Referirea la un caracter din cadrul sirului se face ca si la elementele unui tablou prin numele
variabilei de tip sir de caractere si indicele sau din cadrul sirului sir[0] = 's'
. cu oricare dintre caracterele unui sir se pot realiza toate operatiile si se pot aplica functiile acceptate pentru tipul char.
. Atribuirea
char s[4];
s='student';. stud
Functii standard pentru prelucrarea sirurilor de caractere: lungime, concatenare
. unsigned strlen (const char *s);
Efect: calculeaza lungimea sirului catre care indica s.
Returneaza: numarul de caractere aflat inainte de caracterul nul.
strlen("abcd") = 4
strlen("") = 0
. char *strcat (char *s1, const char *s2);
Efect: adauga o copie a sirului catre care indica s2 (inclusiv caracterul nul) la capatul sirului catre care indica s1 (caracterul nul al lui s1 este acoperit de primul caracter al lui s2); lungimea sirului obtinut este strlen(s1)+strlen(s2)
Returneaza: un pointer catre sirurile concatenate (valoarea lui s1).
string.h
strncat()
Functii standard pentru prelucrarea sirurilor de caractere: comparatii
. int strcmp(const char *s1, const char *s2);
. Efect: compara sirurile s1 si s2
. Returneaza: un intreg care este strict mai mic, egal sau strict mai mare decat 0 dupa cum s1 este mai mic, egal sau mai mare lexicografic decat s2
strncmp()
memcmp()
strxfrm()
Functii standard pentru prelucrarea sirurilor de caractere: comparatii
. Prin compararea a doua siruri se poate realiza ordonarea alfabetica a unui tablou de siruri de caractere; compararea se face caracter cu caracter de la stanga la dreapta
'bbb' mai mic decat 'bbc' adevarat
. Daca sirurile sunt de lungime diferita iar sirul mai scurt este inclus in cel lung, relatia dintre ele este caracterizata printr-un rezultat negativ. 'aaab' mai mic decat 'aab' ?
. Doua siruri sunt egale daca au aceeasi lungime si acelasi continut : 'xx' diferit de 'xx '.
sir1.c
Functii standard pentru prelucrarea sirurilor de caractere: copiere
. char *strcpy(char *s1, const char *s2);
. Efect: copiaza sirul indicat de s2 (inclusive caracterul nul) in tabelul indicat de catre s1.
. Returneaza: valoarea lui s1.
. char *strncpy(s1, s2, n)
. Efect: copiaza n caractere din s2 in s1
. Returneaza: s1.
memcpy()
memmove()
Functii standard pentru prelucrarea sirurilor de caractere: cautare
. memchr(); strchr() - returneaza un pointer catre prima aparitie a unui caracter intr-un sir dat sau null in cazul in care nu exista caracterul cautat in sirul dat.
- memchr() cauta in primii n octeti ai sirului
- strchr() cauta in tot sirul.
. strstr() - gaseste prima aparitie a unui sir in alt sir; in caz de
succes returneaza un pointer catre elementul din sir unde incepe subsirul, iar in caz de eroare returneaza null.
. strcspn()
. strpbrk()
. strrchr()
. strspn()
. strtok()
Aplicatii
. sir2_1.c - inlocuire subsir intr-un text
. sir 5.c - ordonare litere
. sir_p.c copiere/concatenare
10.3. Structuri
. O structura se obtine prin reuniunea unor elemente (denumite componente sau campuri) care pot avea tipuri diferite.
. Un tip structura poate contine in definitia sa tipuri standard, alte structuri, tablouri, pointeri.
Structuri
. Sintaxa:
typedef struct nume_tip_structura;
. defineste un tip structura
Structuri
. O variabila de tip structura este o colectie de variabile de tipuri diferite asociate sub un singur nume. Fiecare variabila a structurii are un nume prin care poate fi referita
. Structura este folosita pentru a grupa diverse variabile care au un anumit sens impreuna
. Elementele sau variabilele precizate intr-o structura sunt numite 'membri'.
Structuri
. Tipul structura data
typedef struct data
. Variabila structura persoana
struct persoana;
Structuri
. struct data
. struct d1,d2,d3; unde d1,d2,d3 sunt variabile de tip structura
. O declaratie de structura care nu este urmata de o lista de variabile nu aloca spatiu de memorie, ci descrie doar forma sau organizarea structurii.
. Daca structura este nominalizata, numele poate fi utilizat in program pentru atribuirea de valori structurii:
struct data d;
. defineste o variabila d care are o structura de tip data si poate fi initializata la un moment dat conform definitiei sale cu o lista de valori: struct data d =;
Structuri
. Variabilele unei structuri pot fi referite prin numele structurii urmat de punct si numele variabilei corespunzatoare din structura: var_din_struct.id_de_camp
. Exemplu: student_nou.nume
. In cazul in care este vorba de un pointer catre o structura se foloseste operatorul -> .
. Exemplu: fie st_ptr un pointer catre o structura de tip student; referirea la numele studentului (campul nume) se va face astfel:
st_ptr -> nume
Structuri
. Tablouri de structuri
struct exemplu tab[100];
sau
struct exemplu ;
struct exemplu tab[100];
Structuri
. O structura poate fi pasata ca argument al unei functii.
. In cazul in care trebuie aduse modificari unor articole (membri) ai structurii se vor folosi pointeri catre structura
. Se poate transmite doar un membru al structurii, iar in cazul in care valoarea sa trebuie modificata se va pasa un pointer catre acest membru al structurii
. In situatia transmiterii unei structuri ca argument, se copiaza fiecare membru al structurii, ceea ce poate determina ocuparea a spatii mari de memorie in cazul
- structurilor mari sau
- al functiilor des apelate.
. In astfel de cazuri se recomanda pasarea prin pointeri catre structurile mari.
Structura articol - programe
struct1.c
Curs 12
11. Pointeri
Pointeri
. Un pointer este o variabila care contine adresa unei alte variabile.
. Sintaxa de declarare a pointerilor este urmatoarea: tipVarPtr *nume_var;
- nume_var este un pointer la o valoare de tip tipVarPtr
. Pointerii sunt utili in limbajul C pentru alocarea dinamica a memoriei (pentru crearea structurilor de date dinamice: liste, arbori, .).
. "C este consistent si constant cu aritmetica pointerilor; pointerii, tablourile si aritmetica adresarii
constituie punctul forte al limbajului" (K&R).
Pointeri - exemple
. int *PtrInt; - declararea unei variabile pointer intreg
Idem: int* PtrInt; sau int * PtrInt;
. char *PtrChar; - declara un pointer caracter
. struct ex_struct PtrStr1,*PtrStr2 - declara doi pointeri catre structura 'ex_struct'
. struct exemplu **PtrPtrEx; - pointer la un pointer la o structura exemplu;
. struct exemplu tabel[100]; - un tabel de 100 de structuri exemplu
. struct exemplu *tabelPtr[100]; - un tabel de 100 de pointeri la structura exemplu
Operatori
. * dereferentiere (dereferencing) - aplicat unui argument are ca efect extragerea continutului zonei de memorie indicate de pointer;
. -> dereferentiere si selectia unei componente (camp al) a unei structuri
. & indica adresa unei variabile (creeaza o referinta
Exemple
void func_ex()
. Cum 'i' este o variabila locala unei functii, pointerul care a fost initializat cu operatorul de adresare (&i) va exista doar in timpul executiei functiei 'func_ex'.
Exemple
. Declararea unui pointer are ca efect alocarea de spatiu in memorie pentru pointer; NU se aloca spatiu pentru entitatea catre care indica pointerul.
Operatii cu pointeri
. Aritmetice:
- adunare/scadere a unui intreg la/dintr-un pointer; incrementare/decrementare cu 1.
- Scadere a unui pointer din altul (se obtine dimensiunea entitatii indicate)
. Relatii (<, >, ==, etc.):
- Comparatii intre doi pointeri: un pointer p1 este mai mare decat un pointer p2, daca adresa pe care o contine p1 este mai indepartata de inceputul memoriei decat adresa continuta de p2.
- Compararea
unui pointer cu o valoare
Utilitate
. Pointerii sunt asociati cu lucrul cu memoria. Programatorul este cel care aloca si elibereaza memoria.
. In cazul in care scriem memoria fara a o aloca pot sa apara probleme cu suprascrierea acesteia.
. point1.c
Alocarea memoriei
. Alocarea automata; entitatile temporare au alocata automat zona de memorie care este automat eliberata dupa ce acestea nu se mai folosesc (se paraseste functia care le foloseste).
. Alocare statica; variabilele alocate static nu sunt reinitializate la fiecare apel al functiei in cadrul carora au fost declarate.
. Alocarea dinamica a memoriei are urmatorul efect: blocuri de memorie (de orice dimensiune) pot fi allocate intr-o zona de memorie numita heap prin intermediul functiilor malloc(), realloc() si free(). Aceste blocuri de memorie pot fi reutilizate dupa ce zona de memorie a fost eliberata prin apelul functiei free().
Alocarea memoriei
. Sintaxa
void *malloc(size_t size);
. size_t tip utilizat pentru dimensiunea unor obiecte din memorie sau pentru contoare.
. malloc() aloca un bloc de size octeti din zona de memorie heap.
. Permite unui program sa aloce memorie explicit, atunci cand este necesar si exact la dimensiunea necesara (folosit pentru liste, arbori, etc.).
. In caz de succes malloc() returneaza un pointer la blocul de memorie nou alocat
. In caz de eroare (daca nu exista suficient spatiu pentru noul bloc) malloc() returneaza NULL. Continutul blocului ramane neschimbat.
. Daca dimensiunea argumentului este 0, malloc() returneaza NULL
#include <stdio.h>
#include <alloc.h>
Implementarea unui tablou bidimensional
Pointeri si tablouri
. Compilatorul C nu face o diferentiere evidenta intre pointeri si tablouri, ambele entitati arata ca si pointerii.
. 'intTab' este un pointer catre primul elemnt al unui table de intregi, (int*).
. Valoarea variabilei 'intPtr' este de tip (int*) si este prevazuta sa arate catre un singur intreg 'i'.
. intTab ? intPtr
. Din punctul de vedere al compilatorului nu este nici o diferenta, ambele sunt pointeri (int*) si este indifferent daca e folosit [] sau + in asociere cu acestea.
Pointeri si tablouri
Bitii din memorie contin probabil deja o anumita informatie, iar 16 va fi scris peste informatia existenta
Pointeri si tablouri
. O distinctie fina intre tablouri si pointeri pointerul care reprezinta adresa de baza a unui tabel nu poate fi modificat in codul sursa (este un pointer 'const').
Constrangerea se aplica numelui tabelului.
Pointeri, tablouri, functii
. Parametrii tablou sunt pasati ca pointeri.
void func (int ParamTab[])
void func (int *ParamTab)
Liste inlantuite
. point2.c
. Program care creeaza, concateneaza, afiseaza, inverseaza o lista inlantuita
Pointeri si structuri
Pointeri, structuri, functii
Alocarea memoriei
Alocarea memoriei
Alocarea memoriei
Aplicatii
. point2.c - point6.c
C Reference Card (ANSI)
Program Structure/Functions
type fnc(type ,: : : ) function declarations
type name external variable declarations
main()
type fnc(arg
/* */ comments
main(int argc, char *argv[]) main with args
exit(arg) terminate execution
C Preprocessor
include library _le #include <_lename>
include user _le #include '_lename'
replacement text #define name text
replacement macro #define name(var) text
Example. #define max(A,B) ((A)>(B) ? (A) : (B))
unde_ne #undef name
quoted string in replace #
concatenate args and rescan ##
conditional execution #if, #else, #elif, #endif
is name de_ned, not de_ned? #ifdef, #ifndef
name de_ned? defined(name)
line continuation char
Data Types/Declarations
character (1 byte) char
integer int
oat (single precision) float
oat (double precision) double
short (16 bit integer) short
long (32 bit integer) long
positive and negative signed
only positive unsigned
pointer to int, float,: : : *int, *float,: : :
enumeration constant enum
constant (unchanging) value const
declare external variable extern
register variable register
local to source _le static
no value void
structure struct
create name by data type typedef typename
size of an object (type is size_t) sizeof object
size of a data type (type is size_t) sizeof(type name)
Initialization
initialize variable type name=value
initialize array type name[]=
initialize char string char name[]='string'
c 1999 Joseph H. Silverman Permissions on back. v1.3
Constants
long (su_x) L or l
oat (su_x) F or f
exponential form e
octal (pre_x zero) 0
hexadecimal (pre_x zero-ex) 0x or 0X
character constant (char, octal, hex) a, ooo, xhh
newline, cr, tab, backspace n, r, t, b
special characters , ?, , '
string constant (ends with 0) 'abc: : : de'
Pointers, Arrays & Structures
declare pointer to type type *name
declare function returning pointer to type type *f()
declare pointer to function returning type type (*pf)()
generic pointer type void *
null pointer NULL
object pointed to by pointer *pointer
address of object name &name
array name[dim]
multi-dim array name[dim ][dim
Structures
struct tag ;
create structure struct tag name
member of structure from template name.member
member of pointed to structure pointer -> member
Example. (*p).x and p->x are the same
single value, multiple type structure union
bit _eld with b bits member : b
Operators (grouped by precedence)
structure member operator name.member
structure pointer pointer->member
increment, decrement ++, --
plus, minus, logical not, bitwise not +, -, !, ~
indirection via pointer, address of object *pointer, &name
cast expression to type (type) expr
size of an object sizeof
multiply, divide, modulus (remainder) *, /, %
add, subtract +, -
left, right shift [bit ops] <<, >>
comparisons >, >=, <, <=
comparisons ==, !=
bitwise and &
bitwise exclusive or ^
bitwise or (incl) |
logical and &&
logical or ||
conditional expression expr ? expr : expr
assignment operators +=, -=, *=, : : :
expression evaluation separator ,
Unary operators, conditional expression and assignment oper-
ators group right to left; all others group left to right.
Flow of Control
statement terminator ;
block delimeters
exit from switch, while, do, for break
next iteration of while, do, for continue
go to goto label
label label:
return value from function return expr
Flow Constructions
if statement if (expr) statement
else if (expr) statement
else statement
while statement while (expr)
statement
for statement for (expr ; expr ; expr
statement
do statement do statement
while(expr );
switch statement switch (expr)
ANSI Standard Libraries
<assert.h> <ctype.h> <errno.h> <float.h> <limits.h>
<locale.h> <math.h> <setjmp.h> <signal.h> <stdarg.h>
<stddef.h> <stdio.h> <stdlib.h> <string.h> <time.h>
Character Class Tests <ctype.h>
alphanumeric? isalnum(c)
alphabetic? isalpha(c)
control character? iscntrl(c)
decimal digit? isdigit(c)
printing character (not incl space)? isgraph(c)
lower case letter? islower(c)
printing character (incl space)? isprint(c)
printing char except space, letter, digit? ispunct(c)
space, formfeed, newline, cr, tab, vtab? isspace(c)
upper case letter? isupper(c)
hexadecimal digit? isxdigit(c)
convert to lower case? tolower(c)
convert to upper case? toupper(c)
String Operations <string.h>
s,t are strings, cs,ct are constant strings
length of s strlen(s)
copy ct to s strcpy(s,ct)
up to n chars strncpy(s,ct,n)
concatenate ct after s strcat(s,ct)
up to n chars strncat(s,ct,n)
compare cs to ct strcmp(cs,ct)
only _rst n chars strncmp(cs,ct,n)
pointer to _rst c in cs strchr(cs,c)
pointer to last c in cs strrchr(cs,c)
copy n chars from ct to s memcpy(s,ct,n)
copy n chars from ct to s (may overlap) memmove(s,ct,n)
compare n chars of cs with ct memcmp(cs,ct,n)
pointer to _rst c in _rst n chars of cs memchr(cs,c,n)
put c into _rst n chars of cs memset(s,c,n)
C Reference Card (ANSI)
Input/Output <stdio.h>
Standard I/O
standard input stream stdin
standard output stream stdout
standard error stream stderr
end of _le EOF
get a character getchar()
print a character putchar(chr )
print formatted data printf('format ',arg
print to string s sprintf(s,'format ',arg
read formatted data scanf('format ',&name
read from string s sscanf(s,'format ',&name
read line to string s (< max chars) gets(s,max)
print string s puts(s)
File I/O
declare _le pointer FILE *fp
pointer to named _le fopen('name','mode')
modes: r (read), w (write), a (append)
get a character getc(fp)
write a character putc(chr ,fp)
write to _le fprintf(fp,'format',arg
read from _le fscanf(fp,'format',arg
close _le fclose(fp)
non-zero if error ferror(fp)
non-zero if EOF feof(fp)
read line to string s (< max chars) fgets(s,max,fp)
write string s fputs(s,fp)
Codes for Formatted I/O: '%-+ 0w:pmc'
- left justify
+ print with sign
space print space if no sign
0 pad with leading zeros
w min _eld width
p precision
m conversion character:
h short, l long, L long double
c conversion character:
d,i integer u unsigned
c single char s char string
f double e,E exponential
o octal x,X hexadecimal
p pointer n number of chars written
g,G same as f or e,E depending on exponent
Variable Argument Lists <stdarg.h>
declaration of pointer to arguments va_list name;
initialization of argument pointer va_start(name,lastarg)
lastarg is last named parameter of the function
access next unamed arg, update pointer va_arg(name,type)
call before exiting function va_end(name)
Standard Utility Functions <stdlib.h>
absolute value of int n abs(n)
absolute value of long n labs(n)
quotient and remainder of ints n,d div(n,d)
retursn structure with div_t.quot and div_t.rem
quotient and remainder of longs n,d ldiv(n,d)
returns structure with ldiv_t.quot and ldiv_t.rem
pseudo-random integer [0,RAND_MAX] rand()
set random seed to n srand(n)
terminate program execution exit(status)
pass string s to system for execution system(s)
Conversions
convert string s to double atof(s)
convert string s to integer atoi(s)
convert string s to long atol(s)
convert pre_x of s to double strtod(s,endp)
convert pre_x of s (base b) to long strtol(s,endp,b)
same, but unsigned long strtoul(s,endp,b)
Storage Allocation
allocate storage malloc(size), calloc(nobj,size)
change size of object realloc(pts,size)
deallocate space free(ptr)
Array Functions
search array for key bsearch(key,array,n,size,cmp())
sort array ascending order qsort(array,n,size,cmp())
Time and Date Functions <time.h>
processor time used by program clock()
Example. clock()/CLOCKS_PER_SEC is time in seconds
current calendar time time()
time -time in seconds (double) difftime(time ,time
arithmetic types representing times clock_t,time_t
structure type for calendar time comps tm
tm_sec seconds after minute
tm_min minutes after hour
tm_hour hours since
tm_mday day of month
tm_mon months since January
tm_year years since 1900
tm_wday days since Sunday
tm_yday days since January 1
tm_isdst Daylight Savings Time ag
convert local time to calendar time mktime(tp)
convert time in tp to string asctime(tp)
convert calendar time in tp to local time ctime(tp)
convert calendar time to GMT gmtime(tp)
convert calendar time to local time localtime(tp)
format date and time info strftime(s,smax,'format ',tp)
tp is a pointer to a structure of type tm
Mathematical Functions <math.h>
Arguments and returned values are double
trig functions sin(x), cos(x), tan(x)
inverse trig functions asin(x), acos(x), atan(x)
arctan(y=x) atan2(y,x)
hyperbolic trig functions sinh(x), cosh(x), tanh(x)
exponentials & logs exp(x), log(x), log10(x)
exponentials & logs (2 power) ldexp(x,n), frexp(x,*e)
division & remainder modf(x,*ip), fmod(x,y)
powers pow(x,y), sqrt(x)
rounding ceil(x), floor(x), fabs(x)
Integer Type Limits <limits.h>
The numbers given in parentheses are typical values for the
constants on a 32-bit Unix system.
CHAR_BIT bits in char (8)
CHAR_MAX max value of char (127 or 255)
CHAR_MIN min value of char (_128 or 0)
INT_MAX max value of int (+32,767)
INT_MIN min value of int (_32,768)
LONG_MAX max value of long (+2,147,483,647)
LONG_MIN min value of long (_2,147,483,648)
SCHAR_MAX max value of signed char (+127)
SCHAR_MIN min value of signed char (_128)
SHRT_MAX max value of short (+32,767)
SHRT_MIN min value of short (_32,768)
UCHAR_MAX max value of unsigned char (255)
UINT_MAX max value of unsigned int (65,535)
ULONG_MAX max value of unsigned long (4,294,967,295)
USHRT_MAX max value of unsigned short (65,536)
Float Type Limits <float.h>
FLT_RADIX radix of exponent rep (2)
FLT_ROUNDS oating point rounding mode
FLT_DIG decimal digits of precision (6)
FLT_EPSILON smallest x so 1:0 + x 6= 1:0 (10
FLT_MANT_DIG number of digits in mantissa
FLT_MAX maximum oating point number (10
FLT_MAX_EXP maximum exponent
FLT_MIN minimum oating point number (10
FLT_MIN_EXP minimum exponent
DBL_DIG decimal digits of precision (10)
DBL_EPSILON smallest x so 1:0 + x 6= 1:0 (10
DBL_MANT_DIG number of digits in mantissa
DBL_MAX max double oating point number (10
DBL_MAX_EXP maximum exponent
DBL_MIN min double oating point number (10
DBL_MIN_EXP minimum exponent
May 1999 v1.3. Copyright c 1999 Joseph H. Silverman
Permission is granted to make and distribute copies of this card pro-
vided the copyright notice and this permission notice are preserved on
all copies.
Send comments and corrections to J.H. Silverman, Math. Dept., Brown
Univ.,
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 6451
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved