Notiek prezentācijas ielādēšana. Lūdzu uzgaidiet

Notiek prezentācijas ielādēšana. Lūdzu uzgaidiet

Algoritmi un programmēšana Praktiskie darbi

Līdzīgas prezentācijas


Prezentācija par tēmu: "Algoritmi un programmēšana Praktiskie darbi"— Prezentācijas transkripts:

1 Algoritmi un programmēšana Praktiskie darbi
Simboli un simbolu virknes Norāde, adrese, reference Doc. Dr. Sc. Comp. Edgars Rencis, Latvijas Universitāte, Datorikas fakultāte, 24. oktobris, 2019.

2 Simboli un simbolu virknes

3 Simboli – datu tips char
Simboli ir sakārtoti simbolu tabulā ASCII EBCDIC HTML codes ... Jebkurā tabulā vienkopus pēc kārtas atrodas latīņu alfabēta mazie burti latīņu alfabēta lielie burti cipari Nav svarīgi zināt simbolu kārtas numurus tabulā

4 ASCII simbolu tabula

5 Datu tipu int un char saistība
int un char mainīgos var piešķirt vienu otram saskaņā ar ASCII simbolu tabulu char c='a'; int i=52; int i=c; char c=i; cout << i; //skaitlis 97 cout << c; //simbols '4' Simboliem definētas salīdzināšanas operācijas char c; cin >> c; if (c>='A' && c<='Z') cout << "Ir lielais burts\n"; Simboliem definētas aritmētiskās operācijas char c; cin >> c; int i=c-'0'; //Atņemam simbolu kārtas numurus

6 Simbolu virknes C++ Zema līmeņa simbolu virknes
C stila simbolu virknes – char tipa masīvs Augsta līmeņa simbolu virknes C++ stila simbolu virknes – datu tips string

7 Zema līmeņa simbolu virknes
Datu tips "zema līmeņa simbolu virkne" C++ tiek attēlots kā simbolu masīvs char s[20]; Simbolu virknei vienmēr jābeidzas ar kodu tabulas 0. simbolu uz šādu norunu paļaujas daudzas C++ konstrukcijas ja šīs konstrukcijas nelieto, tad šo norunu var neievērot

8 Simbolu virknes beigu pazīme
Jebkura simbolu virkne beidzas ar simbolu `\0`, piemēram, char s[4] | a | b | c |\0 |  "abc" | a | b |\0 | c |  "ab" |\0 | a | b |\0 |  "" Konstanšu uzdošana: simbols – 'a', 'c', '5', ', ', '\'', '\n', '\0' simbolu virkne – "", "a", "abc", "Hello!\n": ""  | \0 | "a"  | a | \0 | "abc"  | a | b | c | \0 | "Hello!\n"  | H | e | l | l | o | ! | \n | \0 |

9 Simbolu virknes un citu tipu masīvi
Simbolu virknes ir masīvi nevar veikt salīdzināšanu nevar veikt piešķiršanu Simbolu virknes ir speciāli masīvi var veikt ievadu un izvadu char s[100]; cin >> s; cout << s; var veikt speciālu inicializēšanu deklarācijas brīdī char s[100]={'a', 'b', 'c', '\0'}; char s1[100]="abc";

10 Simbolu virkņu papildiespējas
Simbolu virknes ievadīšana cin >> s; tiek ņemti pretī visi lietotāja ievadītie simboli līdz pirmajam atdalītājsimbolam (piemēram, atstarpei) cin.getline(s,maxCharCount); tiek ņemti pretī visi lietotāja ievadītie simboli līdz Enter pēc ievadītajiem simboliem automātiski galā tiek pielikts simbols '\0' Simbolu virknes izvadīšana cout << s; tiek pēc kārtas izvadīti visi virknes elementi, sākot ar nullto, līdz tiek sastapts simbols '\0'

11 Simbolu virknes beigu pazīmes nozīme
Ļauj uztvert simbolu virkni kā vienu veselumu Ļauj glabāt vienā masīvā dažāda garuma simbolu virknes Ļauj apstrādāt simbolu virkni, saprotot, kur tā beidzas Ļauj izmantot dažādas priekšdefinētas funkcijas darbam ar simbolu virkni char * strcpy (char * s2, const char * s1); piešķirt s1 saturu mainīgajam s2 (s2=s1), atgriež s2 char * strcat (char * s2, const char * s1); pievienot s1 saturu galā s2 saturam (s2=s2+s1), atgriež s2 int strcmp (const char * s1, const char * s2); salīdzināt virknes s1 un s2 pa simbolam atgriež 1, ja s1>s2; -1, ja s2>s1; 0, ja s1==s2) int strlen (const char * s); atgriež virknes s garumu

12 Piemērs Uzdevums Risinājums
Lietotājs ievada simbolu virkni, kas nepārsniedz 100 simbolus. Noskaidrot, vai tā sākas ar ciparu. Risinājums int main() { char s[101]; cin.getline(s,101); if (s[0]>='0' && s[0]<='9') cout <<"Sākas ar ciparu!\n"; else cout <<"Nesākas ar ciparu!\n"; return 0; }

13 Piemērs Uzdevums Risinājums
Lietotājs ievada simbolu virkni, kas nepārsniedz 100 simbolus. Noskaidrot, vai tā sākas ar ciparu. Risinājums int main() { char s[101]; cin.getline(s,101); if (s[0]>=48 && s[0]<=57) cout <<"Sākas ar ciparu!\n"; else cout <<"Nesākas ar ciparu!\n"; return 0; }

14 Piemērs Uzdevums Risinājums
Lietotājs ievada simbolu virkni, kas nepārsniedz 100 simbolus. Noskaidrot, vai tā sākas ar ciparu. Risinājums int main() { char s[101]; cin.getline(s,101); if (s[0]-'0'>=0 && s[0]-'0'<=9) cout <<"Sākas ar ciparu!\n"; else cout <<"Nesākas ar ciparu!\n"; return 0; }

15 Uzdevums 1 Lietotājs ievada simbolu virkni, kas nepārsniedz 100 simbolus. Noteikt tās reālo garumu, nelietojot funkciju strlen. int main() { char s[101]; cin.getline(s,101); int i=0; while (s[i]!='\0') i++; cout << "Virkne satur "<<i<<" simbolus\n"; return 0; }

16 Simbolu virknes Javascript
Simbolu virkņu konstanšu uzdošanai var lietot gan pēdiņas, gan apostrofus var s="abc"; var s='abc'; Virknes garums glabājas īpašībā length var s="abc"; alert(s.length); // 3 Javascript simbolu virkne nav masīvs bet to var pārveidot par masīvu ar funkciju split var s="abc"; var arr=s.split(""); for (var i=0;i<arr.length;i++) alert(arr[i]);

17 Javascript simbolu virkņu iespējas
Apakšvirkņu meklēšana – indexOf un lastIndexOf var s="abcdebcdecdedee"; var x=s.indexOf("cd"); // 2 var y=s.lastIndexOf("cd"); // 9 var x1=s.indexOf("cd",3); // 6 var y1=s.lastIndexOf("cd",8); // 6 var z=s.indexOf("cdc"); // -1 Apakšvirkņu izdalīšana – substring var s="abcdebcdecdedee"; var z=s.substring(3,8); // "debcd" apakšvirkne no 3. pozīcijas ieskaitot līdz 8. pozīcijai neieskaitot Reģistra maiņa – toUpperCase un toLowerCase var s="aBcDe"; var z1=s.toUpperCase(); // "ABCDE" var z2=s.toLowerCase(); // "abcde" Konkrēta simbola iegūšana – charAt var s="abcde"; var c=s.charAt(3); // d

18 Uzdevums 2 Lietotājs ievada simbolu virknes s un z. Noteikt, cik reižu virknē s sastopama apakšvirkne z. realizēt risinājumu Javascript Risinājums <script> var s=prompt(); var z=prompt(); var x=0, i=s.indexOf(z); while (i!=-1) { x++; i=s.indexOf(z,i+1); } alert(x); </script>

19 Norāde, adrese, reference

20 Kas ir dinamiska datu struktūra?
Dinamisks – tāds, kuram kompilācijas brīdī nav izdalīta atmiņa, bet kuram atmiņu pēc vajadzības var izdalīt izpildes laikā Dinamiska datu struktūra – struktūra, kura tiek glabāta dinamiskajā atmiņā un kurai var piekļūt caur statiskajā atmiņā esošu norādi Dinamisku datu struktūru veidošanas motivācija – statiskās atmiņas taupīšana (pati norāde aizņem maz vietas)

21 Norāde, adrese, reference
<typeName> * <variableName>; int * x; // x būs norāde uz veselu skaitli char * s; // s būs norāde uz vienu simbolu pati norāde (neatkarīgi no datu tipa, uz kura mainīgo tā norāda) aizņem 4 baitus statiskajā atmiņā norāde ir vesels skaitlis (norādītās informācijas atmiņas adrese) heksadecimālajā pierakstā int * x = new int; cout << x; // 0x3d3cb8 int * x = new int; int y = (int)x; cout << y; // norādes izmantošana *x tā vieta atmiņā, uz kuru norāda x (pieraksts lietojams kā parasts attiecīgā datu tipa mainīgais) int * x = NULL; //NULL adrese nozīmē, ka x nenorāda nekur x = new int; //izveidot vietu skaitlim dinamiskajā atmiņā un likt x norādīt uz šo vietu *x = 17; //Vietā, uz kuru norāda x, ierakstīt 17 cout << *x; //Izdrukāt to, kas atrodas vietā, uz kuru norāda x delete x; //Atbrīvot atmiņas vietu (viena skaitļa garumā), uz kuru norāda x

22 Norāde, adrese, reference
vesels skaitlis pieļaujamā atmiņas adresācijas intervālā parasti pierakstīts heksadecimālajā pierakstā jebkuram mainīgajam var noskaidrot tā adresi, izmantojot adreses ņemšanas operatoru & int x; int y = (int)&x; cout << &x << " " << y; //0x22ff adresi kā vērtību var piešķirt norādei int x; int * y; y = &x; cout << y; //0x22ff74 int x = 5, * y = &x; *y = 17; cout << x; // 17

23 Norāde, adrese, reference
iespēja piekļūt vienam un tam pašam atmiņas apgabalam ar dažādiem mainīgajiem jēdziens pazīstams no funkcijām – parametru var nodot kā vērtību vai kā referenci izmantošana int x = 5; int & y = x; // Deklarējot referenci, jānorāda tās atrašanās vieta atmiņā cout << x << y; // 55 y = 7; cout << x << y; // 77

24 Kas tiek izdrukāts? int x=3,*y = &x; x=5;
cout << x << endl; cout << &x << endl; cout << y << endl; cout << *y << endl;

25 Kas tiek izdrukāts? int x=3,*y = &x; x=5;
cout << x << endl; // 5 cout << &x << endl; // 0x22ff74 (x adrese) cout << y << endl; // 0x22ff74 (adrese, uz kuru norāda y) cout << *y << endl; // 5

26 Kas tiek izdrukāts? int x=3,*y; y=(int*)0x22ff74; *y=17;
cout << x << endl;

27 Kas tiek izdrukāts? int x=3,*y; y=(int*)0x22ff74; *y=17;
cout << x << endl; // 17 (ja paveicas)

28 Kas tiek izdrukāts? int x=3,*y,&z; z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

29 Kas tiek izdrukāts? int x=3,*y,&z;  references mainīgais bez vietas atmiņā z=5; *y=17; cout << x << endl; cout << y << endl; cout << z << endl;

30 Kas tiek izdrukāts? int x=3,*y,&z=&x; z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

31 Kas tiek izdrukāts? int x=3,*y,&z=&x;  nekorekta sintakse z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

32 Kas tiek izdrukāts? int x=3,*y,&z=x; z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

33 Kas tiek izdrukāts? int x=3,*y,&z=x; z=5;
*y=17;  norāde y ne uz ko nenorāda cout << x << endl; cout << y << endl; cout << z << endl;

34 Kas tiek izdrukāts? int x=3,*y=x,&z=x; z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

35 Kas tiek izdrukāts? int x=3,*y=x,&z=x;  nekorekta sintakse z=5;
cout << x << endl; cout << y << endl; cout << z << endl;

36 Kas tiek izdrukāts? int x=3,*y=&x,&z=x; z=5; *y=17;
cout << x << endl; cout << y << endl; cout << z << endl;

37 Kas tiek izdrukāts? int x=3,*y=&x,&z=x; z=5; *y=17;
cout << x << endl; // 17 cout << y << endl; // 0x22ff74 cout << z << endl; // 17


Lejuplādēt ppt "Algoritmi un programmēšana Praktiskie darbi"

Līdzīgas prezentācijas


Google reklāma