Mảng
GV. Nguyễn Minh Huy
Nhập mơn lập trình - GV. Nguyễn Minh Huy
1
Nội dung
Khái niệm mảng
mảng..
Thao tác trên mảng
mảng..
Chuỗi ký tự.
tự.
Nhập môn lập trình - GV. Nguyễn Minh Huy
2
Nội dung
Khái niệm mảng.
mảng.
Thao tác trên mảng
mảng..
Chuỗi ký tự.
tự.
Nhập môn lập trình - GV. Nguyễn Minh Huy
3
Khái niệm mảng
Xét chương trình sau:
sau:
Nhập 5 số nguyên
nguyên,, sau đó xuất 5 số vừa nhập
nhập..
Khai báo 5 biến int a, b, c, d, e.
Nhập 50 số nguyên
nguyên,, sau đó xuất 50 số vừa nhập
nhập..
Khai báo 50 biến int!!
int!!
Làm sao khai báo nhiều biến cùng lúc?
lúc?
Mảng
Mảng..
Nhập môn lập trình - GV. Nguyễn Minh Huy
4
Khái niệm mảng
Mảng trong ngôn ngữ C:
Mảng là một dãy biến có cùng kiểu
kiểu..
Các biến trong dãy là phần tử mảng
mảng..
Khai báo
báo::
liệu>
> <Tên mảng>[
mảng>[ <Số phần tử>
tử> ];
<Số phần tử>:
tử>: phải là một hằng số.
số.
int m1[
m1[ 10 ]];;
float m2[
m2[ 50 ]];;
// Dãy 10 số nguyên
nguyên..
// Dãy 50 số thực
thực..
int N;
float m3[
m3[ N ]];;
// Sai
const int K = 100;
float m4[
m4[ K ]];;
// Đúng
Nhập mơn lập trình - GV. Nguyễn Minh Huy
5
Khái niệm mảng
Mảng trong ngôn ngữ C:
Sau khi khai báo
báo,, phần tử mảng có giá trị bao nhiêu
nhiêu?
?
int m[ 5 ]];;
m
?
?
?
?
?
Khởi tạo giá trị mảng
mảng::
liệu>
> <Tên mảng>[
mảng>[<
<Số phần tử>
tử>] = { <Giá trị PT1>,
PT1>, <Giá trị PT2>,
PT2>, Y };
int m1[5] = { 1, 2, 3, 4, 5 };
m1
1
2
3
4
5
// Khởi tạo tất cả phần tử
int m2[5] = { 1, 2 };
m2
1
2
0
0
0
// Khởi tạo vài phần tử đầu
// các phần tử sau tất cả = 0
int m3[5] = { 0 };
m3
0
0
0
0
0
// Khởi tạo tất cả = 0
int m3[ ] = { 1, 2, 3, 4, 5 };
m3
1
2
3
4
5
// Tự động biết số phần tử
Nhập mơn lập trình - GV. Nguyễn Minh Huy
6
Khái niệm mảng
Mảng trong ngôn ngữ C:
Truy xuất phần tử mảng
mảng::
mảng>
> [ <Chỉ số mảng>
mảng> ]
mảng>:
>: một số nguyên từ 0 đến <Số phần tử>
tử> - 1.
int a[ 10 ] = { 0 };
a
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
0
a[ 0 ] = 5;
a[ 1 ] = 6;
a[ 2 ] = a
a[[ 0 ] + a
a[[ 1 ];
a[ -1 ] = 7;
a[ 10 ] = 8;
Nhập mơn lập trình - GV. Nguyễn Minh Huy
// Sai
// Sai
7
Khái niệm mảng
Mảng trong ngôn ngữ C:
Truyền tham số mảng
mảng::
Khai báo tham số mảng giống biến mảng
mảng..
void foo(
foo( int a[ 100 ], int size );
Khai báo tham số mảng có thể bỏ số phần tử.
tử.
void foo(
foo( int a[ ], int size );
Phần tử mảng có thể bị thay đổi sau khi ra khỏi hàm
hàm..
void foo(
foo( int a[ ], int size )
{
a[ 2 ] = 9;
a[ 5 ] = 8;
}
void main()
{
int a[ 100 ] = { 0 };
foo
foo(( a, 100 );
// a[2], a[5] bị thay đổi
đổi..
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
8
Nội dung
Khái niệm mảng
mảng..
Thao tác trên mảng
mảng..
Chuỗi ký tự.
tự.
Nhập môn lập trình - GV. Nguyễn Minh Huy
9
Thao tác trên mảng
Cách thức chung
chung::
B1: Duyệt mảng
mảng..
Dùng vòng lặp + biến đếm.
đếm.
Mỗi vòng lặp xét một phần tử.
tử.
B2: Thao tác trên từng phần tử.
tử.
Dùng biến đếm truy xuất phần tử.
tử.
// Duyệt mảng M có kích thước N.
for ( int i = 0; i < N; i++ )
{
<Lệnh truy xuất phần tử M[ i ]>;
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
10
Thao tác trên mảng
Nhập mảng
mảng::
// Nhập mảng số nguyên a, kích thước n
void nhapMang
nhapMang(( int a[ ], int &n )
{
printf(“
printf
(“Nhap
Nhap kich thuoc = “);
scanf(“%d”,
scanf
(“%d”, &n);
&n);
for (int
(int i = 0; i < n; i++
++))
{
printf(“
printf
(“Nhap
Nhap phan tu %d = “, i);
scanf(“%d”,
scanf
(“%d”, &a[ i ]);
}
#define MAX
100
void main()
{
int a[ MAX ], size1;
int b[ MAX ], size2;
nhapMang(a, size1);
nhapMang(a,
nhapMang(b,
nhapMang
(b, size2);
}
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
11
Thao tác trên mảng
Xuất mảng
mảng::
// Xuất mảng số nguyên a, kích thước n
void xuatMang
xuatMang(( int a[ ], int n )
{
for ( int i = 0; i < n; i++ )
printf(“%d
printf
(“%d “, a[ i ]);
}
#define MAX
100
void main()
{
int a[ MAX ], size1;
int b[ MAX ], size2;
nhapMang(a, size1);
nhapMang(a,
nhapMang(b,
nhapMang
(b, size2);
xuatMang(a, size1);
xuatMang(a,
xuatMang(b,
xuatMang
(b, size2);
}
Nhập môn lập trình - GV. Nguyễn Minh Huy
12
Thao tác trên mảng
Tính tổng phần tử mảng
mảng::
// Tính tổng mảng a, kích thước n
long tinhTong
tinhTong(( int a[ ], int n )
{
long tong = 0;
for ( int i = 0; i < n; i++ )
tong += a[ i ];
#define MAX
100
void main()
{
int a[ MAX ], size1;
int b[ MAX ], size2;
nhapMang(a, size1);
nhapMang(a,
nhapMang(b,
nhapMang
(b, size2);
return tong;
}
long tong1 = tinhTong
tinhTong(a,
(a, size1);
long tong2 = tinhTong
tinhTong(b,
(b, size2);
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
13
Nội dung
Khái niệm mảng
mảng..
Thao tác trên mảng
mảng..
Chuỗi ký tự.
tự.
Nhập môn lập trình - GV. Nguyễn Minh Huy
14
Chuỗi ký tự
Chuỗi ký tự trong C:
Chuỗi ký tự = mảng ký tự + phần tử cuối ‘\0’
0’..
Chiều dài chuỗi = số phần tử mảng – 1;
Khai báo chuỗi
chuỗi::
char <Tên chuỗi>
chuỗi> [
chuỗi>
> + 1 ];
0
s1 ?
char s1[
s1[ 5 ]];;
1
?
2
?
3 4
? \0
Khởi tạo chuỗi
chuỗi::
char
chuỗi>
> [ ] = “<
“
Chuỗi khởi tạo>”
tạo>”;;
char s2[ ] = “Hello”;
Nhập mơn lập trình - GV. Nguyễn Minh Huy
0
s1 H
1
e
2
l
3
l
4 5
o \0
// Khởi tạo chuỗi
15
Chuỗi ký tự
Thao tác trên chuỗi ký tự:
tự:
Nhập chuỗi
chuỗi::
scanf(“%s”, &
scanf(“%s”,
&chuoi
chuoi).
).
Chỉ nhập từ đầu tiên
tiên..
gets(chuoi
gets(
chuoi);
);
Nhập nguyên chuỗi
chuỗi..
#define MAX
void main()
{
char s1[
s1[ MAX ];
char s2[
s2[ MAX ];
printf(“Nhap
printf(“
Nhap chuoi s1 = “);
scanf(“%s”,
scanf
(“%s”, &s1);
printf(“
printf
(“Nhap
Nhap chuoi s2 = “);
gets(s1);
Xuất chuỗi
chuỗi::
100
printf(“%s”, chuoi).
printf(“%s”,
chuoi).
puts(chuoi
puts(
chuoi).
).
printf(“Chuoi s1 = %s”,
printf(
%s”, s1)
s1);;
puts(s2);
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
16
Chuỗi ký tự
Thao tác trên chuỗi ký tự:
tự:
Thư viện
string.h>:
>: #include <string.h>
string.h>
strlen((chuoi
strlen
chuoi):
): đếm chiều dài chuỗi
chuỗi..
char s1[ ] = “Hello World”;
World”;
// Tự thêm ‘\0’ ở cuối.
cuối.
char s2[ ] = “Hello World\
World\n”;
// Tự thêm ‘\0’ ở cuối.
cuối.
char s3[ ] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘W’, ‘o’, ‘r’, ‘l’, ‘d’, ‘\
‘\n’, ‘\
‘\0’ };
int chieuDai1 = strlen
strlen(s1)
(s1);;
int chieuDai2 = strlen
strlen(s2)
(s2);;
int chieuDai3 = strlen(s3)
strlen(s3);;
Nhập mơn lập trình - GV. Nguyễn Minh Huy
// chieuDai1 = 11
// chieuDai2 = 12
// chieuDai3 = 12
17
Chuỗi ký tự
Thao tác trên chuỗi ký tự:
tự:
Viết hoa chữ cái đầu mỗi từ:
từ:
#include
<string.h>
>
#define MAX 100
void vietHoa
vietHoa(( char s[ ] )
{
for (int
(int i = 0; i < strlen
strlen(s)
(s);; i++)
if ( s[ i ] >= ‘a’ && s[ i ] <= ‘z’ &&
( i == 0 || s[ i - 1 ] == ‘ ‘ ) )
s[ i ] = s[ i ] - 32;
}
void main()
{
char s[MAX];
printf(“Nhap
printf(“
Nhap chuoi s = “);
gets(s);
vietHoa(s);
vietHoa
(s);
printf(“%s
printf
(“%s\\n”, s);
}
Nhập mơn lập trình - GV. Nguyễn Minh Huy
18
Tóm tắt
Khái niệm mảng
mảng::
Dãy biến cùng kiểu
kiểu..
Các biến trong dãy là phần tử mảng
mảng..
Thao tác trên mảng
mảng::
Thao tác chung
chung:: duyệt + thao tác từng phần tử.
tử.
Chuỗi ký tự:
tự:
Mảng ký tự kết thúc bằng ‘\0’.
Nhập xuất
xuất:: printf,
printf, scanf,
scanf, gets, puts.
Đếm chiều dài
dài:: strlen (thư viện
string.h>).
>).
Nhập môn lập trình - GV. Nguyễn Minh Huy
19
Bài tập
Bài tập 7.1:
Viết chương trình C như sau
sau::
(tổ chức theo dạng hàm và chia làm nhiều file):
- Nhập vào mảng N số nguyên
nguyên..
- Hãy cho biết
biết::
a) Có bao nhiêu số chẵn trong mảng
mảng..
b) Có bao nhiêu số âm trong mảng
mảng..
c) Có bao nhiêu số ngun tố trong mảng
mảng..
Nhập mơn lập trình - GV. Nguyễn Minh Huy
20