Algoritmi un programmēšana Praktiskie darbi

Slides:



Advertisements
Līdzīgas prezentācijas
      Sensoro spēju attīstīšana matemātisko pamatpriekšstatu veidošana, matemātika - integrētā pieeja  Konsultācija  Rīgas pirmsskolas izglītības.
Advertisements

Skolas simbolika 10.a klases projekts 2011./2012. m.g.
Lasīšanas prasmju pilnveide
“Rītausmas reidi”.
Eiropas Sociālā fonda projekts „Inovatīva un praksē balstīta pedagogu izglītības ieguve un mentoru profesionālā pilnveide” Vienošanās Nr.2010/0096/1DP/ /09/IPIA/VIAA/001.
Aktualitātes bērnu tiesību aizsardzības jautājumos
Demonstrējumi dārzkopībā g.
Prezentācijas transkripts:

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.

Simboli un simbolu virknes

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ā

ASCII simbolu tabula

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

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

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

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 |

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

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'

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

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; }

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; }

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; }

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; }

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]);

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

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>

Norāde, adrese, reference

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)

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; // 4013240 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

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; //0x22ff74 2293620 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

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

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

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

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

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

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

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;

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

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;

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

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;

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

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

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

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