BÀI GIẢNG HỌC PHẦN
KỸ THUẬT LẬP TRÌNH
CHƯƠNG 4: CÁC KIỂU DỮ LIỆU CÓ CẤU TRÚC
Nội dung
4.1. Kiểu mảng
4.2. Kiểu xâu ký tự
4.3. Kiểu cấu trúc
2
4.1. Kiểu mảng
•
•
•
•
Khái niệm mảng
Khai báo và sử dụng mảng
Các thao tác cơ bản trên mảng
Một số chương trình với mảng
3
Khái niệm mảng
• Là một kiểu dữ liệu có cấu trúc, bao gồm một tập
hữu hạn các phần tử có cùng kiểu dữ liệu, có tên
chung, được lưu trữ kế tiếp nhau trong bộ nhớ
• Kích thước của mảng được xác định ngay khi khai
báo và là cố định
• Các phần tử trong mảng có tên chung là tên của
mảng và được phân biệt với nhau thông qua chỉ số
của chúng
• Mảng thường được dùng để lưu một dãy giá trị
như: dãy số nguyên, dãy số thực, dãy kí tự, ma trận,
…
4
Khai báo và sử dụng mảng (1)
• Khai báo mảng:
kiểu_dữ_liệu tên_mảng[N1][N2]…[Nn]
trong đó:
- kiểu_dữ_liệu: là kiểu dữ liệu của các phần tử mảng
- tên_mảng: tên biến mảng
- N1, N2, …, Nn: kích thước các chiều của mảng
Số phần tử của mảng: N1 * N2 * … * Nn
• Ví dụ:
- int a[10], b[20];
- float matran[10][20];
5
Khai báo và sử dụng mảng (2)
• Có thể sử dụng chỉ thị #define để xác định kích
thước các chiều của mảng
Ví dụ:
#define N1 20
#define N2 30
int a[N1];
float b[N1][N2];
6
Khai báo và sử dụng mảng (3)
• Kết hợp khởi tạo giá trị trong khai báo mảng:
- Khởi tạo giá trị cho mọi phần tử của mảng
Ví dụ: int a[3] = {4,5,9};
float x[2][3] = {{2,1.5,3}, {1,3,4.25}};
- Khởi tạo giá trị cho một số phần tử đầu mảng
Ví dụ: int b[5] = {2,6,1};
- Khi khơng khai báo kích thước, kích thước mảng
bằng với số lượng giá trị khởi tạo
Ví dụ: int c[] = {15,20,36,54};
7
Khai báo và sử dụng mảng (4)
• Khai báo hằng kiểu mảng:
- Cách 1:
#define tên_mảng {giá_trị_1, …, giá_trị_n}
Không truy cập được vào các phần tử của mảng
- Cách 2:
const kiểu_dữ_liệu tên_mảng[N1] … [Nn] =
{giá_trị_1, …, giá_trị_n}
Ví dụ:
const int hangmang1[4] = {10,20,25,40};
const float hangmang2[] = {4.5,9.25};
const float hangmang3[5] = {1.5,2,5};
8
Khai báo và sử dụng mảng (5)
• Lưu trữ dữ liệu kiểu mảng:
- Các phần tử của mảng được lưu trữ tại các ô nhớ kế
tiếp nhau trong bộ nhớ
- Kích thước bộ nhớ lưu trữ:
N1 * N2 * … * Nn * sizeof(kiểu_dữ_liệu)
- Các phần tử trong mảng được đánh chỉ số, phần tử
đầu tiên có chỉ số là 0, phần tử thứ i có chỉ số là i-1
- Biến mảng lưu trữ địa chỉ của ô nhớ đầu tiên trong
vùng nhớ được cấp phát
9
Khai báo và sử dụng mảng (6)
• Sử dụng mảng:
- Cú pháp truy cập vào các phần tử mảng:
tên_mảng[chỉ_số_1][chỉ_số_2] … [chỉ_số_n]
- Ví dụ:
int a[4];
Các truy cập hợp lệ: a[0], a[1], a[2], a[3]
Các truy cập không hợp lệ: a[-2], a[-1], a[4], a[5],
…
10
Khai báo và sử dụng mảng (7)
• Sử dụng mảng: (tiếp)
- Lấy địa chỉ của phần tử mảng (áp dụng cho mảng 1
chiều):
&tên_mảng[chỉ_số];
Ví dụ: &a[1]
- Tên mảng biểu thị địa chỉ đầu của mảng, tức là:
a = &a[0]
11
Các thao tác cơ bản trên mảng (1)
• Phép gán mảng:
- Không được thực hiện phép gán thông thường cho
một biến mảng
- Chỉ có thể thực hiện phép gán giá trị cho các phần
tử của mảng
- Ví dụ:
int a[3] = {4,5,9},b[3],i;
Phép gán không hợp lệ: b = a;
Phép gán hợp lệ:
for(i=0;i<3;i++)
b[i] = a[i];
12
Các thao tác cơ bản trên mảng (2)
• Nhập dữ liệu cho mảng từ bàn phím:
Sử dụng hàm scanf để nhập dữ liệu cho từng phần tử
của mảng
Ví dụ: int a[10];
Nhập dữ liệu cho phần tử a[1]: scanf("%d",&a[1]);
Nhập dữ liệu cho tất cả các phần tử của mảng: sử
dụng cấu trúc lặp for
int i;
for(i=0;i<10;i++)
{
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}
13
Các thao tác cơ bản trên mảng (3)
• Nhập dữ liệu cho mảng từ bàn phím (tiếp):
Lưu ý: Phép lấy địa chỉ không áp dụng cho các phần tử
của mảng nhiều chiều (trừ trường hợp mảng 2 chiều
gồm các số nguyên) cần sử dụng biến trung gian khi
nhập dữ liệu cho mảng nhiều chiều
Ví dụ: float a[10][20];
Nhập dữ liệu cho các phần tử của mảng:
int i,j;
float x;
for(i=0;i<10;i++)
for(j=0;j<20;j++)
{printf("a[%d][%d] = ",i,j);
scanf("%f",&x);
a[i][j] = x;
}
14
Các thao tác cơ bản trên mảng (4)
• Xuất dữ liệu của mảng ra màn hình:
Sử dụng hàm printf để xuất dữ liệu từng phần tử
của mảng ra màn hình
Ví dụ: int a[10];
Xuất dữ liệu của phần tử a[1]:
printf("a[1] = %d",a[1]);
Xuất dữ liệu của tất cả các phần tử mảng sử dụng
cấu trúc lặp for:
int i;
for(i=0;i<10;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
15
Ví dụ (1)
• Chương trình nhập/xuất dữ liệu cho mảng:
#include<stdio.h>
int main(void)
{
int a[50];
int n,i;
lap: printf("Nhap so phan tu n = ");
scanf("%d",&n);
if (n<=0 || n>50)
{
printf("So phan tu khong hop le, hay nhap lai!\n");
goto lap;
}
16
Ví dụ (2)
• Chương trình nhập/xuất dữ liệu cho mảng: (tiếp)
for(i=0;i
{
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}
printf("Day so vua nhap la:\n");
for(i=0;i
printf("%d ",a[i]);
return 0;
}
17
Một số chương trình với mảng
• Viết chương trình tính tổng, trung bình cộng cho dãy số
nguyên a1, a2 , …, an
• Viết chương trình tìm giá trị lớn nhất, nhỏ nhất của dãy
số nguyên a1, a2 , …, an
• Viết chương trình tìm phần tử có giá trị là x trong dãy
số nguyên a1, a2 , …, an (số ngun x nhập từ bàn phím)
• Viết chương trình sắp xếp dãy số nguyên a 1, a2 , …, an
theo chiều tăng/giảm dần
• Viết chương trình nhập vào ma trận số nguyên (a ij)mxn,
in lại các giá trị vừa nhập theo dạng ma trận, tính tổng
các phần tử trong ma trận và thơng báo kết quả ra màn
hình
18
4.2. Kiểu xâu ký tự
•
•
•
•
•
Khái niệm xâu ký tự
Khai báo và sử dụng xâu ký tự
Các hàm xử lý ký tự
Các hàm xử lý xâu ký tự
Một số chương trình với xâu ký tự
19
Khái niệm xâu ký tự
• Là một kiểu dữ liệu có cấu trúc, bao gồm một dãy
các ký tự liên tiếp, kết thúc bởi ký tự '\0' (null – mã
ASCII là 0)
• Mỗi ký tự được lưu trong 1byte
• Độ dài xâu là số ký tự có trong xâu
• Xâu rỗng là xâu khơng có ký tự nào
• So sánh:
- Xâu ký tự & mảng ký tự
- 'A' và "A"
20
Khai báo và sử dụng xâu ký tự (1)
• Khai báo xâu ký tự:
char tên_xâu[n]
trong đó:
n = số ký tự tối đa + 1
Ví dụ:
- char hoten[30];
- char s1[50], s2[100];
• Khởi tạo giá trị trong khai báo xâu ký tự:
Xét các ví dụ:
char s[4] = {'A', 'B', 'C', '\0'};
char hoten[30] = "Luu Thanh Duyen";
21
Khai báo và sử dụng xâu ký tự (2)
• Khai báo hằng xâu ký tự:
- Cách 1:
#define tên_xâu giá_trị
- Cách 2:
const char tên_xâu[n] = giá_trị;
Ví dụ:
#define s1 "ABC"
const char s2[10] = "ABCDE";
22
Khai báo và sử dụng xâu ký tự (3)
• Lưu trữ dữ liệu kiểu xâu ký tự:
- Các ký tự được lưu trữ tại các byte nhớ kế tiếp nhau
trong bộ nhớ
- Kích thước bộ nhớ lưu trữ:
Số ký tự tối đa + 1
- Tương tự như dữ liệu kiểu mảng, mỗi ký tự trong
xâu được đánh chỉ số, ký tự đầu tiên có chỉ số là 0,
ký tự thứ i có chỉ số là i-1
23
Khai báo và sử dụng xâu ký tự (4)
• Sử dụng xâu ký tự:
- Cú pháp truy cập vào các ký tự trong xâu:
tên_xâu[chỉ_số_ký_tự]
- Ví dụ:
char s[15] = "Tran Ngoc Anh";
s[0] 'T'
s[3] 'n'
s[5] 'N'
24
Khai báo và sử dụng xâu ký tự (5)
• Vào/ra xâu ký tự:
- Khai báo tệp tiêu đề:
#include <stdio.h>
- Nhập xâu ký tự từ bàn phím:
gets(tên_xâu);
scanf("%s",&tên_xâu);
- Xuất xâu ký tự ra màn hình:
puts(tên_xâu);
printf("%s",tên_xâu);
• Lưu ý: - Khơng dùng phép gán giá trị cho xâu
- Không sử dụng hàm scanf() để nhập xâu chứa ký tự
cách
- Trước khi dùng gets() cần dùng hàm fflush(stdin)
25