Ch−¬ng VII DỮ LIỆU KIỂU CẤU TRÚC I Kiểu cấu trúc:

Một phần của tài liệu Lập trình C (Trang 86 - 90)

VI. Các lệnh rẽ nhánh không điều kiện: break, continue, goto:

Ch−¬ng VII DỮ LIỆU KIỂU CẤU TRÚC I Kiểu cấu trúc:

I. Kiểu cấu trúc:

I.1. Khai báo và khởi tạo kiểu biến cấu trúc :

Mảng là tập hợp gồm các phần tử có cùng kiểu. Khi ta muốn tạo kiểu dữ liệu mà các phần tử của chúng có kiểu khác nhau nhưng có sự liên kết với nhau, ta sử dụng kiểu struct.

Mẫu : struct tên_kiểu_cấu_trúc

{ khai báo các thành phần (các trường) }; Ví dụ : struct khach { char ten[20]; char diachi[100]; int tuoi; int dienthoai; };

Ta có một kiểu mới là kiểu khach gồm các trường ten, diachi, tuoi và dienthoai. Khai báo và khởi tạo biến :

struct khach khach_thu_1 = {“Nguyen Van A”,”Da Nang”,20,888888}; Ta cũng có thể khai báo biến cùng lúc với kiểu như sau:

struct khach { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach_thu_1, khach_thu_2;

Ta có thể khai báo biến không khai báo kiểu: struct { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach_thu_1, khach_thu_2; Khai báo kiểu dùng typedef:

typedef struct { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach;

khach khach_thu_1, khach_thu_2; Định nghĩa kiểu cấu trúc lồng nhau: Ví dụ : struct ngay { int ngaythu; int thang; int nam; }; struct nhansu { char hoten[20]; struct ngay ngaysinh; int gioitinh;

float hsluong; }nguoi1;

I.2. Truy cập đến các phần tử của một biến kiểu cấu trúc :

Mẫu : tên_biến.tên_phần_tử

Ví dụ : strcpy(khach_thu_1.ten,”Tran Van B”); khach_thu_1.tuoi=40;

printf(“Tuoi cua %s la %d”, khach_thu_1.ten, khach_thu_1.tuoi); Ta có thể gán biến cấu trúc này cho biến cấu trúc khác có cùng kiểu :

khach_thu_2= khach_thu_1;

Ta có thể khởi tạo biến cấu trúc từ lúc khai báo như khởi tạo mảng: khach khach_1={“John”,”17 Le Duan, Da Nang”,40,876543}; Với các cấu trúc lồng nhau ta cũng truy cập tương tự.

Ví dụ : nguoi1.ngaysinh.nam

Ta có thể sử dụng phép toán lấy địa chỉ đối với thành phần cấu trúc Ví dụ : scanf(“%d”,&khach_thu_1.tuoi);

Với thành phần cấu trúc không nguyên, ta nhập thông qua biến trung gian.

I.3. Thành phần kiểu field:

Khi ta muốn có được các thành phần nguyên giá trị nhỏ, tiết kiệm bộ nhớ thì ta dùng kiểu field. Các phần tử được định nghĩa đưới dạng các bit có dấu hoặc không dấu. Độ dài của mỗi trường không vượt quá 16 bit.

struct bit_field { int bit_1 : 1; int bits_2_to_5 : 4; int bit_6 : 1; int bits_7_to_16 : 10; } bit_var;

Ta không thể lấy địa chỉ thành phần kiểu field, không thể xây dựng mảng kiểu field và thành phần kiểu field không thể làm giá trị trả về.

I.4. Con trỏ trỏ đến kiểu cấu trúc : typedef struct typedef struct { int x; int y; }diem; diem diem1,diem2; diem *pointer=&diem1;

Ta dùng con trỏ để truy cập đến các phần tử của cấu trúc : tên_con_trỏ->tên_thành_phần

hoặc (*tên_con_trỏ).tên_thành_phần toán tử -> gọi là toán tử trỏ tới

Ví dụ : pointer->x=5; tương đương với diem1.x (*pointer).y=6; tương đương với diem1.y

Tương tự như con trỏ biến thường, phép toán số học đối với con trỏ cấu trúc cũng hoạt động tương tự.

I.5. Mảng cấu trúc : (adsbygoogle = window.adsbygoogle || []).push({});

Ta khai báo tọa độ bằng cấu trúc : typedef struct

{ int x; int y; }diem;

diem diem1,diem2;

Để lưu trữ tọa độ của 20 điểm ta dùng mảng : diem taphop[20]= { {2,3},

{3,4} };

Cũng như mảng khác, mảng cấu trúc cũng được đánh số thứ tự từ 0. Để truy cập vào các phần tử của mảng :

taphop[3].x=4; taphop[3].y=6;

Cũng như các biến cấu trúc, ta có thể gán các phần tử của mảng cho nhau và cho các biến cấu trúc đơn.

Chú ý : thường không được sử dụng phép toán lấy địa chỉ đối với các thành phần của mảng cấu trúc.

Để cấp phát bộ nhớ hiệu quả, ta dùng hàm malloc: diem *d;

int sodiem;

d=(diem *)malloc(sodiem*sizeof(diem));

I.6. Cấu trúc và hàm :

ham1(diem1.x); ham2(diem1.y);

Ta có thể chuyển địa chỉ của từng phần tử cho hàm. ham1(&diem1.x); ham2(&diem1.y); Ví dụ : struct diem { int x; int y; } ;

void ham(struct diem d) {

printf("\nd.x=%4d\nd.y=%4d",d.x,d.y); }

void main() {

struct diem diem1; diem1.x=2;diem1.y=4; ham(diem1);

}

Để thay đổi giá trị của cấu trúc ta truyền con trỏ cấu trúc. Giá trị trả về của hàm có thể là cấu trúc hoặc con trỏ cấu trúc. Ví dụ: #include <stdio.h> #include <conio.h> #include <alloc.h> typedef struct { char ten[30] ; int diem ; char kq[5] ; } kieuHV;

kieuHV *lop , *p , tam ; /* Ham nhap danh sach */

void nhapds ( int n , kieuHV lop[ ]) { int i , diem ;

p = lop ;

for ( i = 0 ; i < n ; i++)

{ printf("\nNhap Ho ten nguoi thu %d : " , i + 1 ) ; gets ( p->ten); printf ( " diem = " ) ; scanf ( "%d" , &diem ) ; p->diem = diem ;

printf ("%c", getchar()); /* khu stdin */ p++ ;

} }

/* Ham sap xep*/

void sapxep ( int n, kieuHV lop[ ]) { int i , j ; kieuHV tam ; (adsbygoogle = window.adsbygoogle || []).push({});

for ( i = 0 ; i < n-1 ; i++) for ( j=i + 1 ; j< n ; j++)

if ( lop[i].diem < lop[j].diem )

{ tam = lop[i] ; lop[i] = lop [j] ; lop [j] = tam ; } }

/* ham in danh sach */

void inds( int n, kieuHV lop[] ) { int i ;

for ( i = 0 ; i < n ; i++ )

{ printf ("%20s%5d ", lop[i].ten,lop[i].diem ); printf ("\n") ; /* xuong hang */

} }

/* chuong trinh chinh */ void main ( )

{ int i , j, n , t, diem ;

printf ("\n Nhap si so : ") ; scanf ( "%d", &n); lop = (kieuHV*)malloc ( n * sizeof ( kieuHV) ) ; printf ("%c", getchar ());

nhapds(n, lop ) ; sapxep ( n, lop ) ; inds ( n, lop ); getch ( );

}

Một phần của tài liệu Lập trình C (Trang 86 - 90)