Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Programarea calculatoarelor - Curs

calculatoare



+ Font mai mare | - Font mai mic



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" Timisoara

- 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 Washington, DC - Baltimore, Maryland.

Telegraf Morse/Vail - 1844

. Receptorul

. Cu el s-a receptat primul mesaj de test pe linia Washington, DC - Baltimore,

Maryland

Edison Stock Printer. 'Gold & Stock

Telegraph Co. Edison's Patent No.

. 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 Atlantic - 1858

. 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 Bell - 1877

. 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 americana si Universitatea Pennsylvania

. 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 (ClubSilicon Valley, California)

. '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, Pearl)

_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 Euclid

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:

- EDO (Extended Data Out Dynamic 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

_ ADA

_ 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 Printer Port (Supports

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

CD-ROM 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 Printer Port (Supports

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, constanta, functie).

. 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' constanta caracter si 'x' un sir care contine un singur caracter - nu sunt acelasi lucru.

- 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 constanta pe care o returneaza multe din functiile din biblioteca C standard atunci cand se

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 constanta:

- constanta simpla

- constanta structurata

- expresie formata din operatii si functii simple aplicate numai asupra unor constante

Asigura valori nemodificabile

Constante

. O constanta de tip intreg poate contine in final una din literele L, l, (long) U, u (unsigned).

. 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 constanta reala este considerata ca fiind de tipul double.

. 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 constanta este o expresie care implica numai constante.

. Astfel de expresii sunt evaluate la compilare si nu la executie si pot fi folosite in orice loc in care poate sa apara o constanta.

#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 constanta simpla zecimala va fi cuprinsa intr-unul dintre tipurile de intregi din lista urmatoare: int long unsigned long care va putea contine valoarea.

. Constantele simple hexazecimale vor utiliza lista urmatoare: int unsigned int long unsigned long

. Daca dupa constanta apare sufixul u sau U: unsigned int unsigned long

. 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 constanta este "promovata" la o lungime mai mare si U, u sau l, L nu sunt precizate.

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 constanta folosind un pointer declarat printr-un calificator const al aceluiasi tip.

. 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 constanta, si apoi utilizarea acestui pointer, dar acest mod de lucru este eronat, determinand un comportament nedefinit.

. 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

. constanta (simpla, fara semn)

. 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 Bell (Bell Labs) ale companiei Lucent. Aceste laboratoare de cercetare sunt printre cele

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: Mon, 10 Jul 2000 14:52:15 -0400

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 Princeton; asta era destul de tipic pentru multe alte locuri: nu

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 Moore, desi e o schimbare cantitativa, cind este aplicata ca o crestere exponentiala

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 Bell

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

Pittsburgh, tu iti doresti din toata inima sa mearga bine calculatoarele care controleaza

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 Paris

. 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 constanta conforma cu tipul precizat prin caracterul de conversie corespunzator.

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 camp se vor completa blancuri la stanga (sau la dreapta, daca este prezent indicatorul de aliniere la stanga) pentru a obtine lungimea precizata a campului.

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 constanta numarul maxim al elementelor tabloului;

. '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 constanta (spre exemplu, cu NULL pentru a verifica daca pointerul a fost initializat).

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 midnight

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., Providence, RI 02912 USA. hjhs@math.brown.edui



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 6434
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved