Агуулга: Энэ бүлэгт ашигласан программын кодуудыг энд үзүүллээ. Массив бол хамгийн үндсэн өгөгдлийн бүтэц юм. С++ хэлний онцлог бол массивын нэр нь массивын эхний (0 индесктэй) элементийн хаяг заах заагч болдог. Цаашилбал заагч дээр хийгдэгдэх энгийн арифметик үйлдлүүд зөвшөөрөгддөг. Гэсэн хэдий ч массив ба заагч нь хоорондоо ялгаатай гэдгийг санаж байх хэрэгтэй.
Массив ба заагч
1. Нэг хэмжээст массив ба заагч
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// One-dimensional array and Pointer
#include <iostream>
using namespace std;
int a[] = { 0, 1, 2, 3, 4 };
int main()
{
int i, *p;
for( i=0; i<=4; i++) cout << a[i] << " ";
cout << endl;
for( p= &a[0]; p<=&a[4]; p++) cout << *p << " ";
cout << endl;
for( p= &a[0], i=0; i<=4; i++) cout << p[i] << " ";
cout << endl;
for(p=a,i=0; p+i<=a+4; i++) cout << *(p+i) << " ";
cout << endl;
for(p=a+4; p>=a; p--) cout << *p << " ";
cout << endl;
for(p=a+4,i=0; i<=4; i++) cout << p[-i] << " ";
cout << endl;
for(p=a+4; p>=a; p--) cout << a[p-a] << " ";
cout << endl;
}
2. Хоёр хэмжээст массив ба заагч
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// Two-dimensional array and Pointers
#include <iostream>
using namespace std;
int a[3][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
int *pa[3] = { a[0], a[1], a[2] }; // Array of Pointers
int *p = a[0];
int main() {
int i;
for( i=0; i<3; i++ )
cout << a[i][2-i] << " " << *a[i] << " " << *(*(a+i)+i) << endl;
cout << endl;
for( i=0; i<3; i++)
cout << *pa[i] << " " << p[i] << endl;
cout << endl;
}
Өгөгдлийн хийсвэр төрөл - Өргөтгөгдөх массив
1. Main() функц
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// Abstract Data Type - Extendible Array
#include "extendible_array.h"
int main() {
Iarray a(3);
for(int i=0; i<3; i++)
a[i] = i;
a.print();
cout << "size of a is " << a.size() << endl;
a.resize(5);
a.print();
a[3] = 3; a[4] = 4;
// a[5] = 5; error!
a.print();
a.resize(2);
a.print();
}
2. Толгой файл: extendible_array.h
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// Abstract Data Type - Extendible Array
// Filename: extendible_array.h
#include <iostream>
using namespace std;
class Iarray {
int *a, len;
public:
Iarray(int length);
~Iarray();
int& operator[](int n);
int size();
void resize(int length);
void print();
};
Iarray::Iarray(int length) {
len = length;
a = new int[len];
for(int i=0; i<len; i++) a[i] = 0;
}
Iarray::~Iarray() {
delete [] a;
}
int& Iarray::operator[](int i) {
if( 0>i || i>=len) {
cout << "Error: " << i << " subscript is out of bounds.\n";
exit(-1);
}
return a[i];
}
int Iarray::size() {
return len;
}
void Iarray::resize(int length) {
if(len == length) return;
int newlen = length, i;
int *newa = new int[newlen];
int min = (newlen < len) ? newlen : len;
for(i=0; i<min; i++) newa[i] = a[i];
for(i=min; i<newlen; i++) newa[i] = 0;
delete [] a;
a = newa;
len = newlen;
}
void Iarray::print() {
for(int i=0; i<len; i++)
cout << a[i] << " ";
cout << endl;
}
Массивын хэрэглээ
1. Найман бэрс
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// Eight queens puzzle
#include <iostream>
using namespace std;
int x[9];
void Print(int n) {
static int solution = 0;
cout << "\nsolution = " << ++solution << endl;
for(int i=1; i<=n; i++) {
for (int j=1; j<=n; j++)
if (x[i] == j) cout << " Q";
else cout << " .";
cout << '\t' << x[i] << endl;
}
}
bool Check(int k, int i) {
for (int j=1; j < k; j++)
if ((x[j] == i) // Two in the same column
|| (abs(x[j]-i) == abs(j-k))) // or in the same diagonal
return(false);
return(true);
}
void Queens(int k, int n) {
for (int i=1; i<=n; i++) {
if (Check(k, i)) {
x[k] = i;
if (k==n) Print(n);
else Queens(k+1, n);
}
}
}
int main() {
Queens(1,8);
}
2. N бэрс
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// N queens puzzle
// Check by changing the value of N in the source code
#include <iostream>
using namespace std;
#define N 9
int a[N], b[2 * N - 1], c[2 * N - 1], x[N];
void found(void) {
int i, j;
static int solution = 0;
cout << "\nsolution = " << ++solution << endl;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
if (x[i] == j) cout << " Q";
else cout << " .";
cout << endl;
}
}
void seek(int i) {
int j;
for (j = 0; j < N; j++)
if (a[j] && b[i + j] && c[i - j + N - 1]) {
x[i] = j;
if (i < N - 1) {
a[j] = b[i + j] = c[i - j + N - 1] = 0;
seek(i + 1);
a[j] = b[i + j] = c[i - j + N - 1] = 1;
}
else found();
}
}
int main() {
int i;
for (i=0; i<N; i++) a[i] = 1;
for (i=0; i<2*N-1; i++) b[i] = 1;
for (i=0; i<2*N-1; i++) c[i] = 1;
seek(0);
}
3. Шидэт квадрат
// Data Structure & Algorithm C++, Otgonbayar Tovuudorj
// Chapter 5: Array & Pointer
// Magic square if the sums of the numbers in each row, each column, and both main diagonals are the same.
#define SIZE 160 // Consider a memory for increasing the size.
#include <iostream>
#include <iomanip>
using namespace std;
int m[SIZE][SIZE];
void odd_n(int n);
void even_n(int n);
void check(int n);
void display(int n);
void swap(int i1, int j1, int i2, int j2);
int main() {
int n;
cout << "\nInput the number 3-" << SIZE << ": ";
cin >> n;
if(n>2 && n<=SIZE) {
if(n%2) odd_n(n);
else even_n(n);
check(n);
}
}
void odd_n(int n) {
int i, j, num=1, nn=n*3/2;
for(i=0; i < n; i++)
for(j=0; j < n; j++)
m[(i*2-j+n)%n][(j-i+nn)%n] = num++;
}
void even_n(int n) {
int i, j, bound=n-1, num=1;
int mid=n/2, nn=n*n+1, swch = mid;
int block1=(n-2)/4, block2=bound-block1;
int inside1=n/4, inside2=bound-inside1;
for(i=0; i<n; i++)
for(j=0; j<n; j++) {
if(i >= inside1 && i <= inside2 && j >= inside1 && j <= inside2)
m[i][j]=num;
else
if((i > block1 && i < block2) || (j > block1 && j < block2))
m[i][j]=nn-num;
else
m[i][j]=num;
num++;
}
if(!(n%4)) return;
swch=mid;
for(i=0; i<mid; i++) {
if(i==block1 || i==block2) {
swch=0; continue;
}
swap(i, block2, bound-i, block2);
swap(block1, i, block1, bound-i);
swap(block2, i, block2, bound-i);
swap(swch, i, swch, bound-i);
}
for(i=block1+1; i < block2; i++) {
swap(i, block1, i, block2);
swap(block1, i, block2, i);
}
swap(mid, block1, mid, block2);
swap(block1, swch, block2, swch);
}
void swap(int i1, int j1, int i2, int j2) {
int t;
t=m[i1][j1];
m[i1][j1]=m[i2][j2];
m[i2][j2]=t;
}
void check(int n)
{
int i, j;
unsigned long sum, srow, scol, sd1=0, sd2=0;
sum=(unsigned long)n*(n*n+1)/2;
cout << "SUM = " << sum << endl;
for(i=0; i < n; i++) {
sd1 += m[i][i];
sd2 += m[i][n-i-1];
srow = scol = 0;
for(j=0; j < n; j++) {
srow += m[i][j];
scol += m[j][i];
}
if((srow!=sum) || (scol!=sum)) return;
}
if((sd1!=sum) || (sd2!=sum)) return;
cout << "\n- O.K. -\n\n";
display(n);
}
void display(int n) {
for(int i=0; i<n; i++) {
cout << setw(2) << i+1 << ")] ";
for(int j=0; j<n; j++)
cout <<setw(4) << m[i][j];
cout << endl;
}
}
