KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu

Slides:



Advertisements
Similar presentations
Đánh giá Quốc gia có Hệ thống cho Việt Nam Các ư u tiên về Giảm nghèo, Phát triển Công bằng và Bền vững Ngày 5 tháng 4 n ă m 2016.
Advertisements

Giáo viên thực hiện: Lò Thị Nhung Đơn vị công tác: Trường THCS Búng Lao, huyện Mường Ảng, tỉnh Điện Biên. GIÁO ÁN ĐỊA LÍ 7 Chương II: Môi trường đới ôn.
HÀNH CHÍNH NHÀ NƯỚC TỪ CÁCH MẠNG THÁNG TÁM ĐẾN NAY
Quản trị Rủi ro thiên tai và Biến đổi khí hậu
PHÁT TRIỂN VÀ SỬ DỤNG HỢP LÝ NGUỒN TÀI NGUYÊN NƯỚC
BỘ Y TẾ VỤ TRANG THIẾT BỊ VÀ CÔNG TRÌNH Y TẾ
Báo cáo Cấu trúc đề thi PISA và Các dạng câu hỏi thi PISA
Sử dụng năng lượng hiệu quả
PHÂN TÍCH THIẾT KẾ HỆ THỐNG
XÂY DỰNG VÀ PHÁT TRIỂN CHƯƠNG TRÌNH ĐÀO TẠO THEO ĐỀ XƯỚNG CDIO
TRÍCH DẪN & LẬP DANH MỤC TÀI LIỆU TRÍCH DẪN
Rainforest Alliance đào tạo cho các nông trại trà ở Việt Nam
Qua hàng ngàn năm dựng nước và giữ nước, dân tộc ta đã để lại nhiều bài học vô giá. Nổi bật trong đó là tinh thần đoàn kết, ý thức cộng đồng. Hai truyền.
L/O/G/O NGUYÊN LÝ KẾ TOÁN Nguyễn Hữu Quy (MBA,CPA,APC)
TRƯỜNG ĐẠI HỌC THĂNG LONG
GIỚI THIỆU TRÌNH BIÊN DỊCH FREE PASCAL
Thực hiện các cuộc họp quan trọng
Sứ Mệnh GoCoast 2020 được thành lập bởi thống đốc Phil Bryant thông qua điều hành để phục vụ như là hội đồng cố vấn chính thức cho việc phân phối quỹ nhận.
QUẢN TRỊ THÀNH TÍCH Performance Management
KIẾN TRÚC HƯỚNG DỊCH VỤ - SOA
Ghi chú chung về khóa học
Ngôn ngữ lập trình C/C++
Giới thiệu chương trình trách nhiệm xã hội của doanh nghiệp
KHAI PHÁ DỮ LIỆU (DATA MINING)
VÀ CÁC CHÍNH SÁCH PHÒNG CHỐNG TÁC HẠI THUỐC LÁ
Tổ chức The Natural Step và IKEA
Software testing Kiểm thử phần mềm
NHẬP MÔN VỀ KỸ THUẬT.
Ngôn ngữ lập trình C/C++
KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu
KHÓA TẬP HUẤN CÔNG BẰNG GIỚI VÀ CÁC DỰ ÁN PHÁT TRIỂN
Hạ Long – Cát Bà Sáng kiến Liên minh Bui Thi Thu Hien
Đức Hồng Y Nguyễn Văn Thuận cầu bầu
PHÒNG CHỐNG ĐỊCH TIẾN CÔNG HỎA LỰC BẰNG VŨ KHÍ CÔNG NGHỆ CAO
Module 6 – Managing for Sustainability
Miễn dịch bệnh lý Quá mẫn Bệnh tự miễn Thiếu hụt miễn dịch
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
TRUYỀN THÔNG VỀ PHÒNG CHỐNG BỆNH DO VI RÚT ZIKA 1
QUYẾT ĐỊNH KINH DOANH Dave Goeller
XÂY DỰNG LỢI THẾ CẠNH TRANH THÔNG QUA CHIẾN LƯỢC CẤP KINH DOANH
MKTNH Version 3 Giảng viên: ThS. Thái Thị Kim Oanh
Bài 2: Từ tiêu chuẩn sức khoẻ tới nơi làm việc lành mạnh
Chương 6 Thiết kế hướng đối tượng
Giáo viên: Đặng Việt Cường
DI SẢN THẾ GIỚI WORLD HERITAGE CỔ THÀNH HUẾ VIỆT NAM
Chương 4: Những nguyên lý hỗ trợ FMS
XÂY DỰNG KẾ HOẠCH VÀ CHIẾN LƯỢC MARKETING
Chiến lược CSR –Là gì và làm thế nào để chúng ta sàng lọc lựa chọn?
UBND TỈNH ĐIỆN BIÊN SỞ GIÁO DỤC VÀ ĐÀO TẠO
LẬP TRÌNH ỨNG DỤNG WINDOW FORM
NỘI DUNG TẬP HUẤN 1-Giới thiệu về 5 modun – dạy học dự án
Quản lý con người Quản lý người làm việc như những cá nhân và theo nhóm.
KỸ NĂNG HỌC TẬP KHOA QUẢN TRỊ KINH DOANH ThS. NGUYỄN HOÀNG SINH
Biến và Kiểu Dữ Liệu Chương 2.
Operators and Expression
Trách nhiệm giải trình của doanh nghiệp ở diện rộng
QUYỀN LỰC VÀ MÂU THUẪN TRONG NHÓM
MODULE 5: CÔNG CỤ 5S - QUẢN LÝ VẬN HÀNH CƠ BẢN
Chương 2 Căn bản về Cung và Cầu 1.
CUỘC THI THIẾT KẾ BÀI GIẢNG ĐIỆN TỬ ELEARNING
QUẢN TRỊ TÍNH ĐA DẠNG THÔNG QUA NHIỀU HOẠT ĐỘNG KINH DOANH
HƯỚNG DẪN MÃ HÓA BỆNH TẬT, TỬ VONG THEO ICD - 10
Nguyễn Văn Linh - Programing Language - Chapter 1
NHÂN QUYỀN LÀ GÌ? Dẫn Nhập Nhân quyền và thu thập tài liệu: Bài Một.
1. Các khái niệm trong PTTK HĐT (tt)
Chương 8 NHỮNG VẤN ĐỀ QUẢN TRỊ CƠ BẢN TRONG THỰC THI CHIẾN LƯỢC
KHAI THÁC THỦY SẢN ĐẠI CƯƠNG
Chương 4: Tập gõ 10 ngón Chương 2: Học cùng máy tính
Presentation transcript:

KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu Email: phamdieucse@gmail.com Blog: http://xuandieu.wordpress.com

MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG Chương 3: MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG

1. Khái niệm 2. Mảng một chiều 3. Mảng nhiều chiều

Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). 1. Khái niệm Mảng là một tập hợp các giá trị có cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ và được tham chiếu bởi một tên chung chính là tên mảng. Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). Giá trị Mảng thực chất là mộ t biế n đượ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 kiểu dữ liệu và cùng tên. Do đó để truy xuất các biến thành phần, ta dùng cơ chế chỉ mục. 1 5 3 6 4 7 9 2 8 Vị trí Vị trí được tính từ 0

1. Khái niệm Nếu mảng có n phần tử thì phần tử đầu tiên có chỉ mục là 0 và phần tử cuối có chỉ mục là n-1. Để tham chiếu đến một phần tử ta dùng tên mảng và chỉ mục của phần tử được đặt trong cặp dấu []. Ví dụ: a[0] Số lượng phần tử có trong mảng được gọi là kích thước của mảng. luôn cố định, phải được xác định trước và không đổi trong suốt quá trình thực hiện chương trình.

1. Khái niệm Mảng là 1 đối tượng dùng để lưu trữ các phần tử có cùng 1 kiểu dữ liệu Chỉ số mảng bắt đầu được tính từ 0 cho tới n-1 Tức là nếu như mảng có 10 phần tử, thì vị trí sẽ được tính từ số 0 cho tới 9. Với 0 là vị trí của phần tử số 1, số 1 là vị trí của phần tử số 2 …. 9 8 7 10 50 N=6 i=0 i=1 i=2 i=3 i=4 i=5 Mảng M có 6 phần tử M[0] M[4] M[i] Là phần tử tại vị trí thứ i Đối với duyệt mảng, người ta thường dùng vòng for, ít khi dùng vòng while, do.. while

type arrayName[elements]; 2. Mảng một chiều Khai báo một mảng một chiều Cú pháp: type arrayName[elements]; type: kiểu dữ liệu của mỗi phần tử mảng. arrayName: tên mảng elements: số phần tử có trong mảng Ví dụ: int a[5] a 3 5 2 7 9 a[0] a[1] a[2] a[3] a[4]

2. Mảng một chiều Ví dụ: int a[100]; //Khai báo mảng số nguyên a gồm 100 phần tử float b[50]; //Khai báo mảng số thực b gồm 50 phần tử char str[30]; //Khai báo mảng ký tự str gồm 30 ký tự 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 void main() { int a[MAX], b[MAX]; //Các lệnh } Như vậy khi duyệt mảng thì các chỉ số không được vượt quá hoặc bằng số phần tử của mảng

Total_size = sizeof(type) * elements 2. Mảng một chiều Mảng phải được khai báo tường minh Kích thước (tính bằng byte) của mảng được tính theo công thức: Total_size = sizeof(type) * elements Ví dụ: int num[100]; Mảng num có kích thước là: 2bytes * 100 = 200bytes (giả sử int chiếm 2 bytes)

2. Mảng một chiều Mỗi phần tử mảng là một biến thông thường. Ví dụ: int num[3]; num[0] = 2; //gán 2 cho phần tử num[0] num[1] = num[0] + 3 //num[1] có giá trị 5 num[2] = num[0] + num[1]; //num[2] có giá trị 7 cout << num[1]; //In ra giá trị 5

2. Mảng một chiều Khai báo và khởi tạo mảng một chiều Cú pháp: type arrayName[]= {value1, value2, ..., value n}; Lưu ý: Không khai báo kích thước mảng. Số lượng phần tử trong mảng là số các giá trị được cung cấp trong cặp dấu ngoặc {}, được phân cách nhau bởi dấu phẩy.

2. Mảng một chiều Ví dụ: int soChan[] = {2,4,6,8,10}; Mảng soChan có 5 phần tử lần lượt là: soChan[0] có giá trị là 2 soChan[1] có giá trị là 4 ... soChan[4] có giá trị là 10

cout<<a<<endl; cout<<setprecision(3)<<a; 2. Mảng một chiều Khai báo và gán giá trị ban đầu cho mảng một chiều: Gán từng phần tử int a[5] = {3, 6, 8, 1, 12}; Gán số lượng phần tử khởi tạo ít hơn số phần tử của mảng: int a[8] = {3,5,2} Giá trị 3 6 8 1 12 Vị trí 2 4 *Mục đích sử dụng hàm: Khi có một công việc giống nhau cần thực hiện ở nhiều vị trí. Khi cần chia một chương trình lớn phức tạp thành các đơn thể nhỏ (hàm con) để chương trình được trong sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán và giải quyết vấn đề. Lý do chính: Được sử dụng lại coding đỡ mất thời gian Dễ sửa chữa lỗi Chia để trị : phân nhỏ chương trình lớn thành các chương trình con để dễ xử lý #include<iostream.h> #include<conio.h> void main() { cout<<"Cop cai"; getche(); } ý nghĩa của nó là bắt ta nhấn phím bất kỳ mới cho thoát chương trình, để người sử dụng quan sát kết quả chương trình khi demo bằng Cfree thì em F5 nó vẫn dừng mặc dù em không có getche() nhưng thực ra là nó dừng rồi vì em quan sát cuối phần mềm có dòng "press any key to continue..." đó chính là kết thúc rồi còn khi có getche() gõ phím vào mới xuất hiện dòng đó em hiểu hok em thử xem nak iomanip.h --- setw(n) ---- setprecision(n) int a=7, b=9; cout<<a<<setw(5)<<b; float a=7.56745, b=5.339; cout<<a<<endl; cout<<setprecision(3)<<a; cout<<setprecision(2)<<b; Giá trị 3 5 2 Vị trí 1 4 6 7

Tên mảng [ vị trí cần truy xuất ] void main() { 2. Mảng một chiều Truy xuất giá trị Tên mảng [ vị trí cần truy xuất ] void main() { int a[5] = {3, 6, 8, 11 , 12}; cout<<“Giá trị mảng tại vị trí 3 = “<<a[3]; } Kết quả: Giá trị mảng tại vị trí 3 = 11 Vị trí 3 11

2. Mảng một chiều 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

Có 2 cách nhập dữ liệu cho từng phần tử trong mảng: 2. Mảng một chiều Cách nhập dữ liệu cho từng phần tử trong mảng như thế nào? Có 2 cách nhập dữ liệu cho từng phần tử trong mảng: - cách 1: nhập bằng tay từ bàn phím - cách 2: cho máy tự động nhập Chúng ta nên kết hợp hàm (hôm bữa học) để nhập và xuất mảng.

2. Mảng một chiều Ví dụ: Tạo một mảng nguyên a có N phần tử. Mỗi phần tử có giá trị là chỉ mục của nó. In mảng ra màn hình.

2. Mảng một chiều Viết bằng Hàm

2. Mảng một chiều srand(time(NULL)); Nhập mảng tự động bằng máy: Để khởi tạo xuất ra các số ngẫu nhiên, ta phải viết hàm này trước: Hàm trên có ý nghĩa là yêu cầu máy tính khởi động để tạo các số ngẫu nhiên : Tức là mỗi lần chạy chương trình thì nó sẽ tự động phát sinh ra các con số có giá trị khác nhau. **** nếu như không có dòng này thì mỗi lần chạy chương trình sẽ cho ra có số ngẫu nhiên GIỐNG NHAU. srand(time(NULL));

2. Mảng một chiều Để lấy giá trị ngẫu nhiên , ta dùng công thức bên dưới: rand()%n : Tức lấy lấy các giá trị ngẫu nhiên từ 0 cho tới n-1 Như vậy nếu ta gọi rand()%100 : tức là lấy giá trị ngẫu nhiên từ 0 99 Đề bài : Hãy xuất các số ngẫu nhiên từ -55 cho tới 150 (-77 88) Rand()%n -77=88 n=166 (3095)  rand()%n +30=95n=66 (-55150)Rand()%n -55 =150 n=206 (-50 -100)?

2. Mảng một chiều

2. Mảng một chiều Liệt kê các phần tử thỏa điều kiện 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]; } Mẫu 2: void LietKeXXX(int a[], int n, int x) if (a[i] thỏa điều kiện so với x)

2. Mảng một chiều void LietKeChan(int a[], int n) { 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) cout<<a[i]<<“\t”; } 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) cout<<a[i]< <“\t”; }

2. Mảng một chiều 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

2. Mảng một chiều

2. Mảng một chiều Đếm: 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; }

2. Mảng một chiều Ví dụ 1: Đếm các phần tử có giá trị là số nguyên tố

2. Mảng một chiều Tìm kiếm Mẫu 1: Tìm và trả về vị trí phần tử có giá trị lớn nhất int TimVTMax(int a[], int n) { int vtmax = 0; for (int i = 1; i < n; i++) if (a[i] > a[vtmax]) vtmax = i; return vtmax; } Mẫu 2: Tìm vị trí phần tử có giá trị x (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; }

2. Mảng một chiều Kiểm tra xem mảng có thỏa điều kiện cho trước *TH1: kiểm tra tồn tại một phần tử trong mảng thỏa điều kiện nào đó cho trước  tìm phần tử thỏa điều kiện để kết luận. *TH2: kiểm tra tất cả các phần tử thỏa điều kiện nào đó cho trước  tìm phần tử không thỏa điều kiện để kết luận mảng không thỏa điều kiện.

2. Mảng một chiều Mẫu TH1: bool KiemTraTonTaiXXX(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) return true; return false; } Mẫu TH2: bool KiemTraXXX(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] không thỏa điều kiện) return false; return true; }

2. Mảng một chiều Ví dụ 1: Kiểm tra xem mảng có tồn tại số lẻ không?

2. Mảng một chiều Ví dụ 2: Kiểm tra xem mảng có toàn giá trị âm không? (true: có/ false: không)

2. Mảng một chiều Mẫu tính tổng: int TongXXX(int a[], int n) { 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; }

2. Mảng một chiều Tính tổng, giá trị trung bình có điều kiện 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;

2. Mảng một chiều Ví dụ 1: Tính tổng các phần tử có giá trị lẻ trong mảng

2. Mảng một chiều Sắp xếp 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;

3. Mảng nhiều chiều C/C++ hỗ trợ mảng nhiều chiều. Dạng đơn giản nhất của mảng nhiều chiều là mảng hai chiều. Mảng hai chiều thực chất là mảng của những mảng một chiều. Ta có thể xem mảng hai chiều là một ma trận gồm các hàng và các cột

type arrayName[rows][columns]; 3. Mảng nhiều chiều Khai báo mảng hai chiều type arrayName[rows][columns];  rows: số hàng columns: số cột Ví dụ: Khai báo mảng số nguyên 3 hàng 4 cột int a[3][4]

3. Mảng nhiều chiều Ví dụ 1: int M[5][3]; Tức là khai báo 1 mảng 2 chiều tên là M, có 5 dòng, 3 cột. tổng số phần tử trong mảng = 5*3 =15 phần tử Ví dụ 2: float K[3][4]; khai báo 1 mảng 2 chiều tên là K có kiểu số thực, số dòng là 3, số cột là 4 tổng số phần tử là 4*3=12; - Tương tự như mảng 1 chiều, chỉ số của các phần tử được đánh dấu từ số 0 cho tới số dòng -1 hoặc số cột -1

3. Mảng nhiều chiều i =0 i =1 i =2 i =3 j =0 j =1 j =2 j =3 j =4 Giả sử ta có mảng M 2 chiều, có 4 dòng và 5 cột Chiều duyệt theo cột, thường đặt tên là j j =0 j =1 j =2 j =3 j =4 M[0][0] 9 M[0][1] 2 M[0][2] M[0][3] 12 M[0][4] 3 M[1][0] M[1][1] 8 M[1][2] 15 M[1][3] 7 M[1][4] 5 M[2][0] 10 M[2][1] M[2][2] 19 M[2][3] 13 M[2][4] 18 M[3][0] 17 M[3][1] 86 M[3][2] 78 M[3][3] 46 M[3][4] i =0 Tức là để truy suất 1 phần tử tại dòng thứ ivà tại cột thứ j thì ta viết: M[i][j] - Ví dụ, muốn lấy phần tử tại dòng 2, cột 3 thì ta viết M[2][3] Chiều duyệt theo dòng, thường đặt tên là i i =1 i =2 i =3 Thông thường, người ta sử dụng 2 vòng for lồng nhau để duyệt mảng 2 chiều. Vòng for ngoài duyệt theo dòng, vòng for trong duyệt theo cột

3. Mảng nhiều chiều int M[dòng][cột]; Ví dụ: int M[3][2] ; Dòng =3, cột =2  tổng số phần tử = 2*3 =6 phần tử Để duyệt mảng, ta kết hợp 2 vòng for lồng nhau, vòng for ngoài chạy theo chỉ số dòng (đặt là i), vòng for trong chạy theo chỉ số cột (đặt là j)

3. Mảng nhiều chiều

3. Mảng nhiều chiều

3. Mảng nhiều chiều

3. Mảng nhiều chiều

3. Mảng nhiều chiều Ma Trận vuông : mảng 2 chiều có số cột và số dòng bằng nhau Cách khai báo sẽ thay đổi 1 ít so với mảng 2 chiều bình thường. Vì ma trận vuông là ma trận có số cột và số dòng bằng nhau, nên ta thường khai báo CẤP của mà trận thay vì khai báo số dòng, số cột. Nếu nói ma trận vuông cấp 3  có 3*3 =9 phần tử Tức là khi nói tới ma trận vuông thì người ta nói tới cấp. Nếu ma trận là cấp N thì số phần tử của nó sẽ là N2

3. Mảng nhiều chiều

3. Mảng nhiều chiều 15 36 56 100

3. Mảng nhiều chiều 1) Viết hàm xuất đường chéo chính, đường chéo phụ cho mảng 2 chiều 1 2 3 4 Nhận xét: Đường chéo chính (màu vàng) thì chỉ số i và j là luôn luôn bằng nhau Đường chéo phụ (màu xanh) thì i +j =n-1 45 M[0][0] M[0][1] 7 M[0][2] M[0][3] 99 M[0][4] -9 M[1][0] 55 M[1][1] 9 M[1][2] 13 M[1][3] 75 M[1][4] M[2][0] M[2][1] M[2][2] M[2][3] M[2][4] M[3][0] M[3][1] M[3][2] M[3][3] M[3][4] M[4][0] M[4][1] M[4][2] M[4][3] M[4][4]

3. Mảng nhiều chiều