200 likes | 365 Views
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 “ .
E N D
Siruri de caractere. Tipul STRUCT Recursivitate Divide et Impera Listeliniare SI INFORMATICA
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).
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;
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
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; • }
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
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
#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; } }
Pentru ca punctul P sa fie situatpeaxa OX, x-ulpunctuluitrebuiesa fie egal cu 0; P situatpeaxa ox <=> P.X==0 RASPUNS: a)
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.
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; }
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; }
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.
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);
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;
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'); }
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
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)
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; }
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