Kiáu bÁn ghi (struct)

Một phần của tài liệu Bài giảng kỹ thuật lập trình c (Trang 59 - 66)

BÁng 4.2 Mát số hàm vß xâu

4.5. Kiáu bÁn ghi (struct)

- Khái niám: CÃu trúc là mát kiáu dā liáu kiáu bÁn ghi(record) , cho phép nhißu lo¿i dā

liáu đ°ÿc nhóm l¿i vãi nhau. (Khái niám cÃu trúc trong C t°¢ng tự nh° Pascal hay Foxpro).

4.5.1. Khai báo kiáu cÃu trúc

struct tên_kiáu _cÃu_trúc

{ Khai báo các thành phÅn của cÃu trúc };

Trong đó :

 tên_kiáu _cÃu_trúc là mát tên bÃt kỳ do ng°åi lập trình tự đặt theo qui tắc đặt tên. Thành phÅn của cÃu trúc có thá là : biến, mÁng, cÃu trúc khác đã đ°ÿc đßnh nghĩa tr°ãc đó vv..

Ví dā 1:

Đo¿n ch°¢ng trình :

struct ngay { int ngaythu; char thang[12]; int nam; };

mơ tÁ mát kiáu cÃu trúc có tên là ngay gồm có ba thành phÅn : Biến nguyên ngaythu,

mÁng thang, và biến nguyên nam.

Ví dā 2:

struct nhancong { char ten[15];

char diachi[20]

double bacluong;

struc ngay ngaysinh;

struc ngay ngaybatdaucongtac;

};

t¿o ra kiáu cÃu trúc có tên là nhancong gồm có năm thành phÅn. Ba thành phÅn đÅu khơng có gì cÅn nói thêm. Chỉ có hai thành phÅn còn l¿i là các cÃu trúc ngaysinh

ngaybatdaucongtac đ°ÿc xây dựng theo cÃu trúc ngay đ°ÿc đßnh nghĩa trong ví dā 1.

Đánh nghĩa cÃu trúc bằng typedef :

Có thá dùng tốn tÿ typedef đá đßnh nghĩa các kiáu cÃu trúc ngay nhancong ỗ trờn

nh° sau : typedef struct { int ngaythu; char thang[12]; int nam; } Date; typedef struct { char ten[15];

char diachi[20] double bacluong; Date ngaysinh; Date ngaybatdaucongtac; } nhancong; 4.5.2. Truy nhÁp đÁn các thành phần cÃu trúc :

Viác xÿ lý mát cÃu trúc bao giå cũng phÁi đ°ÿc thực hián thông qua các thành phÅn của nó. Đá truy cập đến mát thành phÅn c¢ bÁn (là biến hoặc mÁng) của mát cÃu trúc ta sÿ dāng mát trong các cách viết sau: tên_biÁn_cÃu_trúc.tên_thành_phần

Ví dā:

nhancong x, a[100]; //biến x và mÁng a là các biến có kiáu cÃu trúc nhancong

x.ten //truy cập đến thành phÅn ten của biến cÃu trúc x

x.bacluong // truy cập đến thành phÅn bacluong của biến cÃu trúc x &

a[i].ten // truy cập đến thành phÅn ten của biến cÃu trúc a[i]

a[i].ngaysinh.ngaythu // truy cập đến thành phÅn ngaythu của thành phÅn ngaysinh của a[i]

&

VáibiÁn cÃu trúc là con trß thì ta viết

Tên_con_trỏ->Tên_thành_phÅn hoặc (*Tên_con_trỏ).Tên_thành_phÅn

Ví dā:

nhancong *p; //biến p là biến con trỏ có kiáu cÃu trúc nhancong p->ten //truy cập đến thành phÅn ten của biến cÃu trúc p

p->bacluong // truy cập đến thành phÅn bacluong của biến cÃu trúc p

hoặc

(*p).ten //truy cập đến thành phÅn ten của biến cÃu trúc p

(*p).bacluong // truy cập đến thành phÅn bacluong của biến cÃu trúc p

Thông tin của sinh viên gồm: tên (xâu ký tự), mã số (số nguyên), điám mơn Tốn (số thực), điám mơn tin đ¿i c°¢ng(số thực), điám mơn tiếng Anh (số thực). Viết ch°¢ng trình thực hián các cơng viác sau:

- Khai báo cÃu trúc mô tÁ thông tin trên - Nhập n sinh viên, n <50

- Hián thß danh sách đó.

- Tìm các sinh viên có điám trung bình thỏa mãn mát tiêu chuẩn nào đó (ví dā điám trung bình >=7.0, điám trung bình là tổng điám 3 mơn chia 3)

- Sắp xếp danh sách sv theo mã sinh viên #include<stdio.h>

#include<string.h> typedef struct{

char hten[30]; int masv;

float dToan, dTin, dAnh; }SV; //khai báo cÃu trúc SV

void nhap(SV *a)//nhập thông tin cho 1 sv {

printf("Nhap ho ten: "); fflush(stdin); gets(a->hten); printf("Nhap ma sinh vien: "); scanf("%d", &(a->masv)); printf("Nhap diem toan: "); scanf("%f", &(a->dToan)); printf("Nhap diem tin: "); scanf("%f", &(a->dTin));

printf("Nhap diem tieng Anh: "); scanf("%f", &(a->dToan)); }

float dtb(SV a) { return (a.dToan+a.dTin+a.dAnh)/3; }//tính điám trung bình cho 1 sv void nhap_ds(SV a[], int *n)//nhập 1 danh sách n sv

{ int i; float t;

printf("Nhap so sinh vien: ") ; scanf("%d", n);

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

printf("\nNhap cho sv thu: %d\n", i+1); nhap(&a[i]);

} }

void hthi(SV a)//hián thß thơng tin của 1 sv {

printf("\nHo ten: %10s; Ma sv: %5d; Diem Toan: %6.2f; Diem Tin: %6.2f ; Diem Anh: %6.2f", a.hten, a.masv, a.dToan, a.dTin, a.dAnh);

printf("; Diem trung binh: %6.2f ", dtb(a)); }

void hthi_ds(SV a[], int n)//hián thß tồn bá danh sách n sinh viên {

int i;

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

printf("\nThong tin cua SV %d\n", i+1); hthi(a[i]);

} }

void liet_ke(SV a[], int n)//liát kê các sinh viên điám trung bình >=7.0 {

int i;

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

if(dtb(a[i]>=7.0) {

printf("\nThong tin cua SV %d\n", i+1); hthi(a[i]);

} }

void sxep(SV a[], int n)//sắp xếp danh sách sinh viên theo mã {

int i, j; SV tam;

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

if(a[i].masv>a[j].masv){ tam=a[i];

a[i]=a[j]; a[j]=tam;

} }

int main(){ SV a[100]; int n;

nhap_ds(a, &n); //gái hàm nhập danh sách printf("\nDanh sach ban dau\n");

hthi_ds(a, n);

printf("\nDanh sach da dc sap xep\n"); sx_doi_cho(a, n); hthi_ds(a, n); printf("\nDanh sach sv co dtb>=7.0\n"); liet_ke(a, n); return 0; } Bài tÁp

1. Đếm số lÅn xuÃt hián của các số nguyên d°¢ng trong mÁng 1chißu hoặc 2 chißu. 2. Tính tổng tẩt cÁ các phÅn tÿ không âm trong mÁng.

3. Nhập vào mát chi ký tự

a) Chun tồn bá các chā cái hoa vß chā th°ång và ng°ÿc l¿i

b) Cắt các dÃu cách thừa giāa các từ sao cho đÅu và cuối chi khơng có dÃu cách, giāa hai từ chỉ có mát dÃu cách

c) Chun chi há tên vß d¿ng tên riêng. Ví dā: NgueyN AnH vAn chuyán thành

Nguyen Anh Van.

4. Thông tin của công nhân gồm: há tên (xâu ký tự), năm sinh (số ngun), l°¢ng (số thực). Viết ch°¢ng trình thực hián các công viác sau:

- Khai báo cÃu trúc mô tÁ thông tin trên - Nhập n công nhân, n <50

- Hián thß danh sách các cơng nhân có l°¢ng >5 triáu - Sắp xếp danh sách cơng nhân tăng dÅn theo l°¢ng. 5. In ra các số nguyên tố trong mÁng gồm n số nguyên. 6. Tìm số lãn nhÃt trong mÁng các số thực có n phÅn tÿ.

7. Nhập vào mát mÁng các số nguyên. Chuyán các số lẻ lên đÅu, các số chẵn xuống cuối mÁng. In kết q ra màn hình. Ví dā: đÅu vào là 2, 13, 15, 22, 16, 18, 3. Kết quÁ là 13,

Một phần của tài liệu Bài giảng kỹ thuật lập trình c (Trang 59 - 66)