www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Nhập Môn Lập Trình
Mảng – Mảng Một Chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Road Map
Khái Niệm Mảng
Mảng một chiều
Khởi tạo mảng 1 chiều
Duyệt mảng 1 chiều
Nhập/ Xuất mảng 1 chiều
Sắp Xếp Mảng
Bubble sort
Cấp Phát Vùng Nhớ Động
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
3
Array = Mảng: là một tập hợp nhiều phần tử có cùng kiểu và
chung một tên
Sắp xếp các biến cùng kiểu dữ liệu thành một dãy liên tiếp.
Ví dụ:
int array_int [5];
/* Mảng array_int có 5 phần tử kiểu int xếp liên tiếp*/
float array_float [1000];
/* Mảng array_float có 1000 phần tử kiểu float xếp liên tiếp */
Khái niệm mảng
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
4
Mảng một chiều là mảng mà những phần tử của nó được xác
định một chỉ số.
Khai báo bien_so kiểu Array <T> :
<T> bien_so [n];
Trong đó:
<T> là kiểu dữ liệu
bien_so : tên biến
n: số phần tử của Array
Khai báo tường minh: int A[10]; float X[20];
Khai báo không tường minh: int A[ ]; float B[ ];
Mảng Một Chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
5
7 4 10 15 90 30 3 21 56 80
Mảng B
Phần tử B[3] có giá trị là 15
0 1 2 3 4 5 6 7 8 9
chỉ số
Mảng Một Chiều
Ví dụ: int B[10];
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
6
Khởi tạo = khai báo + gán giá trị cho mảng
Cú pháp khởi tạo mảng
#include<stdio.h>
#include<conio.h>
#define SIZE 5
void main()
{ clrscr();
int a[SIZE]={4,6,3,8,9};
for(int i=0; i<SIZE; i++)
printf("\na[%d]=%d",i,
a[i]);
getch();
}
Khởi tạo mảng 1 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
7
Gán giá trị cho mảng dùng vòng lặp
#include<stdio.h>
#include<conio.h>
#define SIZE 10
void main()
{ clrscr();
int value[SIZE]; /* value is an array of 10 integers */
int i; /* counter */
/* initialise elements of array to 0 */
for( i=0; i< SIZE; i++) {
value[i] = 0;
}
}
Khởi tạo mảng 1 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
8
Lỗi thường gặp khi khai báo :
int n[10]; n[0]++; /* quên gán giá trị trước khi dùng */
int b[5] = { 1, 3, 5, 7, 9, 11 }; /* gán nhiều giá trị hơn số phần tử */
int n[10] = { 0 };
/* gán giá trị zero cho phần từ đầu tiên và */
/* đồng thời gán giá trị zero cho tất cả phần tử còn lại vì số giá
trị dùng để gán ít hơn số phần tử của mảng */
int n[] = { 1, 3, 5, 7, 9 } /* Khởi tạo mảng có 5 phần tử số nguyên */
Mảng Một Chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
9
Xử lý mảng = Xử lý nhóm các phần tử = Xử lý mỗi phần tử trong mảng.
Một phần tử được xác định bởi một chỉ số
for (i=0; i<n; i++) xử lý a[i];
for (i=0; i<n; i++)
if (Điều kiện) xử lý a[i];
Duyệt mảng ngược
for (i=n-1; i>=0; i ) xử lý a[i];
for (i=n-1; i>=0; i )
if (điều kiện) xử lý a[i];
Duyệt mảng xuôi
Duyệt mảng 1 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
10
#include <stdio.h>
#include <conio.h>
#define SIZE 5
void main()
{ clrscr();
int a[SIZE]={4,6,3,8,9},S1=0, S2=0, S3=0, i;
printf("noi dung mang:");
for(i=0; i< SIZE; i++)
printf("%3d", a[i]);
for(i=0; i< SIZE; i++)
S1 += a[i];
printf("\nTong mang: %d", S1);
for(i=0; i< SIZE; i++)
if(a[i]%2==0) S2+=a[i];
printf("\nTong mang chan: %d", S2);
for(i= SIZE-1; i>=0; i )
if(a[i]%2) S3+=a[i];
printf("\nTong mang le: %d", S3);
getch();
}
Duyệt mảng ngược
Duyệt mảng có điều kiện
Duyệt mảng không có
điều kiện
18
12
Minh họa duyệt mảng 1 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
11
#include <conio.h>
#include <stdio.h>
void main()
{ int a[100],n;
clrscr();
//Nhập các phần tử vào mảng
printf("\n nhap so phan tu cua mang:");
scanf("%d",&n);
for (int i=0;i<n;i++)
{ printf("nhap a[%d]: ",i);
scanf("%d",&a[i]);
}
//Xuất mảng ra màn hình
printf("Noi dung mang:");
for(int i=0;i<n; i++)
printf("%3d",a[i]);
getch();
}
Kết quả
Viết chương nhập n
phần tử kiểu số nguyên vào
mảng và xuất mảng
này ra màn hình.
Nhập/ Xuất mảng 1 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
12
Sắp Xếp Mảng
Sắp xếp các phần tử của mảng theo 1 thứ tự tăng dần hay
giảm dần
Là bài toán kinh điển trong lập trình trong bất kỳ ngôn ngữ
Có nhiều thuật toán được phát minh để giải quyết bài toán
sắp xếp mảng
Các thuật toán này có độ phức tạp, không gian bô nhớ
được dùng và khoảng thời gian cần để thực hiện khác nhau
Ví dụ các thuật toán: Bubble sort, Insertion sort, Selection
Excange sort, Shell sort …
Thuật toán được đánh giá bởi số lần so sánh và chuyển đổi
phần cần phải thực hiện
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
13
Sắp Xếp Mảng
Bubble Sort:
Ý tưởng chính:
Mảng có N phần tử
Tìm số nhỏ nhất trong N phần tử và đưa về vị trí đầu tiên
Tìm số nhỏ nhất trong N-1 phần tử và đưa về vị trí kế tiếp
Tiếp tục lặp lại đến hết phần tử trong mảng
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
14
Bubble Sort – Ví dụ
2 8 5 1 6 4
1
5
1
2
2 3 4 5 6 7 81
i
j
1
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
15
Bubble Sort – Ví dụ
1
2
2 8 5 4 6
1
5
1
2 3 4 5 6 7 81
i
j
2
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
16
Bubble Sort – Ví dụ
2
1
2
4 8 5 6
1
5
1
2 3 4 5 6 7 81
i
j
4
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
17
Bubble Sort – Ví dụ
2 4
1
2
8 5 6
1
5
1
2 3 4 5 6 7 81
i
j
5
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
18
Bubble Sort – Ví dụ
2 4 5
1
2
8 6
1
5
1
2 3 4 5 6 7 81
i
j
6
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
19
Bubble Sort – Ví dụ
2 4 5 6
1
2
8
1
5
1
2 3 4 5 6 7 81
i
j
8
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
20
Bubble Sort – Ví dụ
2 4 5 6 8
1
2
1
5
1
2 3 4 5 6 7 81
i
j
1
5
1
2
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
21
Bubble sort – Thuật toán
Mảng
bắt đầu
1
12
2
2
3
8
4
5
5
1
6
6
7
4
8
15
Sau 1
vòng
1
12
2
8
5
4
6
15
Sau 2
vòng
1
2
12
4
8
5
6
15
Sau 3
vòng
1
2
4
12
5
8
6
15
Sau 4
vòng
1
2
4
5
12
6
8
15
Sau 5
vòng
1
2
4
5
6
12
8
15
Sau 6
vòng
1
2
4
5
6
8
12
15
Mảng xếp
theo thứ tự
1
2
4
5
6
8
12
15
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Bài tập tại lớp
Hãy viết mã giả và vẽ lưu đồ cho thuật toán Bubble Sort vừa
trình bày
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Bubble sort
BEGIN
INPUT array A[N] with N elements
FOR i = 0 to N – 1
FOR j = N – 1 to i + 1
IF A[j] < A[j – 1]
tmp = A[j]
A[j] = A[j – 1]
A[j – 1] = tmp
ENDIF
END FOR
END FOR
END
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
24
Demo sắp xếp
mảng tăng dần
bằng thuật toán
Bubble Sort
Sắp xếp mảng 1 chiều
#include <stdio.h>
#include <conio.h>
void main()
{ int n=5;
int a[n] = {5,3,4,7,1};
int i,j, t ;
for (i=0; i<n-1; i++)
for (j=n-1; j> i ; j )
if (a[j] < a[j-1])
{ t = a[j];
a[j]= a[j-1];
a[j-1] = t;
}
//Xuất mảng đã sắp xếp tăng
for (i=0; i<n; i++)
printf(“%3d”,a[i]);
getch();
}
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
25
Bài tập 1: (Giải tại lớp)
Viết chương trình nhập n phần tử số nguyên vào
mảng. Xuất ra màn hình:
- Phần tử max trong mảng
- Phần tử min trong mảng
- Tổng các phần tử của mảng.
Giải một số bài tập mảng 1 chiều