180 likes | 413 Views
Vienošanās Nr. 2008/0001/1DP/1.2.1.2.2./08/IPIA/VIAA/002. 1. A. Simbolisko virkņu apstrāde. 9. 5. C. Daugavpils Valsts ģimnāzija Edgars Pudulis. Nedaudz par virknēm. Virkne ir viens no sarežģītākajiem datu komponentiem un vienlaikus arī visbiežāk lietotais datu tips.
E N D
Vienošanās Nr. 2008/0001/1DP/1.2.1.2.2./08/IPIA/VIAA/002 1 A Simbolisko virkņu apstrāde 9 5 C Daugavpils Valsts ģimnāzija Edgars Pudulis
Nedaudz par virknēm... Virkne ir viens no sarežģītākajiem datu komponentiem un vienlaikus arī visbiežāk lietotais datu tips. Virkne ir universāls mainīgais, jo spēj sevi saturēt vienlaicīgi skaitļus un burtus, piemēram, cilvēka personas kods 100467-11122 satur svarīgu informāciju – cilvēka dzimšanas datus. Kā veidot programmu, lai dators automātiski no šāda simbolu salikuma spētu izvadīt uz ekrāna tikai dzimšanas dienas datus ? Šis materiāls ir izstrādāts uz virkņu apstrādes īpatnībām Turbo Pascal vidē, bet virknes apstrādes loģika ir līdzvērtīga arī citās programmēšanas vidēs, mainās tikai operatoru nosaukumi un to iespējas, dažreiz to daudzums, dažas vides spēj patstāvīgi noteikt virknes datu tipu...
Virkne kā datu tips... Katru mainīgo elementu, kuro lieto programmēšanas vidē, ir jāapraksta ar noteiktu tipu, jo tikai tad dators sapratīs un piešķirs tam noteiktas funkcijas, kurās spēs apstrādāt šo mainīgo un iegūt rezultātu. Virknēm izmanto divus tipus: 1) STRING – teksta virkne līdz 255 simboliem; 2) CHAR – viens virknes elements (burts, cipars u.c.) Jāņem vērā, ka virkne maksimāli var saturēt tikai 255 simbolus, bet to daudzumu var arī ierobežot norādot iekavās maksimālo virknes garumu. Apraksta piemērs: VAR s:string; s1:string[20]; a:char;
Funkcija LENGTH(Virkne) Procedūras būtība – noteikt virknes garumu, rezultāts ir skaitlis, piemēram, LENGTH(labdien) rezultāts ir 7. 1.uzd. Dators pieprasa cilvēka vārdu un nosaka vārdā esošo simbolu skaitu. Uses crt; VAR V:string; Begin Write(‘Ievadi savu vārdu ‘); Readln(V); Write(‘Tavs vārds satur ‘,LENGTH(V),‘ simbolus!’); Readln; End. ! Virknes datu nolasīšanai izmanto procedūru READLN !
Virknes elementu apstrāde Virkne nav nedalāms mainīgais, katru virknes elementu var apskatīt atsevišķi. Dotā virkne: V = AIGARS IR STUDENTS Kā redzams dotā virkne sastāv no 18 simboliem (tukšumi arī ir simboli!) Apzīmējumi: lai vērstos pie virknes 3 elementa, lieto šādu apzīmējumu V[3], tātad V[3]=‘G’, bet, piemēram, V[LENGTH(V) – 1] = ‘T’, jo virknes garums ir 18, bet 18-1=17, jeb V[17]=‘T’ Svarīgi! Ja darbojamies ar virknes elementiem, tos ir jāiekļauj starp apostrofiem, tā kā norādīts piemēros!
Uzdevums, virknes dalīšana 2.uzd. Dators piedāvā ievadīt cilvēka vārdu un izvada elementus stabiņa veidā – visus burtus vienu zem otra. Uses CRT; VAR V:string; i:integer; Begin Write(‘Ievadi savu vārdu ‘); Readln(V); FOR i:=1 to LENGTH(V) do writeln(V[i]); Readln; END. Programmā izmantosim cikla operatoru ar mainīgo komponentu i. Šis elements atbild par tekošā virknes elementa kārtas numuru sākot ar pirmo un līdz pēdējam. Komanda WriteLN nodrošinās elementu izdruku stabiņā.
Uzdevums, virknes apvienošana 3.uzd. Dators piedāvā ievadīt cilvēka vārda burtu skaitu un pēc tam pašus burtus atsevišķi vienu no otra. Apvienot ievadītos burtus vienotā vārdā. Uses CRT; VAR V, VA:string; i, BS:integer; Begin Write(‘Ievadi burtu skaitu ‘); Readln(BS); FOR i:=1 to BS do BEGIN Readln(V); VA:=VA+V; END; Write (‘Jūsu vārds ir ,VA); Readln; END. Šoreiz pēc uzdevuma noteikumiem V var lietot arī CHAR tipu ! Virknes apvienošanai izmanto + zīmi, kas atšķirībā no matemātikas nozarē izprotamā 2+3=5, šoreiz ‘2’+’3’=’23’, elements tiek vienkārši pievienots virknes nobeigumā.
Datu konvertēšana Bieži vien ar kaut kādu virknes apgabalu ir nepieciešams veikt kādas citas darbības, piemēram, veikt ar kādu no elementiem matemātisku aprēķinu vai vienkārši pārbaudīt datu ievades precizitāti un daudz citu gadījumu. VAR SK:integer; V:string; STR(SK,V) procedūra, kas pārveido skaitlisko elementu uz virknes tipa mainīgo. Funkcijas izpildes rezultātā SK=V, bet papildus V tiek piešķirtas tiesības veikt dažādas virknes operācijas, kas nav iespējamas ar dažādām matemātikas izteiksmēm.
Datu konvertēšana VAR SK, KODS: integer; V:string; VAL(V,SK,KODS) procedūra, kas pārveido virknes elementu uz skaitlisko tipa mainīgo. Funkcijas izpildes rezultātā SK=V, bet papildus SK tiek piešķirtas tiesības veikt dažādas matemātiskās operācijas, kas nav iespējamas ar dažādām virknes operācijām, paralēli ar SK vairs nevar veikt virknes operācijas. Ne jebkurš simbols ir pārveidojams par ciparu, tāpēc talkā nāk trešais parametrs KODS, kurš kontrolē, vai elements V ir pārveidojams par ciparu. KODS = 0, ja V ir kāds no cipariem 0,1,2,3,4,5,6,7,8,9 vai kāds ciparisks salikums – skaitlis. KODS nav vienāds ar 0, ja V satur kādu nepārveidojamu elementu, piemēram, burtu K.
Piemērs ar VAL 4.uzd. Dotors piedāvā ievadīt virkni. Ja virknes elements ir cipars, izvadīt tā kāpinājumu otrajā pakāpē, pretējā gadījumā izvadīt paziņojumu – NAV CIPARS! Uses CRT; VAR V: string; i,SK,KODS: integer; Begin Write('Ievadiet virkni '); readln(V); For i:=1 to LENGTH(V) do BEGIN VAL(V[i],SK,KODS); If KODS=0 then Writeln('Kvadrats ir ',SK*SK) else Writeln('Nav cipars!') end; readln; END.
Piemērs ar VAL 5.uzd. Dotors piedāvā ievadīt skaitļu virkni. Aprēķināt virknes elementu ciparu summu. Uses CRT; VAR V: string; i,SK,KODS,SUM: integer; Begin Write('Ievadiet virkni '); readln(V); For i:=1 to LENGTH(V) do BEGIN VAL(V[i],SK,KODS); INC(SUM,SK); END; readln; END. Operators INC darbojas kā palielinātājs – INC(7,16)=7+16=23 Iepriekšējā summa tiek palielināta par nākošo ciparu!
Funkcija UPCASE Funkcijas būtība – pārveidot dotos virknes burtus par lielajiem, t.i. upcase(a) = A. Bieži ir nepieciešams salīdzināt, piemēram, šādas virknes ‘Aigars’ un ‘AiGaRs’. Mazais un lielais burts ir dažādas vērtības, tāpēc lai uzzinātu vai virknes nozīmes izlasot ir identiskas, jāpāriet uz vienādām burtu vērtībām, t.i. visus mazos burtus jāpārveido uz lielajiem. 6.uzd. Dotors piedāvā ievadīt virkni. Pārveidot virknē visus mazos burtus uz lielajiem. uses crt; var s:string; i:integer; Begin write(' Ievadi virkni :'); readln(s); For i:=1 to length(s) do write(upcase(s[i])); readln; end.
Funkcija COPY Funkcijas būtība – ļauj nokopēt kādas virknes fragmentu. COPY(virkne no kuras ņemsim datus, no kuras pozīcijas, cik ? ) 7.uzd. Dators pieprasa 10 simbolu garu virkni, izvadīt uz ekrāna otro virknes daļu sākot no 6 līdz 10 simbolam. uses crt; var s,R:string; Begin clrscr; write('Ievadi datus : '); readln(s); R:=copy(s,6,5); write(R); readln; end. Programmas darbības rezultātā no virknes ABCDEFGHYY uz ekrāna tiks izvadīta virkne FGHYY
Funkcija DELETE Funkcijas būtība – ļauj izdzēst kādu virknes fragmentu. DELETE(virkne no kuras dzēst, no kuras pozīcijas, cik ? ) 8.uzd. Dators pieprasa 10 simbolu garu virkni, izdzēst dotajā virknē 3 pirmos elementus. uses crt; var s:string; Begin clrscr; write('Ievadi datus : '); readln(s); delete(s,1,3); write(s); readln; end. Programmas darbības rezultātā no virknes Juris uz ekrāna tiks izvadīta virkne is. Īpatnība - komanda tiek lietota kā patstāvīgs operators, t.i. jaunas vērtības piešķiršana notiek procedūras vidē.
Funkcija POS Funkcijas būtība – veic fragmentu meklēšanu virknē. Darbības rezultāts ir skaitlis – vērtība, no kuras sākas atrastais fragments, ja rezultāts ir 0, tad šāda fragmenta virknē nav. POS(meklētais teksta fragments, virkne kurā tiek meklēts) 9.uzd. Dators pieprasa simbolu virkni un nosaka, kurš pēc kārtas šajā virknē ir burts a. uses crt; var v:string; r:integer; begin clrscr; readln(v); r:=pos('a',v); write(r); readln; end.
Piemērs 10.uzd. Gadās, ka datora klaviatūrai kāds no taustiņiem iesprūst un tad viena burta vietā tekstā būs vairāki vienādi, pēc kārtas esoši burti. Piemēram, vārda "klavieres" vietā var iznākt "kkkkkklaavierrrrrees". Uzrakstiet programmu, kas labo šādas kļūdas - t.i., ievadītā simbolu virknē atrod visas vietas, kurās ir vairāki vienādi simboli pēc kārtas, un katrā šādā vietā atstāj tikai vienu no šiem simboliem, bet pārējos izdzēš un virkni "sabīda kopā". Programmā ievadam izmantot tikai mazos burtus. Uzdevums no http://www.lio.lv/olimps/uzdevumi.php?show=23 Risinājuma taktika: Šajā uzdevumā var rīkoties dažādi, bet vienkāršākais veids ir nevis kopēt un dzēst virknes elementus, bet veidot jaunu virkni, kuru papildinām tikai tad, kad blakus atrodas divi dažādi elementi.
Piemēra risinājums Lai nepazaudētu pirmo virknes elementu, to uzreiz piešķiram rezultatīvajam mainīgajam. uses crt; var iev,rez:string; i:integer; begin write('Ievadi kljudaino virkni '); readln(iev); rez:=iev[1]; For i:=1 to length(iev)-1 do Begin If iev[i]=iev[i+1] then else rez:=rez+iev[i+1]; End; write(rez); readln; end. Salīdzinājumu skaits ir par vienu mazāks nekā elementu skaits, tas jāņem vērā ciklā. Ja elementi vienādi, tad nedarām neko, pretējā gadījumā jauno elementu pievienojam rezultāta virknei.