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

pdf12 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 3795 | Lượt tải: 3download
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:

  • pdfSlide bài giảng Lập trình C++ - Lương Trần Hy Hiến - Mảng - Xâu kí tự.pdf