để truy nhập vào các phần tử của mảng chúng ta truy nhập thông qua tên mảng và chỉ số tương ứng. đặc biệt trong C# phần tử ựầu tiên của mảng có chỉ số là 0. Phần tử cuối cùng của mảng có chỉ số là Tên_Mảng.Length-1. Nhớ rằng chỉ số của mảng phải ở trong giới hạn cho phép. Ta có thể truy nhập vào các phần tử của mảng thông qua công thức tổng quát sau: Tên_Mảng[chỉ số]
Vắ dụ:
int []=new int[5];
a[0] // Truy nhập vào phần tử ựầu tiên của mảng
a[i] // Truy nhập vào phần tử thứ i của mảng i∈[0, Tên_Mảng.Length 14.3.3. Các thao tác trên mảng
o Nhập, in mảng
o Tắnh tổng: Tắnh tổng các phần tử của mảng, tổng các phần tử chẵn, lẻ, tổng các phần tử chia hết không chia hết cho một số x(x nhập vào từ bàn phắm), tổng các phần tử là số nguyên, số chắnh phương...
Nếu tổng số của các số ựặc biệt:
Ớ Xây dựng hàm kiểm tra một số có thỏa mãn tắnh chất không
Ớ For( int i=0 ; i<n; i++)
If (ham(a[i] )=true ) t:=t+a[i]; o Tìm giá trị và vị trắ max, min của mảng.
o Sắp xếp mảng theo thứ tự tăng, giảm dần, chẵn ựứng trước lẻ ựứng saụ
Sử dụng mảng trung gian b, sử dụng k chỉ số Nhặt lần lượt các phần tử chẵn của a sang b Nhặt lần lượt các phần tử lẻ của a sang b
B chắnh là mảng a ựược sắp xếp theo nguyên tắc chẵn ựứng trước lẻ ựứng sau:
o Chèn một phần tử vào mảng
o Kiểm tra mảng thỏa mãn tắnh chất nào ựó o Xóa một phần tử khỏi mảng...
14.3.4. Vắ dụ áp dụng
Vắ dụ 1: Nhập vào một dãy số nguyên sau ựó thực hiện các yêu cầu sau: a) Tắnh tổng các phần tử của mảng chia hết cho 3
c) Nhập vào từ bàn phắm một số nguyên x và cho biết số nguyên này xuất hiện trong mảng bao nhiêu lần
d) Rút gọn mảng(nghĩa là mỗi phần tử chỉ ựược xuất hiện một lần) using System;
class VD {
static int[] a; static int n;
static void Nhap() {
int i;
ConsolẹWrite("Nhap so phan tu cua mang n="); n = int.Parse(ConsolẹReadLine());
a = new int[n];
ConsolẹWriteLine("Hay nhap cac phan tu cho mang"); for (i = 0; i < n; ++i) { ConsolẹWrite("a[{0}]=", i); a[i] = int.Parse(ConsolẹReadLine()); } }
static void Hien(int []x) {
int i;
for (i = 0; i < x.Length ; ++i) ConsolẹWrite("{0}\t", x[i]); ConsolẹWriteLine();
}
static int Tong3() { int i,t=0; for(i=0;i<n;++i) if(a[i]%3==0) t=t+a[i]; return t; }
{ int i,mx; mx = a[0]; for (i = 1; i < n; ++i) if (mx < a[i]) mx = a[i]; return mx; }
static int Dem(int x) { int i,d=0; for (i = 0; i < n; ++i) if (a[i] == x) d++; return d; }
static void RutGon(out int[] kq) {
int i,d=0,j;
int[] tmp = new int[n]; bool ok; for (i = 0; i < n; ++i) { ok = true; for(j=0;j<d;++j) if (tmp[j] == a[i]) { ok = false; break; } if (ok) tmp[d++] = a[i]; } kq = new int[d]; ArraỵCopy(tmp, kq, d); }
static void Main() {
ConsoleKeyInfo kt; int x;
do{
ConsolẹClear();
ConsolẹWriteLine("\t\t\tMain Menu"); ConsolẹWriteLine("\t1. Nhap mang"); ConsolẹWriteLine("\t2. Hien Mang");
ConsolẹWriteLine("\t3. Cac phan tu cua mang chi het cho 3"); ConsolẹWriteLine("\t4. Gia tri lon nhat cua mang");
ConsolẹWriteLine("\t5. So lan xuat hien cua phan tu x trong mang"); ConsolẹWriteLine("\t6. Rut gon mang");
ConsolẹWriteLine("\t7. Thoat khoi chuong trinh");
ConsolẹWrite(" Ban hay chon mot cong viec tu 1->7:"); kt=ConsolẹReadKey(); ConsolẹWriteLine(); switch(kt.KeyChar) { case '1': Nhap();
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '2':
ConsolẹWriteLine("Cac phan tu cua mang la:"); Hien(a);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '3':
ConsolẹWriteLine(" Ket qua la {0:8}",Tong3());
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '4':
ConsolẹWriteLine(" Ket qua la {0,8}",Max());
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
case '5':
ConsolẹWrite("Nhap x=");x=int.Parse(ConsolẹReadLine()); ConsolẹWriteLine(" Ket qua la {0:8}",Dem(x));
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '6':
ConsolẹWriteLine("Cac phan tu cua mang sau khi rut gon:"); RutGon(out b);
Hien(b);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey(); break; case '7': Environment.Exit(0); break; } } while (true); } }
Vắ dụ 2: Cho hai dãy số a1, a2,....,an và b1,b2,...,bm 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) Xây dựng mảng c bằng cach ghép hai mảng a và b với nhau b) Kiểm tra mảng c có lập thành một cấp số cộng không c) đưa ra các phần tử của mảng c xuất hiện ựúng một lần
d) Tách mảng c thành hai mảng: một mảng chứa toàn số chẵn, một mảng chứa toàn số lẻ
e) Sắp xếp mảng a,b theo thứ tự tăng dần. Sau ựó xây dựng mảng d bằng cách chèn các phần tử của mảng a,b sao cho ta thu ựược mảng d cũng có thứ tự tăng dần
--- using System;
class VD {
static void Nhap(char ten, out int []x) {
int i,n;
ConsolẹWriteLine("Nhap thong tin cho cac phan tu cua mang {0}",ten); ConsolẹWrite("Nhap so phan tu cua mang:");
n = int.Parse(ConsolẹReadLine()); x = new int[n];
ConsolẹWriteLine("Hay nhap cac phan tu cho mang"); for (i = 0; i < n; ++i) { ConsolẹWrite("{0}[{1}]=",ten,i); x[i] = int.Parse(ConsolẹReadLine()); } }
static void Hien(int[] x) {
int i;
for (i = 0; i < x.Length; ++i) ConsolẹWrite("{0}\t", x[i]); ConsolẹWriteLine();
}
static void GhepMang(int[] x, int[] y, out int[] kq) {
kq = new int[x.Length + ỵLength]; ArraỵCopy(x, kq, x.Length);
ArraỵCopy(y, 0, kq, x.Length, ỵLength); }
static bool CapSoCong(int[] x) {
bool ok = true; int i;
for (i = 1; i < x.Length - 1; ++i) if (x[i] != (x[i - 1] + x[i + 1]) / 2) { ok = false; break; }
return ok; }
static void MotLan(int[] x, out int[] kq) {
int i,j,d=0;
int []tmp=new int[x.Length]; bool ok;
for (i = 0; i < x.Length; ++i) { ok = true; for(j=0;j<x.Length;++j) if (x[i] == x[j] && i != j) { ok = false; break; }; if(ok) tmp[d++]=x[i]; } kq = new int[d]; ArraỵCopy(tmp, kq, d); }
static void Tach(int[] x, out int[] chan, out int[] le) {
int i,d1=0,d2=0;
int[] tmp1 = new int[x.Length]; int[] tmp2 = new int[x.Length]; for (i = 0; i < x.Length; ++i) if (x[i] % 2 == 0)
tmp1[d1++] = x[i]; else
tmp2[d2++] = x[i];
chan = new int[d1]; ArraỵCopy(tmp1, chan, d1); le = new int[d2]; ArraỵCopy(tmp2, le, d2); }
static void Chen(int[] x, int[] y, out int[] kq) {
int i,n,k,j; ArraỵSort(x); ArraỵSort(y);
kq = new int[x.Length + ỵLength]; ArraỵCopy(x, kq, x.Length); n=x.Length-1;
{ if (kq[n] < y[i]) kq[++n] = y[i]; else { j = 0; while (y[i] >= kq[j]) j++; for (k = ++n; k > j; --k) kq[k] = kq[k - 1]; kq[j] = y[i]; } } }
static void Main() { int []a=null; int []b=null; int []c=null; int []d=null; int[] kq = null; int[] chan = null; int[] le = null; ConsoleKeyInfo kt; do { ConsolẹClear(); ConsolẹWriteLine("\t\t\tMain Menu");
ConsolẹWriteLine("\t1. Nhap thong tin cho hai mang"); ConsolẹWriteLine("\t2. Mang ghep la");
ConsolẹWriteLine("\t3. Kiem tra day co la cap so cong kỏ");
ConsolẹWriteLine("\t4. Cac phan tu cua mang xuat hien dung mot lan"); ConsolẹWriteLine("\t5. Tach mang(chan, le)");
ConsolẹWriteLine("\t6. Chen mang");
ConsolẹWriteLine("\t7. Thoat khoi chuong trinh"); ConsolẹWrite(" Ban hay chon mot cong viec tu 1->7:"); kt = ConsolẹReadKey();
switch (kt.KeyChar) {
case '1':
Nhap('Á, out a);
Nhap('B', out b);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '2':
ConsolẹWriteLine("Mang ghep la"); GhepMang(a, b, out c);
Hien(c);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '3':
if(CapSoCong(c)==true )
ConsolẹWriteLine(" Day da cho la cap so cong"); else
ConsolẹWriteLine(" Day da cho kong phai la cap so cong"); ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '4':
ConsolẹWriteLine("Cac phan tu cua mang xaut hien dung mot lan"); MotLan(c,out kq);
Hien(kq);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '5':
Tach(c, out chan, out le);
ConsolẹWriteLine("Cac phan tu chan"); Hien(chan);
ConsolẹWriteLine("Cac phan tu le"); Hien(le);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '6':
ConsolẹWriteLine("Mang chen la:"); Chen(a, b,out d);
Hien(d);
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey(); break; case '7': Environment.Exit(0); break; } } while (true); } } Câu lệnh lặp foreach
Cấu trúc foreach cho phép chúng ta lặp qua tất cả các mục trong một mảng hay trong một tập hợp.
Cú pháp sử dụng lệnh lặp foreach như sau:
foreach (<kiểu dữ liệu thành phần> <tên truy cập> in <mảng/tập hợp> ) {
// thực hiện thông qua <tên truy cập> tương ứng với // từng mục trong mảng hay tập hợp
}
Vắ dụ: Nhập vào một dãy số nguyên sau ựó ựưa ra màn hình các số chẵn trên một dòng, các số lể trên một dòng --- using System; class ViDu { static int[] a; static void Nhap() {
int i=0,x;
ConsolẹWriteLine("Ban hay nhap vao mot day so nguyen"); do
{
ConsolẹWrite("So nguyen thu {0}:", i); x = int.Parse(ConsolẹReadLine()); ArraỵResize(ref a, ++i);
a[i - 1] = x;
ConsolẹWrite("Ban co nhap tiep C/K"); kt = ConsolẹReadKey(); ConsolẹWriteLine();
} while (kt.KeyChar == 'c' || kt.KeyChar == 'C'); }
static void Hien() {
ConsolẹWriteLine("Cac phan tu chan la:"); foreach (int i in a)
if(i%2==0)
ConsolẹWrite("{0}\t", i);
ConsolẹWriteLine("\nCac phan tu le la:"); foreach (int i in a)
if(i%2!=0)
ConsolẹWrite("{0}\t", i); }
static void Main() { Nhap(); Hien(); ConsolẹReadKey(); } }
BộI 16: MờNG ậA CHIÒU 16.1. 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ềụ Nhưng ở ựây ta chỉ nghiên cứu mảng hai chiều
16.1.1. Khai báo và tạo mảng Cách khai báo 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.
16.1.2. Cách truy xuất các phần tử mảng
để 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] 16.1.3. Các thao tác trên mảng
o Nhập in mảng theo từng hàng và từng cột for (int i=1; i<ạLength; i++)
{
For (int j=1; j<ạLength; j++)
ConsolẹWrite(Ộ{0} Ợ,a[i,j]); ConsolẹWriteln;
}
o Tắnh tổng: Tắnh tổng các phần tử của mảng, tổng các phần tử chẵn, lẻ, tổng các phần tử chia hết không chia hết cho một số x(x nhập vào từ bàn phắm), tổng các phần tử là số nguyên, số chắnh phương... o Tìm giá trị, vị tắ max min của từng hàng hoặc từng cột
- Sử dụng mảng một chiều ựể lưu kết quả Max, min, vị trắ max, vị trắ min.
- Duyệt từ hàng ựầu tiên ựến hàng cuối cùng - Coi mỗi hàng ựấy chắnh là mảng một chiềụ for (int i=0; i<ạLength-1; i++)
{
Max[i]:=a[i,1]; vt[i]:=1; for (int j=1; i<ạLength; i++) If (max[i] <a[i,j]) { Max[i]:=a[i,j]; Vt[i]:=j; } } // In kết quả
for (int i=0; i<ạLength-1; i++)
ConsolẹWriteLine( ỘMax o hang thu {0} la: {1} tai vi tri: {2}Ộ, i, max[i], vt[i]);
o In ra giá trị và vị trắ của tất cả các phần tử có tắnh chất: vừa là phần tử lớn nhất(nhỏ nhất) của hàng vừa là tử nhỏ nhất(lớn nhất) của cột. - Tìm ra vị trắ phần tử lớn của các hàng
- Tìm ra vị trắ tử nhỏ nhất của các cột
- Duyệt từ hàng ựầu ựến hàng cuối kiểm tra vị trắ hàng của cột lớn nhất hàng thứ i có bằng i => phần tử a[i, vth[i]] là phần tử có ựặc ựiểm trên.
{Tìm ra các vị trắ lớn nhất trên mỗi hàng} for (int i=0; i<ạLength; i++)
{
maxh[i]:=a[i,0]; vth[i]:=0; for( int j=1; j<ạLength; j++) If (maxh[i] <a[i,j]) then {
Maxh[i]:=a[i,j]; Vth[i]:=j; }
}
o Sắp xếp ma trận theo thứ tự tăng dần trên tùng hàng, từng cột. For(int i=0; i<ạLength; i++)
{
For ( int j=0; j<ạLength-1; j++) For ( k=j+1; k<ạLength; k++) {
If (a[i,j]>a[i,k])
{Tg:=a[i,j]; a[i,j]:=a[i,k]; a[i,k]:=tg;} }
}
o Sắp xếp các phần tử trên ựường chéo chắnh theo thứ tự tăng hoặc giảm dần.
For (int i=0; i<ạlength; i++) For (int j=i+1; j<ạLength; j++)
If (a[i,i]>a[j,j])
{ Tg:=a[i,i]; a[i,i]:=a[j,j]; a[j,j]:=tg; }
o Tắnh tổng các phần tử trên ựường cheo chắnh. o cộng hai ma trận, nhân hai ma trận
16.1.4. 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;
ConsolẹWrite("Nhap so hang m="); m = int.Parse(ConsolẹReadLine()); ConsolẹWrite("Nhap so cot n="); n = int.Parse(ConsolẹReadLine()); a = new int[m, n];
ConsolẹWriteLine("Nhap gia tri cho cac phan tu cua ma tran"); for (i = 0; i < m; ++i) for (j = 0; j < n; ++j) { ConsolẹWrite("a[{0},{1}]=", i, j); a[i, j] = int.Parse(ConsolẹReadLine()); } }
static void Hien() {
int i, j;
{ for (j = 0; j < n; ++j) ConsolẹWrite("{0}\t", a[i, j]); Consolẹ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;
Consolẹ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])) ConsolẹWrite("{0}\t", a[i, j]); ConsolẹWriteLine(); }
static void Vet() {
if (m == n) {
for (i = 0; i < m; ++i) t = t * a[i, i];
ConsolẹWriteLine("Tich cac phan tu tren duong cheo chinh la {0}", t); }
else ConsolẹWriteLine("Day khong phan la ma tran vuong"); }
static void Main() { ConsoleKeyInfo kt; do { ConsolẹClear(); ConsolẹWriteLine("\t\t\tMain Menu");
ConsolẹWriteLine("\t1. Nhap thong tin cho mang"); ConsolẹWriteLine("\t2. Hien mang");
ConsolẹWriteLine("\t3. Gia tri lon nhat cua mang");
ConsolẹWriteLine("\t4. Cac phan tu la so nguyen to cua mang"); ConsolẹWriteLine("\t5. Tich cac phan tu tren duong cheo chinh"); ConsolẹWriteLine("\t6. Thoat khoi chuong trinh");
ConsolẹWrite(" Ban hay chon mot cong viec tu 1->6:"); kt = ConsolẹReadKey(); ConsolẹWriteLine(); switch (kt.KeyChar) { case '1': Nhap();
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '2':
ConsolẹWriteLine("Cac phan tu cua mang la"); Hien();
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '3':
ConsolẹWriteLine(" Max cua mang {0}", Max());
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '4': NtMang();
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); ConsolẹReadKey();
break; case '5': Vet();
ConsolẹWriteLine("Ban hay nhan phim bat ky de tiep tuc..."); Consolẹ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];
Consolẹ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) { ConsolẹWrite("{0}[{1},{2}]=",ten, i, j); x[i, j] =int.Parse(ConsolẹReadLine()); } }
static void Hien(int [,]x) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) ConsolẹWrite("{0}\t", x[i, j]); ConsolẹWriteLine(); } }
static void Hien(int[] x) { int i; for (i = 0; i < n; ++i) ConsolẹWrite("{0}\t", x[i]); Consolẹ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]; Arraỵ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;
ConsolẹWrite("Nhap cap cau ma tran n="); n = int.Parse(ConsolẹReadLine());
Nhap('Á, out a); Nhap('B', out b); Tong(a, b, out c);
ConsolẹWriteLine("Tong hai mang"); Hien(c);
MaxHang(c, out x);
ConsolẹWriteLine("Gia tri lon nhat cua cac hang"); Hien(x);
TronOc(ref c);
ConsolẹWriteLine("Mang c sau khi sap xep"); Hien(c);
ConsolẹReadKey(); }
}
16.2. Mờng ệa chiÒu khềng cỉng kÝch th−ắc
Như chúng ta ựã biết hình dạng của mảng ựa chiều cùng kắch thước có dạng hình chữ nhật thì hình dạng của mảng ựa chiều có khắch thước khác nhau không phải hình chữ nhật vì các chiều của chúng không ựều nhaụ
Khi chúng ta tạo một mảng ựa chiều kắch thước khác nhau thì chúng ta khai báo số dòng trong mảng trước. Sau ựó với mỗi dòng sẽ giữ một mảng, có kắch thước bất kỳ. Những mảng này ựược khai báo riêng. Sau ựó chúng ta khởi tạo giá trị các thành phần trong những mảng bên trong.
Cách khai báo
<kiểu dữ liệu> [][] tên mảng=new <kiểu dữ liệu>[kắch thước hàng][] ; hoặc
<kiểu dữ liệu> [][] tên mảng; ...
tên mảng=new <kiểu dữ liệu>[kắch thước hàng][] ;
Sau ựó ta tiến hành cấp phát bộ nhớ cho các phần tử của mỗi hàng tênmảng[chỉ số]=new <kiểu dữ liệu>[số phần tử của mỗi hàng] Vắ dụ:
int a[][]a; a=new int[3][];
Tiếp ựó ta ựi cấp phát bộ nhớ cho các phần tử của mỗi hàng a[0]=new int[6]; // Hàng thứ nhất có 6 phần tử
a[1]=new int[2]; // Hàng thứ nhất có 2 phần tử a[2]=new int[5]; // Hàng thứ nhất có 5 phần tử Truy nhập vào các phần tử của mảng
để truy nhập vào các phần tử của mảng ựa chiều có kắch không bằng nhau ta có thể thực hiện theo nguyên tắc sau:
Tênmảng[chắ số 1][chỉ số 2]
chắ số 1 ∈ [0...Tênmảng.Length-1]
chắ số 2 ∈ [0...Tênmảng[chắ số 1].Length-1]
Vắ dụ: Nhập vào n dãy số nguyên sau ựó tìm giá trị lớn nhất của mỗi dãy lưu vào một mảng một chiều và sẵp xếp chúng theo thứ tự tăng dần.
using System; class VisDu {
static int[][] a; static void Nhap() {
int i,j,n,m;
ConsolẹWrite("Ban muon nhap vao bao nhieu day so nguyen n="); n = int.Parse(ConsolẹReadLine());
a = new int[n][];
ConsolẹWriteLine("Ban hay nhap thong tin cho moi day so nguyen"); for (i = 0; i < ạLength; ++i)
{
ConsolẹWrite("Ban hay nhap so phan tu cho day thu {0} m=", i); m = int.Parse(ConsolẹReadLine());
ConsolẹWriteLine("Nhap gia tri cho moi phan tu o day thu {0}", i); for (j = 0; j < a[i].Length; j++) { ConsolẹWrite("a[{0}][{1}]=", i, j); a[i][j] = int.Parse(ConsolẹReadLine()); } } }
static void Tim(out int[] kq) {
int i, j, d=0,max; kq = null;
for (i = 0; i < ạLength; ++i) {
max = a[i][0];
for (j = 1; j < a[i].Length; ++j) if (max < a[i][j]) max = a[i][j]; ArraỵResize(ref kq, ++d);
kq[d - 1] = max;