490 likes | 677 Views
Tabele oz. polja. Neja Zupan. Polje???. sum = 0.0; for (i = 0; i < 6; i++) { cin >> x; sum += x; }. sum = 0; cin >> a; sum += a; cin >> b; sum += b; cin >> c; sum += c; cin >> d; sum += d; cin >> e; sum += e; cin >> f; sum += f;. const int NE = 100; float racun[NE];.
E N D
Tabele oz. polja Neja Zupan
Polje??? sum = 0.0; for (i = 0; i < 6; i++) { cin >> x; sum += x; } sum = 0; cin >> a; sum += a; cin >> b; sum += b; cin >> c; sum += c; cin >> d; sum += d; cin >> e; sum += e; cin >> f; sum += f;
const int NE = 100; float racun[NE]; Kaj je polje? • Polje je struktura pomnilniških celic istega podatkovnega tipa, ki ima določeno ime. • Do posameznih elementov polja (celic) pridemo preko indeksa elementa (celice). • Indeks je celoštevilčna vrednost in prvi element v polju ima indeks 0, naslednji za ena več...
Sintaksa • tipime [st_elementov]; • float tabela[6]; //deklaracija polja 6 realnih vrednosti z imenom tabela polje je veljavno če je index < 6 Subscript Overflow float tabela[10]; odgovornost programerja
Deklaracija/Definicija const int N = 50; int i, count[N]; cin >> count[i]; • int polje [5]; • int polje [5] = { 16, 2, 77, 40, 12071 }; INICIALIZACIJA!
Delna inicializacija • int polje [5]; • polje [5] = {0}; • polje [5] = {16, 2, 77}; • int polje[] = {5,6,3};
Aritmetika polj • y = x; //napačno • y[j] = x[j]; //pravilno for(j = 0; j < 25; j++) y[j] = x[j]; polje[0] = a; polje[a] = 75; b = polje [a+2]; polje[i] = polje[i] + 5; (count[i] += 5;) polje[polje[a]] = polje[2] + 5;
Kaj vrne program? // primer polje #include <iostream> int polje [] = {1, 2, 7, 4, 12}; int n, result=0; int main () { for ( n=0 ; n<5 ; n++) { result += polje[n]; } cout << result; return 0; }
Naloga • Napišite kodo tako, da bo vektor_B 2x vecji kot vektor_Afloat vektor_A[3]={1.0, 0.0, 3.0}, vektor_B[3];
Naloga REŠITEV • for (int i=0; i<3; i++) vektor_B[i] = 2 * vektor_A[i];
Naloga Imamo maksimalno 200 pozitivnih celih števil za katere želimo izračunati povprečje in izračunati število polj, ki vsebujejo večje vrednosti od vrednosti 10% nad povprečjem. Kako se lotiti priprave kode?
Naloga REŠITEV Najprej napišite psevdokodo: deklaracija spremenljivk vnos elementov v polje izračun vsote, povprečja in 10% nad najdi vse vrednosti iz polja zapiši rezultat
Naloga REŠITEV Natančnejša psevdo koda: vsota je 0. stevilo je 0. nad10 je 0. vnesi prvo vrednost. while ce je pozitivno { vstavi vrednost v polje z indeksim stevilo. pristej stevilo vsoti. povecaj stevilo. vnesi novo vrednost. } izracunaj povprecje. for stevecod 0 do stevilo-1 if array[stevec] > 1.1*povprecje povecaj nad10; rezultatpovprecje, steviloinnad10.
Eno- in dvo-dimenzionalna polja int polje [5]; int polje [3][5]; int polje [15];
Vrednosti polj se prensšajo izključno preko kazalcev (referenčni operator) Znak & se NE uporablja Z [] se le označi spremenljivko polja Uporaba besede “const” prepreči spreminjanje parametra polja float povprecje(int n, float A[]) { float sum = 0.0; int i; for (i = 0; i < n; i++) sum += A[i]; return (sum/n); } Polje kot parameter funkcije void addarray(int size, const float A[], const float B[], float C[]) { int i; for (i = 0; i < size; i++) C[i] = A[i] + B[i]; }
float povprecje(int n, float A[]) { float sum = 0.0; int i; for (i = 0; i < n; i++) sum += A[i]; return (sum/n); } const int NE = 100; float average, data[NE]; int i, m; cout << “Vnesi število manjše od " << NE << "): "; cin >> m; for (i = 0; i < m; i++) cin >> data[i]; average = povprecje(m, data); Polje kot parameter funkcije
float one[50], two[50], three[50]; . . dodaj(20, one, two, three); Polje kot parameter funkcije void dodaj(int size, const float A[], const float B[], float C[]) { int i; for (i = 0; i < size; i++) C[i] = A[i] + B[i]; }
Naloga Napišite program, ki ustvari dve polji celih števil polje1 = {5, 10, 15} polje2 = {2, 4, 6, 8, 10} Program kliče funkcijo, ki ne vrne rezultata in na ekran izpiše 3 števila iz prvega polja in 4 števila iz drugega polja.
Naloga REŠITEV #include <iostream.h> void izpisi_polje (int arg[], int length) { for (int n=0; n<length; n++) cout << arg[n] << " "; cout << "\n"; } int main () { int polje1[] = {5, 10, 15}; int polje2[] = {2, 4, 6, 8, 10}; izpisi_polje (polje1,3); izpisi_polje (polje2,4); return 0; }
Nizi znakov • Znakovni niz je predstavljen s poljem znakov. • Za razliko od polja števil predstavlja niz znakov zaporedje znakov, ki se končajo z ničelnim znakom '\0' in ta označuje konec niza. • V C++ je zaporedje znakov shranjeno v“array of characters”
Nizi znakov • Razlika med zapisoma 'A' in “A” • Prvi zapis pomeni znak A in drugi zapis stringa A • Ker se stringi končajo zničelnim znakom, "A" predstavlja dva znaka 'A' and '\0'
Nizi znakov char s1[10]; • Spremenljivka s1 je lahko maksimalno dolžine 9 (zadnji znak je ničelni znak) • Spremenljivka “string” je inicializirana kot vsaka druga spremenljivka char polje_znakov1 [] = “primer"; char polje_znakov2 [10] = “primer" • Shranjeno sledeče: • polje_znakov1 |p|r|i|m|e|r|\0| • polje_znakov2 |p|r|i|m|e|r|\0|?|?|?|
Klic stringa #include <iostream.h> int main () { char vpras[] = “Vnesite svoje ime: "; char pozdrav[] = “Živjo, "; char ime [80]; cout << vpras; cin >> ime; cout << pozdrav << ime << "!"; return 0; } polje Stringe, ki vsebujejo predledek, ne moremo brati z operatorjem >>
Branje in klic stringa #include <iostream.h> int main () { char vpras[] = “Vnesite svoje ime: "; char pozdrav[] = “Živjo, "; char ime [80]; cout << vpras; cin >> ime; cout << pozdrav << ime << "!"; return 0; } polje Stringe, ki vsebujejo predledek, ne moremo brati z operatorjem >>
Branje stringa s presledki • Stavek m znakov shrani v str • \n označuje konec stringa (besede, stavka...) m • \n ni shranjen v str cin.get(str,m+1);
Naloge • Kakšen je zapis polja name v spominu za spodnje tri spremenljivke: • char name[11] = {'J', 'o', 'h', 'n', '\0'}; • char name[8] = "John"; • char name[] = "John"; • Napišite kodo tako, da se bodo imena izpisala na zaslonchar osebe[3][16]={"Aleš", "Boris", "Tomaz"};
Naloga REŠITEV • Rezultati so narisani • for (int i=0; i<3; i++) cout << i+1 << ". oseba je: " << osebe[i] << endl;
Uporaba vektorjev in polj • Iskanje določene vrednosti, znaka • razvrščanje • Vnos vrednosti v polje • Izbris vrednosti iz polja
Dinamični pomnilnik Neja Zupan
Dinamični pomnilnik int * kazalec; kazalec = new int [5]; kazalec = new tipkazalec = new tip [elementi] kazalec = new (nothrow) int [5]; delete pointer; delete [] pointer; int * kazalec; kazalec = new (nothrow) int [5]; if (kazalec == 0) { // sporočilo uporabniku-napaka. };
Koliko števil želite vpisati? 5 Vpiši 1. številko : 75 Vpiši 2. številko : 436 Vpiši 3. številko : 1067 Vpiši 4. številko : 8 Vpiši 5. številko r : 32 Vpisal si številke: 75, 436, 1067, 8, 32, #include <iostream.h> int main () { int i,n; int * p; cout << “Koliko števil želiš vpisati? "; cin >> i; p= new (nothrow) int[i]; if (p == 0) cout << “Napaka: pomnilnik zaseden"; else { for (n=0; n<i; n++) { cout << “Vpiši” << n << “. številko: “; cin >> p[n]; } cout << “Vpisal si številke: "; for (n=0; n<i; n++) cout << p[n] << ", "; delete[] p; } return 0; }
Strukture in razredi Neja Zupan
Strukture (struct) • Struktura omogoča združitev različnih podatkovnih tipov v enega • Struct – zbirka fiksnega števila komponent • Komponente so dostopnje preko njihovega imena • Komponente so lahko različnega tipa • Komponente strukture (struct) imenujemo člani (members) • Struktura je definicija in ne deklaracija (ni dodeljeno pomnilniški prostor)
Strukture (struct) - sintaksa The general form (syntax) of a struct is: struct typeName { dataType1 identifier1; dataType2 identifier2; // podatkovni_tip ime_parametra dataTypen identifiern; };
Strukture (struct) - sintaksa struct sadje { int teza; float cena; } jabolko, jagoda; struct sadje { int teza; float cena; }; sadje grozdje; sadje marelica;
Dostop do članov struct struct sadje { int teza; float cena; }; sadje grozdje; sadje marelica; Sintaksa: structImeSpremenljivke.ImeClana Pika je operator za dostop do člana strukture. grozdje.teza; marelica.cena;
struct spremenljivke in funkcije Spremenljivka tipa struct: v funkcijo posredovana kot vrednost ali preko reference Funkcija lahko vrne vrednost tipa struct
Naloga • Definirajte strukturo za opis osebe • Deklarirajte polje 10 oseb • Napišite sintakso za izpis vseh 10 oseb na ekran
Naloga REŠITEV struct Oseba { char ime[32]; char priimek[32]; char emso[14]; char spol; };
Naloga REŠITEV //Deklaracija polja sestavljenih spremenljivk Oseba ljudje[10]; //dekl. polja ljudje z 10 elementi cout << "Vpisite ime osebe:"; cin >> ljudje[1].ime; cout << "Vpisite priimek osebe:"; cin >> ljudje[1].priimek; cout << "Vpisite EMSO osebe:"; cin >> ljudje[1].emso; cout << "Vpisite spol osebe:"; cin >> ljudje[1].spol;
Naloga REŠITEV //zgled za polje for (int i=0; i<10; i++) { cout << "Vpisite ime " << i+1 << ". osebe: "; cin >> ljudje[i].ime; cout << "Vpisite priimek " << i+1 << ". osebe: "; cin >> ljudje[i].priimek; ... }
Drugi podatkovni tipi • typedef – sinonim za obstoječe podatkovne tipe • union – posamezni del pomnilnika uporablja več spremenljivk različnega podatkovnega tipa • anonimni union – razlika le v klicu članov podatkovnega tipa union • enum – spremenljivka lahko zavzame le eno vrednost izmed konstant
Razredi - class • class – tip strukture podatkov • ADT • naredi C++ objektno orientiran jezik • Zbirka fiksnega števila komponent • Komponente se imenujejo člani (members)
Sintaksa class classIdentifier { classMemberList }; Član je lahko spremenljivka ali funkcija class CRectangle { int x, y; public: void set_values (int,int); int area (void); } rect;
Sintaksa • private members: člani razreda so dosegljivi samo članom istega razreda ali “prijateljskim” razredom. • protected members:so dosegljivi članom istega razreda, izpeljanim in prijateljskim razredom. • public members:dosegljivi povsod, kjer je viden razred. class CRectangle { int x, y; public: void set_values (int,int); int area (void); } rect;
Primer // primer class #include <iostream> using namespace std; class CRectangle { int x, y; public: void set_values (int,int); int area () {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); return 0; }