Chuong1_OnTapC_DLCoCauTruc

Download Report

Transcript Chuong1_OnTapC_DLCoCauTruc

Trường Đại Học Bách Khoa Hà Nội
Viện: Điện Tử - Viễn Thông
Bộ Môn: Điện tử - Kỹ thuật máy tính
Ngôn ngữ lập trình C/C++
Chương 1: Ôn tập ngôn ngữ C
Các kiểu dữ liệu có cấu trúc
1
Các kiểu dữ liệu có cấu trúc
Kiểu liệt kê: enum
Kiểu bản ghi: struct
Kiểu hợp: union
Kiểu bản ghi có trường ở mức bit: bit field struct




2
Kiểu enum
Ý nghĩa: là kiểu dữ liệu mà miền giá trị của nó là một
số giá trị mà ta muốn và có thể liệt kê ra.

VD: các giá trị logic (true, false), các ngày trong một tuần, các
mức tính thuế thu nhập,v.v
Các thao tác cơ bản:




3
Định nghĩa: tạo ra một kiểu dữ liệu mới trước khi khai báo
sử dụng
Khai báo: khai báo các biến kiểu enum đã được định nghĩa ở
trên
Gán giá trị: cập nhật giá trị cho biến kiểu enum
Kiểu enum – Định nghĩa
Cách định nghĩa: Kiểu liệt kê được định nghĩa với từ
khóa enum, và có hai cách có thể được dùng để định
nghĩa:



4
Cách 1: không cần dùng từ khóa typedef và
Cách 2: có sử dụng từ khóa typedef này.
Kiểu enum – Định nghĩa
Cách 1: không dùng từ khóa typedef.
enum tên_kiểu {phần_tử_1, phần_tử_2, …, phần_tử_N};

VD:
enum ngayTrongTuan {ThuHai, ThuBa, ThuTu, ThuNam,
ThuSau, ThuBay, ChuNhat};
enum gioitinh {Nam, Nu};
5
Kiểu enum – Định nghĩa
Cách 2: sử dụng từ khóa typedef.
typedef enum { phần_tử_1, phần_tử_2, …,
phần_tử_N } tên_kiểu ;

VD:
typedef enum {True, False} boolean;
6
Kiểu enum – Khai báo
Khai báo biến kiểu enum tương tự như cách khai báo các
biến thông thường:
Cú pháp:


tên_kiểu v;
tên_kiểu v1,v2;
VD:
ngayTrongTuan d1, d2; //Khai báo 2 biến
enum gioitinh gt = Nam; //Khai báo và khởi tạo giá trị
7
Kiểu enum – Khai báo
Ngoài ra, các biến có thể được khai báo ngay khi định
nghĩa kiểu với cách định nghĩa không sử dụng từ khóa
typedef
 Cú pháp:
enum [tên_kiểu] {phần_tử_1, phần_tử_2, …,
phần_tử_N} biến1, biến2;
VD:

enum ngayTrongTuan {ThuHai, ThuBa, ThuTu, ThuNam,
ThuSau, ThuBay, ChuNhat} d; //vừa định nghĩa kiểu, vừa khai
báo biến
enum gioitinh {Nam, Nu} gt; //khai báo biến ngầm định kiểu
8
Kiểu enum – Gán giá trị
Bản chất giá trị liệt kê của kiểu enum là các hằng số
nguyên, với phần tử liệt kê đầu tiên có giá trị là 0, phần tử
thứ hai có giá trị là 1, v.v
 Các giá trị này có thể được đặt tường minh khi định nghĩa
hay khai báo.
VD:

typedef enum {True=1, False=0} boolean;
enum Colors {BLUE=1,RED=3,GREEN=2} c;
9
Ví dụ

Viết một chương trình nhập một giá trị nguyên biểu một
trong các ngày trong một tuần. Chương trình sẽ kiểm tra
giá trị đó để in ra ngày tương ứng. Việc làm trên sẽ lặp lại
cho đến khi giá trị nhập vào là -1 thì kết thúc chương
trình.
10
Ví dụ
#include <stdio.h>
case wednesday:
printf("Hom nay la thu tu\n");break;
#include <conio.h>
case thursday:
main(){
printf("Hom nay la thu nam\n");break;
enum day {monday, tuesday, wednesday,
case friday:
thursday, friday, saturday, sunday};
printf("Hom nay la thu sau\n");break;
enum day d;
case saturday:
do {
printf("Hom nay la thu bay\n");break;
printf("Nhap ngay hom nay:(nhap -1 de thoat)");
case sunday:
scanf("%d",&d);
printf("Hom nay la chu nhat\n");break;
switch (d) {
default:
case monday:
if (d !=-1) printf("Du lieu khong hop
le\n");
printf("Hom nay la thu hai\n");break;
}
case tuesday:
} while (d != -1);
printf("Hom nay la thu ba\n");break;
getch();
}// end main
11
Kiểu struct


Ý nghĩa: là cấu trúc cho phép bên trong chứa các
trường dữ liệu mà có kiểu dữ liệu có thể khác nhau
Các thao tác cơ bản:




12
Định nghĩa
Khai báo biến
Truy nhập vào các trường
Gán giá trị
Kiểu struct – Định nghĩa

Có hai cách để định nghĩa kiểu struct:


13
Cách 1: không sử dụng từ khóa typedef
Cách 2: sử dụng từ khóa typedef
Kiểu struct – Định nghĩa
Cách 1: không sử dụng từ
khóa typedef
struct tên_kiểu {
Khai báo các trường;
};
VD:
struct ngaysinh {
int ngay;
int thang;
int nam;
};
14
struct nguoi {
char ten[30];
int tuoi;
char gioitinh; // ‘M’ cho
nam, ‘F’ cho nữ
struct ngaysinh sinhngay;
};
Kiểu struct – Định nghĩa
Cách 2: sử dụng từ khóa typedef
typedef struct {
Khai báo các trường;
} tên_kiểu ;
VD:
typedef struct {
char sohieu[30] ;
char chuyennganh;
int soluong;
} lophoc ;
15
Kiểu struct – Khai báo
Tương tự kiểu enum, việc khai báo biến kiểu struct
cũng có thể theo 1 trong 2 cách:

Cách 1: khai báo sau khi định nghĩa kiểu struct

Cách 2: kết hợp khai báo và định nghĩa kiểu
16
Kiểu struct – Khai báo
Cách 1:
[struct] tên_kiểu v;
[struct] tên_kiểu v1,v2;
lophoc lh1, lh2;
struct ngaysinh ns;
Cách 2:
struct tên_kiểu {
Khai báo các trường;
} v1, v2;
17
struct ngaysinh {
int ngay;
int thang;
int nam;
} ns1, ns2;
Truy nhập vào các trường

Có 2 cách truy nhập:


Cách 1: dùng biến thông
thường, sử dụng cú pháp
“tên_biến.tên_trường”
Cách 2: dùng biến con
trỏ, sử dụng cú pháp
“tên_biến->tên_trường”
typedef struct {
char sohieu[30] ;
char chuyennganh;
int soluong;
} lophoc ;
lophoc lh;
lophoc * p = & lh;
scanf(“%s”, lh.sohieu);
scanf(“%c”, &p->chuyennganh);
scanf(“%d”, &p->soluong);
18
Kiểu struct - Gán giá trị

Hai biến cùng một kiểu struct có thể được gán cho nhau.
Việc gán này sẽ cho thay cho việc gán lần lượt tất cả các
trường của hai biến này cho nhau.
VD:
lophoc lh1, lh2;
lh1=lh2;
19
lh1.sohieu = lh2.sohieu;
lh1.chuyennganh= lh2.chuyennganh;
lh1.soluong = lh2.soluong;
Ví dụ

Viết chương trình quản lý một danh sách nhân
viên với các chức năng:


20
Nhập vào một danh sách N nhân viên (N là hằng số cho
trước)
In ra nội dung danh sách đó
Ví dụ:
#include <stdio.h>
#define N 3
int main(){
struct person {
char name[30];
int age;
char sex; //'M' for male
//and 'F' for female
} ; //end struct
struct person pList[N];
int i;
printf("Nhap danh sach nhan vien\n");
for (i=0;i<N;i++) {
printf("Nhan vien thu %d\n",i+1);
21
printf("Ten:");
scanf("%s",pList[i].name);
printf("Tuoi:");
scanf("%d",&pList[i].age);
printf("Gioi tinh (M hoac F):");
scanf("%c",&pList[i].sex);
} //end for
//In danh sách ra màn hình
printf("Ho ten Tuoi Gioi tinh\n");
for (i=0;i<N;i++){
printf("%s%d",pList[i].name,
pList[i].age);
if (pList[i].sex=='M')
printf("Nam\n");
else printf("Nu\n");
} //end for
} //end main
Các cấu trúc tiết kiệm kích thước
lưu trữ


Cấu trúc union: về ý nghĩa sử dụng thì tương tự như cấu
trúc struct. Tuy nhiên, ở mỗi thời điểm trong chương trình
thì chỉ dùng đến một trường trong số tất cả các trường, vì
kích thước lưu trữ chỉ đủ để lưu trữ cho một trường
Cấu trúc bit field: chính là cấu trúc struct, nhưng các
trường có thể khai báo kích thước lưu trữ đến mức bit (1
hoặc nhiều bit).
22
Tóm tắt
Các kiểu dữ liệu có cấu trúc trong C




enum
struct
union
bit field
Cảm ơn!
23
Bài tập

Bài 1: Viết chương trình giải một phương trình bậc 2,
với các thông số của phương trình (gồm các hệ số, số
nghiệm và giá trị mỗi nghiệm) được đưa vào trong cấu
trúc struct. Yêu cầu chương trình:



Nhập ba hệ số a,b,c từ bàn phím (với a ≠ 0)
In ra màn hình số nghiệm và giá trị mỗi nghiệm
Bài 2: Mở rộng bài 1 thêm khả năng kiểm tra sự hợp
lệ của dữ liệu nhập vào (với a phải ≠ 0), và cho phép
giải nhiều PTB 2.
24
Bài tập

Bài 3: Viết chương trình xây dựng kiểu số phức dùng
cấu trúc struct, và cho phép thực hiện các thao tác cơ
bản +,-,*,/ hai số phức. Yêu cầu chương trình:



Nhập 2 số phức a và b từ bàn phím
In ra nội dung của a và b, đồng thời a+b,a-b,a*b và a/b.
Bài 4: Viết chương trình tính tổng một dãy N số phức
có giá trị được nhập từ bàn phím.
25