mac os x lion 10 7 2 free download full versionmac os x 10 7 lion free download full versionwindows 7 professional free download full versionmacromedia flash mx 2004 7 0 free download full versionphim hoạt hình 7 viên ngọc rồng full htv37 viên ngọc rồng full trên htv3windows live movie maker for windows 7 ultimate free download full version7 viên ngọc rồng fullformat usb or flash drive software 7 0
Trang 1Chương 7: KIỂU CẤU TRÚC
(STRUCTURE TYPE)
Giáo viên: Tạ Thúc Nhu Khoa CNTT trường ĐH Lạc Hồng
NGÔN NGỮ C
Trang 2I- Tổng Quan:
I- Tổng Quan:
• Kiểu cấu trúc, còn gọi là kiểu mẫu tin, là kiểu dữ liệu tự tạo
dùng lưu trữ tập hợp các thông tin thuộc tính cần xử lý của một đối tượng trong thực tế
• Mỗi thuộc tính trong một kiểu cấu trúc có một tên phân biệt
và thuộc về một kiểu dữ liệu đã định nghĩa
• Kiểu của các thuộc tính có thể khác nhau.
• Ví dụ: Thông tin về một nhân viên bao gồm:
– Mã số nhân viên thuộc kiểu số nguyên,
– Họ tên thuộc kiểu chuổi,
– ngày sinh thuộc kiểu cấu trúc ngày tháng năm đã định nghĩa,
– hệ số lương thuộc kiểu số thực v.v
Trang 3II- Định nghiã kiểu cấu trúc:
II- Định nghiã kiểu cấu trúc:
typedef struct {
Kiểu Thuộctính_1;
Kiểu Thuộctính_2;
Kiểu Thuộctính_n;
struct Tên_Kiểu
{
Kiểu Thuộctính_1;
Kiểu Thuộctính_2;
Kiểu Thuộctính_n;
};
Mẫu 2 Mẫu 1
Trang 4Ví dụ: Định nghiã kiểu cấu trúc tên là Date
chứa thông tin ngày, tháng và năm
Ví dụ: Định nghiã kiểu cấu trúc tên là Date
chứa thông tin ngày, tháng và năm
typedef struct {
unsigned char Ngay, Thang ; int Nam ;
} Date ;
struct Date
{
unsigned char Ngay, Thang ;
int Nam ;
};
int unsigned char
unsigned char
Nam Thang
Ngay
Date
Trang 5Ví dụ: Định nghiã kiểu cấu trúc
lưu trữ thông tin nhân viên
Ví dụ: Định nghiã kiểu cấu trúc
lưu trữ thông tin nhân viên
typedef struct
{ int MSNV;
char Ho[20], Ten[8];
Date NgaySinh;
float HeSoLuong;
} NhanVien;
struct NhanVien
{
int MSNV;
char Ho[20], Ten[8];
struct Date NgaySinh;
float HeSoLuong;
} ;
NhanVien
float int
uc uc
char[8]
char[20]
int
Nam Thang
Ngay
NgaySinh
HeSoLuong Ten
Ho MSNV
Trang 6III- Biến kiểu cấu trúc:
III- Biến kiểu cấu trúc:
1 Khai báo biến cấu trúc:
[struct] TênKiểuCấuTrúc TênBiếnCT ={giá trị mục 1, giá trị mục 2, };
2 Thuộc tính của biến cấu trúc được xác định bởi:
TênBiếnCT ThuộcTính
nv
.Nam Thang
.Ngay
nv NgaySinh
nv HeSoLuong
nv Ten
nv Ho
nv MSNV
ngaysinh
1999 5
12
ngaysinh Nam
ngaysinh Thang
ngaysinh Ngay
Trang 7Ví dụ: In giá trị của các thuộc tính của biến nv
Ví dụ: In giá trị của các thuộc tính của biến nv
puts("Thong tin nhan vien:");
printf("Ma so : %d", nv.MSNV );
printf(“\nHo ten : %s %s”, nv.Ho , nv.Ten );
nv.NgaySinh.Nam );
printf("\nHe so luong : %f ", nv.HeSoLuong );
nv
2.05 1960
3 12
Tuan
Le Anh 9
.Nam Thang
.Ngay
nv NgaySinh
nv HeSoLuong
nv Ten
nv Ho
nv MSNV
Trang 8Ví dụ: Nhập giá trị cho các thuộc tính
của biến nv
Ví dụ: Nhập giá trị cho các thuộc tính
của biến nv
puts("\nNhap thong tin nhan vien :");
printf("Ma so: "); scanf("%d", &nv.MSNV ); flushall( );
printf("Ten : "); scanf("%s", nv.Ten );
printf("He so luong : "); scanf(“%f”, &nv.HeSoLuong );
nv
.Nam Thang
.Ngay
nv NgaySinh
nv HeSoLuong
nv Ten
nv Ho
nv MSNV
Trang 9Ví dụ: Tính tọa độ trung điểm
của 1 đoạn thẳng AB
Ví dụ: Tính tọa độ trung điểm
của 1 đoạn thẳng AB
typedef struct{ float x, y; } Diem ;
void main()
{
Diem A,B,M;
printf("\nNhap toa do diem A: ");
scanf("%f%%f", &A.x, &A.y);
printf("\nNhap toa do diem B: ");
scanf("%f%%f", &B.x, &B.y);
M.x = (A.x + B.x)/2;
M.y = (A.y + B.y)/2;
printf("\nToa do diem M la (%.2f,%.2f)", M.x, M.y);
getch();
}
6 3
y
x B
0 1
y
x A
3 2
y x
M
Trang 10III- Biến kiểu cấu trúc: (tt)
III- Biến kiểu cấu trúc: (tt)
3 Gán 2 biến cấu trúc có cùng kiểu cấu trúc:
NhanVien nv2 ;
nv2 = nv1;
nv1
2.05 1960
3 12
Tuan
Le Anh 9
Nam Thang
Ngay
NgaySinh
HeSoLuong Ten
Ho MSNV
nv2
2.05 1960
3 12
Tuan
Le Anh 9
Nam Thang
Ngay
NgaySinh
HeSoLuong Ten
Ho MSNV
Trang 11IV- Hàm và kiểu cấu trúc:
IV- Hàm và kiểu cấu trúc:
1 Hàm có thể nhận một biến cấu trúc với 3 kiểu truyền: trị;
tên hay địa chỉ.
2 và có thể return biếncấutrúc về nơi gọi
Hàm B
Hàm A
Truyền Biến cấu trúc
return BiếnCấuTrúc;
Trang 12Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và tham chiếu)
Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và tham chiếu)
void NhapPhanSo( PhanSo &a) { PhanSo x;
do { printf("\nNhap tu va mau: ");
scanf("%d%d", &x.tu, &x.mau); fflushall( );
} while (x.mau == 0);
a = x;
if (a.mau < 0) { a.tu = - a.tu;
a.mau = - a.mau;
} }
Chú ý: Không dùng scanf để nhập giá trị thuộc tính của tham chiếu kiểu cấu trúc và con trỏ kiểu cấu
//Khai báo kiểu phân số
typedef struct{ int tu , mau; } PhanSo ;
void NhapPhanSo( PhanSo & );
PhanSo Tong( PhanSo , PhanSo );
void main()
{ PhanSo a, b, c;
NhapPhanSo( a );
NhapPhanSo( b );
c = Tong(a,b);
printf(“KQ=%d/%d”,c.tu, c.mau);
}
PhanSo Tong( PhanSo a, PhanSo b)
c.tu = a.tu*b.mau + b.tu*a.mau;
c.mau = a.mau*b.mau;
return c;
Trang 13Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và địa chỉ)
Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và địa chỉ)
void NhapPhanSo( PhanSo *a) { PhanSo x;
do { printf("\nNhap tu va mau: ");
scanf("%d%d", &x.tu, &x.mau); fflush(stdin);
} while (x.mau == 0);
*a = x;
if ( a->mau < 0) { a->tu = - a->tu ;
a->mau = - a->mau ; }
}
Chú ý: Thuộc tính của biến cấu trúc được truy xuất bằng biến con trỏ theo cú pháp:
pBiếnCT ->ThuộcTính
//Định nghĩa kiểu phân số
typedef struct{ int tu , mau; } PhanSo ;
void NhapPhanSo( PhanSo * );
PhanSo Tong( PhanSo , PhanSo );
void main()
{ PhanSo a, b, c;
NhapPhanSo( &a );
NhapPhanSo( &b );
c = Tong(a,b);
printf(“KQ=%d/%d”,c.tu, c.mau);
}
PhanSo Tong( PhanSo a, PhanSo b)
c.tu = a.tu*b.mau + b.tu*a.mau;
c.mau = a.mau*b.mau;
return c;
Trang 14V- Mảng cấu trúc:
V- Mảng cấu trúc:
nv[i] là 1 biến cấu trúc thuộc kiểu NhanVien.
Mảnh nv
nv[2]
nv[1]
nv[0] 9 Le Anh Tuan 12 3 1960 2.05
Nam Thang
Ngay
NgaySinh
HeSoLuong Ten
Ho MSNV
Trang 15Ví dụ: danh sách nhân viên
Ví dụ: danh sách nhân viên
void InDS(NhanVien A[], int N) { printf("%-4s %-30s %-10s %s",
“MSNV", "Ho Ten",
"Ngay sinh",“HSLg”);
for (int i = 0; i < N; i++) { printf("\n%4d %-20s %-9s
%.2d/%.2d/%4d %4.1f”, A[i].MSNV, A[i].Ho, A[i].Ten,
A[i].NgaySinh.Ngay, A[i].NgaySinh.Thang, A[i].NgaySinh.Nam, A[i].HeSoLuong);
puts(“”);
} } void main() { NhanVien NV[100];
NhapHoSo( NV, 5 );
void NhapHoso(NhanVien nv[],int N)
{ NhanVien a;
printf("\nNhap %d nhan vien :“, N);
for (int i=0; i < N; i++)
{ printf("Nhap nhan vien %d:“, i );
printf("Ma so: ");
scanf("%d", &a.MSNV ); flushall();
printf("Ho:"); gets(a Ho );
printf("Ten:"); scanf("%s", a.Ten );
printf("Ngay sinh:");
scanf(“%d”, &a.NgaySinh.Ngay );
printf("Thang sinh:");
scanf(“%d”, &a.NgaySinh.Thang );
printf("Nam sinh:");
scanf(“%d”, &a.NgaySinh.Nam );
printf("He so luong : ");
scanf(“%f”, &a.HeSoLuong );
nv[i] = a;