You are on page 1of 19

LẬP

TRÌNH
C
CƠ BẢN
Khái niệm cấu trúc
Khai báo và sử dụng
Cấu trúc cấu trúc
(Struct) Xử lý dữ liệu cấu trúc
Mảng cấu trúc
1. Khái niệm cấu trúc

 Kiểu dữ liệu cấu trúc (struct) là kiểu dữ liệu phức hợp bao gồm nhiều
thành phần, mỗi thành phần có thể thuộc những kiểu dữ liệu khác nhau.

 Các thành phần dữ liệu trong cấu trúc được gọi là các trường dữ liệu
(field).
2. Khai báo và sử dụng cấu trúc

2.1 Khai báo kiểu dữ liệu cấu trúc


 Cú pháp:
struct tên_cấu_trúc {
<khai báo các trường dữ liệu>;
};

 Ví dụ:
struct sinh_vien {
char ma_so_sinh_vien[10];
char ho_va_ten[30];
float diem_TinDC;
}
struct point_3D {
float x;
float y;
float z;
}
2. Khai báo và sử dụng cấu trúc

2.2 Khai báo biến cấu trúc

 Cú pháp:
struct tên_cấu_trúc tên_biến_cấu_trúc;

 Ví dụ: struct sinh_vien a, b, c;

Þ Kết hợp khai báo kiểu dữ liệu cấu trúc và khai báo biến cấu trúc
struct [tên_cấu_trúc] {
<khai báo các trường>;
} tên_biến_cấu_trúc;
Lưu ý:
- Phần tên cấu trúc có thể có hoặc không
- Nếu có tên_cấu_trúc thì sau này ta có thể khai báo bổ sung biến có kiểu
dữ liệu là tên_cấu_trúc đó
- nếu không có tên_cấu_trúc thì cấu trúc khai báo tương ứng không được
sử dụng về sau.
2. Khai báo và sử dụng cấu trúc

2.2 Khai báo biến cấu trúc

Þ Kết hợp khai báo kiểu dữ liệu cấu trúc và khai báo biến cấu trúc

 Ví dụ 1:  Ví dụ 2:
struct diem_thi { struct thi_sinh {
float diem_Toan; char SBD[10];
float diem_Ly; char ho_va_ten[30];
float diem_Hoa; struct diem_thi {
} float diem_Toan;
struct thi_sinh { float diem_Ly;
char SBD[10]; // số báo float diem_Hoa;
danh }ket_qua;
char ho_va_ten[30]; } thi_sinh_1, thi_sinh_2;
struct diem_thi ket_qua;
} thi_sinh_1, thi_sinh_2;
2. Khai báo và sử dụng cấu trúc

2.3 định nghĩa kiểu dữ liệu cấu trúc với typedef

 Cú pháp:
typedef struct tên_cũ tên_mới;
Hoặc
typedef struct [tên_cũ] {
<khai báo các trường>;
}danh_sách_các_tên_mới;
Lưu ý:
• Sau câu lệnh này ta có thể sử dụng tên_mới thay cho tổ hợp struct
tên_cũ khi khai báo biến.
• Được phép đặt tên_mới trùng với tên_cũ.
2. Khai báo và sử dụng cấu trúc

2.3 định nghĩa kiểu dữ liệu cấu trúc với typedef

 Ví dụ:
struct point_3D {
float x, y, z;
} P;
struct point_3D M;
typedef struct point_3D point_3D;
point_3D N;

Þ Trong ví dụ trên ta đã đặt lại tên cho cấu trúc struct point_3D thành
point_3D và dùng tên mới này làm kiểu dữ liệu cho khai báo của biến N.
Các biến P, M được khai báo theo cách chúng ta đã biết.
2. Khai báo và sử dụng cấu trúc

2.3 định nghĩa kiểu dữ liệu cấu trúc với typedef

 Ví dụ:
typedef struct point_2D {
float x, y;
}point_2D, diem_2_chieu, ten_bat_ki;
Point_2D X;
diem_2_chieu Y;
ten_bat_ki Z;

Þ Với ví dụ này ta cần chú ý là point_2D, diem_2_chieu và ten_bat_ki


không phải là tên biến mà là tên mới của cấu trúc struct point_2D.
Các biến X, Y, Z được khai báo với kiểu dữ liệu là các tên mới này.
3. Xử lý dữ liệu cấu trúc

3.1 Truy nhập các trường dữ liệu của cấu trúc


 Cú pháp
tên_biến_cấu_trúc.tên_trường
 Ví dụ:
// dưới đây là một cấu trúc mô tả một điểm trong không gian 2 printf(“\n Hay nhap thong tin ve mot diem”);
chiều.
// các trường dữ liệu gồm: tên của điểm và tọa độ của điểm đó. printf(“\n Ten cua diem: “);
// tọa độ là một cấu trúc gồm 2 trường: hoành độ và tung độ fflush(stdin);
#include <stdio.h> scanf(“%c”,&temp_char);
#include <conio.h> p.ten_diem = temp_char;
void main() { printf(“\n nhap vao hoanh do cua diem: “);
struct point_2D { scanf(“%f”,&temp_float);
char ten_diem; p.toa_do.x = temp_float;
struct { // giả sử điểm đang xét nằm trên đường thẳng y = 3x +
float x, y; 2;
} toa_do; p.toa_do.y = 3*p.toa_do.x + 2;
} p; printf(“\n %c = (%5.2f,%5.2f)”,p.ten_diem,
float temp_float; p.toa_do.x, p.toa_do.y);
char temp_char; getch();
}
3. Xử lý dữ liệu cấu trúc

3.1 Truy nhập các trường dữ liệu của cấu trúc

Þ kết quả khi chạy chương trình:

Þ Lưu ý:

Cũng như việc nhập giá trị cho các phần tử của mảng, việc nhập giá trị cho các
trường của cấu trúc (đặc biệt là các trường có kiểu dữ liệu float) nên thực hiện qua
biến trung gian để tránh những tình huống có thể làm treo máy hoặc kết quả nhập
được không như ý.
3. Xử lý dữ liệu cấu trúc

3.2 Phép gán giữa các biến cấu trúc


 Cú pháp:
biến_cấu_trúc_1 = biến_cấu_trúc_2;
Þ Câu lệnh giá trị của các trường trong biến_cấu_trúc_2 cho các trường tương
ứng trong biến_cấu_trúc_1.
 Ví dụ:
#include <stdio.h> gets(a.ho_ten);
#include <conio.h> printf("\na.diem = ");scanf("%f",&temp_f);
#include <string.h> a.diem = temp_f;
void main() { strcpy(c.ho_ten, a.ho_ten);
struct s { c.diem = a.diem;
char ho_ten[20]; b = a;
float diem; printf("\na: %20s %5.2f", a.ho_ten, a.diem);
}a, b, c; printf("\nb: %20s %5.2f", b.ho_ten, b.diem);
float temp_f; printf("\nc: %20s %5.2f\n", c.ho_ten, c.diem);
printf("\na.ho_ten: ");fflush(stdin); }
3. Xử lý dữ liệu cấu trúc

3.2 Phép gán giữa các biến cấu trúc

Þ kết quả khi chạy chương trình:

Þ Lưu ý:
Để copy dữ liệu là xâu kí tự ta phải dùng lệnh strcpy(), không được dùng
lệnh gán thông thường để copy nội dung xâu kí tự.
3. Xử lý dữ liệu cấu trúc

3.3 Con trỏ cấu trúc

 Cú pháp
struct <tên cấu trúc> * <tên biến con trỏ cấu trúc> ;

 Truy cập vào trường dữ liệu của cấu trúc từ biến con trỏ cấu trúc

(*<tên biến con trỏ cấu trúc>).<tên trường dữ liệu>


Hoặc
<tên biến con trỏ cấu trúc> - > < tên trường dữ liệu>
4. Mảng cấu trúc

 Cú pháp
struct <tên cấu trúc> <tên mảng cấu trúc> [số phần tử];

 Ví dụ:
Câu lệnh trên khai báo một biến mảng tên là lop_KHMT gồm 50 phần tử,
trong đó mỗi phần tử đều có kiểu dữ liệu là kiểu cấu trúc sinh_vien.

struct sinh_vien
{
char ho_ten[20];
float diem_thi;
};
struct sinh_vien lop_KHMT[50];
4. Mảng cấu trúc

 Ví dụ

#include <stdio.h> printf(“\n Nhap thong tin cho sinh vien thu %d”,i+1);
#include <conio.h> printf(“\n Ma so sinh vien:”);
#include <string.h> fflush(stdin); gets(str);
void main() { strcpy(sv[i].ma_sv,str);
struct sinh_vien { printf(“\n Ho va ten: “);
fflush(stdin); gets(str);
char ma_sv[10];
strcp(sv[i].ho_ten,str);
char ho_ten[20]; printf(“\n Diem thi: “);
float diem_thi; scanf(“%f”,&diem);
}; sv[i].diem_thi = diem;
struct sinh_vien sv[3]; }
int i; printf(“\n Thong tin ve cac sinh vien”);
clrscr(); for(i=0;i<3;i++) {
for(i=0;i<3;i++) { printf(“\n Sinh vien thu %d ”,i+1);
char str[20]; printf(“%-10s %-20s %-3.1f”,sv[i].ma_sv, sv[i].ho_ten,sv[i].diem_thi);
float diem; }
getch();
}
4. Mảng cấu trúc

 Ví dụ

Þ Kết quả:
Bài tập
Thanks!
CREDITS: This presentation template was created by Slidesgo,
including icons by Flaticon, infographics & images by Freepik and
illustrations by Stories

You might also like