1. Trang chủ
  2. » Công Nghệ Thông Tin

Dữ liệu kiểu cấu trúc

8 373 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Dữ liệu kiểu cấu trúc
Định dạng
Số trang 8
Dung lượng 79,34 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

Ch−¬ng VII DỮ LIỆU 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;

khi khai báo biến ta sẽ không dùng từ khóa struct:

Trang 2

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 bits_2_to_5 : 4;

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ề

Trang 3

I.4 Con trỏ trỏ đến kiểu cấu trúc :

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 :

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 :

Chuyển từng phần tử của biến cấu trúc hoặc cả biến cấu trúc cho hàm :

Trang 4

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 ;

Trang 5

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

p++ ;

}

}

/* Ham sap xep*/

void sapxep ( int n, kieuHV lop[ ])

{ int i , j ; kieuHV tam ;

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

}

II Kiểu Union:

Cũng như cấu trúc, union gồm nhiều thành phần khác nhau, nhưng chúng khác nhau ở chỗ : các thành phần của cấu trúc chiếm các vùng nhớ khác nhau trong khi các thành phần của union được cấp phát chung một vùng nhớ Độ dài của union bằng độ dài của thành phần lớn nhất

Việc khai báo và truy xuất các thành phần của union cũng tương tự như struct

Sẽ là vô nghĩa nếu chúng ta khởi tạo cho tất cả các thành phần của biến union

Ta có thể khởi tạo : union u { char ch;

int x;

} a_union = {`H'};

Trang 6

Ví dụ :

#include <stdio.h>

#include <conio.h>

typedef union

{ int ax;

int ay;

} test;

void main()

{

test r;

r.ax=4660;

printf("\n r.ax=%d",r.ax);

printf("\n r.ay=%d",r.ay);

getch();

}

Kết quả là : ax=4660

ay=4660

Ví dụ:

#include <stdio.h>

#include <conio.h>

union u { char ch[2];

int num;

};

void main(void)

{ union u val;

val.ch[0] = 'A';

val.ch[1] = 'b';

printf("The two character constants held by the union:\n");

printf("%c\n", val.num & 0x00FF); A

}

Ví dụ :

#include <stdio.h>

#include <conio.h>

typedef union

{ unsigned int ax;

struct

{ unsigned char al;

unsigned char ah;

} byte;

} thanh_ghi;

void main()

Trang 7

{

thanh_ghi r;

r.ax=0x1234;

printf("\n r.ax=%x",r.ax);

printf("\n r.ah=%x",r.byte.ah);

printf("\n r.al=%x",r.byte.al);

getch();

}

Kết quả :

r.ax=1234

r.ah=12

r.al=34

Thực ra trong dos.h người ta đã định nghĩa kiểu dữ liệu union có tên REGS để phục vụ cho việc truy cập các thanh ghi của CPU trong việc gọi ngắt trong C

struct BYTEREGS {

unsigned char al, ah, bl, bh;

unsigned char cl, ch, dl, dh;

};

struct WORDREGS {

unsigned int ax, bx, cx, dx;

unsigned int si, di, cflag, flags;

};

union REGS {

struct WORDREGS x;

struct BYTEREGS h;

};

Ví dụ: typedef struct

{ char type;

union { char ch;

int i;

float f;

}v;

} solieu;

Dựa vào thành phần type mà ta biết được cần xử lý số liệu theo kiểu số nào Cách làm này ít tốn bộ nhớ

Người ta còn dùng union để trích xuất các bit trong byte,word

Trang 8

III Bài tập :

1 Xây dựng mảng cấu trúc mà mỗi cấu trúc (ứng với mỗi sinh viên) gồm các trường sau :

- Họ và tên

- Tuổi

- Lớp

- Điểm thi

trong đó điểm thi là một cấu trúc gồm ba trường : toán, lý, hóa

Nhập số liệu của 10 thí sinh, hiển thị các thí sinh có điểm trung bình lớn hơn 5 theo thứ tự tăng dần của tổng số điểm

Nhập vào tên cần tìm, nếu có nhiều học viên có cùng tên cần tìm thì in ra người đầu tiên và người cuối cùng

2 Viết chương trình cộng, trừ, nhân, chia các số phức

3 Nhập vào toạ độ 4 điểm A,B,C,D Kiểm tra xem điểm D có nằm trong tam giác ABC không, 2 đoạn thẳng AC và BD có cắt nhau không

Ngày đăng: 02/10/2013, 20:20

TỪ KHÓA LIÊN QUAN

w