Nhập môn lập trình - Chương 5: Con trỏ, mảng, chuỗi ký tự - Huỳnh Nguyễn Thành Luân

Bộ nhớ máy tính

 Bộ nhớ RAM chứa rất nhiều ô nhớ, mỗi ô nhớ có

kích thước 1 byte.

 RAM dùng để chứa một phần hệ điều hành, các

lệnh chương trình, các dữ liệu

 Mỗi ô nhớ có địa chỉ duy nhất và địa chỉ này được

đánh số từ 0 trở đi.

 Ví dụ

• RAM 512MB được đánh địa chỉ từ 0 đến 229 – 1

• RAM 2GB được đánh địa chỉ từ 0 đến 231 – 1

pdf64 trang | Chuyên mục: Lập Trình | Chia sẻ: tuando | Lượt xem: 506 | Lượt tải: 2download
Tóm tắt nội dung Nhập môn lập trình - Chương 5: Con trỏ, mảng, chuỗi ký tự - Huỳnh Nguyễn Thành Luân, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 1 2 3 4 18 
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 
 19 
Nhập xuất mảng 
20 
Sự tương quan mảng và con trỏ 
Khi khai báo một mảng thì tên của mảng là 
một hằng địa chỉ, chứa địa chỉ của phần tử đầu 
tiên (phần tử có chỉ số 0). 
Xét khai báo: int a[5]; int *pa = a; khi đó con 
trỏ pa cũng giữ địa chỉ của phần tử đầu tiên của 
mảng a và pa+i (hoặc pa[i]) là địa chỉ của phần 
tử a[i]. 
21 
 Các khai báo tương đương 
 int *pa;  int pa[]; 
 double *pa;  double pa[]; 
 char *pa;  char pa[]; 
 long *pa;  long pa[]; 
Sự tương quan mảng và con trỏ 
22 
Khai báo mảng bằng con trỏ 
Cú pháp: 
 *; 
 Ví dụ : 
 int *p; // khai bao con tro p 
 int b[100]; 
 p = (int*)malloc(sizeof(int)*100); //C++ p = new int[100]; 
 p = b; // p tro vao phan tu 0 cua mang b 
 Với cách viết như trên thì ta có thể hiểu các cách viết sau là 
tương đương 
 p[i]  *(p + i)  b[i]  *(b+i) 
 Cấp phát: hàm malloc (C++ new) 
 Giải phóng free(p) (C++ delete p) 
23 
Mảng và hàm 
 Khai báo hàm nhập mảng 
void NhapMang(int a[], int &n); 
 Phân tích: 
 Tên hàm: NhapMang 
 Tham số n là tham chiếu. 
 Tham số a là tham trị vì a là con trỏ hằng. 
 Giá trị trả về: không trả về giá trị cụ thể. 
 Khai báo hàm xuất mảng 
void XuatMang(int a[], int n); 
Viết chương trình nhập xuất mảng bằng hàm???? 24 
Mảng và hàm 
 Chương trình nhập xuất mảng bằng hàm 
25 
Mảng và hàm 
26 
Nhập mảng ngẫu nhiên 
Đối với Bordland C++: 
 Bước 1: khai báo thư viện 
#include 
 Bước 2: Khởi động bộ tạo random ngoài vòng lặp 
randomize(); 
 Bước 3: lấy số random 
x = random(n); 
//Hàm random(n) cho kết quả là 1 số ngẫu nhiên có trị 0 đến n -1 
=> muốn lấy cái giá trị âm thì sao????? 
27 
Nhập mảng ngẫu nhiên 
ĐỐI VỚI VISUAL C++ hoặc DevC++ 
 Bước 1: Khai báo thư viện 
#include 
#include 
 Bước 2: Đặt điểm bắt đầu cho việc sinh số ngẫu nhiên của hàm 
rand() 
srand(time(NULL)); //đặt bên ngoài vòng lặp lấy ngẫu nhiên 
 Bước 3: Lấy số random 
x = rand()%n; 
//hàm rand sẽ lấy số ngẫu nhiêu trong khoảng [0, RAND_MAX] 
=> rand()% n lấy số ngẫu nhiên khoảng 0 đến n-1 
Nếu muốn số ngẫu nhiên trong đoạn [0,n] thì sao? 
Sinh số nằm trong khoảng từ [m, n] thì sao ? 
Viết lại hàm nhập mảng ???? 
28 
Nhập mảng ngẫu nhiên Bordland C++ 
29 
Nhập mảng ngẫu nhiên VISUAL C++ 
30 
Một số thuật toán 
1. Tính tổng/tích các phần tử mảng: Duyệt tòan 
bộ mảng, thực hiện cộng hoặc nhân tích lũy 
2. Tìm kiếm: Duyệt mảng cho đến khi tìm thấy. 
31 
Hàm Tìm Kiếm (dùng for) 
32 
Một số thuật toán 
3. Liệt kê các phần tử chẵn: Duyệt toàn bộ 
mảng, xuất ra các phần tử chẵn 
33 
Một số thuật toán 
4. Đếm các phần tử dương trong mảng: Duyệt toàn bộ 
mảng, đếm các phần tử dương 
5. Xây dựng hàm kiểm tra số nguyên tố và hàm đếm 
các phần tử mảng là số nguyên tố ???? Về nhà làm 
34 
Hàm void main 
35 
Hàm void main 
36 
Tìm giá trị lớn nhất của mảng 
Yêu cầu 
 Cho trước mảng a có n phần tử. Tìm giá trị lớn nhất trong a 
(gọi là max) 
Ý tưởng 
 Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên a[0] 
 Lần lượt kiểm tra các phần tử còn lại để cập nhật max. 
? max 78
0 1 2 MAX - 1 n – 1 
   7 2 8 8 
37 
Hàm tìm Max 
38 
Sắp xếp mảng thành tăng dần 
Yêu cầu 
 Cho trước mảng a kích thước n. Hãy sắp xếp mảng a đó sao 
cho các phần tử có giá trị tăng dần. 
Ý tưởng 
 Sử dụng 2 biến i và j để so sánh tất cả cặp phần tử với nhau 
và hoán vị các cặp nghịch thế (sai thứ tự). 
0 1 2 MAX - 1 n – 1 
   5 1 8 6 
tạm 5 
i j 
8
1 5
j j 
6 8
j 
39 
Sắp Xếp Tăng 
Mẫu phương thức sắp thứ tự tăng: 
40 
Mảng nhiều chiều 
Mảng nhiều chiều là mảng có từ 2 chiều trở 
lên. 
Điều đó có nghĩa là mỗi phần tử của mảng 
là một mảng khác. 
Người ta thường sử dụng mảng nhiều chiều 
để lưu các ma trận, các tọa độ 2 chiều, 3 
chiều 
41 
Khai báo mảng 2 chiều 
 Khai báo 
 [][]; 
Ví dụ: float m[8][9]; // mảng 2 chiều có 8*9 phần tử là số thực 
int a[3][4]; // mảng 2 chiều có 3*4 phần tử là số nguyên 
 Truy xuất phần tử mảng 2 chiều 
Tênmảng[Chỉ số dòng][Chỉ số cột] 
Ví dụ: int a[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} }; 
Với các khai báo như trên ta có: 
a[0][0] = 2; a[0][1] = 3; 
a[1][1] = 6; a[1][3] = 6; 
42 
Nhập xuất mảng 2 chiều 
 Nhập: 
 int a[4][5], i, j; 
 for (i = 0; i<4; i++) 
 for (j = 0; j<5; j++) 
 { // phần tử đầu tiên là a[0][0] 
 printf(“a[%d][%d]=”, i, j); 
 scanf(“%d”, &a[i][j]); 
 } 
 Xuất: 
 for (i = 0; i<4; i++) 
 { 
 for (j = 0; j<5; j++) 
 printf(“%5d”, a[i][j]); 
 printf(“\n”); 
 } 
43 
Mảng hai chiều 
 Khai báo qua con trỏ 
 **; 
Ví dụ : 
 int **A ; // Khai báo mảng động 2 chiều kiểu int 
 float **B ; // Khai báo mảng động 2 chiều kiểu float 
 A = new int*[6]; //Cấp phát bộ nhớ cho số dòng của ma trận A 
 for(int i = 0; i<6; i++) 
 A[i] = new int[10]; //Cấp phát bộ nhớ cho các phần tử của mỗi dòng 
 Truyền mảng 2 chiều cho hàm 
 Hàm bị gọi ví dụ: 
 void ABC(int a[ ][100], int n, int m) //phải cho biết số cột tối đa 
 Gọi hàm: 
 int a[100][100], x, y; 
 ABC(a, x, y); 
 44 
Nhập xuất mảng 2 chiều 
45 
Nhập xuất mảng 2 chiều 
46 
Kĩ thuật đặt lính canh 
 Viết hàm tìm phần tử nhỏ nhất trong ma trận 
47 
Định nghĩa kiểu dữ liệu mới 
#define MAX 100 
typedef MATRAN[MAX][MAX]; 
Ví dụ : Khai báo ma trận các số nguyên a. 
#define MAX 100 
typedef int MATRAN[MAX][MAX]; 
MATRAN a; // int a[MAX][MAX]; 
 48 
Chuỗi ký tự 
Chuỗi ký tự là một dãy các phần tử, mỗi phần tử có kiểu 
ký tự 
 Trong ngôn ngữ C, chuỗi ký tự là một dãy các ký tự đặt 
trong hai dấu nháy kép. 
 Khi gặp chuỗi ký tự, máy sẽ cấp phát khoảng nhớ cho 1 
mảng kiểu char đủ lớn để chứa các ký tự xâu và ‘\0’ 
 Chuỗi rỗng được ký hiệu bằng hai dấu nháy kép đi liền 
nhau : “” 
Chú ý: Cần phân biệt mảng các ký tự và chuỗi ký tự. 
Đối với chuỗi ký tự, ký tự kết thúc chuỗi là '\0' 
49 
Khai báo theo mảng 
 Cú pháp: 
 char Tênchuỗi[]; 
 Ví dụ: char Ten[13]; 
 => bộ nhớ sẽ cung cấp 13 bytes để lưu trữ 
 nội dung của chuỗi ký tự Ten; 
 byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt chuỗi 
 Ghi chú: 
 Chiều dài tối đa của biến chuỗi: 1..255 bytes. 
 Chuỗi ký tự được kết thúc bằng ký tự ‘\0’ =>khai báo độ 
dài của chuỗi luôn luôn khai báo dư 1 phần tử để chứa ký tự 
‘\0’ 
‘\0’ Ten: 
Ten[0] Ten[12] 
50 
Khai báo theo con trỏ 
 Cú pháp: char *; 
 Ví dụ: char *Ten; 
 Trong khai báo này, bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ 
của biến con trỏ Ten đang chỉ đến. 
 Chưa cung cấp nơi để lưu trữ dữ liệu. 
 Do đó phải cấp phát vùng nhớ bằng hàm malloc hoặc calloc 
trong “alloc.h” hoặc “stdlib.h” 
 Ví dụ: 
 char *Ten; 
 Ten = (char*)malloc(20*sizeof(char)); 
 //hoặc Ten = “chuoi nao do” //????? 
51 
Các hàm nhập xuất chuỗi 
 Hàm nhập chuỗi: gets 
Ví dụ: gets(hoten); 
 Hàm tự động thêm ký tự NULL (‘\0’) vào cuối biến 
chuỗi. 
 Hàm xuất chuỗi: puts 
Ví dụ: puts(hoten); 
 Hàm scanf? 
 Hàm printf với mã định dạng là %s 
Chú ý: Khi dùng hàm nhập chuỗi sau hàm scanf phải sử 
dụng hàm fflush (stdin) trước để khử ký tự ‘\n’ vì ký tự này 
làm trôi hàm gets 
52 
Ví dụ 1 
53 
Ví dụ 2 
54 
Cách 1. Truy xuất giống mảng ký tự. 
 Ví dụ: 
 char s[]={‘T’,’h’,’u’,’\0’}; 
 int i=0; 
 while (s[i]!=‘\0’) 
 { 
 printf(“%c”,s[i]); 
 i++; 
 } 
Cách 2. Sử dụng hàm chuỗi. 
Truy xuất chuỗi 
55 
Các hàm thư viện – 
Tính độ dài của chuỗi s 
 int strlen(char *s); 
void main() 
{ 
char *s = "Lap trinh C"; 
printf(“Do dai s = %d”,strlen(s)); 
} 
Kết quả: 
Do dai s = 11 
56 
Các hàm thư viện – 
Sao chép nội dung chuỗi nguồn vào chuỗi 
đích, nội dung của chuỗi đích sẽ bị xóa 
Chép n ký tự từ chuỗi nguồn sang chuỗi đích. 
Nếu chiều dài nguồn < n thì hàm sẽ điền 
khoảng trắng cho đủ n ký tự vào đích 
strcpy(char *đích, char *nguồn); 
strncpy(char *đích, char *nguồn, int n); 
57 
Nối chuỗi s2 vào chuỗi s1 
 strcat(char *s1, char *s2); 
Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1 
 strncat(char *s1, char *s2, int n); 
So sánh 2 chuỗi s1 và s2 theo nguyên tắc thứ tự từ điển. 
Phân biệt chữ hoa và thường. Trả về: 
0: nếu s1 bằng s2. 
1: nếu s1 lớn hơn s2. 
-1: nếu s1 nhỏ hơn s2. 
int strcmp(char *s1, char *s2); 
Các hàm thư viện – 
58 
So sánh n ký tự đầu tiên của s1 và s2, giá trị trả về 
tương tự hàm strcmp() 
 int strncmp(char *s1,char *s2, int n); 
So sánh chuỗi s1 và s2 nhưng không phân biệt hoa 
thường, giá trị trả về tương tự hàm strcmp() 
 int stricmp(char *s1,char *s2); 
So sánh n ký tự đầu tiên của s1 và s2 nhưng không 
phân biệt hoa thường, giá trị trả về tương tự hàm 
strcmp() 
 int strnicmp(char *s1,char *s2, int n); 
Các hàm thư viện – 
59 
Tìm sự xuất hiện đầu tiên của ký tự c trong 
chuỗi s. Trả về: 
NULL: nếu không có 
Địa chỉ c: nếu tìm thấy 
 char *strchr(char *s, char c); 
Tìm sự xuất hiện đầu tiên của chuỗi s2 trong 
chuỗi s1. Trả về: 
NULL: nếu không có 
Ngược lại: Địa chỉ bắt đầu chuỗi s2 trong s1 
 char *strstr(char *s1, char *s2); 
60 
Đổi ký tự hoa sang thường và 
ngược lại 
 Đổi một ký tự thường thành ký tự hoa (trong ctype.h) 
Cú pháp: char toupper(char c) 
 Đổi chuỗi chữ thường thành chuỗi chữ hoa 
Cú pháp: char* strupr(char *s) 
 Đổi một ký tự hoa thành ký tự thường (trong ctype.h) 
Cú pháp: char tolower(char c) 
 Đổi chuỗi chữ hoa thành chuỗi chữ thường 
Cú pháp: char *strlwr(char *s) 
61 
Đổi từ chuỗi ra số - atoi(), 
atof(), atol() (trong stdlib.h) 
Cú pháp : 
 int atoi(const char *s) : chuyển chuỗi thành số nguyên 
 long atol(const char *s) : chuyển chuỗi thành số nguyên dài 
 float atof(const char *s) : chuyển chuỗi thành số thực 
Nếu chuyển đổi không thành công, kết quả trả về của 
các hàm là 0. 
Ví dụ: 
 atoi(“1234”)=> 1234 
62 
Ví dụ 
63 
Ví dụ chuyển đổi số 
64 

File đính kèm:

  • pdfnhap_mon_lap_trinh_chuong_5_con_tro_mang_chuoi_ky_tu_huynh_n.pdf