Lưu ý: số phần tử trong câu khai báo mảng phải là một hằng số hoặc một biểu thức của các hằng số.
Trang 1L ươ ng Tr ầ n Hy Hi ế n
M ả ng
khai báo
c ấ u trúc, thao tác
2
Xâu ký t ự
t ạ o xâu, nh ậ p, xu ấ t
m ộ t s ố hàm xâu
M ộ t s ố thu ậ t toán s ắ p x ế p và tìm ki ế m
Công d ụ ng
Dùng để l ư u các đố i t ượ ng có cùng chung m ộ t ki ể u và
ý ngh ĩ a s ử d ụ ng
Phân lo i
3
Phân lo ạ i
M ả ng 1 chi ề u
M ả ng 2 chi ề u
Khai báo
Cách s ử d ụ ng
Các thao tác c ơ b ả n trên m ả ng
T ậ p các ph ầ n t ử thu ộ c cùng m ộ t ki ể u d ữ li ệ u
Đượ c s ắ p x ế p liên t ụ c trong b ộ nh ớ
kích th ướ c là c ố đị nh
Có th ể đ ánh ch ỉ s ố và truy c ậ p theo th ứ t ự ng ẫ u
4
Có th ể đ ánh ch ỉ s ố và truy c ậ p theo th ứ t ự ng ẫ u nhiên
C/C++: ch ỉ s ố luôn b ắ t đầ u t ừ 0
Phân lo ạ i:
M ả ng 1 chi ề u
M ả ng 2 chi ề u
M ả ng n chi ề u
Trang 2M ả ng (3)
Khai báo m ả ng:
Mảng 1 chiều:
Kiểu Tên-mảng[số phần tử];
Ý nghĩa: <Tên-mảng> là một
mảng có <số phần tử> kiểu
0 1 … SPT-2 SPT-1
…
5
mảng có <số phần tử> kiểu
<Kiểu> Phần tửđầu tiên nằm
ở vị trí thứ 0 Phần tử cuối
cùng nằm ở vị trí <số phần
tử> - 1
Lưu ý: số phần tử trong câu
khai báo mảng phải là một
hằng số hoặc một biểu thức
của các hằng số
•Ví dụ:
•int A[10];// mảng A có 10
phần tử kiểu nguyên
•double mangthuc[100];mảng mangthuc có 100 phần tử kiểu
thực
•const int MAX = 100;
double mangthuc[MAX];
Ví d ụ
void main() {
int c[12];
6
for (int i=0; i<12; i++) { cin >> c[i];
} }
7
void main() {
int a[12];
int b[] = {2, 3, 5, 7};
8
t b[] { , 3, 5, };
int c[5] = {2, 4, 8, 16};
int d[2] = {1, 2, 3}; // compile error int m[5], i;
… }
Trang 3Kích th ướ c m ả ng không c ầ n bi ế t tr ướ c
void main()
{
int n, max = 0;
cin >> n;
int a[n];
9
int a[n];
for (int i=0; i<n; i++) {
cin >> a[i];
if (a[max] < a[i]) max = i;
}
if (n > 0)
cout << "max number = " << a[max];
}
Có th ể truy ề n m ả ng là tham s ố cho m ộ t hàm
Nh ư là tham chi ế u (nh ậ n s ự thay đổ i)
Hàm c ầ n ph ả i bi ế t kích th ướ c c ủ a m ả ng
10
thông qua m ộ t tham s ố ph ụ
thông qua giá tr ị k ế t thúc m ả ng
void arrayCopy( int a[], int b[] , int size)
{
for (int i=0; i<size; i++)
b[i] [i]
11
b[i] = a[i];
}
M ả ng 1 chi ề u
Các thao tác th ườ ng g ặ p trên m ả ng m ộ t chi ề u:
Qui ước mảng:
int A[100]; // mảng có thể chứa tối đa 100 phần tử
int n; // số phần tử thật sự sẽ sử dụng
Các thao tác trên mảng một chiều th ờng đi kèm với một vòng
12
Các thao tác trên mảng một chiều thường đi kèm với một vòng for
Nhập một dãy (giả sửđã nhập n)
for (int i = 0 ; i < n ; i++) {
cout << “Nh ậ p vào ph ầ n t ử th ứ “ << i << “ c ủ a m ả ng: “; cin >> A[i];
}
Trang 4M ả ng 1 chi ề u
Bài toán: Tìm v ị trí X trên m ả ng a đ ang có N
thành ph ầ n.
Gi ả i pháp: Tìm tu ầ n t ự
13
int linearSearch(int, int [], int);
void main() {
int a[100], key;
… cin >> key;
cout << linearSearch(key a 100);
14
cout << linearSearch(key, a, 100);
} int linearSearch(int k, int m[], int size) {
for (int i=0; i< size; i++) {
if (k == m[i]) return i;
} return -1;
}
M ả ng 1 chi ề u
Xu ấ t dãy
// đị nh d ạ ng độ r ộ ng để xu ấ t #include<iomanip>
for (int i = 0 ; i < n ; i++)
cout << setw(6)<<A[i];
15
Thêm m ộ t ph ầ n t ử v vào cu ố i dãy
A[n++] = v;
Thêm m ộ t ph ầ n t ử v vào đầ u dãy
for (int i = n ; i > 0 ; i )
A[i] = A[i-1];
A[0] = v;
n++;
0
Thêm 15 vào (a, 7)
16
15
12
N = 7
a[N] = X;
N ++; X
Trang 5M ả ng 1 chi ề u
Thêm m ộ t ph ầ n t ử v vào v ị trí th ứ k c ủ a dãy
for (int i = n ; i > k ; i )
A[i] = A[i-1];
17
A[i] = A[i-1];
A[k] = v;
n++;
Xóa ph ầ n t ử n ằ m t ạ i v ị trí th ứ k c ủ a dãy
n ;
for (int i = k ; i < n ; i++)
A[i] = A[i+1];
S ắ p x ế p dãy theo th ứ t ự t ă ng d ầ n:
Interchange Sort
for (int i = 0 ; i < (n – 1) ; i++) {
23
{ for (int j = i + 1 ; j < n ; j++)
if (A[j] < A[i]) {
int temp = A[j];
A[j] = A[i];
A[i] = temp;
} }
Tìm Min
int min = A[0];
for (int i = 1 ; i < n ; i++)
if (A[i] < min)
min = A[i];
24
min = A[i];
cout << “Ph ầ n t ử nh ỏ nh ấ t là: “ << min;
Tìm Max
int max = A[0];
for (int i = 1 ; i < n ; i++)
if (A[i] > max)
max = A[i];
cout << “Ph ầ n t ử l ớ n nh ấ t là: “ << max;
Tính t ổ ng
int tong = 0;
for (int i = 0 ; i < n ; i++)
25
for (int i = 0 ; i < n ; i++) tong += A[i];
Tính trung bình c ộ ng
int tong = 0;
for (int i = 0 ; i < n ; i++) tong += A[i];
double TBC = tong * 1.0 / n;
Trang 6Đả o ng ượ c dãy
for (int i = 0 ; i < n / 2; i++)
{
26
{
int temp = A[i];
A[i] = A[n – i – 1];
A[n – i – 1] = temp;
}
Bài t ậ p
Vi ế t các hàm tính giá tr ị l ớ n nh ấ t, giá tr ị nh ỏ nh ấ t, giá tr ị trung bình c ủ a m ộ t m ả ng s ố nguyên
27
M ả ng 2 chi ề u
Khai báo m ả ng:
Mảng 2 chiều:
Kiểu Tên-mảng[số dòng][ ố cột];
Ý nghĩa: <Tên-mảng> là một ma
trận có <số dòng> dòng và <số
0 1 … SC-1
0
1
…
SD-1
28
trận có <số dòng> dòng và <số
cột> cột Phần tửđầu tiên nằm ở
vị trí dòng thứ 0, cột thứ 0 Phần
tử cuối cùng nằm ở vị trí dòng
<số dòng> - 1 và cột <số cột>
-1
Lưu ý: số dòng, số cột phải là một
hằng số hoặc một biểu thức của
các hằng số
SD-1
•Ví dụ:
int A[10][5]; // ma trận
10 dòng, 5 cột
const int MAXX = 10;
const int MAXY = 5;
int A[MAXX][MAXY];
M ả ng 2 chi ề u
int a[7][7];
int b[2][3] = { {2, 4, 6}, {3, 5, 7} }; for (int i=0; i<2; i++){
29
{ for (int j=0; j<3; j++) cout << b [i][j]<<“\t” ; cout << endl;
}
B ả n ch ấ t là m ả ng m ộ t chi ề u
Trang 7M ả ng 2 chi ề u
Các thao tác th ườ ng g ặ p trên m ả ng hai chi ề u:
Qui ước mảng:
int A[100][100]; // mảng có thể chứa tối đa 100x100 phần tử
int m, n; // số dòng và số cột thật sự sẽ sử dụng
Các thao tác trên mảng hai chiều thường đi kèm với hai vòng for
Nhập một dãy (giả sửđã nhập m, n)
30
Nhập một dãy (giả sửđã nhập m, n)
for (int i = 0 ; i < m ; i++)
{
for (int j = 0 ; j < n ; j++)
{
cout << “Nhập phần tử tại dòng “ << i << “ cột “ << j << “ của mảng: “;
cin >> A[i][j];
}
}
Xu ấ t ma tr ậ n
//setw(6); // đị nh d ạ ng độ r ộ ng để xu ấ t
for (int i = 0 ; i < m ; i++)
31
for (int i = 0 ; i < m ; i++) {
for (int j = 0 ; j < n ; j++) cout << setw(6)<< A[i][j];
cout << endl;
}
Thêm m ộ t dòng v vào cu ố i ma tr ậ n
for (int j = 0 ; j < n ; j++)
A[m][j] = v[j];
m++;
32
m++;
Thêm m ộ t dòng v vào v ị trí dòng th ứ k
for (int i = m ; i > k ; i++)
{
for (int j = 0 ; j < n ; j++)
A[i][j] = A[i-1][j];
}
for (int j = 0 ; j < n ; j++)
A[k][j] = v[j];
m++;
Xóa dòng th ứ k
m ;
for (int i = k ; i < m ; i++)
33
for (int i = k ; i < m ; i++) {
for (int j = 0 ; j < n ; j++) A[i][j] = A[i+1][j];
}
Trang 8Tìm ki ế m v ị trí ph ầ n t ử mang giá tr ị x
int dem = 0;
for (int i = 0 ; i < m ; i++)
{
34
{
for (int j = 0 ; j < n ; j++)
if (A[i][j] == x)
{
cout << “Vị trí dòng “ << i << “ cột “ << j << endl;
dem++;
}
}
if (dem == 0)
cout << “Phần tử ” << x << “ không có trong ma trận.”;
M ả ng các ký t ự
char name[30];
char str[] = ”hello”;
35
Trong C/C++ xâu k ế t thúc b ằ ng ký t ự \0
kích th ướ c b ộ nh ớ và độ dài có ngh ĩ a là khác
nhau.
h e l l o \0 str
char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };
char last_name[6] = "Minor";
char other[] = "Tony Blurt";
Chu ỗ i ký t ự - Ví d ụ
36
char characters[7] = "No null";
first_name
last_name
other
characters
'J' 'o' 'h' 'n' 0 'M' 'i' 'n' 'o' 'r' 0 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0 'N' 'o' 32 'n' 'u' 'l' 'l' 0
L ư u ý: k ế t thúc chu ỗ i
#include <iostream>
using namespace std;
int main() {
char other[] = "Tony Blurt";
cout<<other;
"Blurt" sẽ không
được in ra
37
cout<<other;
other[4] = '\0';
cout<<other;
return 0;
}
Tony Blurt Tony
other 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0
Trang 9Khai báo, nh ậ p/xu ấ t xâu
#include <iostream>
using namespace std;
#include <cstring>
void main()
{
38
{
char s1[] = ”Hello”;
char s2[] = ”What’s your name?”;
char name[30];
cout << s1 << endl << s2 << endl;
cin >> name;
cout << name << ”, welcome!”;
}
V ề c ơ b ả n nh ư m ả ng
Nh ư là tham s ố bi ế n
Có ph ầ n t ử k ế t thúc xâu nên th ườ ng không c ầ n
39
truy ề n kích th ướ c
void stringCopy(char s1[], char s2[])
{
int i = 0;
while (s1[i] > 0) {
40
s2[i] = s1[i];
i++;
}
s2[i] = 0;
}
M ộ t s ố hàm th ư vi ệ n xâu
S ử d ụ ng th ư vi ệ n cstring (th ư vi ệ n C++)
#include <cstring>
M ộ t s ố hàm
strlen (s) : tr ả l i kích th ớ c xâu s
41
strlen (s) : tr ả l ạ i kích th ướ c xâu s
strcpy (s1, s2) : copy s2 vào s1
strcmp (s1, s2) : so sánh, n ế u b ằ ng thì k ế t qu ả là 0; có phân bi ệ t IN HOA – in th ườ ng
stricmp (s1, s2) : so sánh, n ế u b ằ ng thì k ế t qu ả là 0; không phân bi ệ t IN HOA – in th ườ ng
strupr (s): Đổi toàn bộ các ký tự của chuỗi thành IN HOA
strlwr (s): Đổi toàn bộ các ký tự của chuỗi thành in thường
Trang 10Chu ỗ i ký t ự – M ộ t s ố hàm th ư vi ệ n
Gán n ộ i dung chu ỗ i:
o Chép toàn b ộ chu ỗ i source sang chu ỗ i dest:
int strcpy(char *dest, const char
42
*src);
o Chép t ố i đ a n ký t ự t ừ source sang dest:
int strncpy(char *dest,
const char *src, int n);
T ạ o chu ỗ i m ớ i t ừ chu ỗ i đ ã có:
char *strdup(const char *src);
#include <iostream>
using namespace std;
int main() {
char s[] = "Tony Blurt";
Chu ỗ i ký t ự – ví d ụ strcpy
Tony Blurt To123Blurt Blurt
43
char s2[100], *s3;
strcpy(s2, s);
cout<<s2;
strncpy(s2 + 2, "12345", 3);
cout<<s2;
s3 = strdup(s + 5);
cout<<s2;
return 0;
}
Chu ỗ i ký t ự – M ộ t s ố hàm th ư vi ệ n
N ố i chu ỗ i:
char *strcat(char *dest,
const char *src);
Tách chu ỗ i:
44
Tách chu ỗ i:
char *strtok(char *s,
const char *sep);
Tr ả v ề đị a ch ỉ c ủ a đ o ạ n đầ u tiên Mu ố n tách
đ o ạ n k ế ti ế p tham s ố th ứ nh ấ t s ẽ là NULL
#include <iostream>
#define SEPARATOR "., "
int main() {
Chu ỗ i ký t ự – ví d ụ strtok
Thu strtok: 9
123 45
45
{ char s[]= "Thu strtok: 9,123.45";
char *p;
p = strtok(s, SEPARATOR);
while (p != NULL) { cout<<p;
p = strtok(NULL, SEPARATOR);
} return 0;
}
45
Trang 11Chu ỗ i ký t ự – M ộ t s ố hàm th ư vi ệ n
Tìm m ộ t ký t ự trên chu ỗ i:
char *strchr(const char *s, int
c);
46
Tìm m ộ t đ o ạ n ký t ự trên chu ỗ i:
char *strstr(const char *s1,
const char *s2);
#include <iostream>
using namespace std;
int main() {
Chu ỗ i ký t ự – ví d ụ tìm ki ế m
47
char s[]= "Thu tim kiem chuoi";
char *p;
p = strchr(s, 'm');
cout<<p;
p = strstr(s, "em");
cout<<p;
return 0;
}
m kiem chuoi
em chuoi
#include <iostream.h>
void StrIns(char *s, char *sub)
{
int len = strlen(sub);
Chu ỗ i ký t ự – chèn m ộ t đ o ạ n ký t ự
48
memmove(s + len, s, strlen(s)+1);
strncpy(s, sub, len);
}
int main()
{
char s[]= "Thu chen";
StrIns(s, "123"); cout<<s;
StrIns(s + 8, "45"); cout<<p;
return 0;
}
123 Thu chen
123 Thu 45chen
#include <iostream.h>
void StrDel(char *s, int n) {
memmove(s, s + n, strlen(s+n)+1);
Chu ỗ i ký t ự – xóa m ộ t đ o ạ n ký t ự
xoa 12345
49
memmove(s, s + n, strlen(s+n)+1);
} int main() {
char s[]= "Thu xoa 12345";
StrDel(s, 4); cout<<s;
StrDel(s + 4, 3); cout<<p;
return 0;
}
xoa 12345 xoa 45
Trang 12M ả ng xâu
char names[100][30];
for (int i=0; i<100; i++) {
50
cin >> names[i];
cout << strlen(names[i]);
}
Bài t ậ p
Vi ế t hàm t ạ o xâu ngh ị ch đả o: nh ậ n tham s ố là xâu, t ạ o xâu ngh ị ch đả o c ủ a chính xâu đ ó và ghi
k ế t qu ả vào chính xâu tham s ố vào.
Vi ế t hàm ki ể m tra m t xâu ký t có n ằ m trong
52
Vi ế t hàm ki ể m tra m ộ t xâu ký t ự có n ằ m trong
m ộ t xâu ký t ự khác hay không.
Thao tác thành th ạ o v ớ i m ả ng m ộ t chi ề u
Cài đặ t các hàm s ắ p x ế p và tìm ki ế m
Thao tác v ớ i xâu ký t ự
53
nh ậ p xu ấ t, t ạ o h ằ ng xâu
s ử d ụ ng các hàm th ư vi ệ n copy, so sánh,…