You are on page 1of 26

25.10.

2010

Аудиториски вежби 6
Текстуални низи - стрингови

Пример за едноставни програми

 Да се испечати ”Zdravo” на излез

 Да се најде (да се испечати) збирот


на два броја внесени од корисникот

1
25.10.2010

Решение на втората програма


Со ова сме декларирале две
int x; променливи кои ќе може да ја
памтат вредноста на два цели
int y; броја

 Потоа, две наредби за читање на x и y


 Потоа, пресметување на резултатот со
наредба како: z=x+y;
 Внимавајте, пред извршување на оваа
наредба z исто така треба да го
декларираме
 На крај, во програмата ќе ставиме наредба
за печатење на z и сме завршиле

Декларирање на променливи
double r; (или float r;)
char c;
 Низа од променливи:
 ако сакаме да ги запаметиме броевите кои ќе
бидат извлечени во едно бинго-извлекување, а
воопшто и не знаеме колку може да има (секоја
недела е различно)
 наместо да смислуваме 30, 40 или 10000
различни имиња на променливи, само
пишуваме:
int bingo[10000];

2
25.10.2010

Добивка од користење на низа


Едноставно внесување со
еден for циклус

for(i=0; i<10000; i++)


cin>>bingo[i];

Што е стринг?

 Стринговите претставуваат било каква


комбинација од знаци (букви, _, *, ...) во кои
влегува и празното место

 стрингот е низа од знаци


char ime[20];

3
25.10.2010

Доделување на вредност на стринг


ime[0]=’M’;
ime[1]=’a’;
ime[2]=’k’;
ime[3]=’e’;
ime[4]=’d’;
ime[5]=’o’;
ime[6]=’n’;
ime[7]=’k’;
ime[8]=’a’;

Доделување на вредност на стринг (2)


 треба да го напишеме и следново
ime[9]=0;
или
ime[9]=’\0’;

 Ова се прави за да се одбележи крајот на


стрингот

4
25.10.2010

Доделување на вредност на стринг (3)


 Друг начин на доделување вредност на
стринг (иницијализација при декларирање)
char ime[]=”Andrijana”;
char ime[15]=”Aleksandar”;
 Во овој случај ‘\0’ се додава автоматски на
крајот на стрингот
 Внимавајте: ова е дозволено само при
иницијализација. Не е дозволено
доделувањето:
ime = ”Andrijana
Andrijana”;
”;

Визуелно претставување на
зафатената меморија
 Со извршување на
char ime[20]
 во меморијата се креира следниот
мемориски простор за стрингот ime:

 Со првото извршено доделување добиваме:

М а k е d o n k a 0

5
25.10.2010

Нетерминиран стринг
#include <iostream>
using namespace std;
void main ()
{
char str[100] ;
str[0]='S';
str[1]='k';
str[2]='o';
str[3]='p';
str[4]='j';
str[5]='e';
cout << str;
}
Skopje╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠└

Коректен изглед на претходната


програма
#include <iostream>
using namespace std;
void main ()
{
char str[100] ;
str[0]='S';
str[1]='k'; или str[6]=0;
str[2]='o';
str[3]='p';
str[4]='j';
str[5]='e';
str[6]='\0';
cout << str;
}

6
25.10.2010

Читање и прикажување на стринг


 За да прикажеме на екран даден стринг
(на пример ime), доволно е да напишеме:
cout << ime;

 При читањето на даден стринг, ако


користиме стандарден поток за влез (cin) се
соочуваме со проблемот на празното
место

Читање на стрингови - пример

#include <iostream>
using namespace std;
void main()
{
char ime[20];
cin >> ime;
cout << "imeto e: " << ime;
cin >> ime;
cout << "Vtoroto ime e: " << ime;
}

Ana-Marija
imeto e: Ana-Marija
Ana Marija
Vtoroto ime e: Ana

7
25.10.2010

Ако користиме cin.getline()

#include <iostream>
using namespace std;
void main()
{
char ime[20];
cin.getline(ime, 20);
cout << "imeto e: " << ime << endl;
}
Аna Marija Trajkova
imeto e:
Аna Marija Trajkova

 Што ќе се случи ако внесеме Ana Marija Trajkovska?

Добивање на знак од стрингот


 За да добиеме само еден знак од
стрингот, користиме ime[i];
 Со i ја дефинираме позицијата на
знакот во стрингот
 Ако ime=“Portokal” тогаш,
со ime[3]
ја добиваме буквата ‘t’
 Внимавајте: за индексите броиме од
нула!

8
25.10.2010

Приказ на стринг буква по буква

void main()
{
char ime[20];
int i=0;
cin.getline(ime,20);
while (ime[i]!=0)
{
cout << ime[i];
i++;
}
} Аna Marija Trajkova

Приказ на дел од стринг


 Приказ на подолг стринг од 3-та до 7-ма позиција

void main()
{
char ime[20];
int i=2;
cin.getline(ime,20);
while (i<7)
{
cout << ime[i];
i++;
}
} Kazablanka
zabla

9
25.10.2010

Менување на дел од стринг


cout << ime[3];
 Ако ime=”TREBA”, На излез: B
 Ако пред прикажување на стрингот
ставиме: ime[3]=’V’;
 Со: cout << ime;
на излез: “TREVA” наместо “TREBA”

Должина на стринг

void main()
{
char ime[20];
int i=0;
cin.getline(ime,20);
while (ime[i]!=0) i++;
cout << i;
}

Аna Trajkova
12

 Има и полесен начин!

10
25.10.2010

Функција strlen()
void main()
{
char ime[20];
int i=0;
cin.getline(ime,20);
while (ime[i]!=0) i++;
cout << "Dolzhinata e: " << i <<"\n";
cout << "Dolzhinata e i: " << strlen(ime);
}

Аna Trajkova
Dolzhinata e: 12
Dolzhinata e i: 12

Приказ на дел од стринг


 Приказ на стринг од 3-та до 7-ма позиција

тука кажуваме да се почне од


void main() трета позиција
{
char ime[20];
int i=2;
cin.getline(ime,20); тука кажуваме да се заврши
while (i<7&&i<strlen(ime)) пред осмата позиција или со
{ завршувањето на стрингот
cout << ime[i];
i++;
}
} Kazan
zan

11
25.10.2010

Поминување низ стринг


 Поминувањето низ стринг всушност
претставува достап до секој знак
поединечно со можност за негова промена

 Во продолжение се дадени неколку


примери

Пример 1
void main()
{
char ime[20];
int i=0;
cin.getline(ime,20);
while (ime[i]!=0)
{
ime[i]=toupper(ime[i]);
i++;
}
cout << ime;
}
rabota
RABOTA

 Функција toupper() !

12
25.10.2010

Пример 2

void main()
{
char ime[20];
cin.getline(ime,20);
ime[1]=toupper(ime[1]);
cout << ime;
}
marija
???????

 Што работи програмата сега?

Пример 3
void main()
{
char ime[20];
int i=0;
cin.getline(ime,20);
while (ime[i]!=0)
{
if (islower(ime[i]))
ime[i]=toupper(ime[i]);
else
ime[i]=tolower(ime[i]);
i++;
Ratko%
}
rATKO%
cout << ime;
}

 Функции islower() и tolower()и isupper()

13
25.10.2010

Функции strcpy,strcat и strcmp


 Не може: ime
ime1=
1=ime
ime;
 strcpy :
strcpy (стринг rez, стринг izv);
Ја копира содржината од izv во rez. Го враќа rez
 strcat :
strcat (стринг rez, стринг izv);
Ја додава содржината на izv во продолжение на
rez. Го враќа rez
 strcmp :
int strcmp(стринг string1, стринг string2);
Ги споредува стринговите string1 и string2. Враќа
0 ако двата стринга се еднакви

Пример 4
void main()
{
char ime[20];
char prezime[20];
char celo_ime[40];
cout << "Vnesi go tvoeto ime:" << endl;
cin.getline(ime,20);
if (strcmp(ime,"Aleksandar")==0)
cout << "Ti se vikash isto kako mene." << endl;
cout << "Vnesi go tvoeto prezime:" << endl;
cin.getline(prezime,20);
if (strcmp(prezime,"Ilievski")==0)
cout <<"Ti se prezivash kako i jas." <<endl;

14
25.10.2010

Пример 4 (прод.)

strcpy(celo_ime, ime);
strcat(celo_ime," ");
strcat(celo_ime, prezime);

cout << "Tvoeto polno ime e “;


cout << celo_ime << endl;
}
Vnesi go tvoeto ime:
Aleksandar
Ti se vikash isto kako mene.
Vnesi go tvoeto prezime:
Markov
Tvoeto polno ime e Aleksandar
Markov

15
25.10.2010

Задача 1
 Да се провери дали еден збор е
палиндром?

 Објаснување. Палиндром е збор кој се чита


исто и од лево и од десно

Решение
void main()
{
char zbor[40];
bool tocno;
int n,
i=0;
cout << "Vnesete go zborot:";
cin >> zbor;
Vnesete go
n=strlen(zbor); zborot:abrakadabra
zborot:anasana
do Zborot ne e
e palindrom
{ palindrom
tocno=(zbor[i]==zbor[n-i-1]);
i++;
} while((tocno)&&(i<=(n/2)));
if (tocno)
cout<<"Zborot e palindrom"<<endl;
else
cout<<"Zborot ne e palindrom"<<endl;
}

16
25.10.2010

Задача 2
 Се внесува една SMS порака збор по збор

 Да се испечати целата SMS порака

 Ако пораката е подолга од 160 знака се


печати само дека пораката не може да се
прати

Решение
int main()
{
char zbor[30];
char poraka[161];
int dolzhina;
strcpy(poraka,"");
cout << "Vnesuvaj zbor po zbor.“;
cout << " Za kraj vnesi string so edno prazno mesto
\n";
cin.getline(zbor,30);

17
25.10.2010

Решение (прод.)
dolzhina=0;
while((strcmp(zbor,” ")!=0) &&(dolzhina<=160))
{
dolzhina+=strlen(zbor)+1;
strcat(poraka," ");
strcat(poraka, zbor);
cin.getline(zbor,30);
}
if (strlen(poraka)>160)
cout << "Porakata ne mozhe da se prati." <<
endl;
else
cout << poraka ;
return 0;
}

Задача 3
 Дадена е една SMS порака која се
состои само од букви, од празни места
и точки
 За секоја буква знаеме колку пати треба
да кликнеме на тастатурата на
мобилниот телефон за да ја добиеме
 Да се пресмета колку кликања се
потребни за да се истипка на мобилен
телефон дадената порака

18
25.10.2010

 Пораката ќе се типка на следната тастатура:


 Копче 1: празно место, цифра 1;
 Копче 2: A,B,C, цифра 2;
 Копче 3: D,E,F, цифра 3;
 Копче 4: G,H,I, цифра 4;
 Копче 5: J,K,L, цифра 5;
 Копче 6: M,N,O, цифра 6;
 Копче 7: P,Q,R,S, цифра 7;
 Копче 8: T,U,V, цифра 8;
 Koпче 9: W,X,Y,Z, цифра 9;

 Koпче *: нема знаци на ова копче;


 Kопче 0: 0, интерпукц. знаци . , ? !
 Копче #: нема знаци на ова копче;

Решение

void main()
{
char poraka[161];
int klik=0;

cout <<"Vnesi ja porakata,Mozhesh da koristish”;


cout <<“golemi bukvi, prazno mesto i tochka.“;
cout << endl;
cin.getline(poraka,160);

int i=0;

19
25.10.2010

while (poraka[i]!=0) case 'B':


{ case 'E':
switch (poraka[i]) case 'H':
{ case 'K':
case 'A': case 'N':
case 'D': case 'Q':
case 'G': case 'U':
case 'J': case 'X':
case 'M': case '.':
case 'P': klik+=2;
case 'T': break;
case 'W':
case ' ':
klik++;
break;

case 'C':
case 'F':
case 'I':
case 'L':
Vnesi ja porakata.
case 'O':
Mozhesh da koristish
case 'R':
golemi bukvi, prazno
case 'V':
mesto i tochka.
case 'Y':
ANA I MARKO SE
klik+=3;
DRUGARI.
break;
Potrebni se 42
case 'S':
klikanja za da se
case 'Z':
ispishe porakata
klik+=4;
break;
}
i++;
}
cout << "Potrebni se " ;
cout << klik <<”klikanja”;
cout <<”za da se ispishe porakata”;
cout << endl;
}

20
25.10.2010

Задача 4
 Во царството на МОН имале еден чуден
јазик

 Таму сите зборови се кажувале обратно од


зборовите на нашиот македонски јазик

 Да се напише програма која за даден збор


на нашиот јазик, ќе го напише зборот на
МОН јазикот

Решение
void main()
{
char zbor[30];
int i;
cout << "Vnesi eden zbor od nashiot jazik";
cout << endl;
cin.getline(zbor,30);

cout << "Na MON jazikot toa se vika " ;


for(i=strlen(zbor)-1; i>=0; i--)
cout << zbor[i];
cout << endl;
} Vnesi eden zbor od
nashiot jazik
vodovod
Na MON jazikot toa se
vika dovodov

21
25.10.2010

Задача 5
 Некој професор дури предавал многу
често употребувал даден збор кој се
случувало да го каже и по неколку пати
во една реченица
 За даден текст (не подолг од 500 букви) и
даден збор, да се најде колку пати тој
збор се појавува во текстот
 Ако тој збор се случи да се содржи и во
некој друг збор, треба да се изброи и
тоа појавување

Решение
void main()
{
char tekst[500];
char zbor[30];
int i,j, dolzhina, pojavuvanja=0;
cout << "Vnesi go tekstot shto go kazhal profesorot“;
cout << endl;
cin.getline(tekst,500);
cout << "Vnesi go zborot shto se povtoruva"<< endl;
cin.getline(zbor,30);
for(i=0; i<(strlen(tekst)-strlen(zbor)+1); i++)
{
dolzhina=0;
for (j=0; j<strlen(zbor); j++)
if ( tekst[i+j] == zbor[j] ) dolzhina++;
if ( dolzhina == strlen(zbor) ) pojavuvanja++;
}
cout<<"Zborot se pojavuva "<<pojavuvanja<<" pati.”<<endl;
}

22
25.10.2010

Проблем!
 Имаме текст “na bababa taraba.” и го
бараме зборот “baba”

 Горната програма ќе покаже дека има две


појавувања на зборот “baba” и тоа “na
bababa taraba.” и “na bababa taraba.”

 Решението следи

Решение
void main()
{
char tekst[300];
char zbor[30];
int i,j, dolzhina, pojavuvanja=0;

cout << "Vnesi go tekstot "<< endl;


cin.getline(tekst,300);
cout << "Vnesi go zborot shto se povtoruva"<< endl;
cin.getline(zbor,30);
for(i=0; i<(strlen(tekst)-strlen(zbor)+1); i++)
{
dolzhina=0;
for (j=0; j<strlen(zbor);j++)
if (tekst[i+j]== zbor[j]) dolzhina++;

23
25.10.2010

Продолжува решението

if (dolzhina==strlen(zbor))
{
pojavuvanja++;
i+=strlen(zbor)-1;
}
}
cout << "Zborot se pojavuva ";
cout << pojavuvanja<< "pati." <<endl;
}

Домашни задачи
 За даден стринг, сите појавувања на буквата
‘b’ да се заменат со ‘p’
 Пример,
за даден влез Ljubcho, да се даде на излез
Ljupcho

24
25.10.2010

Домашни задачи (2)


 Се внесуваат 5 збора, еден по еден
 Зборовите содржат само букви или цифри, но
не се знае дали буквите се големи или мали
 Од нив да се состави реченица (која ќе ги
содржи зборовите по дадениот редослед) која
ќе започнува со голема буква, сите останати ќе
бидат мали букви и на крај ќе завршува со
точка

Пример

Влез Излез
Toj
Si Тoj si kupi 10 kilogrami.
kupI
10
kiloGRAMI

25
25.10.2010

Домашни задачи (3)


 Да се напише програма која дадена
реченица ќе ја преведе во МОН јазикот

 Се знае дека секоја реченица се состои од


неколку збора одделени со празни места и
на крај завршува со еден интерпункциски
знак

Пример

Влез Излез

Aj site na svadbata. jA etis an atabdavs.

 Програмата треба да ги издвои зборовите,


еден по еден, да го преврти секоj збор и еден
по еден да ги слепи во нова реченица

26

You might also like