• Nhiều chương trình chúng ta viết là không có giao diện với
các cửa sổ
• Các đối số dòng lệnh sẽ được truyền cho chương trình thông
qua lời gọi chương trình
• Các đối số được truyền thông qua hàm Main
• args - mảng các chuỗi
38
50 trang |
Chia sẻ: huyhoang44 | Lượt xem: 679 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Mảng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
v 1.0 - 11/2012
Mảng
1
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng2
chúng ta đã học...
Programs = Data Structure + Algorithms
Tuần tự Rẽ nhánh Lặp Hàm
Cấu trúc chương trình
Tổ chức dữ liệu
bool char short int long float double string
Kiểu dữ liệu
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng3
chúng ta sẽ học...
Programs = Data Structure + Algorithms
Tuần tự Rẽ nhánh Lặp Hàm
Cấu trúc chương trình
Tổ chức dữ liệu
bool char short int long float double string
Kiểu dữ liệu
array
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
1. Mảng
2. Chuỗi ký tự
3. Đối số dòng lệnh
4. Generics
4
Nội dung
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Cơ bản về Mảng
Array
5
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Mảng là một tập liên tục có thứ tự các thành phần dữ liệu cùng
kiểu được tham chiếu bằng cùng một tên định danh và một chỉ
số
• Giá trị của chỉ số nằm trong khoảng 0 .. size - 1
• C# kiểm tra phạm vi của mảng
• Chương trình bị crash khi truy xuất thành phần vượt quá phạm vi mảng
• Mảng là kiểu tham chiếu, được cấp phát trong bộ nhớ heap
• Tất cả các mảng đều được tạo ra từ lớp System.Array
• Trước khi sử dụng mảng, ta cần thực hiện 3 bước :
1. Khai báo mảng
2. Khởi tạo mảng (cấp phát bộ nhớ cho mảng)
3. Khởi gán giá trị cho mảng
6
Mảng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Các khai báo mảng bao gồm kiểu dữ liệu, các cặp dấu ngoặc
vuông và tên mảng
• Số lượng dấu phẩy hoặc cặp ngoặc vuông thể hiện số chiều của mảng
• Mảng được đặt tên theo quy tắc đặt tên biến
7
Khai báo
type[] name; //mảng một chiều
type[,] name; // mảng hai chiều
type[][] name; // mảng hai chiều lởm chớm - Jagged
type[][,] name;
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Sử dụng từ khoá new
• Các size có thể là một hằng số, biến, giá trị của biểu thức
• Sau khi cấp phát bộ nhớ thì số chiều, kích thước mỗi chiều là không thể thay
đổi (trừ khi cấp phát lại)
• Các thành phần dữ liệu của mảng sẽ nhận giá trị mặc nhiên theo kiểu dữ liệu
của mảng
• Có thể vừa khai báo vừa khởi tạo mảng trong cùng một câu lệnh
8
Khởi tạo
name = new type[sizes];
name = new type[sizes1,sizes2];
type[] name = new type[sizes];
type[,] name = new type[sizes1,sizes2];
type[][] name = new type[sizes1][];
...
// mảng jagged
name = new type[sizes1][];
name[0] = new type[size2];
name[1] = new type[size3];
...
name[size1 - 1] = new type[sizen];
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng9
Mảng một chiều
int[] test = new int[10]; // space for 10 ints
0 1 2 3 4 5 6 7 8 9
test[0] test[5]
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng10
Mảng hai chiều
float[,] test_score = new float[4,10]; // space for 40 floats
test_score[0,0]
0 1 2 3 4 5 6 7 8 9
0
1
2
3
test_score[3,2]
test_score[2,3]
test_score[3,9]
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng11
Mảng lởm chởm hai chiều
float[][] jagged = new float[4][];
jagged[0] = new float[10];
jagged[1] = new float[6];
jagged[2] = new float[8];
jagged[3] = new float[3];
jagged[0][0]
0 1 2 3 4 5 6 7 8 9
0
1
2
3
jagged[3][2]
jagged[2][5] jagged[0][9]
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng12
Mảng ba chiều
double[,,] class_score = new double[5,5,10]; // space for 250 doubles
, ,
, ,
, ,
, ,
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Gán giá trị cho từng thành phần của mảng
• Vừa khai báo, khởi tạo và khởi gán giá trị cho mảng
• Đồng thời khởi tạo và gán giá trị
13
Khởi gán - mảng một chiều
int[] ages = new int[4];
ages[0] = 20;
ages[1] = 23;
ages[2] = 23;
ages[3] = 0;
int[] ages = {20, 23, 23, 0};
int[] ages = new int[5] {20, 23, 23, 0};
int[] ages;
ages = new int[] {20, 23, 23, 0};
ages = {20, 23, 23, 0}; // sai
int[] ages = new int[] {20, 23, 23, 0};
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng14
Khởi gán - mảng nhiều chiều
int[,] rects = new int[4,2];
rects[0,0] = 1;
rects[0,1] = 2;
...
rects[2,1] = 6;
...
int[,] rects = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
int[,] rects = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
int[,] rects;
rects = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng15
Khởi gán - mảng lởm chởm
int[][,] jagged = new int[3][,];
jagged[0][0,0] = 1;
jagged[0][0,1] = 2;
...
jagged[2][1,1] = 6;
...
int[][] jagged = new int[4][];
jagged = new int[5] {1, 2, 3, 4, 5};
jagged = new int[2] {3, 4};
jagged = new int[3] {5, 6, 7};
jagged = new int[5] {6, 7, 8, 9, 10};
int[][] jagged = new int[][]
{ new int[] {1, 2, 3, 4, 5},
new int[] {3, 4},
new int[] {5, 6, 7},
new int[] {6, 7, 8, 9, 10}
};
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Các chỉ số có thể là kết quả của một biểu thức
• Mảng thường được sử dụng cùng với các vòng lặp (for, while)
• Mỗi vòng lặp cho một chiều của mảng
• Chỉ số chạy từ 0 đến size - 1 (hoặc < size)
16
Sử dụng mảng
// Nhập giá trị cho mảng
for (int i = 0; i < test.Length; i++)
test[i] = int.Parse(Console.ReadLine());
// In ra màn hình giá trị của mảng
for (i = 0; i < 10; i++)
% for (j = 0; j < 4; j++)
% Console.Write(“{0} ”,test_score[i,j]);
// In mảng jagged
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < jagged[i].Length; j++)
Console.Write(“{0} ”, jagged[i][j]);
Console.WriteLine();
}
int[] inputs = new int[max];
int size = 0;
string line;
Console.Write("Enter first number:");
line = Console.ReadLine();
while (line != null)
{
% inputs[size] = int.Parse(line);
% size++;
% Console.Write("Enter next number:");
% line = Console.ReadLine();
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
foreach
• Cho phép duyệt qua tuần tự từng phần tử một của một mảng,
một danh sách
• Phù hợp hơn với mảng một chiều hoặc các danh sách
17
foreach (type identifier in expression)
statement;
foreach (int t in test)
Console.Write(“{0} ”, t);
foreach (int t in test_score)
Console.Write(“{0} ”, t);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Biến mảng có kiểu tham chiếu
• Khi viết
• Có thể sao chép nội dung từng thành phần trong B sang A
18
Sao chép mảng
A = B;
for (int i = 0; i < A.Length; i++)
A[i] = B[i];
0x0a10
B 0x0a10
A
a a a a a a
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng19
Mảng là trị trả về của hàm
static string[] GetStringArray()
{
string[] strings = {“Hello”, “from”, “CSLT”};
return strings;
}
static void Main()
{
string[] strs = GetStringArray();
foreach (string s in strs)
Console.WriteLine(s);
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Có thể truyền một mảng đã được khởi tạo cho một hàm
• Trong định nghĩa hàm, tham số được khai báo như khai báo
mảng
• Có thể truyền bất kỳ mảng nào cùng số chiều và cùng kiểu cho các hàm này
• Có thể dùng các tham chiếu ref và out cho các tham số mảng
20
Truyền mảng cho hàm
static void function(int[] arg)
static void function(int[,] arg)
static void function(int[][] arg)
static void PrintArray(int[] a)
{
% foreach (int n in a)
% % Console.Write(“{0} ”, n);
% Console.WriteLine();
}
static int Main()
{
% int[] firstArray = {5, 10, 15};
% int[] secondArray = {2, 4, 6, 8};
% PrintArray(firstArray);
% PrintArray(secondArray);
% return 0;
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Tham số params
• Từ khoá params cho phép truyền cho hàm một lượng tham số
có kiểu xác định thông qua chỉ một tham số duy nhất
• Có thể truyền vào một mảng hoặc danh sách các đối số (phân cách nhau
bằng dấu phẩy)
• Nếu còn có nhiều tham số khác thì, tham số params phải được đặt ở cuối
21
static double CalculateAverage(params double[] values)
{
double sum = 0;
for (int i = 0; i < values.Length; i++)
sum += values[i];
return sum / values.Length;
}
double average;
average = CalculateAverage(4.0, 3.2, 5.7, 64.22, 87.2);
double[] data = {4.0, 3.2, 5.7};
average = CalculateAverage(data);
M
ai
n(
)
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
System.Array
22
Clear() Hàm tĩnh này gán giá trị mặc định (theo kiểu dữ liệu của mảng) cho tất
cả các thành phần của mảng
Copy() Hàm cho phép sao chép một phần của mảng này lên mảng khác
CopyTo() Hàm này được sử dụng để sao chép các thành phần của mảng nguồn
sang mảng đích
GetLength() Hàm này trả về số lượng thành phần trên một chiều chỉ định của mảng
IndexOf() Hàm này trả về chỉ số của giá trị xuất hiện đầu tiên trong mảng một
chiều
LastIndexOf() Hàm trả về chỉ số của giá trị xuất hiện cuối cùng trên mảng một chiều
Length Thuộc tính này trả ra số lượng thành phần của mảng
Rank Thuộc tính này trả ra số chiều của mảng
Reverse() Hàm tĩnh này đảo ngược thứ tự các thành phần của một mảng một
chiều
Sort() Hàm tĩnh này sắp xếp một mảng một chiều kiểu cơ bản
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Một số ví dụ
23
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng24
Ví dụ - nhập xuất
Đọc 10 số nguyên vào mảng numbers rồi in chúng theo thứ tự ngược
lại
static int Main()
{
% int[] numbers = new int[10];
% Console.Write("Enter ten numbers: ");
% for (int i = 0; i < 10; i++)
% % numbers[i] = int.Parse(Console.ReadLine());
% for (int i = 0; i < 10; i++)
% % Console.Write("{0} ", numbers[9-i]);
% Console.WriteLine();
return 0;
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng25
Ví dụ
Đọc và số thẻ sinh viên, điểm hai bài thi và in ra danh sách điểm trung bình của từng
sinh viên
const int MAX = 100;
static void Main(string[] args)
{
int[] idNumbers = new int[MAX];
int[] exam1 = new int[MAX];
int[] exam2 = new int[MAX];
int size, i;
string line;
%
% // Doc so the sinh vien va diem bai thi
% size = 0;
% Console.Write("Enter ID number and two exam grades: ");
% line = Console.ReadLine();
% while (line != null)
% {
string[] items = line.Split();
idNumbers[size] = int.Parse(items[0]);
exam1[size] = int.Parse(items[1]);
exam2[size] = int.Parse(items[2]);
% Console.Write("Enter ID number and two exam grades: ");
% line = Console.ReadLine();
size++;
% }
%
% // In ra diem trung binh
% Console.Write("\n\nIDNumbers\tAverage\n\n");
% for (i = 0; i < size; i++)
% % Console.WriteLine("{0}\t{1}", idNumbers[i], (exam1[i] + exam2[i])/2);
Console.ReadKey();
}
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng26
Ví dụ - cộng ma trận
double[,] a = new double[m,n];
double[,] b = new double[m,n];
double[,] c = new double[m,n];
for (i = 0; i < m; i++)
% for (j = 0; j < n; j++)
% % c[i,j] = a[i,j] + b[i,j];
A =
a0,0
a1,0
am−1,0
a0,1
a1,1
am−1,1
a0,n−1
a1,n−1
am−1,n−1
⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
B =
b0,0
b1,0
bm−1,0
b0,1
b1,1
bm−1,1
b0,n−1
b1,n−1
bm−1,n−1
⎡
⎣
⎢
⎢
⎢
⎢
⎢
⎢
⎤
⎦
⎥
⎥
⎥
⎥
⎥
⎥
C = A + B→ ci, j = ai, j + bi, j
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng27
Ví dụ - nhân ma trận
double[,] a = new double[m,p];
double[,] b = new double[p,n];
double[,] c = new double[m,n];
for (i = 0; i < m; i++)
% for (j = 0; j < n; j++)
% {
% % c[i,j] = 0;
% % for (k = 0; k < p; k++)
% % % c[i,j] += a[i,k] + b[k,j];
% }
C = AB→ ci, j = ai,kbk , j
k=0
p−1
∑
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Chuỗi ký tự
28
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Sử dụng từ khoá string để khai báo một chuỗi ký tự
• Tất cả các chuỗi đều dẫn xuất từ lớp System.String
• Các chuỗi này là “bất di bất dịch”
• giá trị của nó là không thể thay đổi một khi đã được tạo ra
• các hàm sẽ trả ra các thay đổi trên một chuỗi mới, chuỗi gốc vẫn nguyên vẹn
• Có thể xem chuỗi ký tự như một mảng một chiều các ký tự kết
thúc bằng null (\0)
• Mảng dài hơn 1 ký tự so với chuỗi ký tự mà nó lưu trữ
• Trình biên dịch sẽ tự động thêm null vào cuối các hằng chuỗi
29
Chuỗi ký tự
string st = "This is the initial string content";
st = "This is a different string content";
T h i s i s \0...st
Stack Heap
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Các hằng chuỗi được bao trong cặp dấu nháy kép
• Có thể bao gồm các ký tự escape
• Chuỗi đúng nguyên văn (verbatim string) - bắt đầu bằng ký tự @
• dấu \ không được xem là ký tự escape, dấu “ phải được gấp đôi
• chuỗi có thể được viết trên nhiều dòng
30
Chuỗi ký tự
\’ ‘ \n dòng mới
\” “ \r về đầu dòng
\\ \ \t tab
string path = "\\\\MyApp\\bin\\Debug";
string verPath = @"\\MyApp\bin\Debug";
string oneline = "Line One\nLine Two";
string twoline = @"Line One
Line Two";
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
System.String
31
Length Thuộc tính trả ra độ dài của chuỗi
Compare() Hàm tĩnh so sánh hai chuỗi
Contains() Hàm xác định một chuỗi có chứa một chuỗi con được chỉ định
Equals() Hàm kiểm tra sự giống nhau về nội dung của hai chuỗi
Format() Hàm tĩnh định dạng một chuỗi sử dụng các thành tố cơ sở (số,
chuỗi) và các token giữ chỗ
Insert() Hàm này chèn một chuỗi vào chuỗi đã cho
Remove()
Replace()
Hàm này trả ra bản sao của một chuỗi với những thay đổi (xoá
hoặc thay thế ký tự)
Split() Hàm này trả ra một mảng kiểu string chứa các chuỗi con được
tách ra bằng các ký tự hoặc chuỗi phân tách
Trim() Hàm này xoá ở đầu và cuối chuỗi các ký tự được chỉ định
ToUpper()
ToLower()
Các hàm này tạo ra một bản sao của chuỗi hiện tại với tất cả các
ký tự được in hoa hoặc in thường
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
• Truy xuất chuỗi
• Nối chuỗi
Mảng
Một số thao tác với chuỗi
32
// hai cách như nhau
string s3 = s1 + s2;
string s4 = string.Concat(s1, s2);
// in ra độ dài chuỗi
Console.Write(s1.Length);
Console.Write(s1[3]); // in ký tự g
string s1 = "Programming";
string s2 = " C#";
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
• So sánh chuỗi
• So sánh bằng
Mảng
Một số thao tác với chuỗi
33
if (s1 == s2) Console.Write("bằng nhau");
if (s1.Equals(s2)) Console.Write("bằng nhau");
if (string.Equals(s1, s2)) Console.Write("bằng nhau");
// 0 - bằng nhau
// >0 - s1 lớn hơn s2
// <0 - s1 nhỏ hơn s2
int result = string.Compare(s1,s2);
// không phân biệt chữ hoa, chữ thường
result = string.Compare(s1,s2,true);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
• Sao chép
• Tìm kiếm chuỗi
• Chèn
Mảng
Một số thao tác với chuỗi
34
// vị trí trong chuỗi gốc, tính từ 0
Console.Write("Vị trí hai chữ m là ", s1.IndexOf("mm"));
string s5 = string.Copy(s1);
string s6 = s1;
if (s2.EndsWith("#")) Console.Write("đúng vậy");
if (s2.StartsWith(" ")) Console.Write("đúng vậy");
string s7 = s3.Insert(12, "language");
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Tách chuỗi (split)
35
string s1 = "Trường Đại học Kinh tế, Đại học Huế";
// tạo mảng các ký tự được dùng để tách từ
char[] delims = { ' ', ',' };
// kết quả tách được trả ra trong một mảng string
string[] strs = s1.Split(delims,
StringSplitOptions.RemoveEmptyEntries);
foreach (string st in strs)
Console.WriteLine(st);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
System.Text.StringBuilder
• Lớp StringBuilder cho phép tạo và thay đổi các chuỗi
• Khi bạn gọi các hàm của kiểu này, bạn thay đổi trực tiếp nội
dung của chuỗi
36
StringBuilder sb = new StringBuilder("FANTASTIC GAMES");
sb.Append("\n");
sb.AppendLine("Half Life");
sb.AppendLine("Beyond Good and Evil");
sb.AppendLine("Deus Ex 2");
sb.AppendLine("System Shock");
Console.WriteLine(sb.ToString());
sb.Replace("2", "Invisible War");
Console.WriteLine(sb.ToString());
Console.WriteLine("sb has {0} chars.", sb.Length);
Console.WriteLine();
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Đối số dòng lệnh
37
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
• Nhiều chương trình chúng ta viết là không có giao diện với
các cửa sổ
• Các đối số dòng lệnh sẽ được truyền cho chương trình thông
qua lời gọi chương trình
• Các đối số được truyền thông qua hàm Main
• args - mảng các chuỗi
38
Đối số dòng lệnh (1/2)
dir /s /w /p C:\”Program Files”\
static void Main(string[] args)
static int Main(string[] args)
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng39
Đối số dòng lệnh (2/2)
C:\>argdemo hello world from Hue
static int Main(string[] args)
foreach (string st in args)
process(st);
for (i = 1; i < args.Lenght; i++)
process(args[i]);
h e l l o \0
w o r l d \0
f r o m \0
H u e \0
args[0]
args[1]
args[2]
args[3]
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng40
Ví dụ
Viết chương trình tính tổng một dãy số được nhập vào theo đối số
dòng lệnh
static int Main(string[] args)
{
if (args.Length < 2)
% {
% % Console.Write("Correct usage : sum ...\n");
% % return 1;
% }
% int sum = 0;
foreach (string st in args)
% {
sum += int.Parse(st);
% }
%
% Console.Write("Sum of numbers : {0}", sum);
Console.ReadKey();
% return 0;
}
C:\>sum 2 3 4 5 6
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Generics
41
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
System.Collections
42
• Mảng là cấu trúc dữ liệu (container) cơ bản nhất cho việc lưu
trữ dữ liệu
• Hữu dụng cho việc quản lý lượng nhỏ dữ liệu
• Kích thước mảng là cố định
• Cần có các cấu trúc dữ liệu mềm dẻo hơn
• tăng, giảm kích thước tự động, dễ dàng
• Namespace System.Collections ra đời cùng với phiên
bản .NET 1.0
• Cung cấp một vài CTDL : ArrayList, Hashtable, Queue, SortedList,
Stack
• Nhưng các CTDL này mặc phải một số vấn đề :
• Hiệu năng
• An toàn kiểu
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Generics
• Generics là kỹ thuật được đổi tên và có cải tiến của kỹ thuật
khuôn hình trong các ngôn ngữ lập trình hướng đối tượng
• Khuôn hình là kỹ thuật cho phép định nghĩa các hàm, lớp, cấu
trúc dữ liệu,... chấp nhận kiểu dữ liệu hình thức tại thời điểm
biên dịch và trong thời gian chạy nó mới nhận kiểu dữ liệu cụ
thể
• Từ bản 2.0, .NET cung cấp các generics sau trong namespace
System.Collections.Generic
43
• Dictionary
• List
• LinkedList
• Queue
• SortedDictionary
• SortedSet
• Stack
• HashSet
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
List
44
Add() Hàm chèn thêm một phần tử vào cuối danh sách
BinarySearch() Hàm sử dụng thuật toán tìm kiếm nhị phân để tìm kiếm một phần
tử nào đó
Clear() Hàm xoá tất cả các phần tử trong danh sách
Contains() Hàm xác định sự tồn tại của một phần tử xác định
Count Thuộc tính cho biết số lượng phần tử hiện tại trong danh sách
IndexOf() Hàm tìm kiếm một giá trị xác định và trả ra vị trí xuất hiện đầu tiên
tính từ đầu danh sách của giá trị đó trong danh sách
Insert() Hàm này chèn một phần tử mới vào danh sách
LastIndexOf() Hàm tìm kiếm một giá trị xác định và trả ra vị trí xuất hiện đầu tiên
tính từ cuối danh sách của giá trị đó trong danh sách
Remove() Hàm xoá một phần tử xác định
RemoveAt() Hàm xoá một phần tử tại vị trí chỉ định
Reverse() Hàm đảo ngược thứ tự các thành phần của danh sách
Sort() Hàm thực hiện sắp xếp danh sách theo thứ tự nào đó
ToArray() Hàm trả ra danh sách dưới dạng một mảng
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Ví dụ
• Khai báo, khởi tạo và khởi gán giá trị
• Duyệt mảng
• Chèn thêm phần tử mới
45
// khởi tạo danh sách và khởi gán giá trị
List ageList = new List { 20, 21, 24, 25 };
// dùng foreach để duyệt qua mảng
foreach (int age in ageList)
Console.Write("{0} ", age);
// chèn vào cuối danh sách
ageList.Add(21);
// chèn vào vị trí thứ 3 trong danh sách
ageList.Insert(2, 45);
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Ví dụ
• Tìm kiếm và xoá
• Chuyển ra mảng
46
// Contains trả ra giá trị true hoặc false
if (ageList.Contains(21))
ageList.Remove(21);
// BinarySearch, IndexOf, LastIndexOf là giống nhau
// trả ra vị trí của giá trị tìm được (0 → count - 1)
// nếu không có thì trả ra giá trị < 0
int index = ageList.IndexOf(21);
if (index >= 0)
ageList.RemoveAt(index);
int[] ageArray = ageList.ToArray();
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Stack
47
Clear() Hàm xoá tất cả các phần tử trong Stack
Contains() Hàm xác định sự tồn tại của một phần tử xác định
Count Thuộc tính cho biết số lượng phần tử hiện có trong Stack
Peek() Hàm trả ra phần tử đầu tiên trong Stack, nhưng không xoá
nó khỏi Stack
Pop() Hàm trả ra phần tử đầu tiên trong Stack và xoá nỏ khỏi
Stack
Push() Hàm chèn một phần tử mới vào đầu Stack
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Ví dụ
48
string exp = "1 2 + 4 * 3 +";
string[] items = exp.Split(); // tách từng số và toán tử ra
Stack stack = new Stack();
int num, left, right;
foreach (string item in items)
{
if (int.TryParse(item, out num)) // thử đổi sang số
stack.Push(num); // nếu được thì gán vào Stack
else
{ // không được thì là toán tử
right = stack.Pop(); // nên lấy ra hai số trong Stack
left = stack.Pop();
// dựa theo toán tử để thực hiện phép toán
switch (item)
{
case "+": num = left + right; break;
case "-": num = left - right; break;
case "*": num = left * right; break;
case "/": num = left / right; break;
}
stack.Push(num); // kết quả được nhét vào lại Stack để tính tiếp
}
}
num = stack.Pop(); // lấy kết quả ra khỏi Stack
Console.Write(num); // in kết quả
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn Mảng
Queue
49
Clear() Hàm xoá tất cả các phần tử trong Stack
Contains() Hàm xác định sự tồn tại của một phần tử xác định
Count Thuộc tính cho biết số lượng phần tử hiện có trong Stack
Dequeue() Hàm trả ra phần tử đầu tiên trong Queue và xoá nó khỏi
Queue
Enqueue() Hàm này thêm phần tử mới vào cuối Queue
Monday, September 9, 13
Lê Viết Mẫn - lvman@hce.edu.vn
Cảm ơn sự chú ý
Câu hỏi ?
Mảng50
Monday, September 9, 13
Các file đính kèm theo tài liệu này:
- 07_mang_1976.pdf