NMLT_ThucHanh_Chuong07p1.pdfSlide lap trinh web sieu nang cao provip

huykhadeo113 0 views 11 slides Feb 16, 2025
Slide 1
Slide 1 of 11
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11

About This Presentation

Slide lap trinh web sieu nang cao provip


Slide Content

CHƯƠNG 07. MẢNG MỘT CHIỀU - 1 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

BÀI TẬP THỰC HÀNH CHƯƠNG 07 (p1)
1. Mảng một chiều
• Dùng để biểu diễn một dãy các biến có cùng kiểu dữ liệu.

Hình ảnh trên, a là dãy các số nguyên có tối đa 7 phần tử (phương thức a.Length) và hiện tại có
4 phần tử (chứa trong biến n).
Lưu ý: Để đơn giản hóa cách thức sử dụng mảng khi bắt đầu học, trong bài học quy ước a.Length
cũng là số lượng phần tử tối đa và số lượng phần tử hiện tại của mảng (bỏ đi biến n).
1.1. Khai báo mảng:
type[] arrayName;
• Tạo mảng có n phần tử:
arrayName = new type[n];
Ví dụ 1: Khai báo một mảng số nguyên có tối đa 10 phần tử:

int[] Mang1Chieu = new int[10];
• Khởi tạo giá trị khi khai báo:
Type[] arrayName = new Type[] {value1, value2, …, valueN};
Ví dụ 2: Khai báo và khởi tạo mảng a gồm 4 phần tử 2912, 1706, 1506, 1904

int[] a = new int[] { 2912, 1706, 1506, 1904 };
1.2. Truy xuất phần tử mảng:
• Các phần tử trong mảng được truy xuất thông qua chỉ số
• Chỉ số mảng được bắt đầu từ 0 và kết thúc n-1
arrayName[index]

CHƯƠNG 07. MẢNG MỘT CHIỀU - 2 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

Ví dụ 3: Các phép truy xuất hợp lệ và không hợp lệ trong mảng số nguyên a có 4 phần tử:
int a[4];

• Các truy xuất
o Hợp lệ: a[0], a[1], a[2], a[3]
o Không hợp lệ: a[-1], a[4], a[5], …
• Gán giá trị cho phần tử:
arrayName[index] = value;
• Lấy số phần tử của mảng
arrayName.Length
1.3. Duyệt mảng
• Duyệt mảng là hành động đi qua tất cả các phần tử của mảng nhằm thực hiện các thao tác cơ bản
như nhập mảng, xuất mảng, tính tổng, tìm kiếm, thống kê, …
• Duyệt từ đầu đến cuối: a[0], a[1], …, a[n-1]:
for (int i = 0; i <= a.Length-1; i++)
{
// Xử lý phần tử thứ tại vị trí i (a[i])
}
• Duyệt từ cuối về đầu: a[n-1], a[n-2], …, a[0]:
for (int i = a.Length-1; i >= 0; i--)
{
// Xử lý phần tử thứ tại vị trí i (a[i])
}
1.4. Truyền mảng vào hàm
• Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng.
Ví dụ 4: static void NhapMang(int[] A, int n)
• Mảng là kiểu dữ liệu tham chiếu nên khi truyền vào hàm, nếu chỉ muốn thay đổi nội dung của
mảng thì truyền kiểu tham trị (không có từ khóa ref hay out), ngược lại muốn thay đổi tham chiếu
của mảng, nghĩa là cấp phát mảng mới thì cần từ khóa ref hay out.
Ví dụ 5: Tình huống nhập mảng truyền tham trị, nghĩa là cho trước số lượng phần tử, chỉ cần nhập
nội dung mảng. Ngược lại, hàm nhập mảng chịu trách nhiệm nhập số lượng và nội dung mảng.
Truyền tham trị Truyền tham chiếu
Cú pháp static void NhapMang(int[] A,int n) static void NhapMang(ref int[] A)
Tình huống
Truy xuất nội dung: int b = A[1]
Cập nhật nội dung: A[1] = 10
Truy xuất và cập nhật nội dung
Thay đổi tham chiếu: A = new int[20];
Lời gọi hàm
int n = 5;
int A[] = new int[5];
NhapMang(A, n);
int A[];
NhapMang(ref A, n)
1.5. Ví dụ minh họa
Ví dụ 6: Nhập xuất dãy số nguyên NhapXuatDaySoNguyen.*

CHƯƠNG 07. MẢNG MỘT CHIỀU - 3 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

Cho dãy số nguyên A và B có n và m phần tử (n ≤ 100). Hãy nhập dãy số nguyên A từ bàn phím, phát
sinh ngẫu nhiên dãy số nguyên B có giá trị trong đoạn [300, 500], xuất dãy số nguyên A và B ra màn
hình theo thứ tự từ trái sang phải và từ phải sang trái.
* Day so A:
Moi ban nhap so luong phan tu: 3
Phan tu 0: 5
Phan tu 1: 3
Phan tu 2: 6
Day so co 3 phan tu: 5 3 6
Day so co 3 phan tu: 6 3 5
* Day so B:
Moi ban nhap so luong phan tu: 4
Day so co 4 phan tu: 301 517 434 392
Day so co 4 phan tu: 392 434 517 301
Các hàm mẫu:
public static void nhapDaySo(ref int[] day)
{
int i, n;

// Nhập số lượngphần tử
Console.Write("Moi ban nhap so luong phan tu: ");
n = int.Parse(Console.ReadLine());
// Tạo mảng các phần tử
day = new int[n];
// Nhập giá trị cho từng phần tử
for (i = 0; i <= day.Length - 1; i++)
{
Console.Write("Phan tu {0}: ", i);
day[i] = int.Parse(Console.ReadLine());
}
}

public static int[] sinhNgauNhienDaySo(int n, int vmin, int vmax)
{
int i;
int[] day = null;
// Tạo mảng các phần tử
day = new int[n];
// Sinh ngẫu nhiên giá trị cho từng phần tử
Random rand = new Random();// Đối tượng sinh số ngẫu nhiên
for (i = 0; i <= day.Length - 1; i++)
{
day[i] = rand.Next(vmin, vmax);
}
return day;
}

public static void inMangTraiSangPhai(int[] day)
{
// In số phần tử
Console.Write("Day so co {0} phan tu:", day.Length);
// Duyệt dãy từ đầu về cuối
for (int i = 0; i <= day.Length - 1; i++)
{

CHƯƠNG 07. MẢNG MỘT CHIỀU - 4 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

Console.Write(" {0}", day[i]);
}
Console.WriteLine();// Xuống dòng
}

public static void inMangPhaiSangTrai(int[] day)
{
// In số phần tử
Console.Write("Day so co {0} phan tu:", day.Length);
// Duyệt dãy từ cuối về đầu
for (int i = day.Length - 1; i >= 0; i--)
{
Console.Write(" {0}", day[i]);
}
Console.WriteLine();// Xuống dòng
}

public static void Main(string[] args)
{
// Khai báo mảng 1 chiều
int[] a = null, b = null;
int n;

// Dãy số A
Console.WriteLine("* Day so A: ");
nhapDaySo(ref a);
inMangTraiSangPhai(a);
inMangPhaiSangTrai(a);
// Dãy số B
Console.WriteLine("* Day so B: ");
Console.Write("Moi ban nhap so luong phan tu: ");
n = int.Parse(Console.ReadLine());
b = sinhNgauNhienDaySo(n, 300, 500);
inMangTraiSangPhai(b);
inMangPhaiSangTrai(b);
}
1.6. Bài tập áp dụng
Bài tập 1: static void NhapMang1(int[] a): Hàm có tham số là mảng 1 chiều chứa các số nguyên a
đã được khởi tạo, yêu cầu người dùng nhập giá trị cho các phần tử của mảng a (Sinh viên tự thực
hiện)
Bài tập 2: static void NhapMang2(out int[] a): Hàm có tham số là mảng 1 chiều chứa các số nguyên
a không cần phải khởi tạo trước, yêu cầu người dùng nhập kích thước, khởi tạo mảng a với kích thước
vừa nhập, sau đó nhập giá trị cho các phẩn tử của a. (Sinh viên tự thực hiện)
Bài tập 3: static int[] NhapMang3(): khởi tạo một mảng 1 chiều chứa các số nguyên a bên trong
hàm, yêu cầu người dùng nhập kích thước, khởi tạo mảng a với kích thước vừa nhập, sau đó nhập giá
trị cho các phẩn tử của a. Hàm có kết quả trả về là mảng a sau khi đã nhập xong. (Sinh viên tự thực
hiện)

CHƯƠNG 07. MẢNG MỘT CHIỀU - 5 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

2. Một số bài toán về mảng
2.1. Tính tổng giá trị mảng (Bài 3 tài liệu thực hành)
Yêu cầu:
• Cho mảng A có n phần tử
• Tính tổng giá trị của tất cả phần tử trong mảng
Phương pháp:
• Cộng dồn lần lượt từng phần tử của mảng cho đến khi hết mảng
Ví dụ 7: Viết hàm tính tổng của mảng số nguyên.
static int TinhTongMang(int[] a)
{
int tong = 0;
for (int i = 0; i < a.Length; i++)
tong += a[i];
return tong;
}
2.2. Tìm kiếm một phần tử trong mảng (Bài 4 tài liệu thực hành)
Yêu cầu:
• Cho mảng A có n phần tử
• Tìm phần tử có giá trị x xem nó có trong mảng A hay không
• Nếu có nó nằm ở vị trí nào trong mảng
Phương pháp:
• Xét lần lượt từng phần tử của mảng A
• Nếu phần tử đang xét bằng x thì trả về chỉ số của phần tử đó
• Nếu không tồn tại trả về -1.

Ví dụ 8: Viết hàm tìm phần tử có giá trị x trong mảng số nguyên.
static int TimKiem(int[] a, int x)
{
for (int vt = 0; vt < n; vt++)
if (a[vt] == x)
return vt;
return -1;
}
2.3. Tìm giá trị lớn nhất (Bài 5 tài liệu thực hành)
Yêu cầu:
• Cho mảng A có n phần tử
• Tìm phần tử nhỏ nhất (min) trong mảng A
Phương pháp:
• Dùng biến min để lưu giá trị nhỏ nhất

CHƯƠNG 07. MẢNG MỘT CHIỀU - 6 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

• Giả sử min ban đầu là phần tử đầu tiên của mảng
• Lần lượt xét các phần tử còn lại để cập nhật giá trị nhỏ nhất cho biến min


Ví dụ 9: Viết hàm tìm giá trị lớn nhất của mảng số nguyên.
static int TimMax(int[] a)
{
int max = a[0];
for (int i = 0; i < a.Length; i++)
if (a[i] > max)
max = a[i];
return max;
}
Ví dụ 10: Viết hàm tìm giá trị nhỏ nhất của mảng số thực.
static double TimMax(double[] a)
{
double min = a[0];
for (int i = 0; i < a.Length; i++)
if (a[i] < min)
min = a[i];
return min;
}
2.4. Sắp xếp mảng tăng dần
Ý tưởng: Thuật toán sắp xếp chọn (selection sort)
• Ý tưởng:
o Xét vị trí đầu tiên, duyệt các phần tử đứng sau nó. Nếu có phần tử lớn hơn phần tử đầu tiên
thì hoán vị. Kết quả phần tử đầu tiên là nhỏ nhất so với các phần tử đứng sau.
o Lặp lại cho phần tử tiếp theo cho đến phần tử kế cuối.
• Chạy tay:
o Cho dãy số:

CHƯƠNG 07. MẢNG MỘT CHIỀU - 7 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

5 2 4 3
a[0] a[1] a[2] a[3]
n = 4
o Xét vị trí 0:
2 5 4 3
a[0] a[1] a[2] a[3]
2 5 4 3
a[0] a[1] a[2] a[3]
o Xét vị trí 1:
2 4 5 3
a[0] a[1] a[2] a[3]
2 3 5 4
a[0] a[1] a[2] a[3]
o Xét vị trí 2:
2 3 4 5
a[0] a[1] a[2] a[3]
• Mã giả:
For i  0 To n-2 Do
For j  i+1 To n-1 Do
If a[i] > a[j] Then
HoanVi (a[i], a[j])
End If

CHƯƠNG 07. MẢNG MỘT CHIỀU - 8 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

End For
End For
Yêu cầu:
• Cho mảng A có n phần tử
• Sắp xếp mảng A sao cho giá trị các phần tử tăng dần
Phương pháp:
• Dùng hai vòng for để so sánh tất cả các cặp phần tử với nhau
• Hoán vị các cặp phần tử nghịch thế (sai thứ tự)
Khái niệm nghịch thế nghĩa là khi xét hai phần tử trong mảng, phần tử đứng trước lớn hơn phần
tử đứng sau (mảng tăng dần) hoặc phần tử đứng trước nhỏ hơn phần tử đứng sau (mảng giảm dần).
Ví dụ 11: Sắp xếp mảng số nguyên tăng dần.
static void SapXepTang(int[] a)
{
for (int i = 0; i < a.Length – 1; i++)
{
for (int j = i + 1; j < a.Length; j++)
{
if (a[i] > a[j])
HoanVi(ref a[i], ref a[j]);
}
}
}
static void HoanVi(ref int x, ref int y)
{
int tam = x;
x = y;
y = tam;
}

Bài tập 6. Đếm số nguyên dương Định nghĩa hàm đếm và trả về số lượng phần tử có giá trị lớn hơn
0 trong một mảng một chiều chứa các số nguyên. (SV tự thực hiện)
Bài tập 7: Cho ?????? số nguyên ?????? = (??????1, ??????2, … , ????????????) (&#3627409359; ≤ ?????? ≤ ??????&#3627409358;&#3627409358;&#3627409358;). Hãy cài đặt các hàm sắp xếp dãy
?????? tăng dần theo thuật toán Bubble Sort và Interchange Sort (SV tự thực hiện)
Input
• Dòng đầu tiên chứa số nguyên n
• Dòng thứ hai chứa ?????? số nguyên
Output
• Dòng duy nhất các số nguyên đã sắp xếp

CHƯƠNG 07. MẢNG MỘT CHIỀU - 9 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

Hướng dẫn: Thuật toán Bubble Sort











Hướng dẫn: Thuật toán Interchange Sort

CHƯƠNG 07. MẢNG MỘT CHIỀU - 10 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23

CHƯƠNG 07. MẢNG MỘT CHIỀU - 11 -

GV: TNQTRAM
Th

c hành Nh

p môn l

p trình 20
23



Bài tập 8: Hiệu chỉnh 2 thuật toán ở Bài 1 để thực hiện việc sắp xếp các phần tử trong đoạn [&#3627408524;,&#3627408525;] (0
≤ &#3627408472; ≤ &#3627408473; < ??????) theo thứ tự tăng dần. (SV tự thực hiện)

--- Còn tiếp ---