Основи на програмирање (ОП - 02)
9. НИЗИ ВО C++ Еднодимензионални низи
Низа во С++ се декларира со:
тип_на _елементите име[број_на _елементи]; Елемент на низа се претставува со:
име[индекс],
каде што индекс е број од 0 до број_на _елементи−1. Пример: Декларација на низи.
a) int a[5]; a[0], a[1], a[2], a[3], a[4] (a0, a1, a2, a3, a4)
б) const int k=5; int a[k]; в) int k=10; float s[k]; Декларацијата е погрешна: k не е константа.
1
Основи на програмирање (ОП - 02)
Индексот на елементите на некоја низа може да биде: константа, променлива или израз од целоброен тип:
c[2], c[7], c[i], c[j], c[i+j-1] итн.,
каде што i и j се целобројни променливи. Доделување вредност и иницијализација на низа a)
int a[10]; a[0]=1; a[9]=2; a[3]=-4; a[5]=1; б) int b[5]={1, -2, -3, 6, 3}; в) int c[5]={1, 2, 3}; c[0]=1; c[2]=2; c[3]=3; c[4]=0; c[5]=0; г) int nuli[100]={0};
2
Основи на програмирање (ОП - 02)
1. Иницијализација на низа со наредбата: for
Излез од програмата: Еlement Vrednost 0 0 1 0 2 0 3 0 4 0
}
#include <iostream> using namespace std; int main () { int i;
int a[5]; for (i=0; i<5; i++) a[i]=0; cout<<”Element Vrednost”<<endl; for (i=0; i<5; i++) cout<<i<<” ”<<a[i]<<endl; return 0;
3
Основи на програмирање (ОП - 02)
2. Иницијализација на низа со иницијализирачка листа
#include <iostream> using namespace std;
int main () { int b[5]={12, 34, 27, 15, 40}; int i;
cout<<”Element Vrednost”<<endl; for (i=0; i<5; i++) cout<<i<<” ”<<a[i]<<endl; return 0;
}
Излез од програмата: Еlement Vrednost 0 12 1 34 2 27 3 15 4 40
Димензијата на низа може да се дефинира автоматски преку иницијализирачката листа: a)
double b[]={2.3, 3.4, 4.5, 5.6, 6.7}; // nizata ima 5 elementi
б) char c[]={ ′a′, ′b′, ′c′}; // nizata ima 3 elementi
б) char s[5]={1, 2, 3, 4, 5, 6}; // se javuva greska
4
Основи на програмирање (ОП - 02)
3. Специфицирање должина на низа со симболичка константа
Излез од програмата: Еlement Vrednost 0 1 1 3 2 5 3 7 4 9
}
#include <iostream> #define d=5 // predprocesorska direktiva using namespace std;
int main () { int c[d]; int j;
for (j=0; j<d; j++) c[j]=2*j+1;
cout<<”Element Vrednost”<<endl; for (j=0; j<d; j++) cout<<j<<” ”<<c[j]<<endl; return 0;
Низите не можат да се доделуваат една на друга, ниту пак, да се иницијализираат една со друга.
5
Основи на програмирање (ОП - 02)
Пример: Најмал елемент во низа.
/* Najmal element vo niza */ #include <iostream> using namespace std; void main () { int i, n, min, index, a[10]; cout<<”Vnesi go brojot na elementi vo nizata n= ”;
cin>>n; for (i=0; i<d; i++)
{ cout<<”a[”,i,”]= ”; cin>>a[i]; }
min=0; index=0; for (i=1; i<n; i++)
{ if (a[i]<min)
{ min=a[i]; index=i;
} }
cout<<”Najmaliot element vo nizata e so indeks: ”<<index<<endl;
}
6
Основи на програмирање (ОП - 02)
Пример: Од низата цели броеви а1, а2, ... , аn, да се издвојат во посебни низи парните и непарните елементи.
/* Nizi od parni i neparni broevi */
#include <iostream> #define n=10 using namespace std;
int main () { int i, p=0, q=0, a[n], b[n], c[n]; for (i=0; i<n; i++)
{ cout<<”a[”,i,”]= ”; cin>>a[i]; if (a[i] % 2= = 0) { p++; b[p]=a[i]; } else { q++; c[q]=a[i]; }
} for (i=0; i<n; i++) cout<<b[i]; cout<<endl;
for (i=0; i<q; i++) cout<<c[i]; cout<<endl; }
7
Основи на програмирање (ОП - 02)
Пример: Да се пресмета збирот на елементите на низата [ai]10 што се деливи со 3. Елементите на низата се зададени преку иницијализирачка листа.
/* Zbir na elementi na niza */
#include <iostream> #define n=10 using namespace std;
int main () { int a[n]={1, 3, 6, 10, 15, 21, 28, 36, 45, 55} int i, suma=0;
for (i=0; i<n; i++) { if (a[i] % 3 = = 0)
suma+=a[i]; }
cout<<”Sumata na elementite na nizata e: ”<<suma<<endl; return 0; }
8
Основи на програмирање (ОП - 02)
Дводимензионални низи
Низа во С++ се декларира со:
тип_на _елементите име[димензија1][димензија2];
каде што е прва димензија1 димензија, а димензија2 е втора димензија. Низата има вкупно димензија1 × димензија2 елементи. Елемент на дводимензионална низа се претставува со:
име[индекс1, индекс2],
каде што:
индекс1 е број од 0 до димензија1−1, а индекс2 е број од 0 до димензија2−1. Пример: Декларација на низи.
a) int a[3][4];
a0,0 a0,1 a0,2 a0,3a1,0 a1,1 a1,2 a1,3a2,0 a2,1 a2,2 a2,3
9
Основи на програмирање (ОП - 02)
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
б) Димензиите на низата можат да се зададат и преку константи: const int m=5; const int n=5; int a[m][n]; в) int m=5; int n=5; float b[m][n]; Декларацијата е погрешна: m и n не се константи. Индексите на елементите на некоја низа можат да бидат: константи, променливи или изрази од целоброен тип:
c[2][3], c[7][i], c[i][j+2, c[j][i+j], c[i+j-1][j-i+1] итн.,
каде што i и j се целобројни променливи.
10
Основи на програмирање (ОП - 02)
Доделување вредност и иницијализација на низа a) Наредба за доделување:
float a[2][2]; a[0][0]=1.0; a[0][1]=2.0; a[1][0]=3.0; a[1][1]=4.0;
б) Декларирање со иницијализирачка листа: int b[2][3]={1, -2, -3, 6, 3,5}; // (доделувањето е по редици)
еквивалентно е со:
int b[2][3]={{1, -2, -3},{6, 3,5}};
в) Со
int b[2][3]={{1},{6}};
се иницијализираат само елементите: b[0][0]=1 и b[1][0]=6, а останатите елементи добиваат вредност 0.
в) Со
int b[2][3]={1, -2, -3};
се иницијализираат само елементите од првата редица: b[0][1]=1, b[0][2]=-2 и b[0][3]=-3, а останатите елементи добиваат вредност 0.
11
Основи на програмирање (ОП - 02)
Пример: Иницијализација на дводимензионални низи:
#include <iostream> using namespace std; void main () { int i,j; // brojaci na redici i koloni
int a[2][3]={{1,2,3},{4,5,6}}; cout<<”Nizata a e inicijalizirana”<<endl; int b[2][3]; cout<<”Vnesi ja nizata b:”<<endl; for (i=0; i<=1; i++) { for (j=0; j<=2; j++) cin>>b[i][j]; }
12
Основи на програмирање (ОП - 02)
Излез: cout<<”\n\nPecatenje na nizite:”<<endl;
cout<<”\nPecatenje na nizata a:”<<endl; for (i=0; i<=1; i++) { for (j=0; j<=2; j++) cout<<a[i][j]<<” ”; cout<<endl; // odi na nov red } cout<<”\nPecatenje na nizata b:”<<endl; for (i=0; i<=1; i++) { for (j=0; j<=2; j++) cout<<b[i][j]<<” ”; cout<<endl; // odi na nov red }
Nizata a e inicijalizirana Vnesi ja nizata b: 6 5 4 3 2 1 Pecatenje na nizite: Pecatenje na nizata a: 1 2 3 4 5 6 Pecatenje na nizata b: 6 5 4 3 2 1
13
Основи на програмирање (ОП - 02)
Пример: Таблица множење i×j (i,j=1, ... , n (1<n<10)) по модул n.
#include <iostream> using namespace std; void main () { int i,j,n; int tab[10,10]
cout<<”Vnesi broj n (1<n<10)”<<endl; cin>>n;
for (i=1; i<=n; i+=1) for (j=1; j<=n; j+=1) tab[i][j]=i*j % n;
cout<<”Tablica mnozenje po modul:”<<endl;
for (i=1; i<=n; i+=1) { cout<<i<<” ”; for (j=1; j<=n; j+=1) cout<<tab[i][j]<<” ”; cout<<endl; }
}
Излез: 5 1 1 2 3 4 0 2 2 4 1 3 0 3 3 1 4 2 0 4 4 3 2 1 0 5 0 0 0 0 0
14
Основи на програмирање (ОП - 02)
Tекстуални низи (стрингови) Основни карактеристики на стринговите:
• се запишуваат во апострофи, • секој знак има индекс, почнувајќи од 0 (од лево кон десно), • должината на стрингот е еднаква на бројот на знаци. Пример:
“Skopje” “A” “” // Prazna tekstualna niza
Во С++ стринговите завршуваат со “\0”. Притоа, во должината на стрингот не се смета знакот за крај “\0”. Текстуалните низи се декларираат со резервираниот збор char:
char ime(10);
15
Основи на програмирање (ОП - 02)
Доделување вредност на стринг:
1. Иницијализација на стринг со доделување на текстуална константа:
char drzava[10]=”MAKEDONIJA”
M A K E D O N I J A \0 0 1 2 3 4 5 6 7 8 9 10
char ime[]=”MARIJA”
M A Р И Ј А \0 0 1 2 3 4 5 6 2. Иницијализација на стринг со иницијализаторска листа:
char grad[]={′O′,′h′,′r′,′i′,′d′,′\0′} 3. Доделување вредности на елементите на стринг: char grad[5];
grad[0]=′O′; grad[1]=′h′; grad[2]=′r′; grad[3]=′i′; grad[4]=′d′; grad[5]=′\0′;
16
Основи на програмирање (ОП - 02)
Со елементите на стринговите се вршат исти операции како со знаците, при што можат да се користат релационите оператори:
= = еднакво <> различно < помало > поголемо <= помало или еднакво >= поголемо или еднакво Пример:
if (grad[0]= = ′O′ || grad[0]= = ′o′) cout<<”Imeto na gradot zapocnuva so bukvata o”; Забелешка: Разлика помеѓу знаковните константи “O” и ′O′.
“O” има големина од два бајти (опфаќа два знака, заедно со знакот за крај ′\0′) ′O′ има големина од еден бајт
17
Основи на програмирање (ОП - 02)
Читање и печатење стрингови Кога се внесува стринг со cin се наведува само името. Вчитувањето се врши до првиот бланко знак. Пример: Што ќе се добие како излез од следнава програма во С++, ако се внесе текстот: eden dva tri. #include <iostream> using namespace std; main () { char vlez[]=”Vnesi string: ”, tekst[100]; cout<<vlez; cin>>tekst;
cout<<tekst<<endl; } Vnesi string: eden dva tri eden
18
Основи на програмирање (ОП - 02)
Ако треба да се вчита стринг што содржи и бланко знаци се користи функцијата: getline(): Пример: Што ќе се добие како излез од следнава програма во С++, ако се внесе текстот: eden dva tri. #include <iostream> using namespace std; main () { char vlez[]=”Vnesi string: ”, tekst[100]; cout<<vlez; cin.getline(tekst, 100);
cout<<tekst<<endl; } Vnesi string: eden dva tri eden dva tri
19
Основи на програмирање (ОП - 02)
Пристап до поедините елементи на стринг Стринговите може да се обработуваат како и било која друга низа. Притоа, треба да се внимава секогаш еден елемент од полето да има вредност ′\0′ или 0. Пример: Внесување на стринг знак по знак.
#include <iostream> using namespace std; main () { char tekst[100]; int n; cout<<”Vnesi go brojot na znaci vo stringot: ”; cin>>n; for (int i=0; i<n; i++) cin>>tekst[i]; tekst[n]=′\0′; // ili tekst[n]=0;
cout<<tekst<<endl; }
Излез: Vnesi go brojot na znaci vo stringot: 5 a b c d e abcde
20
Основи на програмирање (ОП - 02)
Функции за работа со стрингови и знаци Некои функции од стандардната библиотека на С++ за работа со стрингови:
strlen(s) − одредување должина на стринг, strcat(s1,s2) − спојување на стринговите s1 и s2, strcpy(s1,s2) − копирање на стрингот s1 во стрингот s2, strcmp(s1,s2) − споредување на стринговите s1 и s2. Некои функции од стандардната библиотека на С++ за работа со знаци:
isalpha(ch) − Враќа true ако ch е алфабетски знак, во спротивно false. (aлфабетски знаци се: а .. z и A .. Z) isupper(ch) − Враќа true ако ch е голема буква. Враќа false ако ch не е алфабетски знак. islower(ch) − Враќа true ако ch е мала буква. Враќа false ако ch не е алфабетски знак. isdigit(ch) − Враќа true ако ch е cifra: 0 .. 9, во спротивно false.
toupper(ch) – Kонверзија на мала буква ch во голема. tolower(ch) – Kонверзија на голема буква ch во мала.
21
Основи на програмирање (ОП - 02)
Пример: Примена на функции за работа со стрингови.
#include <iostream> using namespace std; main () { char str1[]=”prv”,
str2[]=”vtor”, str3[30];
strcpy(str3, str1); // kopiraj go str1 vo str3 strcat(str3, str2); // spoj gi str3 i str2 vo str3 strcat(str3, “tret”); // spoj gi str3 i “tret” vo str3
cout<<str3<<” ima dolzina: ”<<strlen(str3)<<endl; }
Излез: Prvvtortret ima dolzina: 11
22
Основи на програмирање (ОП - 02)
Пример: Да се провери дали некој збор е палиндром. aлгоритам Палиндром; почеток печати “Внеси збор: ”; читај zbor; n←dolzina(zbor); i←0; повторувај tocno←zbor[i]= =zbor[n-i-1]; i←i+1; додека (tocno) и (i<[n/2]); ако tocno тогаш печати “Зборот е палиндром”; инаку печати “Зборот не е полиндром”; крај_ако {tocno} крај {Палиндром}
23
Основи на програмирање (ОП - 02)
Програма во С++: #include <iostream> using namespace std; main () { char zbor[50];
int i, n; bool tocno; cout<<”Vnesi zbor: ”; cin>>zbor; n=strlen(zbor); i=0; do { tocno=(zbor[i]= =zbor[n-i-1]); i++; } while ((tocno && (i<=(n/2))); if (tocno)
cout<<”Zborot e polindrom”<<endl; else cout<<”Zborot ne e polindrom”<<endl;
}
24
Основи на програмирање (ОП - 02)
Пример: Малите букви од даден текст да се претворат во големи. aлгоритам ГолемиБукви; почеток печати “Внеси текст: ”; читај tekst; n←dolzina(tekst); за i←0 до n-1 чекор 1 ако MalaBukva(tekst[i]) тогаш
tekst[i]=GolemaBukva(tekst[i]); крај_ако {MalaBukva(tekst[i])} крај_за {i} печати tekst; крај {ГолемиБукви}
25
Основи на програмирање (ОП - 02)
Програма во С++:
#include <iostream> using namespace std; main () { char tekst[100]; cout<<”Vnesi tekst: ”; cin>>tekst; int n=strlen(tekst); for (int i=0; i<n; i++) if (islower(tekst[i])) tekst[i]=toupper(tekst[i]);
cout<<tekst<<endl; }
Излез: Vnesi tekst: abcdEfG ABCDEFG
Дали некој знак е мала буква?
If (znak>=′a′ && znak<=′z′)
26
Основи на програмирање (ОП - 02)
27