Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng và xâu kí tự
Nội dung
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
Tóm tắt nội dung Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng và xâu kí tự, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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
Khai báo mảng
void main()
{
int a[12];
int b[] = {2, 3, 5, 7};
8
int c[5] = {2, 4, 8, 16};
int d[2] = {1, 2, 3}; // compile error
int m[5], i;
…
}
Kí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
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];
}
Mảng là tham số
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
Ví dụ: copy mảng
void arrayCopy(int a[], int b[], int size)
{
for (int i=0; i<size; i++)
b[i] [i]
11
= a ;
}
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
ư
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];
}
Mả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
, ,
}
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
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++;
Mảng – Thêm X vào cuối dãy
1 2 3 4 5 6 70
Thêm 15 vào (a, 7)
16
2 8 5 1 6 4
15
12
N = 78
a[N] = X;
N ++;X
Mả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[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
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
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;
Đả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][số cột];
Ý nghĩa: là một ma
trận có dòng và <số
0 1 … SC-1
0
1
…
SD-1
28
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
- 1 và 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ố.
•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
Mả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
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 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
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 j = 0 ; j < n ; j++)
A[i][j] = A[i+1][j];
}
Tì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.”;
Chuỗi - Xâu ký tự
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 \0str
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
using namespace std;
int main()
{
char other[] = "Tony Blurt";
cout<<other;
"Blurt" sẽ không
được in ra
37
other[4] = '\0';
cout<<other;
return 0;
}
Tony Blurt
Tony
other 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0
Khai báo, nhập/xuất xâu
#include
using namespace std;
#include
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!”;
}
Tham số là xâu ký tự
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
Một số hàm
strlen(s) : trả l i kích th ớc xâu s
41
ạ ư
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
Chuỗ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
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
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
#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;
}
Chuỗ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
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
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
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
}
int main()
{
char s[]= "Thu xoa 12345";
StrDel(s, 4); cout<<s;
StrDel(s + 4, 3); cout<<p;
return 0;
}
xoa 45
Mả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
ộ ự
một xâu ký tự khác hay không.
Tự thực hành
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,…
File đính kèm:
Slide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng - Xâu kí tự.pdf

