Saturday, March 17, 2012

Массив

Массив
Ижил төрлийн элементүүдийн төгсгөлөг тооны цуглуулгыг массив гэнэ. Массивыг дотор нь шугаман массив, тэгш өнцөгт массив, олон хэмжээст массив гэж 3 хуваана.
Тэгвэл Си хэлэнд, энгийн өгөгдлүүдээр нийлмэл өгөгдлийг бүтээж болно. Нийлмэл өгөгдлүүд гэдэгт массив, бүтэц, нэгдэл, файл гэх мэтийг хамааруулдаг. Эдгээрээс массивыг авч үзье.
Массив (array) гэдэг нь нэгэн ижил төрлийн, олон тооны энгийн өгөгдлийн нэгдэл юм. Массив нь нэртэй (name of array) байна. Ө.х. массивын хувьд, нэг нэрэнд нэгээс олон адил төрлийн энгийн өгөгдөл харгалздаг ажээ. Энэ утгаараа нийлмэл өгөгдөл болно.
Массивын бүрдэлд орогч тухайн нэг өгөгдлийг массивын элемент гэнэ. Элементүүд бүгд дугаарлагдсан байна. Элементийн дугаарыг индекс (index) гэнэ. Индекс нь 0-ээс эхлэн тоологдоно.
Массив нь ямар ач холбогдолтой вэ? Их хэмжээний мэдээлэл, төрөл бүрийн статистик өгөгдлийг боловсруулах програмд массив ашиглах нь тун тохиромжтой байдаг.
Массив нь математикийн нэгэн чухал ойлголт болох матрицыг програмчлалын хэлэнд илэрхийлдгээрээ онцгой ач холбогдолтой юм.
C/C++ хэлэнд массивыг статик болон динамикаар зохион байгуулж болно.
Санамж: C/C++ хэлэнд массивыг 0-ээс эхэлж дугаарлана.C/C++ хэлэнд массивыг статик болон динамикаар зохион байгуулж болно.
Санамж: C/C++ хэлэнд массивыг 0-ээс эхэлж дугаарлана.
Массивын төрлүүд, хэлбэрүүд
Массив нь нэгэнт өгөгдөл учраас аль нэг үндсэн өгөгдлийн төрөлд хамаарах ёстой. Энэ нь түүний элементийн төрлөөр тодорхойлогдоно. Тиймээс: бүхэл төрлийн массив (элементийн төрөл нь char, unsigned char, short, unsigned short, int, unsigned int, long int, unsigned long г.м.-ийн аль нэг)бодит төрлийн массив (элементийн төрөл нь float, double,long double г.м.-ийн аль нэг)гэсэн төрлүүд байх нь ээ.Массив нь нэгэнт өгөгдөл учраас тогтмол ба хувьсагч гэж бас хуваагдана. Тогтмол массивт нэг удаа утга оноосон бол програмын явцад дахиж утгыг нь өөрчлөх боломжгүй. Харин хувьсагч массивт хэдэн ч удаа утга оноож болно.
Массивын урт ба хэмжээс
Массивын элементүүдийн тоог массивын урт (length) гэдэг. Компьютерын санах ойн багтаамжаас хамаараад хэрэглэгч ямар ч урттай массив зарлаж болно. Жишээлбэл бүхэл intтөрлийн 5 гэсэн урттай массив зарлалаа гэвэл түүний санах ойд эзлэх зай нь 10 байт болно. Учир нь int төрлийн нэг энгийн элемент 2 байт болдог, тиймээс 5*2=10 болж байгаа юм. Үүнтэй адил зарчмаар, хэрэв бодит float төрлийн 20 гэсэн урттай массив зарлавал, нэг энгийн float төрлийн элемент 4 байт авах учраас 20*4=80 байт зай эзлэх ажээ.
Массивын хэмжээс гэдэг нь арай өөр ойлголт. Логикийн хувьд массив нь шулуун, эсвэл “тэгш өнцөгт”, эсвэл “параллелипипед” гэх мэт геометрийн ямар төсөөллийг бүрдүүлж буйгаас нь хамааруулаад нэг хэмжээст (1D - one dimensional), хоёр хэмжээст (2D - two dimensional), гурван хэмжээст (3D - three dimensional) массив гэх мэтээр нэрлэдэг. Гурваас олон хэмжээстэй (multidimensional) ч байж болно. Хоёр хэмжээст массивыг массивын массив (array of array), гурван хэмжээстийг массивын массивын массив (array of array of array) гэх мэтчилэн үгээр илэрхийлж болно.
Шугаман массив
Шугаман массив нь дараах хэлбэрээр зарлана.
”төрөл” ” массив нэр” [элементийн тоо]
”төрөл”- массивын элементүүдийн тоон төрөл
” массив нэр”- массивыг праграмд төлөөлөх иденфикатор
[элементийн тоо]- массивын элементийн тоог заана.
Жишээ нь:
int a[100],b[100];
float c[50],P[25];
long T[10000],g[5];
char s[100],d[256];
Массив утга олгох үйлдэл
a[0]=100;//0-р элементэд 100 утгыг олгож байна.
a[1]=102
a[99]=80;
c[9]=8.95;
c[44]=10.002
s[2]='A';
Массивыг зарлах үед утга оноох
int IntegerArray[5]={10,20,30,40,50};
тогтмол утгатай массивыг зарлахдаа
const int constArray[5]={9,8,15,6,3};
Жишээ1: Шугаман массивт гараас утга олгоод хэвлэх.
#include "stdio.h"
#include "stdlib.h"
int i,n,s;
int a[100];
int main()
{
scanf("%d",&n);
for(i=0;i
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i
system("pause");
return 0;
}
Жишээ2: Шугаман массивыг өсөхөөр эрэмбэл.
#include "stdio.h"
#include "stdlib.h"
int a[100];
int n,e;
int sort(int m,int l)
{
int i=m;
int j=l;
int x=a[(m+l)/2];
do
{
while(a[i]
while(a[j]>x) j--;
if(i<=j)
{
int w=a[i];
a[i]=a[j];
a[j]=w;
i++;
j--;
}
}
while(i<=j);
if (m
if (i
}
int main()
{
scanf("%d",&n);
for(e=0; e
sort(0,n-1);
for(e=0; e
printf("na[%d]=%d",e,a[e]);
system("pause") ;
return 0;
}
Тэгш өнцөгт массив дараах хэлбэрээр зарлана.
”төрөл” ” массив нэр” [элементийн тоо1] [элементийн тоо2]
”төрөл”- массивын элементүүдийн тоон төрөл
” массив нэр”- массивыг праграмд төлөөлөх иденфикатор
[элементийн тоо1]- массивын мөрийн элементийн тоог заана.
[элементийн тоо2]- массивын баганын элементийн тоог заана.
int a[100][100];
float f[5][6];
char c[12][3];
Жишээ3: Тэгш өнцөгт массивт гараас утга олгоод хэвлэх.
#include "stdio.h"
#include "stdlib.h"
int i,n,s,j,m;
int a[100][100];
int main()
{
scanf("%d%d",&n,&m);
for(i=0;i
for(j=0;j
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i
{
for(j=0;j
printf("=",a[i][j]);
printf("n");
}
system("pause");
return 0;
}
Жишээ4: Тэгш өнцөгт массивын мөр бүрийн хамгийн их элемент олж шугаман массив үүсгэ.
#include "stdio.h"
#include "stdlib.h"
int i,n,s,j,m;
int max,a[100][100],b[100];
int main()
{
scanf("%d%d",&n,&m);
for(i=0;i
for(j=0;j
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i
{
for(j=0;j
printf("=",a[i][j]);
printf("n");
}
for(i=0;i
{
max=a[i][0];
for(j=0;j
if(max
b[i]=max;
}
printf("n");
for(i=0;i
system("pause");
return 0;
}
Массивыг зарлах
Массивыг ашиглахын тулд эхлээд түүнийг зарлах ёстой.
Хувьсагч массив
Нэг хэмжээст (1D) хувьсагч массивыг дараах загварын дагуу зарлана:
өгөгдлийн_төрөл массивын_нэр [урт];
Энд:
· өгөгдлийн_төрөл – массивын төрлийг заасан албаны үг
· массивын_нэр – массивыг нэрлэхийн тулд програм зохиогчийн сонгож авсан чөлөөт идентификатор
· урт – массивын элементийн тоо.
Ж.нь:
int mas [25];
Энд бид бүхэл int төрлийн 25 элементтэй 1D mas гэсэн хувьсагч массив зарлаж байна. Хамгийн эхний элемент 0 гэсэн индекстэй (дугаартай), хамгийн сүүлийн элемент 24 гэсэн индекстэй байна.
float my [10];
Энд бодит float төрлийн 10 элементтэй 1D my гэсэн хувьсагч массив зарлагдав.
char titles [9];
Энд тэмдэгт төрлийн 9 элементтэй 1D titles хэмээх массив зарлалаа.
Хоёр хэмжээст (2D) хувьсагч массивыг зарлахдаа:
өгөгдлийн_төрөл массивын_нэр [урт_1] [урт_2];
гэсэн загварыг баримтлана. Энд:
· урт_1 – массивын эхний хэмжээсийн урт (элементийн тоо)
· урт_2 - массивын хоёр дахь хэмжээсийн урт (элементийн тоо)
Практикт, 2D массивын эхний хэмжээсийг мөр (row), хоёр дахь хэмжээсийг багана (column) хэмээн нэрийддэг. Ж.нь:
int matrix [5] [10];
Энд бүхэл int төрлийн matrix гэсэн 5 мөр, 10 баганатай 2 хэмжээст массивыг зарлаж байна.
Массивын массив гэдэг томъёололтой энэ нь яг тохирч байгаа юм. Учир нь 5 элементтэй matrix массивын нэг элемент нь мөн 10 элементтэй бүхэл төрлийн массив байна гэсэн үг.
Matrix массивын нийт элементийн тоо нь 5*10=50 байна.
Зарим нэг жишээ.
double table [20] [20];
Энд 20 мөр, 20 баганатай бодит double төрлийн table гэсэн квадрат массив зарлагдав. Элементийн тоо нь 400 болно.
unsigned char sheet [6] [5];
Энд 6 мөр, 5 багана бүхий sheet гэсэн бүхэл unsigned charтөрлийн массив зарлаж байна. Элементийн тоо нь 30 болно.
Гурван хэмжээст (3D) хувьсагч массив зарлах нь:
өгөгдлийн_төрөл массивын_нэр [урт_1] [урт_2] [урт_3];
гэж бичигдэнэ. Энэ тохиолдолд мөр, багана дээр нэмэгдээд гурав дахь хэмжээс (өндөр ?) гарч ирнэ. Хэрэв гурван хэмжээсийн уртууд нь адил бол куб массив гэнэ.
Г.м.-ээр олон хэмжээст массивыг зарлаж болно. Онолын хувьд, массивын хэмжээст хязгаар тавьсан юм байхгүй.
Массивыг идэвхжүүлэх
Массивыг зарлахдаа шууд анхны утга оноох, ө.х. идэвхжүүлэх боломжтой. Гэхдээ массив нь олон элементээс тогтсон нийлмэл өгөгдөл учраас түүнтэй бүхэлд нь харьцаж, нэг утга оноох боломжгүй. Харин түүний элементүүдийн авах утгыг тоочин бичнэ.
Тухайлбал 1D массивыг идэвхжүүлэхдээ:
өгөгдлийн_төрөл массивын_нэр [урт] = { утга0, утга1, утга2, ..., утга­урт-1} ; гэж бичнэ. Энд:
· утга0, утга1, утга2, ..., утга­урт-1 – массивын элемент бүрийн авах анхны утга.
Ж.нь:
int numbers [5] = {12, 345, -41, 1361, 3};
numbers массивын эхний элемент 12, хоёр дахь элемент 345, гурав дахь элемент -41, дөрөв дэх элемент 1361, тав дахь элемент 3 байна.
float v [3] = {0.1564. 9.23, -1.0};
v массивын гурван элемент харгалзан 0.1564, 9.23, -1.0 гэсэн анхны утгуудыг авна.
unsigned char symbols [6] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’};
symbols массивын элементүүд харгалзан ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ гэсэн тэмдэгт утгуудыг авна.
Бичигдсэн анхны утгын тоо массивын уртаас хэтрэхгүй байх ёстой. Эс тэгвээс хөрвүүлэгч алдаа заана. Харин массивын уртаас цөөн тоотой анхны утга бичигдсэн байвал массивын элементүүд эхнээсээ тэдгээр утгыг авч, үлдсэн элементүүд идэвхжихгүйгээр үлдэнэ. Ж.нь:
int M [8] = { 8, 4, 2};
Энд, M массивын зөвхөн эхний гурван элемент идэвхжээд үлдсэн элементүүд идэвхжихгүй.
Массивын уртыг ил зааж өгөлгүйгээр идэвхжүүлж бас болдог:
өгөгдлийн_төрөл массивын_нэр [ ] = { утга0, утга1, утга2, ... } ;
Ийм тохиолдолд хөрвүүлэгч өөрөө, { } дотор бичигдсэн анхны утгуудын тоогоор массивын уртыг тодорхойлдог. Ж.нь:
double d [ ] = {1.0. 2.0, 3.0, 4.0, 5.0};
2D массив идэвхжүүлэхдээ, ийм массивын мөр бүр нь өөрөө дахиад хэд хэдэн баганад хуваагдана гэдгийг тооцож, анхны утгуудыг мөр мөрөөр бүлэглэн { } дотор бичдэг. Ж.нь:
double A [3] [2] = { {10, 20}, {30, 40}, {50, 60} };
3 мөртэй 2 баганатай A массивын элементүүдийг мөрөөр нь бүлэглэн идэвхжүүлж байна. Тиймээс эхний мөрийн элементүүд харгалзан 10 ба 20, хоёр дахь мөрийн элементүүд харгалзан 30 ба 40, гурав дахь мөрийн элементүүд харгалзан 50 ба 60 гэсэн утгыг авна.
Дээрх бичиглэл нь.
double A [3] [2] = { 10, 20, 30, 40, 50, 60 };
гэсэн бичиглэлтэй эквивалент юм. Ө.х. мөр мөрөөр бүлэглэхгүйгээр идэвхжүүлэх бас боломжтой. Гэхдээ ингэх нь, 2D массивын шинж чанарыг бүрхэгдүүлэх тул учир дутагдалтай.
3D массив идэвхжүүлэхдээ, ийм массивын мөр бүр нь хэд хэдэн баганад, харин багана бүр нь хэд хэдэн “өндөрт” хуваагдана гэдгийг тооцож, мөр мөрөөр бүлэглэн { } бичиж, тус бүрийн дотор нь дахиад багана баганаар бүлэглэн { } дотор анхны утгуудыг бичдэг. Ж.нь:
int mmm [4] [3] [2] = { { {1, 2}, {11, 22}, {111, 222} },
{ {3, 4}, {33, 44}, {333, 444} },
{ {5, 6}, {55, 66}, {555, 666} },
{ {7, 8}, {77, 88}, {777, 888} } }
Г.м.-ээр олон хэмжээст массивыг идэвхжүүлж болно.
Мэдээж, бичигдсэн анхны утгын тоо олон хэмжээст массивын нийт элементийн тоогоос хэтрэхгүй байх ёстой. Эс тэгвээс хөрвүүлэгч алдаа заана. Харин элементийн тооноос цөөн анхны утга бичигдсэн, ө.х. массивыг бүхэлд нь идэвхжүүлээгүй байж болно.

No comments:

Post a Comment