Странице

уторак, 11. фебруар 2014.

Programiranje 108: Reči i Stringovi

Reč (ili ubuduće String) je niz karaktera. Stringovi se koriste da bi menjale rečenice, recimo menjanje slova. Radi korišćenja stringova mora da se doda još jedna biblioteka, "string":

#include <string>

Uz sam niz karaktera dolazi i niz različitih funkcija. String deklerišemo kao bilo koju drugu promenljivu:

string rec;

Hajde sad malo da menjamo string. Recimo da smo uneli jednu dugu rečenicu ali onda primetimo da je neko slovo pogrešno. Učitali smo reč "popocatlpetl" a treba da bude "popocatepetl" primetite da je osmo slovo "l" promašeno i treba da bude "e". Napravićemo opšti slučaj da za učitan string, učitaćemo indeks slova koje ćemo promeniti i slovo kojim ćemo promeniti. Pošto sam rekao da je string niz karaktera možemo samo napisate: s[i]=karakter, gde je karakter bilo koja vrednost između 0 i 255.

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int i;
char c;
cin>>s>>i>>c;
s[--i]=c;
cout<<s<<endl;
}

Kao što vidite učitavanje stringa je jednostavno, kao i bilo koja druga promenljiva. Stringovi imaju razne funkcije, jedna od najkorišćenijih jeste length i koristi se ovako: s.length(). Ako string ima 10 karaktera onda je s.length()=10. Još jedna korisna funkcija jeste append, koristi se za dodavanje delova na razne načine:

string s1,s2;
cin>>s1>>s2;
s1.append(s2,3,2);//Dodaje deo stringa s2 od indeksa 3+1 dužine 2 na string s1.
s1.append(s2.begin()+6,s2.end());//Dodaju se karakteri stringa s2 od 1+6-tog do kraja na s1.
cout<<s1<<endl;

Recimo da unesemo: "Science Madness" (bez navodnika). Prvo dodajemo od 3+1=4-tog dužine 2, odnosno 4+2=6-og, a to je: "ne". Onda dodajemo od 6+1=7-og do kraja, a to je: "ss". I naš string s1 izgleda: "Scienceness". Hajde da se bacimo na naešto interesantno, na primer proveravanje da li je string palindrom. Prvo da vidimo šta je palindrom. Palindrom je reč (ili rečenica) koja može da se čita sa leve i sa desne strane, a da zvuči isto, recimo "radar". Hajde da uzmemo najjednostavniji prilaz, da nadjemo prvo odstupanje od pravila.

string s;
bool pal(true);
cin>>s;
for(int i=0; i<s.length()/2-1; i++)
{
if(s[i]!=s[s.length()-1-i])
{
pal=false;
break;
}
}
if(pal)cout<<"Palindrom\n";
else cout<<"Nije palindrom\n";

Wow. Dakle uzimimo primer "radar": Na početku je pal=true. i=0 i s[i]=s[0]='r', s[s.length()-1-i]=s[5-1-0]=s[4]='r', uslov da nisu jednak nije ispunjen. i=1 s[i]=s[1]='a', s[s.length()-1-i]=s[5-1-1]=s[3]='a', opet uslov nije ispunjen i pal ostaje da bude true. Na kraju samo proveravamo dali je pal ostalo true odnosno da li je palindrom. Hajde da uzmemo neki drugi primer, recimo "izvodi". i=0 i s[i]=s[0]='i', s[s.length()-1-i]=s[6-1-0]=s[5]='i' i uslov nije ispunjen, prelazimo dalje na i=1, s[i]=s[1]='z', s[s.length()-1-i]=s[6-1-1]=s[4]='d' i sada je uslov ispunjen, pal=false dakle nije palindrom i onda prekidamo for-petlju. Jedna važna stvar koja je povezana sa karakterima (samim tim i stringova) je njihova vrednost. Svaki karakter ima svoju ASCII vrednost i ona se postiže tako što napišete (int)c, gde je c karakter. Recimo (int)'a'=97 ili (int)'0'=48.
O stringovima više nema što šta da se priča, Ako želite da vidite još funkcija možete pogledati ovde. Naravno za usavršavanje znanja iz stringova treba vežba:

  1. Napišite program koji za unetih n stringova (učitati n takođe) pravi novi string koji se sastoji od karaktera parnih indeksa unetih karaktera (npr."ovo", "su", "reci" ispisuje "oosrc")
  2. Napišite program koji za unetih n stringova proverava koji je leksikografski prvi.
  3. Napišite program koji uzima koordinate tačke (x,y,z) i odrežuje nove preko komandi iz stringa s ('u'-gore, 'd'-dole, 'l'-levo, 'r'-desno, 'f'-napred (z se povećava), 'b'-nazad (z se smanjuje).
  4. Napišite funkciju koja za uneti string vraća taj string pročitan sa suprotne strane (npr. "science" -> "ecneics")
  5. Napišite program kojim se za uneti string računa zbir svih brojeva u njemu (npr. za "broj1nije2niti" bi ispisalo 3).
  6. Napišite funkciju koja svako veliko slovo pretvara u malo, a malo u veliko (npr. "ScIeNcE" -> "sCiEnCe".

Rešenja prethodnog domaćeg:

/*1*/
int faktoriel(int n)
{
if(n==1)return 1;
else return n*faktoriel(n-1);
}

/*2*/
int trougao(int n)
{
if(n==1)return 1;
else return n+trougao(n-1);
}

/*3*/
#include <iostream>
using namespace std;
int n,a[100];
int min(int m, int i)
{
if(i<n)
{
int t=min(m,i+1);
if(a[i]<t)return a[i];
else return t;
}
else return 99999;
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
cout<<min(a[0],0);
}

Нема коментара:

Постави коментар