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.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 ;
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;
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 printf("%c\n", val.num >> 8); b } 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()
{ 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ớ.
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.