24/05/2018, 21:42

Mảng đa chiều cùng kích thước

Trong C# cho phép chúng ta xây dựng mảng nhiều chiều. Nhưng ở đây ta chỉ nghiên cứu mảng hai chiều ≅ Cách khai báo mảng hai chiều <kiểu dữ liệu> [ , ] tên mảng; Ví dụ: int [ , ]a; float [ , ]b; Lý giải như ...

Trong C# cho phép chúng ta xây dựng mảng nhiều chiều. Nhưng ở đây ta chỉ nghiên cứu mảng hai chiều

≅ Cách khai báo mảng hai chiều

<kiểu dữ liệu> [ , ] tên mảng;

Ví dụ:

int [ , ]a;

float [ , ]b;

Lý giải như trên ta thấy để cấp phát bộ nhớ cho các phần tử của mang ta dùng từ khoá new như sau:

a=new int[4,3]; // Khai báo mảng hai chiều a gồm 4 hàng, 3 cột và mỗi phần tử của mảng là một số nguyên kiểu int

b=new float[2,3];// Khai báo mảng hia chiều b gồm 2 hàng, 3 cột và mỗi phần tử của mảng là một số thực kiểu float

Một số thông tin khác được lý giải như mảng một chiều

≅ Ta có thể vừa khai báo mảng và vừa cấp phát bộ nhớ cho các phần tử của mảng như sau:

<kiểu dữ liệu>[,] <tên mảng>=new <kiểu dữ liệu>[kích thước hàng, kích thước cột];

Ví dụ:

int [,]a=new int[4,6];

double [,]b=new double[10,4];

.......................

  • Ta có thể khai báo mảng và đồng thời khởi tạo cho các phần tử của mảng như sau:

Chúng ta có thể khởi tạo nội dung của một mảng ngay lúc tạo thể hiện của mảng bằng cách đặt những giá trị bên trong dấu ngoặc ({}). C# cung cấp hai cú pháp để khởi tạo các thành phần của mảng, một cú pháp dài và một cú pháp ngắn:

int[,] myIntArray1 = new int[2,3] { {2, 4, 6},{ 8, 10,9}};

int[,] myIntArray2 = { {2, 4, 1},{ 6, 8, 10}};

Không có sự khác biệt giữa hai cú pháp trên, và hầu hết các chương trình đều sử dụng cú pháp ngắn hơn do sự tự nhiên và lười đánh nhiều lệnh của người lập trình.

≅ Để truy nhập vào các phần tử của mảng chúng ta cũng truy nhập thông qua tên và chỉ số tương ứng. Cụ thể Tên_Mảng[chỉ số hàng, chỉ số cột]

chỉ số hàng nằm trong đoạn [0, Tên_Mảng.GetLength(0)-1]

chỉ số cột nằm trong đoạn [0, Tên_Mảng.GetLength(1)-1]

≅ Một số ví dụ áp dụng

Ví dụ 1: Cho ma tran a gồm m hàng, n cột có các phần tử là các số nguyên được nhập vào từ bàn phím. Sau đó thực hiện các yêu cầu sau:

a) Tìm giá trị lớn nhất trong số các phần tử của mảng

b) Tính tổng các phần tử là số nguyên tố của mảng

c) Nếu a là ma trận vuông hãy tính tích các phần trên đường chéo chính của mảng.

--------------------------------------------------------------------------------------------

using System;

class VD

{

static int[,] a;

static int m, n;

static void Nhap()

{

int i, j;

Console.Write("Nhap so hang m="); m = int.Parse(Console.ReadLine());

Console.Write("Nhap so cot n="); n = int.Parse(Console.ReadLine());

a = new int[m, n];

Console.WriteLine("Nhap gia tri cho cac phan tu cua ma tran");

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

for (j = 0; j < n; ++j)

{

Console.Write("a[{0},{1}]=", i, j);

a[i, j] = int.Parse(Console.ReadLine());

}

}

static void Hien()

{

int i, j;

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

{

for (j = 0; j < n; ++j)

Console.Write("{0} ", a[i, j]);

Console.WriteLine();

}

}

static int Max()

{

int i, j, mx = a[0, 0];

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

for (j = 0; j < n; ++j)

if (mx < a[i, j]) mx = a[i, j];

return mx;

}

static bool Nt(int x)

{

bool ok = true;

int i;

for (i = 2; i < x - 1; ++i)

if (x % i == 0)

{ ok = false; break; }

return ok && x != 1;

}

static void NtMang()

{

int i, j;

Console.WriteLine("cac phan tu la so nguyen to cua mang");

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

for (j = 0; j < n; ++j)

if (Nt(a[i, j]))

Console.Write("{0} ", a[i, j]);

Console.WriteLine();

}

static void Vet()

{

int i, j, t = 1;

if (m == n)

{

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

t = t * a[i, i];

Console.WriteLine("Tich cac phan tu tren duong cheo chinh la {0}", t);

}

else Console.WriteLine("Day khong phan la ma tran vuong");

}

static void Main()

{

ConsoleKeyInfo kt;

do

{

Console.Clear();

Console.WriteLine(" Main Menu");

Console.WriteLine(" 1. Nhap thong tin cho mang");

Console.WriteLine(" 2. Hien mang");

Console.WriteLine(" 3. Gia tri lon nhat cua mang");

Console.WriteLine(" 4. Cac phan tu la so nguyen to cua mang");

Console.WriteLine(" 5. Tich cac phan tu tren duong cheo chinh");

Console.WriteLine(" 6. Thoat khoi chuong trinh");

Console.Write(" Ban hay chon mot cong viec tu 1->6:");

kt = Console.ReadKey();

Console.WriteLine();

switch (kt.KeyChar)

{

case '1':

Nhap();

Console.WriteLine("Ban hay nhan phim bat ky de tiep tuc...");

Console.ReadKey();

break;

case '2':

Console.WriteLine("Cac phan tu cua mang la");

Hien();

Console.WriteLine("Ban hay nhan phim bat ky de tiep tuc...");

Console.ReadKey();

break;

case '3':

Console.WriteLine(" Max cua mang {0}", Max());

Console.WriteLine("Ban hay nhan phim bat ky de tiep tuc...");

Console.ReadKey();

break;

case '4':

NtMang();

Console.WriteLine("Ban hay nhan phim bat ky de tiep tuc...");

Console.ReadKey();

break;

case '5':

Vet();

Console.WriteLine("Ban hay nhan phim bat ky de tiep tuc...");

Console.ReadKey();

break;

case '6':

Environment.Exit(0); break;

}

} while (true);

}

}

--------------------------------------------------------------------------------------------

Ví dụ 2: Cho hai ma trận vuông a,b cấp n có các phần tử là các số nguyên được nhập vào từ bàn phím. Sau đó thực hiện các yêu cầu sau:

a) Tính tổng hai ma trận a,b kết qua cho vào ma trận c

b) Tìm giá trị lớn nhất của các hàng trong ma trận c kết quả cho vào ma trận một chiều x

c) Sắp xếp ma trận c tăng dần theo chiều xoáy trôn ốc

--------------------------------------------------------------------------------------------

using System;

class VD

{

static int n;

static void Nhap(char ten,out int [,]x)

{

int i, j;

x = new int[n, n];

Console.WriteLine("Nhap gia tri cho cac phan tu cua ma tran {0}",ten);

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

for (j = 0; j < n; ++j)

{

Console.Write("{0}[{1},{2}]=",ten, i, j);

x[i, j] =int.Parse(Console.ReadLine());

}

}

static void Hien(int [,]x)

{

int i, j;

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

{

for (j = 0; j < n; ++j)

Console.Write("{0} ", x[i, j]);

Console.WriteLine();

}

}

static void Hien(int[] x)

{

int i;

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

Console.Write("{0} ", x[i]);

Console.WriteLine();

}

static void Tong(int[,] x, int[,] y, out int[,] kq)

{

int i, j;

kq = new int[n, n];

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

for (j = 0; j < n; ++j)

kq[i, j] = x[i, j] + y[i, j];

}

static void MaxHang(int[,] x, out int[] kq)

{

int i, j,mx,d=0;

kq = new int[n];

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

{

mx = x[i, 0];

for (j = 1; j < n; ++j)

if (mx < x[i, j]) mx = x[i, j];

kq[d++] = mx;

}

}

static void TronOc(ref int[,] x)

{

int i, j, d=0,k=0;

int[] tmp = new int[n * n];

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

for (j = 0; j < n; ++j)

tmp[d++] = x[i, j];

Array.Sort(tmp);

d = 0;

do

{

i = k;

for (j = k; j < n - 1 - k; ++j)

x[i, j] = tmp[d++];

j = n - 1 - k;

for (i = k; i < n - 1 - k; ++i)

x[i, j] = tmp[d++];

i = n - 1 - k;

for (j = n - 1 - k; j > k; --j)

x[i, j] = tmp[d++];

j = k;

for (i = n - 1 - k; i > k; --i)

x[i, j] = tmp[d++];

k++;

if (d == n * n - 1) x[n / 2 , n / 2 ] = tmp[d++];

} while (d < n * n);

}

static void Main()

{

int [,]a=null;

int [,]b=null;

int [,]c=null;

int []x=null;

Console.Write("Nhap cap cau ma tran n=");

n = int.Parse(Console.ReadLine());

Nhap('A', out a);

Nhap('B', out b);

Tong(a, b, out c);

Console.WriteLine("Tong hai mang");

Hien(c);

MaxHang(c, out x);

Console.WriteLine("Gia tri lon nhat cua cac hang");

Hien(x);

TronOc(ref c);

Console.WriteLine("Mang c sau khi sap xep");

Hien(c);

Console.ReadKey();

}

}

--------------------------------------------------------------------------------------------

0