Bài giảng Lập trình C - Chương 5: Mảng một chiều - Trần Minh Thái

KHÁI NIỆM

Mảng được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần

Các thành phần của mảng là tập hợp các biến có cùng KDL và cùng tên

 

pptx 50 trang yennguyen 1360
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C - Chương 5: Mảng một chiều - Trần Minh Thái", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình C - Chương 5: Mảng một chiều - Trần Minh Thái

Bài giảng Lập trình C - Chương 5: Mảng một chiều - Trần Minh Thái
Lập trình C  Chương 5. Mảng một chiều(6 tiết) 
Trần Minh Thái 
Email: minhthai@huflit.edu.vn 
Website: www.minhthai.edu.vn 
Cập nhật: 09/11/2016 
Mục tiêu 
Kiểu dữ liệu mảng một chiều 
Các thao tác nhập/ xuất mảng 
Kỹ thuật tìm kiếm, liệt kê giá trị trong mảng 
KHÁI NIỆM 
Mảng được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần 
Các thành phần của mảng là tập hợp các biến có cùng KDL và cùng tên 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Giá trị 
Vị trí 
Vị trí được tính từ 0 
KHAI BÁO 
int a[100]; //Khai bao mang so nguyen a gom 100 phan tu 
float b[50]; //Khai bao mang so thuc b gom 50 phan tu 
char str[30]; //Khai bao mang ky tu str gom 30 ky tu 
 [ ] ; 
Nhằm thuận tiện cho việc viết chương trình, ta nên định nghĩa hằng số MAX ở đầu chương trình – là kích thước tối đa của mảng - như sau: 
#define MAX 100 
int main() 
{ 
	int a[MAX], b[MAX]; 
	//Các lệnh 
} 
KHAI BÁO VÀ GÁN GIÁ TRỊ BAN ĐẦU CHO MẢNG 
Gán từng phần tử 
int a[5] = {3, 6, 8, 1, 12}; 
Gán toàn bộ phần tử có cùng giá trị 
int a[8] = {3}; 
Giá trị 
3 
6 
8 
1 
12 
Vị trí 
0 
1 
2 
3 
4 
Giá trị 
3 
3 
3 
3 
3 
3 
3 
3 
Vị trí 
0 
1 
2 
3 
4 
5 
6 
7 
TRUY XUẤT GIÁ TRỊ 
TênMảng [vị trí cần truy xuất] 
int main() 
{ 
	int a[5] = {3, 6, 8, 11 , 12}; 
	printf(“Gia tri mang tai vi tri 3 = “, a[3]); 
	getch(); 
	return 0; 
} 
Kết quả: Gia tri mang tai vi tri 3 = 11 
Vị trí 3 
CÁC THAO TÁC TRÊN MẢNG 
Nhập 
Xuất (liệt kê) 
Tìm kiếm 
Đếm 
Sắp xếp 
Kiểm tra mảng thỏa điều kiện cho trước 
Tách/ ghép mảng 
Chèn / xóa 
NHẬP XUẤT MẢNG 
a[0] 
a[1] 
a[2] 
a[3] 
a[4] 
a[5] 
a[n-1] 
Nhập a[0] 
Nhập a[1] 
Nhập a[2] 
Nhập a[n-1] 
 Nhập a[i], 0<=i<n 
NHẬP/ XUẤT MẢNG 
#define MAX 100 
void NhapKichThuoc ( int & n ) 
{ 
	printf ( "Nhap vao kich thuoc mang: " ); 
	scanf ( "%d" , & n ); 
} 
void NhapMang ( int a [], int n ) 
{ 
for ( int i = 0; i < n ; i++) 
{ 
printf ( "* Nhap vao phan tu tai vi tri %d : " , i); 
scanf ( "%d" , & a [i]); 
} 
} 
void XuatMang ( int a [], int n ) 
{ 
for ( int i=0; i< n ;i++) 
{ 
	printf ( " %d \t" , a [i]); 
} 
} 
int main () 
{ 
int a[ MAX ], n; 
NhapKichThuoc (n); 
NhapMang (a, n); 
printf ( "Cac gia tri trong mang a:\n" ); 
XuatMang (a, n); 
getch (); 
return 0; 
} 
PHÁT SINH CÁC GIÁ TRỊ CHO MẢNG 
Sử dụng thư viện hàm và 
Dùng hàm srand() trong hàm main() trước khi gọi hàm phát sinh: để khởi tạo bộ giá trị ngẫu nhiên 
Dùng hàm rand()%k để phát sinh số ngẫu nhiên: có giá trị từ 0 đến k-1 
Ví dụ: Chương trình tạo mảng số nguyên có giá trị ngẫu nhiên từ 1 đến MAX 
#include 
#include 
#include 
#include 
#pragma warning ( disable : 4996); 
#define MAX 100 
void NhapKichThuoc ( int & n ); 
void PhatSinh ( int a [], int n ); 
void XuatMang ( int a [], int n ); 
void NhapKichThuoc ( int & n ) 
{ 
	printf ( "Nhap vao kich thuoc mang: " ); 
	scanf ( "%d" , & n ); 
} 
void PhatSinh ( int a [], int n ) 
{ 
	for ( int i = 0; i < n ; i++) 
	{ 
	a [i] = rand () % MAX + 1; 
	} 
} 
void XuatMang ( int a [], int n ) 
{ 
for ( int i=0; i< n ;i++) 
{ 
	printf ( " %d \t" , a [i]); 
} 
} 
int main () 
{ 
int a[ MAX ], n; 
NhapKichThuoc (n); 
srand (( unsigned int ) time ( NULL )); 
PhatSinh (a, n); 
printf ( "Cac gia tri trong mang a:\n" ); 
XuatMang (a, n); 
getch (); 
return 0; 
} 
Bài tập 
Cho mảng một chiều số nguyên a, kích thước n. Hãy viết các hàm: 
Phát sinh giá trị các phần tử ngẫu nhiên theo thứ tự tăng dần cho a. 
Phát sinh giá trị các phần tử ngẫu nhiên có giá âm và dương. 
LIỆT KÊ CÁC PHẦN TỬ THỎA ĐK CHO TRƯỚC 
Mẫu 1: 
void LietKeXXX(int a[], int n) 
{ 
	for (int i = 0; i<n; i++) 
	if ( a[i] thỏa điều kiện ) 
	Xuất a[i]; 
} 
LIỆT KÊ CÁC PHẦN TỬ THỎA ĐK CHO TRƯỚC 
Mẫu 2: 
void LietKeXXX(int a[], int n, int x) 
{ 
	for (int i = 0; i<n; i++) 
	if ( a[i] thỏa điều kiện so với x ) 
	Xuất a[i]; 
} 
Ví dụ 1: Liệt kê các phần tử có giá trị chẵn trong mảng 
void LietKeChan(int a[], int n) 
{ 
	for (int i = 0; i<n; i++) 
	if ( a[i] %2 ==0 ) 
	printf(“%d\t”, a[i]); 
} 
Ví dụ 2: Liệt kê các phần tử có giá trị lớn hơn x trong mảng 
void LietKeLonHonX(int a[], int n, int x ) 
{ 
	for (int i = 0; i<n; i++) 
	if ( a[i] > x ) 
	printf(“%d\t”, a[i]); 
} 
Ví dụ 3: Chương trình nhập vào mảng một chiều số nguyên a, kích thước n. In ra các phần tử có giá trị lớn hơn x có trong mảng 
#define MAX 100 
void NhapKichThuoc(int &n); 
void NhapMang(int a[], int n); 
void XuatMang(int a[], int n); 
void LietKeLonHonX(int a[], int n, int x); 
void NhapKichThuoc(int &n) 
{ 
	prinft(“Nhap vao kich thuoc mang: “); 
	scanf(“%d”, &n); 
} 
void NhapMang (int a[], int n) 
{	 
	for (int i = 0; i < n; i ++) 
	{ 
	printf(“Nhap phan tu tai vi tri %d: “, i); 
	scanf(“%d”, &a[i]); 
	} 
} 
void XuatMang (int a[], int n) 
{ 
	for (int i = 0; i < n; i ++) 
	printf(“%d\t”, a[i]); 
} 
void LietKeLonHonX(int a[], int n, int x) 
{ 
for (int i = 0; i<n; i++) 
if (a[i] > x) 
printf(“%d\t”, a[i]); 
} 
int main() 
{ 
int a[MAX], n, x; 
NhapKichThuoc(n); 
NhapMang(a, n); 
printf("Cac phan tu cua mang:\n"); 
XuatMang(a, n); 
printf("Nhap gia tri x: “); 
scanf(“%d”, &x); 
printf("Cac phan tu co gia tri lon hon %d:\n", x); 
LietKeLonHonX(a, n, x ); 
getch(); 
return 0; 
} 
Bài tập tại lớp 
Cho mảng số nguyên a , gồm n phần tử, viết chương trình gồm các hàm thực hiện các yêu cầu sau: 
Nhập vào kích thước mảng ( 0<n<=100 ), nếu nhập không thỏa miền giá trị thì cho phép người dùng nhập lại 
Nhập các giá trị vào mảng một chiều a 
Xuất các phần tử là bội số của 5 trong mảng a 
Xuất các phần tử là số nguyên tố trong mảng a 
Hàm main() để gọi thực hiện các yêu cầu từ 1 đến 4 
ĐẾM SỐ LƯỢNG PHẦN TỬ 
Mẫu 1: 
int DemXXX(int a[], int n) 
{ 
	int d = 0; 
	for (int i = 0; i<n; i++) 
	if (a[i] thỏa điều kiện) 
	d++; 
 return d; 
} 
Mẫu 2: 
int DemXXX(int a[], int n, int x) 
{ 
	int d = 0; 
	for (int i = 0; i<n; i++) 
	if (a[i] thỏa điều kiện so với x) 
	d++; 
 	return d; 
 } 
Ví dụ 1: Đếm các phần tử có giá trị là số nguyên tố 
int DemSNT(int a[], int n) 
{ 
	int d = 0; 
 for (int i = 0; i<n; i++) 
 { 
 if (LaSNT(a[i]) ==1) 
 { 
 d++; 
 } 
 } 
 return d; 
} 
int LaSNT(int k) 
 { 
 int d = 0; 
 for (int i = 1; i <= k; i++) 
 { 
 if (k % i == 0) 
 { 
 d++; 
 } 
 } 
 if(d == 2) return 1; 
 return 0; 
} 
int DemNhoHonX(int a[], int n, int x) 
{ 
 int d = 0; 
 for (int i = 0; i<n; i++) 
 if (a[i] < x) 
 d++; 
 return d; 
} 
Ví dụ 2: Đếm các phần tử có giá trị nhỏ hơn x trong mảng 
Ví dụ 3: Chương trình nhập vào mảng một chiều số nguyên a, kích thước n. Đếm số lượng các phần tử là số nguyên tố có trong mảng 
#define MAX 100 
void NhapKichThuoc(int &n); 
void NhapMang(int a[], int n); 
void XuatMang(int a[], int n); 
int LaSNT(int k); 
int DemSNT(int a[], int n); 
void NhapKichThuoc(int &n){ 
	prinft(“Nhap vao kich thuoc mang: “); 
	scanf(“%d”, &n); 
} 
void NhapMang (int a[], int n){	 
	for (int i = 0; i < n; i ++) 
	{ 
	printf(“Nhap phan tu tai vi tri %d: “, i); 
	scanf(“%d”, &a[i]); 
	} 
} 
int DemSNT(int a[], int n) 
{ 
	int d = 0; 
 for (int i = 0; i<n; i++) 
 if (LaSNT(a[i]) ==1) 
 d++; 
 return d; 
} 
void XuatMang (int a[], int n) 
{ 
	for (int i = 0; i < n; i ++) 
	printf(“%d\t”, a[i]); 
} 
int LaSNT(int k) 
 { 
 	int d = 0; 
 for (int i = 1; i <= k; i++) 
 if (k % i == 0) 
 d++; 
 if (d == 2) return 1; 
 return 0; 
} 
int main() 
{ 
int a[MAX], n, kq; 
NhapKichThuoc(n); 
NhapMang(a, n); 
printf("Cac phan tu cua mang:\n"); 
XuatMang(a, n); 
kq = DemSNT(a, n); 
if(kq==0) 
printf("Khong co so nguyen to trong mang“); 
else 
printf("So luong so nguyen to la: %d“, kq); 
 getch(); 
 return 0; 
} 
Bài tập 
Cho mảng một chiều số nguyên a, kích thước n. Hãy viết các hàm: 
1. Đếm số lượng các phần tử có giá trị lẻ. 
2. Đếm những phần tử có giá trị là bội số của 3. 
TÌM PHẦN TỬ X 
Ý tưởng 
	Lần lượt so sánh x với phần tử thứ nhất, thứ hai, ... của mảng a cho đến khi gặp được phần tử cần tìm, hoặc đã tìm hết mảng mà không thấy x 
Minh họa tìm x =10 
Minh họa tìm x =25 
Chưa hết mảng 
7 
5 
12 
41 
10 
32 
13 
9 
15 
3 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
7 
5 
12 
41 
10 
32 
13 
9 
15 
3 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
10 
10 
25 
Chưa hết mảng 
Đã tìm thấy tại vị trí 5 
Đã hết mảng 
(nếu x không xuất hiện trong mảng trả về -1) 
int TimVTX(int a[], int n, int x) 
{ 
	 for (int i = 0; i < n; i++) 
 { 
	if (a[i] == x) 
	return i; 
 } 
 return -1; 
 } 
CODE MINH HỌA 
Bài tập 
Cho mảng một chiều số nguyên a, kích thước n. Viết các hàm sau: 
Tìm vị trí xuất hiện cuối cùng của phần tử có giá trị x nếu có. 
Tìm vị trí phần tử có giá trị âm xuất hiện đầu tiên trong mảng. 
1 
2 
3 
4 
5 
6 
7 
8 
TÌM VỊ TRÍ PHẦN TỬ NHỎ NHẤT? 
10 
5 
7 
3 
9 
2 
15 
1 
Giả sử cần tìm vị trí phần tử nhỏ nhất trong dãy số sau ? 
1 
2 
3 
4 
5 
6 
7 
8 
10 
5 
7 
3 
9 
2 
15 
1 
Bước 1: Giả sử vị trí phần tử nhỏ nhất là 1 (vtmin), phần tử này có giá trị 10 
vtmin 
1 
2 
3 
4 
5 
6 
7 
8 
5 
7 
3 
9 
2 
15 
1 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
5 nhỏ hơn 10 nên cập nhật vị trí min 
10 
1 
2 
3 
4 
5 
6 
7 
8 
3 
9 
2 
15 
1 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
7 lớn hơn 5 nên không cập nhật vị trí min 
10 
5 
7 
1 
2 
3 
4 
5 
6 
7 
8 
3 
9 
2 
15 
1 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
3 nhỏ hơn 5 nên cập nhật vị trí min 
10 
5 
7 
1 
2 
3 
4 
5 
6 
7 
8 
3 
9 
2 
15 
1 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
9 lớn hơn 3 nên không cập nhật vị trí min 
10 
5 
7 
1 
2 
3 
4 
5 
6 
7 
8 
9 
2 
15 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
1 nhỏ hơn 3 nên cập nhật vị trí min 
10 
5 
7 
3 
1 
1 
2 
3 
4 
5 
6 
7 
8 
9 
2 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
15 lớn hơn 1 nên không cập nhật vị trí min 
10 
5 
7 
3 
15 
1 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Bước 2: So sánh giá trị tại vtmin với tất cả giá trị tại vị trí còn lại (từ 2 đến 8), nếu có phần tử nào nhỏ hơn phần tử tại vtmin thì cập nhật lại vtmin 
vtmin 
10 
5 
7 
3 
15 
2 lớn hơn 1 nên không cập nhật vị trí min 
2 
1 
CODE MINH HỌA 
int TimVTMin(int a[], int n) 
{ 
	int vtmin = 0; 
	for (int i = 1; i < n; i++) 
 { 
	if (a[i] < a[vtmin]) 
	vtmin = i; 
 } 
 return vtmin; 
} 
Bài tập 
Cho mảng một chiều số nguyên a, kích thước n. Hãy viết hàm tìm phần tử có giá trị lớn nhất 
TÍNH TỔNG, GIÁ TRỊ TRUNG BÌNH CÓ ĐIỀU KIỆN 
Mẫu tính tổng: 
int TongXXX(int a[], int n) 
{ 
	int s = 0; 
	for (int i = 0; i<n; i++) 
 { 
	if (a[i] thỏa điều kiện) 
	s += a[i]; 
 } 
 return s; 
} 
Mẫu tính trung bình: 
float TrungBinhXXX(int a[], int n) 
{ 
	int s = 0; 
	int d = 0; 
	for (int i = 0; i<n; i++) 
 { 
	if (a[i] thỏa điều kiện) 
	{ 
	s += giatri; 
	d ++; 
	}	 
 } 
	if (d==0) 
	return 0;	 
 	return (float) s / d; 
 } 
Ví dụ 1: Tính tổng các phần tử có giá trị lẻ trong mảng 
 int TongLe(int a[], int n) 
 { 
 int s = 0; 
 for (int i = 0; i<n; i++) 
 { 
 if (a[i] %2!=0) 
 s += a[i]; 
 } 
 return s; 
} 
Ví dụ 2: Tính giá trị trung bình các phần tử có giá trị âm trong mảng 
float TrungBinhAm(int a[], int n) 
{ 
 long s = 0; 
 int d = 0; 
 for (int i = 0; i<n; i++) 
 { 
 if (a[i] < 0) 
 { 
 s += a[i]; 
 d++; 
 } 
 } 
 if (d == 0) 
 return 0; 
 return (float)s / d; 
 } 
Mẫu phương thức sắp thứ tự tăng: 
void SapTang(int a[], int n) 
{ 
	for (int i = 0; i < n-1; i ++) 
 { 
	for(int j = i+1; j < n; j ++) 
	if (a[i] > a[j]) 
	HoanVi(a[i], a[j]); 
 } 
} 
void HoanVi(int & a, int & b) 
{ 
	int tam = a; 
	a = b; 
	b = tam; 
} 
Q&A 

File đính kèm:

  • pptxbai_giang_lap_trinh_c_chuong_5_mang_mot_chieu_tran_minh_thai.pptx