Tải bản đầy đủ

Chuong 7 struct full pascal

NGÔN NGỮ C

Chươ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


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...
2

Mã hóa


II-Định nghiã kiểu cấu trúc:
Mẫu 1
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
typedef struct
{
Kiểu Thuộctính_1;
Kiểu Thuộctính_2;
............
Kiểu Thuộctính_n;
} Tên_Kiểu;

3

Mã hóa


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
struct Date
{

typedef struct
{

unsigned char Ngay, Thang ;

unsigned char Ngay, Thang ;

int Nam ;

int Nam ;

};

} Date;

Date
Ngay

Thang

unsigned char unsigned char

4

Nam
int

Mã hóa


Ví dụ: Định nghiã kiểu cấu trúc
lưu trữ thông tin nhân viên
struct NhanVien
{
int MSNV;
char Ho[20], Ten[8];
struct Date NgaySinh;
float HeSoLuong;
};

typedef struct
{
int MSNV;
char Ho[20], Ten[8];
Date NgaySinh;
float HeSoLuong;
} NhanVien;

NhanVien
MSNV

Ho

Ten

int

char[20]

char[8]

NgaySinh
Ngay

Thang

Nam

uc

uc

int

5

HeSoLuong
float

Mã hóa


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,...};
Ví dụ:

Date ngaysinh = {12, 5, 1999};

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
ngaysinh
ngaysinh.Ngay ngaysinh.Thang ngaysinh.Nam
12
5
1999
Vĩ dụ: NhanVien nv = {9, “Le Anh”, ”Tuan”, {12,3,1960}, 2.05};

nv.MSNV

nv.Ho

nv.Ten

9

Le Anh

Tuan

nv
nv.NgaySinh
.Ngay .Thang .Nam
12

3
6

1960

nv.HeSoLuong
2.05
Mã hóa


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);
printf(“\nNgay sinh: %d/%d/%d”, nv.NgaySinh.Ngay, nv.NgaySinh.Thang,
nv.NgaySinh.Nam);
printf("\nHe so luong : %f ", nv.HeSoLuong);

nv.MSNV

nv.Ho

nv.Ten

9

Le Anh

Tuan

nv
nv.NgaySinh
.Ngay
.Thang
.Nam
12

3

7

1960

nv.HeSoLuong
2.05

Mã hóa


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("Ho : ");

gets(nv.Ho);

printf("Ten : ");

scanf("%s", nv.Ten);

printf("Ngay sinh:");

scanf(“%d”, &nv.NgaySinh.Ngay);

printf("Thang sinh:");

scanf(“%d”, &nv.NgaySinh.Thang);

printf("Nam sinh:");

scanf(“%d”, &nv.NgaySinh.Nam);

printf("He so luong : ");

scanf(“%f”, &nv.HeSoLuong);

nv.MSNV

nv.Ho

nv.Ten

9

Le Anh

Tuan

nv
nv.NgaySinh
.Ngay .Thang
.Nam
12

3
8

1960

nv.HeSoLuong
2.05
Mã hóa


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: ");

A

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);

B

getch();

M

}

9

x

y

1

0

x

y

3

6

x

y

2

3
Mã hóa


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:
Ví dụ: NhanVien nv1 = {9, “Le Anh”, ”Tuan”, {12,3,1960}, 2.05};
NhanVien nv2;
nv2 = nv1;

nv1

nv2

MSNV

Ho

Ten

9

Le Anh

Tuan

MSNV

Ho

Ten

9

Le Anh

Tuan

NgaySinh
Ngay
Thang
Nam
12

3

1960

NgaySinh
Ngay
Thang
Nam
12
10

3

1960

HeSoLuong
2.05

HeSoLuong
2.05
Mã hóa


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
return BiếnCấuTrúc;

Truyền Biến cấu trúc

Hàm A
11

Mã hóa


Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và tham chiếu)
//Khai báo kiểu phân số
typedef struct{ int tu, mau;} PhanSo;

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;
}
}

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)
{ PhanSo c;
c.tu = a.tu*b.mau + b.tu*a.mau;
c.mau = a.mau*b.mau;
return c;
}

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
trúc
12

Mã hóa


Ví dụ: Chương trình tính tổng 2 phân số
(Truyền trị và địa chỉ)
//Định nghĩa kiểu phân số
typedef struct{ int tu, mau;} PhanSo;

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;
}
}

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)
{ PhanSo c;
c.tu = a.tu*b.mau + b.tu*a.mau;
c.mau = a.mau*b.mau;
return c;
}

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
(*pBiếnCT).ThuộcTính
13

Mã hóa


V- Mảng cấu trúc:


Dùng quản lý danh sách đối tượng cùng kiểu cấu trúc



Khai báo:

KiểuCấuTrúc TênMảng[Sốphầntử];

Ví dụ:

NhanVien nv[100];

nv[i] là 1 biến cấu trúc thuộc kiểu NhanVien.

nv[0]

MSNV

Ho

9

Le Anh

Mảnh nv
NgaySinh
Ten
Ngay
Thang
Nam
Tuan

12

3

1960

HeSoLuong
2.05

nv[1]
nv[2]

14

Mã hóa


Ví dụ: danh sách nhân viên
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;
}
}

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 );
InDS( NV, 5);
}
15

Mã hóa



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×