1 / 20

INFORMATICA

Siruri de caractere . Tipul STRUCT Recursivitate Divide et Impera Liste liniare SI. INFORMATICA. Siruri de caractere. O constanta de tip sir de caractere se declara intre doua caractere “ .

deon
Download Presentation

INFORMATICA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Siruri de caractere. Tipul STRUCT Recursivitate Divide et Impera Listeliniare SI INFORMATICA

  2. Siruri de caractere • O constanta de tip sir de caractere se declaraintredouacaractere “ . • In memoriainterna, o constanta de acest tip esteretinuta sub forma unui vector de caractere. • Fiecarecomponenta a sirului (incepand cu cea de indice 0) retinecodul ASCII al caracteruluipe care ilmemoreaza. Conventiaeste ca ultimul octet sa retina 0 (codulcaracteruluinul). • Caracterulnulestememorat automat. Trebuierezervatelungimea_sirului+1 caractere char (+1 pentrucaracterulnul).

  3. Declarari •       char sirc[12] = {’c’, ’l’, ’a’, ’s’, ’a’,' ','a',' ','X','-','A','\0'};   // sirul de caractere “clasa a X-a” • char sc[20]; cin>>sc;// citesc de la tastaturasirul sc; • Pentrucitireaunui sir care continesicaracterealbe se folosestemetoda: “cin.get(vector-de-caractere, intnr,char=‘\n’)” ex: char sc[100]; cin.get(sc, 100, ’\n’) cout<<sc;

  4. Afisari • cout<<sirc<<"\n";  //afiseazaclasa a X-a • cout<<sc0[0];   // afiseazaprimulcaracter din sirul sc0 – c • cout<<sc1[4];  // afiseaza al patruleacaracter din sirul sc1 – a • sc0[0]=’p’;       // elementului din sir de indice 0 i se atribuievaloarea ‘p’;cout<<sc0<<endln;       // se afiseazaplasa a X-a •  sc0[4]='C';cout<<sc0<<endln;       // se afiseazaplaCa a X-a

  5. Problema • Se citeste un cuvant format din literemici. Sa se afisezecuvintele care se obtinprineliminareasuccesiva a primeisiultimeilitere din cuvantulcitit. Ex: Daca de citestecuvantulalina se vorafisa: alinalini • #include<iostream> • int main() • { char a[100]; • cin>>a; • while(strlen(a)>0) • {cout<<a; cout<<endl; • strcpy(a,a+1); • strcpy(a+strlen(a)-1,a+strlen(a)); } • return 0; • }

  6. Tipul STRUCT • O structuraeste o colectie de valorieterogene, stocateintr-o zonacompacta de memorie.Componenteleuneistructuri, denumitecampuri, suntidentificateprinnumesimbolice, denumiteselectori.Campurileuneistructuri pot fi de orice tip, simplusauderivat, dar nu void saufunctie.Declarareastructurilor se face folosindcuvantulcheiestruct:struct [nume_structura]{  tip1 membrii;  tip2 membrii;................tipnmembrii;}[lista_declaratori]; //variabile de tip structura

  7. Exemplu1:structpersoana{ //se declaratipulstructpersoana    char nume[20];intvarsta;}; //lipsestelista_declaratoriExemplu2:structpersoana{ //se declaratipulstructpersoana    char nume[20];struct{intzi,an,luna    }data_nasterii; //camp de tip structura

  8. #include<iostream> using namespace std; structpersoana{ char nume[20], prenume[20]; intnr_copii; double salariu; char loc_nastere[20]; }angajati[10]; int main() { int n; cout<<"Nr. angajati="; cin>>n; for(inti=1;i<=n;i++) { • PROBLEMA: O firma are un numar de angajati, pentrufiecarepastranduse • urmatoarele date: nume,prenume, nr copii,loculnasterii. • Folosind structuri introduceti datele apoi afisati datele introduce. cout<<"Intruducetidatelepentruangajatul "<<i<<endl; cout<<"Numele :"; cin>>angajati[i].nume; cout<<"Prenumele :"; cin>>angajati[i].prenume; cout<<"Nr. copii:"; cin>> angajati[i].nr_copii; cout<<"Loculnasterii:"; cin>> angajati[i].loc_nastere; } cout<<"Dateleintroduse au fost:"<<endl; for(inti=1;i<=n;i++) { cout<<"Numele "<<i<<angajati[i].nume<< endl; cout<<"Prenumele: "<<i<<angajati[i].prenume<< endl; cout<<"Nr. copii: "<<angajati[i].nr_copii<< endl; cout<<"Loculnasterii: "<<angajati[i].loc_nastere; } }

  9. Pentru ca punctul P sa fie situatpeaxa OX, x-ulpunctuluitrebuiesa fie egal cu 0; P situatpeaxa ox <=> P.X==0 RASPUNS: a)

  10. RECURSIVITATE • Un procesesterecursivatuncicânddesfasurareasagenereazãaparitiaunorprocesesimilarelui, aflateînlegaturã cu cel care le-a generat. • Recursivitateaeste o tehnicã de elaborare a programelor. • Un procesrecursivestefinitatuncicândîncheiereaexecutiei sale se face dupã un numardetermiant de operatiiexecutate. • Prinantiteza cu procesulrecursivfinit, procesulrecursivinfinit, teoretic, nu îsiincheieexecutianiciodata. • În general, însa, proceselepe care vremsã le descriemsunt finite sitrebuiesã ne asigurãm ca programelenoastresãreflecteacestlucru.

  11. 1. Să se găsească valoarea termenului al n-lea din șirul lui Fibonacci. F(0)=0; F(1)=1;F(n)=F(n-1)+F(n-2). #include<iostream> long int n; int f(int n) { if(n==0) return 0; else if(n==1) return 1;                 else return f(n-1)+f(n-2); } void main() { cout<<"n=";cin>>n; cout<<"f("<<n<<")="<<f(n)<<endl; }

  12. 2.Să se afișeze suma cifrelor dintr-un număr natural citit de la tastatură. #include<iostream > long int n; int s(int n) { if(n==0) return 0;                else return s(n/10)+n%10;  } void main() { cout<<"n=";cin>>n; cout<<s(n)<<endl; }

  13. DIVIDE et IMPERA • Ideea de bazaconsta in impartireauneiprobleme in 2 saumaimultesubprobleme care se rezolvaseparat, apoi se trece la combinarearezultatelorproblemelorrezolvateobtinandu-se, astfel, solutiafinala. • Se da un sir de valori (secventa de valori) a1, a2, a3,…, an. Aceastasecventatrebuieprelucrata. • Prelucrarea se va realize in felulurmator: sirul se imparte in 2 saumaimultesubsiruri. Fiecaresubsir se vaimpartii, dupaaceiasimetoda, in 2 saumaimultesubsiruripanacand se ajunge la o problemarezolvabilasau un rezultatcunoscut.  Din aproape in aproape, princombinarearezultatelorobtinute, se obtinerezultatul final.

  14. Aplicatii Divide et Impera 1) Maximuldintr-un vector Se citeste un vector cu n componente, numere naturale. Se cere să se tipărească valoarea maximă. Functia căutată va genera valoarea maximă dintre numerele retinute în vector pe o pozitie dintre i si j (initial, i=1, j=n). Pentru aceasta, se procedează astfel: dacă i=j, valoarea maxima va fi v[i]; în caz contrar, se imparte vectorul în doi subvectori - presupunem varianta pentru paralelizare pe 2 procesoare. Se calculează mijlocul m al intervalului [i, j]: m = (i+j) div 2. Primul subvector va contine componentele de la i la m, al doilea va contine componentele de la (m+1) la j; se rezolvă subproblemele (aflându-se astfel maximul pentru fiecare din subvectori), iar solutia curentă va fi dată de valoarea maximă dintre rezultatele celor două subprobleme. if (a>b) return a; else return b; } } int main( ) { cout<<”n=”;cin>>n; for (int i=1; i<=n; i++) { cout<<”v[“<<i<<”]=”; cin>>v[i]; } cout<<”max=”<<max(1,n); return 0; } #include <iostream> using namespace std; int v[10],n; int max(int i, int j) { int a, b, m; if (i==j) return v[i]; else { m = (i+j)/2; a = max(i, m); b = max(m+1, j);

  15. 2) Căutare binară Se citeste un vector cu n componente numere întregi (numerele sepresupun ordonate crescător) si o valoare întreagă ("nr"). Să se decidă dacă nr se găseste sau nu printre numerele citite, iar în caz afirmativ să se tipărească indicele componentei care contine această valoare. #include <iostream> using namespace std; int v[100], n, nr; void caut(inti, int j) { int m = (i+j)/2; if (nr==v[m]) cout<<”gasit, indice=”<<m; else if (i<j) if (nr<v[m]) caut(i, m-1); else caut(m+1, j); else cout<<”nu a fostgasit.”; } int main( ) { cout<<”n=”; cin>>n; for (int i=1; i<=n; i++) { cout<<”v[“<<i<<”]=”; cin>>v[i]; } cout<<”nr=”; cin>>nr; caut (1,n); return 0;

  16. 3) Turnurile din Hanoi Se dau3 tijesimbolizateprina,b,c. Petija a se gasescdiscuri de diametrediferite, asezate in ordinedescrescatoare a diametrelorprivite de jos in sus. Se ceresa se mute de petija a pe b, utilizand ca tijaintermediaratija c, respectandurmatoarelereguli: la fiecare pas se muta un singur disc ; nu este permis sa se aseze un disc cu diametrul mai mare peste un disc cu diametrul mai mic. #include<iostream> using namespace std; char a,b,c; int n; void hanoi(intn,chara,char b, char c) { if(n==1) cout<<a<<b<<" "; else { hanoi(n-1,a,c,b); cout<<a<<b<<" "; hanoi(n-1,c,b,a); } } int main() { cout<<"n=";cin>>n; hanoi(n,'a','b','c'); }

  17. Listeliniaresimpluinlantuie O listaliniaraeste o succesiuneordonata de elemente cu proprietatile:- existaprimulsiultimul element;- fiecare element, cu exceptiaultimului, are un succesor- fiecare element, cu exceptiaprimului, are un predecesor

  18. Listeleliniarepot fimemoratesecvential, intr-un vector, sauinlantuit (cu pointeri).Pentru a reprezentasuccesiuneaelementelor in cadruluneiliste se folosescsageticatresuccesorulfiecarui element In cazulalocariiinlantuite a listelorinformatiamemorata in fiecare element esteformata din:- informatiautila (valoareaelementului din lista)- informatia de legatura (adresaurmatorului element)

  19. 1.Sa se scrie o functie care primeste ca parametru adresa primului nod al unei LLSI cu cel putin 3 noduri si sterge primul si ultimul nod al listei.void stergpu( nod *&prim) { nod*p,*q; q=prim; prim=prim->leg; delete q; p=prim; while(p->leg->leg !=0) p=p->leg; q=p->leg; p->leg=0; delete q; }

  20. 2. Într-o stivă ce memorează numere întregi se introduc, în ordine, următoarele numere: 1,2,3,4,5,6,7. Câte numere trebuie să eliminăm din stivăastfel ca în vârful stivei să segăsească numărul 5 (4p.) a. 5 b. 2 c. 3 d. 4 Din stiva se pot eliminaelementedoar de la coada. Ca saajungem la ultimul element 5 trebuiesaeliminamnumarul 7 precumsinumarul 6 de la coadastivei. => 2 numere. RASPUNS : b.2

More Related