Giáo trình lập trình nâng cao
Chia sẻ bởi Vi Văn Thoài |
Ngày 10/05/2019 |
51
Chia sẻ tài liệu: giáo trình lập trình nâng cao thuộc Tin học 11
Nội dung tài liệu:
Chương 1: Kiểu dữ liệu cấu trúc Struct
1. Khái niệm
Cấu trúc là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần này được truy cập thông qua tên.
1
Chương 1: Kiểu dữ liệu cấu trúc Struct
2. Khai báo kiểu cấu trúc Khi xây dựng cấu trúc, ta cần mô tả kiểu của nó. Công việc định nghĩa một kiểu cấu trúc bao gồm việc nêu ra tên của kiểu cấu trúc và các thành phần của nó theo mẫu sau :
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 đó : struct là từ khoá
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 nêu ra trong chương 1.
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..
2
Chương 1: Kiểu dữ liệu cấu trúc Struct
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.
3
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2: 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 là tên, địa chỉ, bậc lương còn hai thành phần sau là các cấu trúc ngaysinh và ngaybatdaucongtac được xây dựng theo cấu trúc ngay được định nghĩa trong vd 1.
4
Chương 1: Kiểu dữ liệu cấu trúc Struct
Định nghĩa cấu trúc bằng typedef :
Có thể dùng toán tử typedef để định nghĩa các kiểu cấu trúc ngay ở trên như sau :
typedef struct
{
int ngaythu;
char thang[12];
int nam;
} ngay;
5
Chương 1: Kiểu dữ liệu cấu trúc Struct
typedef struct
{
char ten[15];
char diachi[20]
double bacluong;
struc ngay ngaysinh;
struc ngay ngaybatdaucongtac;
} nhancong;
6
Chương 1: Kiểu dữ liệu cấu trúc Struct
3. Khai báo biến cấu trúc
Cách 1 : struct tên_kiểu_cấu_trúc_đã_khai_báo danh_sách_tên_các_cấu_trúc;
Ví dụ 1: struct ngay ngaydi,ngayden;
Cách 2 : struct tên_kiểu_cấu_trúc
{
Các thành phần của cấu trúc
} danh_sách_tên_các_cấu_trúc;
7
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 1 :
struct nhancong
{ char ten[15];
char diachi[20];
double bacluong;
struc ngay ngaysinh;
struc ngay ngaybatdaucongtac;
} nhom1,nhom2;
8
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2 :
struct ngay
{
int ngaythu;
char thang[12];
int nam;
} ngaydi,ngayden;
9
Chương 1: Kiểu dữ liệu cấu trúc Struct
Cách 3: struct
{
Các thành phần của cấu trúc
} danh_sách_tên_các_cấu_trúc;
Ví dụ : struct
{
int ngaythu;
char thang[12];
int nam;
} ngaydi,ngayden;
10
Chương 1: Kiểu dữ liệu cấu trúc Struct
Chú ý :
Nếu dùng từ khoá typedef để định nghĩa kiểu cấu trúc như trong mục thì khi khai báo các cấu trúc mới ta không cần dùng từ khoá struct, chỉ cần dùng tên kiểu.
Ví dụ như kiểu cấu trúc ngay được khai báo bằng typedef trong phần trước thì khi khai báo các cấu trúc mới là ngaydi và ngayden có cùng kiểu ngay ta dùng dòng lệnh sau :
ngay ngaydi,ngayden;
11
Chương 1: Kiểu dữ liệu cấu trúc Struct
4. Truy nhập đến các thành phần cấu trúc :
Để 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_cấu_trúc.tên_thành_phần
tên_cấu_trúc.tên_cấu_trúc.tên_thành_phần
Ví dụ : Ta xét phép toán trên các thành phần của cấu trúc nhom1, nhom2 :
Câu lệnh : printf("%s",nhom1.ten);
sẽ đưa lên màn hình tên của nhom1.
12
Chương 1: Kiểu dữ liệu cấu trúc Struct
Câu lệnh :
tongluong=nhom1.bacluong+nhom2.bacluong;
sẽ gán tổng lương của nhom1 và nhom2 rồi gán cho biến tongluong.
Câu lệnh : printf("%d",nhom1.ngaysinh.ten);
sẽ đưa lên màn hình ngày sinh của nhom1.
Câu lệnh : printf("%d",nhom1. ngaybatdaucongtac.nam);
sẽ đưa lên màn hình ngày bắt đầu công tác của nhom1.
13
Chương 1: Kiểu dữ liệu cấu trúc Struct
Chú ý : Có thể sử dụng phép toán lấy địa chỉ đối với các thành phần cấu trúc để nhập số liệu trực tiếp vào các thành phần cấu trúc.
Ví dụ : scanf("%d",&nhom1.ngaybatdaucongtac.nam);
Nhập số liệu vào một biến trung gian sau đó mới gán cho thành phần của cấu trúc.
Ví dụ : int year;
scanf("%d",&year);
nhom1. ngaybatdaucongtac.nam=year;
14
Chương 1: Kiểu dữ liệu cấu trúc Struct
Bài tập : Viết trình quản lý thông tin cán bộ. Giả sử mỗi dữ liệu của một cán bộ gồm :
Ngày tháng năm sinh.
Ngày tháng năm vào cơ quan.
Bậc lương.
Yêu cầu viết một chương trình để :
Xây dựng cấu trúc cơ sở dữ liệu cho cán bộ.
Vào số liệu của một cán bộ.
Đưa số liệu đó ra máy in.
15
Chương 1: Kiểu dữ liệu cấu trúc Struct
5. Mảng cấu trúc
Mảng mà các thành phần có kiểu cấu trúc được gọi là mảng cấu trúc. Khai báo mảng cấu trúc cũng tương tự như khai báo mảng bình thường chỉ khác là thay cho tên kiểu dữ liệu bình thường là tên kiểu dữ liệu cấu trúc
struct tên_kiểu_cấu_trúc_đã_định_nghĩa tên_mảng_cấu_trúc[số phần tử của mảng];
16
Chương 1: Kiểu dữ liệu cấu trúc Struct
VD: int a,b,c[10];
Cho ta hai biến nguyên là a,b và một mảng nguyên c có 10 phần tử.
Ta có thể sử dụng một kiểu cấu trúc đã mô tả để khai báo các cấu trúc và mảng cấu trúc.
VD: Giả sử kiểu cấu trúc canbo đã được định nghĩa như mục trên. Khi đó dòng khai báo :
struct canbo cb1,cb2,nhom1[10],nhom2[7];
sẽ cho : Hai biến cấu trúc cb1 và cb2. Hai mảng cấu trúc nhom1 co 10 phần tử và nhom2 có 7 phần tử và mỗi phần tử của hai nhóm này có kiểu canbo.
17
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2 : Viết đoạn chương trình sẽ tính tổng lương cho các phần tử nhóm 1:
double tongluong=0;
for (i=0;i<10;++i)
tongluong+=nhom1[i].luong;
Chú ý : Không cho phép 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 khác kiểu nguyên.
VD: scanf("%f",&nhom1[5].luong);
Trong trường hợp này ta dùng biến trung gian.
18
Chương 1: Kiểu dữ liệu cấu trúc Struct
6. Phép gán cấu trúc
Có thể thực hiện phép gán trên các biến và phần tử mảng cấu trúc cùng kiểu như sau :
Gán hai biến cấu trúc cho nhau
Gán biến cấu trúc cho phần tử mảng cấu trúc
Gán phần tử mảng cấu trúc cho biến cấu trúc
Gán hai phần tử mảng cấu trúc cho nhau
Mỗi một phép gán trên tương đương với một dãy phép gán các thành phần tương ứng.
19
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ : Viết đoạn chương trình minh hoạ cách dùng phép gán cấu trúc để để sắp xếp n thí sinh theo thứ tự giảm của tổng điểm :
struct thisinh
{ char ht[25];
float td;
} tg,ts[100];
for (i=1;i<=n-1;++i)
for (j=1;j<=n;++j)
if (ts[i].td
20
Chương 1: Kiểu dữ liệu cấu trúc Struct
7. Cấu trúc tư trỏ và danh sách liên kết
* Con trỏ cấu trúc
Ta có thể lấy địa chỉ của một biến cấu trúc bằng toán tử lấy địa chỉ &. Giá trị trả lại là địa chỉ đến trường đầu tiên của cấu trúc.
Ta có thể khai báo một biến con trỏ chỉ đến một cấu trúc như sau:
Struct tênct *tên_biến_con_trỏ;
21
Chương 1: Kiểu dữ liệu cấu trúc Struct
* Cấu trúc tự trỏ
Cấu trúc có ít nhất một thành phần là con trỏ chỉ đến bản thân cấu trúc đang được định nghĩa gọi là cấu trúc tự trỏ.
Ví dụ: struct sinhvien
{ char hoten[25];
float dt,dl,dh,dtb;
struct sinhvien *tiep;
} ;
22
Chương 1: Kiểu dữ liệu cấu trúc Struct
CÊu tróc tù trá ®îc dïng ®Ó x©y dùng danh s¸ch liªn kÕt.
* Danh s¸ch liªn kÕt lµ mét danh s¸ch mµ c¸c phÇn tö ®îc liªn kÕt víi nhau cã nghÜa lµ mçi phÇn tö cã chøa con trá ®Ó trá tíi mét phÇn tö kh¸c. Nãi mét c¸ch kh¸c danh s¸ch liªn kÕt gåm c¸c phÇn tö mçi phÇn tö sÏ cã 2 phÇn chÝnh:
Vïng d÷ liÖu cña danh s¸ch
Vïng liªn kÕt
23
Chương 1: Kiểu dữ liệu cấu trúc Struct
Có hai kiểu liên kết:
* Liên kết theo chiều thuận (FIFO):
- Biết địa chỉ cấu trúc đầu đang được lưu trữ trong một con trỏ nào đó.
- Trong mỗi cấu trúc ( trừ cấu trúc cuối ) chứa địa chỉ của cấu trúc tiếp sau của danh sách.
- Cấu trúc cuối chứa hằng NULL.
VD:
Với kiểu liên kết này, ta có thể lần lượt từ cấu trúc đầu đến cấu trúc cuối theo chiều từ trên xuống dưới.
24
P dau
Null
Chương 1: Kiểu dữ liệu cấu trúc Struct
* Liên kết theo chiều ngược (LIFO):
- Biết địa chỉ cấu trúc cuối.
- Trong mỗi cấu trúc ( trừ cấu trúc đầu ) đều chứ địa chỉ của cấu trúc trước.
- Cấu trúc đầu chứa hằng NULL.
Với danh sách này, ta có thể lần lượt từ cấu trúc cuối lên cấu trúc đầu theo chiều từ dưới lên trên.
VD: Tạo danh sách liên kết quản lý danh sách sinh viên. sau đó in ra danh sách vừa nhập
25
Chương 2: Kiểu tệp tin
I. Khái niệm tệp: Tệp là một tập hợp dữ liệu có liên quan với nhau và có cùng kiểu, được lưu trữ trên bộ nhớ ngoài dưới một cái tên được gọi là tên tệp.
* Cấu trúc và phân loại tệp: Tệp chia thành hai loại:
- Tệp nhị phân: là tệp mà các phần tử là các số nhị phân (0,1) biểu diễn thông tin. Tệp nhị phân dùng giá trị -1 để báo hiệu kết thúc tệp.
- Tệp văn bản: Là tệp chứa các phần tử là các ký tự, nghĩa là chỉ chứa các ký tự đọc được là các chữ cái, chữ số, không kể đến các ký tự điều khiển.
26
Chương 2: Kiểu tệp tin
Các bước xử lý tệp:
Gồm 4 bước: Khai báo biến tệp, mở tệp để ghi hoặc đọc, ghi hoặc đọc tệp, đóng tệp.
Khai báo biến tệp:
FILE Biến_con_trỏ_tệp;
Ví dụ: FILE *vb,*np;
2. Mở tệp- hàm fopen
Cú pháp:Biếntệp=fopen(tên tệp trên đĩa,kiểu xử lý tệp);
Công dụng: Hàm dùng để mở tệp. Nếu thành công hàm cho con trỏ kiểu FILE ứng với tệp vừa mở. Nếu có lỗi hàm sẽ trả về giá trị NULL.
27
Chương 2: Kiểu tệp tin
VD: Mở tệp mới để ghi
f=fopen("C:TCBINsonguyen.dat","wb"
3. Ghi hoặc đọc tệp ( Xử lý dữ liệu )
Đây là bước có sự khác nhau giữa các kiểu tệp và các kiểu xử lý tệp. Vì vậy chúng ta sẽ nghiên cứu cụ thể từng loại
4. Đóng tệp : fclose(biến tệp). Nếu thành công thì giá trị của hàm =0, ngược lại có giá trị EOF (giá trị kết thúc tệp)
28
Chương 2: Kiểu tệp tin
Kiểu xử lý cho tệp văn bản
29
Chương 2: Kiểu tệp tin
Kiểu xử lý cho tệp nhị phân
30
Chương 2: Kiểu tệp tin
III. Ghi hoặc đọc tệp dữ liệu kiểu nhị phân
Ghi vào tệp nhị phân.
Cú pháp: int fwrite(void *ptr, int size, int n, FILE *f);
Công dụng: Ghi n mẫu tin kích thước size byte từ vùng nhớ ptr lên tệp f. Hàm trả về một giá trị bằng số mẫu tin thực sự ghi được
Trong đó:
- ptr: là con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi. ptr có thể là con trỏ kiểu nguyên, ký tự, số thực, cấu trúc.
- size: Kích thước của mẫu tin theo byte.
31
Chương 2: Kiểu tệp tin
- n: là số mẫu tin cần ghi
- f: là con trỏ tệp
Ví dụ: fwrite(&a,sizeof(float),1,f);
2. Đọc dữ liệu từ tệp nhị phân
Cú pháp: int fread(void *ptr, int size, int n, FILE *f);
Công dụng: Đọc n mẫu tin kích thước size byte từ tệp f chứa vào vùng nhớ ptr. Hàm trả về một giá trị bằng số mẫu tin thực sự đọc được
Trong đó: ptr: là con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được. ptr có thể là con trỏ kiểu nguyên, ký tự, số thực, cấu trúc.
32
Chương 2: Kiểu tệp tin
- size: Kích thước của mẫu tin theo byte.
- n: là số mẫu tin cần đọc
- f: là con trỏ tệp
Ví dụ: fread(&a,sizeof(float),1,f);
Chú ý 1:
Đối với kiểu số nguyên có thể dùng thêm hai hàm sau:
-Hàm int putw(int n, FILE *f); để ghi số nguyên n lên tệp f.
Ví dụ: putw(i,f);
- Hàm int getw(FILE *f); Đọc một số nguyên từ tệp f, trả về số nguyên đọc được.
Ví dụ: i=getw(f);
33
Chương 2: Kiểu tệp tin
Chú ý 2:
Riêng đối với kiểu ký tự khi đọc, ghi ký tự cũng có thể dùng các hàm sau:
Hàm int fputc(int ch, FILE *f); Ghi ký tự có mã m=ch %256 lên tệp f. Nếu thành công hàm cho mã ký tự được ghi, trái lại cho EOF
Hàm int fgetc(FILE *f); Hàm đọc một ký tự từ tệp f. Nếu thành công hàm sẽ cho mã đọc được ( có giá trị từ 0 đến 255). Nếu gặp cuối tệp hay có lỗi hàm sẽ trả về EOF.
34
Chương 2: Kiểu tệp tin
Bài tập: Tạo tệp ghi 10 số nguyên, sau đó đọc lại tệp và in ra màn hình.
#include
void main()
{
FILE *f;
f=fopen("SN.DAT","wb");
for(i=1;i<=10;i++)
fwrite(&i,sizeof(int),1,f);
fclose(f);
35
Chương 2: Kiểu tệp tin
f=fopen("SN.DAT","rb");
while (fread(&i,sizeof(int),1,f),!feof(f))
printf("%4d",i);
fclose(f);
getch();
}
36
Chương 2: Kiểu tệp tin
Bài tập 2: Tạo tệp ghi 10 số nguyên, sau đó đọc lại tệp và in ra màn hình. ( Dùng 2 hàm Putw, Getw)
Bài tập 3: Tạo tệp ghi 10 ký tự, sau đó đọc lại;
Bài tập 4: Tạo tệp ghi danh sách sinh viên, đọc lại tệp và in lên màn hình dưới dạng bảng biểu.
37
Chương 2: Kiểu tệp tin
IV. Ghi hoặc đọc tệp dữ liệu kiểu văn bản
Ghi dữ liệu theo khuôn dạng
Cú pháp: fprintf(FILE *f, const char *dk,.);
Cộng dụng: Ghi giá trị các đối lên tệp văn bản. Hàm làm việc giống như hàm printf, nhưng ở đây là ghi lên tệp văn bản.
2. Đọc dữ liệu theo khuôn dạng
Cú pháp: int fscantf(FILE *f, const char dk,.);
Công dụng: Đọc từ tệp văn bản lưu kết quả vào các đối. Hàm làm việc giống hàm scanf
38
Chương 2: Kiểu tệp tin
3. Ghi một chuỗi:
Cú pháp: fputs( const char *st,FILE *f);
Công dụng: Ghi chuỗi st lên tệp f. Kết quả = ký tự cuối được ghi nếu thành công, ngược lại = EOF
4. Đọc một chuỗi
Cú pháp: fgets(char *st,int n,FILE *f);
Công dụng: Đọc một chuỗi n ký tự từ tệp f vào vùng nhớ st
39
1. Khái niệm
Cấu trúc là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần này được truy cập thông qua tên.
1
Chương 1: Kiểu dữ liệu cấu trúc Struct
2. Khai báo kiểu cấu trúc Khi xây dựng cấu trúc, ta cần mô tả kiểu của nó. Công việc định nghĩa một kiểu cấu trúc bao gồm việc nêu ra tên của kiểu cấu trúc và các thành phần của nó theo mẫu sau :
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 đó : struct là từ khoá
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 nêu ra trong chương 1.
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..
2
Chương 1: Kiểu dữ liệu cấu trúc Struct
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.
3
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2: 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 là tên, địa chỉ, bậc lương còn hai thành phần sau là các cấu trúc ngaysinh và ngaybatdaucongtac được xây dựng theo cấu trúc ngay được định nghĩa trong vd 1.
4
Chương 1: Kiểu dữ liệu cấu trúc Struct
Định nghĩa cấu trúc bằng typedef :
Có thể dùng toán tử typedef để định nghĩa các kiểu cấu trúc ngay ở trên như sau :
typedef struct
{
int ngaythu;
char thang[12];
int nam;
} ngay;
5
Chương 1: Kiểu dữ liệu cấu trúc Struct
typedef struct
{
char ten[15];
char diachi[20]
double bacluong;
struc ngay ngaysinh;
struc ngay ngaybatdaucongtac;
} nhancong;
6
Chương 1: Kiểu dữ liệu cấu trúc Struct
3. Khai báo biến cấu trúc
Cách 1 : struct tên_kiểu_cấu_trúc_đã_khai_báo danh_sách_tên_các_cấu_trúc;
Ví dụ 1: struct ngay ngaydi,ngayden;
Cách 2 : struct tên_kiểu_cấu_trúc
{
Các thành phần của cấu trúc
} danh_sách_tên_các_cấu_trúc;
7
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 1 :
struct nhancong
{ char ten[15];
char diachi[20];
double bacluong;
struc ngay ngaysinh;
struc ngay ngaybatdaucongtac;
} nhom1,nhom2;
8
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2 :
struct ngay
{
int ngaythu;
char thang[12];
int nam;
} ngaydi,ngayden;
9
Chương 1: Kiểu dữ liệu cấu trúc Struct
Cách 3: struct
{
Các thành phần của cấu trúc
} danh_sách_tên_các_cấu_trúc;
Ví dụ : struct
{
int ngaythu;
char thang[12];
int nam;
} ngaydi,ngayden;
10
Chương 1: Kiểu dữ liệu cấu trúc Struct
Chú ý :
Nếu dùng từ khoá typedef để định nghĩa kiểu cấu trúc như trong mục thì khi khai báo các cấu trúc mới ta không cần dùng từ khoá struct, chỉ cần dùng tên kiểu.
Ví dụ như kiểu cấu trúc ngay được khai báo bằng typedef trong phần trước thì khi khai báo các cấu trúc mới là ngaydi và ngayden có cùng kiểu ngay ta dùng dòng lệnh sau :
ngay ngaydi,ngayden;
11
Chương 1: Kiểu dữ liệu cấu trúc Struct
4. Truy nhập đến các thành phần cấu trúc :
Để 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_cấu_trúc.tên_thành_phần
tên_cấu_trúc.tên_cấu_trúc.tên_thành_phần
Ví dụ : Ta xét phép toán trên các thành phần của cấu trúc nhom1, nhom2 :
Câu lệnh : printf("%s",nhom1.ten);
sẽ đưa lên màn hình tên của nhom1.
12
Chương 1: Kiểu dữ liệu cấu trúc Struct
Câu lệnh :
tongluong=nhom1.bacluong+nhom2.bacluong;
sẽ gán tổng lương của nhom1 và nhom2 rồi gán cho biến tongluong.
Câu lệnh : printf("%d",nhom1.ngaysinh.ten);
sẽ đưa lên màn hình ngày sinh của nhom1.
Câu lệnh : printf("%d",nhom1. ngaybatdaucongtac.nam);
sẽ đưa lên màn hình ngày bắt đầu công tác của nhom1.
13
Chương 1: Kiểu dữ liệu cấu trúc Struct
Chú ý : Có thể sử dụng phép toán lấy địa chỉ đối với các thành phần cấu trúc để nhập số liệu trực tiếp vào các thành phần cấu trúc.
Ví dụ : scanf("%d",&nhom1.ngaybatdaucongtac.nam);
Nhập số liệu vào một biến trung gian sau đó mới gán cho thành phần của cấu trúc.
Ví dụ : int year;
scanf("%d",&year);
nhom1. ngaybatdaucongtac.nam=year;
14
Chương 1: Kiểu dữ liệu cấu trúc Struct
Bài tập : Viết trình quản lý thông tin cán bộ. Giả sử mỗi dữ liệu của một cán bộ gồm :
Ngày tháng năm sinh.
Ngày tháng năm vào cơ quan.
Bậc lương.
Yêu cầu viết một chương trình để :
Xây dựng cấu trúc cơ sở dữ liệu cho cán bộ.
Vào số liệu của một cán bộ.
Đưa số liệu đó ra máy in.
15
Chương 1: Kiểu dữ liệu cấu trúc Struct
5. Mảng cấu trúc
Mảng mà các thành phần có kiểu cấu trúc được gọi là mảng cấu trúc. Khai báo mảng cấu trúc cũng tương tự như khai báo mảng bình thường chỉ khác là thay cho tên kiểu dữ liệu bình thường là tên kiểu dữ liệu cấu trúc
struct tên_kiểu_cấu_trúc_đã_định_nghĩa tên_mảng_cấu_trúc[số phần tử của mảng];
16
Chương 1: Kiểu dữ liệu cấu trúc Struct
VD: int a,b,c[10];
Cho ta hai biến nguyên là a,b và một mảng nguyên c có 10 phần tử.
Ta có thể sử dụng một kiểu cấu trúc đã mô tả để khai báo các cấu trúc và mảng cấu trúc.
VD: Giả sử kiểu cấu trúc canbo đã được định nghĩa như mục trên. Khi đó dòng khai báo :
struct canbo cb1,cb2,nhom1[10],nhom2[7];
sẽ cho : Hai biến cấu trúc cb1 và cb2. Hai mảng cấu trúc nhom1 co 10 phần tử và nhom2 có 7 phần tử và mỗi phần tử của hai nhóm này có kiểu canbo.
17
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ 2 : Viết đoạn chương trình sẽ tính tổng lương cho các phần tử nhóm 1:
double tongluong=0;
for (i=0;i<10;++i)
tongluong+=nhom1[i].luong;
Chú ý : Không cho phép 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 khác kiểu nguyên.
VD: scanf("%f",&nhom1[5].luong);
Trong trường hợp này ta dùng biến trung gian.
18
Chương 1: Kiểu dữ liệu cấu trúc Struct
6. Phép gán cấu trúc
Có thể thực hiện phép gán trên các biến và phần tử mảng cấu trúc cùng kiểu như sau :
Gán hai biến cấu trúc cho nhau
Gán biến cấu trúc cho phần tử mảng cấu trúc
Gán phần tử mảng cấu trúc cho biến cấu trúc
Gán hai phần tử mảng cấu trúc cho nhau
Mỗi một phép gán trên tương đương với một dãy phép gán các thành phần tương ứng.
19
Chương 1: Kiểu dữ liệu cấu trúc Struct
Ví dụ : Viết đoạn chương trình minh hoạ cách dùng phép gán cấu trúc để để sắp xếp n thí sinh theo thứ tự giảm của tổng điểm :
struct thisinh
{ char ht[25];
float td;
} tg,ts[100];
for (i=1;i<=n-1;++i)
for (j=1;j<=n;++j)
if (ts[i].td
20
Chương 1: Kiểu dữ liệu cấu trúc Struct
7. Cấu trúc tư trỏ và danh sách liên kết
* Con trỏ cấu trúc
Ta có thể lấy địa chỉ của một biến cấu trúc bằng toán tử lấy địa chỉ &. Giá trị trả lại là địa chỉ đến trường đầu tiên của cấu trúc.
Ta có thể khai báo một biến con trỏ chỉ đến một cấu trúc như sau:
Struct tênct *tên_biến_con_trỏ;
21
Chương 1: Kiểu dữ liệu cấu trúc Struct
* Cấu trúc tự trỏ
Cấu trúc có ít nhất một thành phần là con trỏ chỉ đến bản thân cấu trúc đang được định nghĩa gọi là cấu trúc tự trỏ.
Ví dụ: struct sinhvien
{ char hoten[25];
float dt,dl,dh,dtb;
struct sinhvien *tiep;
} ;
22
Chương 1: Kiểu dữ liệu cấu trúc Struct
CÊu tróc tù trá ®îc dïng ®Ó x©y dùng danh s¸ch liªn kÕt.
* Danh s¸ch liªn kÕt lµ mét danh s¸ch mµ c¸c phÇn tö ®îc liªn kÕt víi nhau cã nghÜa lµ mçi phÇn tö cã chøa con trá ®Ó trá tíi mét phÇn tö kh¸c. Nãi mét c¸ch kh¸c danh s¸ch liªn kÕt gåm c¸c phÇn tö mçi phÇn tö sÏ cã 2 phÇn chÝnh:
Vïng d÷ liÖu cña danh s¸ch
Vïng liªn kÕt
23
Chương 1: Kiểu dữ liệu cấu trúc Struct
Có hai kiểu liên kết:
* Liên kết theo chiều thuận (FIFO):
- Biết địa chỉ cấu trúc đầu đang được lưu trữ trong một con trỏ nào đó.
- Trong mỗi cấu trúc ( trừ cấu trúc cuối ) chứa địa chỉ của cấu trúc tiếp sau của danh sách.
- Cấu trúc cuối chứa hằng NULL.
VD:
Với kiểu liên kết này, ta có thể lần lượt từ cấu trúc đầu đến cấu trúc cuối theo chiều từ trên xuống dưới.
24
P dau
Null
Chương 1: Kiểu dữ liệu cấu trúc Struct
* Liên kết theo chiều ngược (LIFO):
- Biết địa chỉ cấu trúc cuối.
- Trong mỗi cấu trúc ( trừ cấu trúc đầu ) đều chứ địa chỉ của cấu trúc trước.
- Cấu trúc đầu chứa hằng NULL.
Với danh sách này, ta có thể lần lượt từ cấu trúc cuối lên cấu trúc đầu theo chiều từ dưới lên trên.
VD: Tạo danh sách liên kết quản lý danh sách sinh viên. sau đó in ra danh sách vừa nhập
25
Chương 2: Kiểu tệp tin
I. Khái niệm tệp: Tệp là một tập hợp dữ liệu có liên quan với nhau và có cùng kiểu, được lưu trữ trên bộ nhớ ngoài dưới một cái tên được gọi là tên tệp.
* Cấu trúc và phân loại tệp: Tệp chia thành hai loại:
- Tệp nhị phân: là tệp mà các phần tử là các số nhị phân (0,1) biểu diễn thông tin. Tệp nhị phân dùng giá trị -1 để báo hiệu kết thúc tệp.
- Tệp văn bản: Là tệp chứa các phần tử là các ký tự, nghĩa là chỉ chứa các ký tự đọc được là các chữ cái, chữ số, không kể đến các ký tự điều khiển.
26
Chương 2: Kiểu tệp tin
Các bước xử lý tệp:
Gồm 4 bước: Khai báo biến tệp, mở tệp để ghi hoặc đọc, ghi hoặc đọc tệp, đóng tệp.
Khai báo biến tệp:
FILE Biến_con_trỏ_tệp;
Ví dụ: FILE *vb,*np;
2. Mở tệp- hàm fopen
Cú pháp:Biếntệp=fopen(tên tệp trên đĩa,kiểu xử lý tệp);
Công dụng: Hàm dùng để mở tệp. Nếu thành công hàm cho con trỏ kiểu FILE ứng với tệp vừa mở. Nếu có lỗi hàm sẽ trả về giá trị NULL.
27
Chương 2: Kiểu tệp tin
VD: Mở tệp mới để ghi
f=fopen("C:TCBINsonguyen.dat","wb"
3. Ghi hoặc đọc tệp ( Xử lý dữ liệu )
Đây là bước có sự khác nhau giữa các kiểu tệp và các kiểu xử lý tệp. Vì vậy chúng ta sẽ nghiên cứu cụ thể từng loại
4. Đóng tệp : fclose(biến tệp). Nếu thành công thì giá trị của hàm =0, ngược lại có giá trị EOF (giá trị kết thúc tệp)
28
Chương 2: Kiểu tệp tin
Kiểu xử lý cho tệp văn bản
29
Chương 2: Kiểu tệp tin
Kiểu xử lý cho tệp nhị phân
30
Chương 2: Kiểu tệp tin
III. Ghi hoặc đọc tệp dữ liệu kiểu nhị phân
Ghi vào tệp nhị phân.
Cú pháp: int fwrite(void *ptr, int size, int n, FILE *f);
Công dụng: Ghi n mẫu tin kích thước size byte từ vùng nhớ ptr lên tệp f. Hàm trả về một giá trị bằng số mẫu tin thực sự ghi được
Trong đó:
- ptr: là con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi. ptr có thể là con trỏ kiểu nguyên, ký tự, số thực, cấu trúc.
- size: Kích thước của mẫu tin theo byte.
31
Chương 2: Kiểu tệp tin
- n: là số mẫu tin cần ghi
- f: là con trỏ tệp
Ví dụ: fwrite(&a,sizeof(float),1,f);
2. Đọc dữ liệu từ tệp nhị phân
Cú pháp: int fread(void *ptr, int size, int n, FILE *f);
Công dụng: Đọc n mẫu tin kích thước size byte từ tệp f chứa vào vùng nhớ ptr. Hàm trả về một giá trị bằng số mẫu tin thực sự đọc được
Trong đó: ptr: là con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được. ptr có thể là con trỏ kiểu nguyên, ký tự, số thực, cấu trúc.
32
Chương 2: Kiểu tệp tin
- size: Kích thước của mẫu tin theo byte.
- n: là số mẫu tin cần đọc
- f: là con trỏ tệp
Ví dụ: fread(&a,sizeof(float),1,f);
Chú ý 1:
Đối với kiểu số nguyên có thể dùng thêm hai hàm sau:
-Hàm int putw(int n, FILE *f); để ghi số nguyên n lên tệp f.
Ví dụ: putw(i,f);
- Hàm int getw(FILE *f); Đọc một số nguyên từ tệp f, trả về số nguyên đọc được.
Ví dụ: i=getw(f);
33
Chương 2: Kiểu tệp tin
Chú ý 2:
Riêng đối với kiểu ký tự khi đọc, ghi ký tự cũng có thể dùng các hàm sau:
Hàm int fputc(int ch, FILE *f); Ghi ký tự có mã m=ch %256 lên tệp f. Nếu thành công hàm cho mã ký tự được ghi, trái lại cho EOF
Hàm int fgetc(FILE *f); Hàm đọc một ký tự từ tệp f. Nếu thành công hàm sẽ cho mã đọc được ( có giá trị từ 0 đến 255). Nếu gặp cuối tệp hay có lỗi hàm sẽ trả về EOF.
34
Chương 2: Kiểu tệp tin
Bài tập: Tạo tệp ghi 10 số nguyên, sau đó đọc lại tệp và in ra màn hình.
#include
void main()
{
FILE *f;
f=fopen("SN.DAT","wb");
for(i=1;i<=10;i++)
fwrite(&i,sizeof(int),1,f);
fclose(f);
35
Chương 2: Kiểu tệp tin
f=fopen("SN.DAT","rb");
while (fread(&i,sizeof(int),1,f),!feof(f))
printf("%4d",i);
fclose(f);
getch();
}
36
Chương 2: Kiểu tệp tin
Bài tập 2: Tạo tệp ghi 10 số nguyên, sau đó đọc lại tệp và in ra màn hình. ( Dùng 2 hàm Putw, Getw)
Bài tập 3: Tạo tệp ghi 10 ký tự, sau đó đọc lại;
Bài tập 4: Tạo tệp ghi danh sách sinh viên, đọc lại tệp và in lên màn hình dưới dạng bảng biểu.
37
Chương 2: Kiểu tệp tin
IV. Ghi hoặc đọc tệp dữ liệu kiểu văn bản
Ghi dữ liệu theo khuôn dạng
Cú pháp: fprintf(FILE *f, const char *dk,.);
Cộng dụng: Ghi giá trị các đối lên tệp văn bản. Hàm làm việc giống như hàm printf, nhưng ở đây là ghi lên tệp văn bản.
2. Đọc dữ liệu theo khuôn dạng
Cú pháp: int fscantf(FILE *f, const char dk,.);
Công dụng: Đọc từ tệp văn bản lưu kết quả vào các đối. Hàm làm việc giống hàm scanf
38
Chương 2: Kiểu tệp tin
3. Ghi một chuỗi:
Cú pháp: fputs( const char *st,FILE *f);
Công dụng: Ghi chuỗi st lên tệp f. Kết quả = ký tự cuối được ghi nếu thành công, ngược lại = EOF
4. Đọc một chuỗi
Cú pháp: fgets(char *st,int n,FILE *f);
Công dụng: Đọc một chuỗi n ký tự từ tệp f vào vùng nhớ st
39
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Vi Văn Thoài
Dung lượng: |
Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)