1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Bài giảng kỹ thuật lập trình c chương 6 ths trần quang hải bằng

20 307 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 472,9 KB

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

Nội dung

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 9 bangtqh@hotmail.com Kiểu cấu trúc struct • Kiểu cấu trúc cho phép tạo ra kiểu dữ liệu mới gồm các phần tử dữ liệu có kiểu khác nhau nhưng l

Trang 1

KỸ THUẬT LẬP TRÌNH C

Chương 6: Các kiểu dữ liệu nâng cao

04/2010

Các kiểu dữ liệu nâng cao

• Kiểu con trỏ

• Kiểu mảng

• Kiểu Cấu trúc (struct) và hợp (union)

• Kiểu File – Và truy xuất file

Trang 2

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 3 bangtqh@hotmail.com

Kiểu con trỏ (pointer)

• Địa chỉ (address)

– Với mỗi biến có các khái niệm:

• Tên biến, kiểu biến, giá trị biến

– Ví dụ:

• int i = 1 ;

• Biến i kiểu số nguyên có giá trị là 1

• Máy tính cấp phát một vùng nhớ 2 byte liên tục để lưu trữ giá trị của biến i

– Địa chỉ biến là số thứ tự của byte đầu tiên trong dãy các byte liên tục nhau máy dành để lưu trữ giá trị biến

– Để lấy địa chỉ biến, sử dụng toán tử “&”

• Ví dụ : &i

– Lưu ý, máy tính phân biệt các kiểu địa chỉ: địa chỉ kiểu int , địa chỉ kiểu float , địa chỉ kiểu long , …

04/2010

Kiểu con trỏ (pointer)

• Con trỏ ( pointer )

– Là một biến dùng để chứa địa chỉ

– Có nhiều loại con trỏ tương ứng với các kiểu địa chỉ khác nhau

• Chẳng hạn, con trỏ kiểu int tương ứng địa chỉ kiểu int , …

– Cú pháp khai báo con trỏ

kiểu_dữ_liệu *tên_con_trỏ;

– Ví dụ

int i, j, *pi, *pj;

pi = &i; /* pi là con trỏ chứa ñịa chỉ biến i */

pj = &j; /* pj là con trỏ chứa ñịa chỉ biến j */

Trang 3

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 5 bangtqh@hotmail.com

Kiểu con trỏ (pointer)

• Giả sử có

– px là con trỏ ñến biến x, thì các cánh viết x*px

tương đương nhau

• Ví dụ

int x, y, *px, *py;

px = &x;

py = &y;

x = 3 ; /* t ươ ng đ ươ ng v ớ i *px = 3 */

y = 5 ; /* t ươ ng đ ươ ng v ớ i *py = 5 */

/* Các câu l ệ nh d ướ i đây là tương ñương : */

x = 10*y;

*px = 10 *y;

x = 10 *(*py);

*px = 10 *(*py);

04/2010

Kiểu mảng

• Mảng 1 chiều ( xem lại slide chương 4 )

• Mảng nhiều chiều

– Ví dụ , khai báo mảng 2 chiều

int a[ 4 ][ 10 ]; // là mảng có 4 hàng, 10 cột

– Truy cập các phần tử của mảng nhiều chiều

a[ 0 ][ 0 ], a[ 0 ][ 1 ], a[ i ][ j ]…

– Ví dụ khác

float arr[ 3 ][ 4 ][ 5 ];

char arrc[ 4 ][ 4 ];

Trang 4

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 7 bangtqh@hotmail.com

Kiểu mảng

04/2010

Kiểu mảng – Bài tập

1 Viết chương trình kiểm tra xem ma trận Anxn có

phải là ma trận tam giác không ?

2 Viết chương trình tìm trung bình cộng của các

phần tử âm thuộc ma trận Amxn

3 Cho 1 số nguyên N (lẻ và ≥ 3) Hãy điền vào ma

trận Anxn các giá trị từ 1 n2 sao cho trận đó thỏa

mãn điều kiện Tổng mỗi hàng = Tổng mỗi cột =

Tổng mỗi đường chéo.

4 Viết chương trình tính định thức của ma trận

vuông A

Trang 5

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 9 bangtqh@hotmail.com

Kiểu cấu trúc (struct)

• Kiểu cấu trúc cho phép tạo ra kiểu dữ liệu mới gồm các phần tử dữ liệu có kiểu khác nhau nhưng liên

kết với nhau

• Kiểu cấu trúc ( struct ure) còn được gọi là kiểu bản

ghi ( record )

• Kiểu cấu trúc gồm nhiều thành phần dữ liệu khác

nhau

• Các thành phần dữ liệu được gọi là các trường

( field )

• Dùng từ khóa struct ñể ñịnh nghĩa kiểu cấu trúc

04/2010

Kiểu cấu trúc (struct)

• Ví dụ: dùng kiểu cấu trúc mô tả dữ liệu là ñịa chỉ

– Địa chỉ gồm các thông tin: số nhà, tên đường, tên thành

phố

• Hoặc có thể khai báo các biến cấu trúc trực tiếp

không cần khai báo tên cấu trúc

struct dia_chi{

int so_nha;

char duong[40];

char thanh_pho[30];

} ong_A, ba_B;

struct {

int so_nha;

char duong[40];

char thanh_pho[30];

}ong_A, ba_B;

Trang 6

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 11 bangtqh@hotmail.com

Kiểu cấu trúc (struct)

• Hoặc chỉ khai báo kiểu cấu trúc

• Sau đó khai báo các biến

struct dia_chi ong_A, ba_B;

struct dia_chi{

int so_nha;

char duong[ 40 ];

char thanh_pho[ 30 ];

};

04/2010

Kiểu cấu trúc (struct)

• Khai báo kiểu cấu trúc lồng nhau

• Khai báo biến

nhan_su p;

typedef struct { char ho_ten[ 40 ];

struct dia_chi noi_o;

char gioi_tinh;

} nhan_su;

Trang 7

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 13 bangtqh@hotmail.com

Kiểu cấu trúc (struct)

• Truy cập phần tử của cấu trúc

tên_bi ế n_c ấ u_trúc tên_tr ườ ng

• Ví dụ

p.ho_ten

p.o_tai.so_nha

p.o_tai.duong

p.o_tai.thanh_pho

p.gioi_tinh

puts(p.ho_ten);

04/2010

Kiểu cấu trúc (struct)

• Gán cấu trúc : có 2 cách

– Gán hai biến cấu trúc cho nhau

– Gán các thành phần (trường) tương ứng của hai cấu trúc

• Ví dụ

struct dia_chi d1, d2;

d1 = d2;

Hoặc

d1.so_nha = d2.so_nha;

d1.duong = d2.duong;

d1.thanh_pho = d2.thanh_pho;

Trang 8

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 15 bangtqh@hotmail.com

Kiểu cấu trúc (struct)

• Mảng cấu trúc

– Khai báo mảng gồm các phần tử có kiểu cấu trúc

– Ví dụ

nhan_su mang_nhan_su[ 100 ];

– Sử dụng

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

puts(mang_nhan_su[i].ho_ten);

04/2010

Kiểu cấu trúc (struct)

• Hàm có tham số kiểu cấu trúc

Trang 9

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 17 bangtqh@hotmail.com

Kiểu hợp (union)

• Kiểu hợp ( union ) cho phép chia sẽ cùng một vùng

bộ nhớ cho các biến khác nhau

• Nhằm tiết kiệm bộ nhớ

• Sử dụng từ khóa union ñể ñịnh nghĩa kiểu hợp

• Ví dụ

};

Máy dành 2 byte ñể lưu trữ khai báo trên

Cả hai phần tử i và ch dùng chung vùng nhớ 2 byte

Tại mỗi thời ñiểm chỉ một trong hai thành phần i hoặc

ch ñược sử dụng

04/2010

Kiểu hợp (union)

• Khai báo biến kiểu hợp

• Truy cập các phần tử kiểu hợp như kiểu

cấu trúc

x.i x.ch

Trang 10

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 19 bangtqh@hotmail.com

Kiểu File (tệp)

• Các thao tác trên file

– Mở file, Đóng file, ðọc dữ liệu file, Ghi dữ liệu, …

• Ngôn ngữ C ñịnh nghĩa (trong stdio.h )

– Cấu trúc kiểu tệp FILE

– Mã kết thúc tệp EOF (-1)

– Các hàm thao tác trên file

• Khai báo con trỏ file

FILE *pf;

04/2010

Kiểu File (tệp)

• Cấu trúc chung của một file trên đĩa

– Một file là gồm các byte có giá trị từ 0 đến 255

– Số byte là kích thước ( size ) của file

– Khi đọc cuối file thì ta nhận được mã kết thúc file

EOF

• Tệp tin chia làm hai loại

– Tệp tin văn bản ( text )

– Tệp tin nhị phân ( binary )

Trang 11

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 21 bangtqh@hotmail.com

• Trước khi một file được đọc hay ghi, một cấu trúc dữ liệu được gọi là dòng chảy phải được liên kết với nó

• Một dòng chảy là một con trỏ trỏ ñến một cấu trúc.

• Có 3 dòng chảy ñược mở ra cho bất kỳ một chương trình C nào

– stdin (standard input): ñược nối với bàn phím để ñọc

– stdout (standard output), stderr (standard error): ñược nối với màn hình để ghi

• Chức năng của dòng chảy :

– Tạo ra một vùng đệm ( buffer ) giữa chương trình đang chạy và

tệp tin trên đĩa

– Làm giảm việc chương trình truy cập trực tiếp thiết bị phần cứng Dòng chảy (stream)

04/2010

Kiểu File (tệp) – Mở file

• Muốn thao tác trên tệp trước hết phải mở tệp

• Mở tệp với hàm fopen

FILE *fopen( const char *name,

– Hàm trả về con trỏ ñến cấu trúc file hoặc dòng chảy tương ứng, nếu không thành công trả về NULL

• name: tên file cần mở

• mode: Chế ñộ mở

“w” : mở ñể ghi

“r”: mở ñể ñọc

“a”: mở ñể ghi vào cuối tệp

Trang 12

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 23 bangtqh@hotmail.com

Kiểu File (tệp) Ờ đóng file

Ớ Phải đóng file khi không làm việc với nó nữa

Ớ Dùng hàm fclose

int fclose(FILE *fp)

Ờ fp là dòng chảy hay con trỏ tệp cần đóng

Ờ Hàm trả về 0 nếu thành công, ngược lại trả về

EOF

Ớ Vắ dụ

fclose(file_dang_mo);

04/2010

Kiểu File (tệp)

Ớ Vắ dụ mở/đóng file

Trang 13

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 25 bangtqh@hotmail.com

Kiểu File (tệp)

• Báo lỗi hệ thống

– Dùng hàm perror

void perror( const char *str)

– Ví dụ:

04/2010

Kiểu File (tệp)

• Đọc ký tự file

– C cung cấp hai hàm getcfgetc

int getc(FILE *fp)

int fgetc(FILE *fp)

– Hai hàm có chức năng như nhau, đọc ký tự từ file ứng với dòng chảy

fp , trả về mã ASCII của ký tự ñọc được nếu thành công, ngược lại trả

về EOF

• Ghi ký tự vào file

– C cung cấp hai hàm putcfputc

int putc(int ch, FILE *fp)

int fputc(int ch, FILE *fp)

– Hai hàm có chức năng như nhau, ghi ký tự có mã ASCII là ch % 256

lên file ứng với dòng chảy fp , trả về mã ASCII ký tự ñược ghi nếu thành công, ngược lại trả về EOF

Trang 14

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 27 bangtqh@hotmail.com

Ví dụ copy file (1)

04/2010

Kiểu File (tệp)

• Đọc/Ghi chuỗi ký tự trên file

– Đọc chuỗi ký tự fgets

char * fgets( char *s, int n, FILE *fp)

– Hàm đọc từng chuỗi ký tự có ñộ dài lớn nhất là n trên file trỏ bởi fp vào chuỗi s

– Hàm trả về con trỏ ñến vùng nhớ chứa chuỗi ký tự ñược đọc nếu thành công, ngược lại trả về NULL

– Ghi chuỗi ký tự fputs

int fputs( const char *s, FILE *fp)

– Ghi chuỗi ky tự s lên file ñược trỏ bởi fp

Trang 15

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 29 bangtqh@hotmail.com

Ví dụ copy file (2)

04/2010

Kiểu File (tệp)

• Đọc dữ liệu trên file theo ñịnh dạng

– Đọc dữ liệu theo định dạng fscanf

int fscanf(FILE *fp,

const char *chu ỗ i_đi ề u_khi ể n, [ danh_sách_đ ố i ])

– Đọc dữ liệu từ file trỏ bởi fp theo ñịnh dạng chuỗi điều khiển vào danh cách các đối, sử dụng tương tự hàm scanf

Trang 16

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 31 bangtqh@hotmail.com

Kiểu File (tệp)

• Ghi dữ liệu theo ñịnh dạng fprintf

int fprintf(FILE *fp,

[danh_sách_đ ố i])

– Ghi dữ liệu vào tệp trỏ bởi fp theo ñịnh dạng

chuỗi điều khiển và từ danh cách các đối, sử

dụng tương tự hàm printf

04/2010

Kiểu File (tệp)

• Ngoài các hàm được trình bày ở trên, C còn cung cấp nhiều hàm khác

– Tự tìm hiểu các hàm:

• fcloseall,

• ferror,

• feof,

• unlink,

• remove,

• fseek,

• …

Trang 17

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 33 bangtqh@hotmail.com

Kiểu File (tệp)

• C còn cho phép thao tác trên các file nhị phân

– Truy cập file một cách ngẫu nhiên dễ dàng

– Dữ liệu có thể ñọc ghi từng khối (blocks)

– File nhị phân và file văn bản có sự khác nhau khi xử lý mã chuyển dòng ( newline ) và mã kết thúc file ( end of file )

– Hầu hết các hàm dùng cho file văn bản đều được sử dụng cho file nhị phân, ngoại trừ các hàm fgets , fputs

– Khi sử dụng hàm fopen sử dụng thêm tùy chọn “b” ñể mở file ở dạng nhị phân.

– Ngoài ra, C cung cấp thêm một số hàm đọc ghi riêng cho tệp nhị phân

04/2010

Trang 18

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 35 bangtqh@hotmail.com

Kiểu File (tệp)

• Vấn đề với mã kết thúc file

– Mã kết thúc file đối với kiểu văn bản là 26 (Ctrl+Z)

– Khi đọc các ký tự của file trong kiểu văn bản, nếu

gặp file tự này thì giá trị EOF ñược trả về và kết thúc

việc đọc

– Kiểu file nhị phân không không coi mã kết thúc file là

26

– Để ñọc tất cả các file tự của tệp, nên đọc trong kiểu

nhị phân

04/2010

Kiểu File (tệp)

• Vấn đề với mã chuyển dòng ( newline )

– Đối với kiểu văn bản

• Khi ghi vào file mã chuyển dòng ‘\n’ , thì hai ký tự

được ghi vào file là ‘\r’ và ‘\n’ (ký tự ‘\r’ chuyển về cột đầu tiên và ‘\n’ chuyển sang dòng mới)

• Khi đọc hai ký tự ‘\r’ và ‘\n’ thì ñược nhận biết là ký

tự ‘\n’

– Đối với kiểu nhị phân

• Khi ghi vào file ‘\n’ , thì chỉ ký tự ‘\n’ ñược ghi vào

Trang 19

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 37 bangtqh@hotmail.com

Kiểu File (tệp)

• Ví dụ Vấn đề với mã chuyển dòng ( newline )

FILE *bf, *tf;

tf = fopen (“txtfile” , “w” );

fprintf(“hi\n”);

bf = fopen( “binfile” , “wb” );

fprintf(“hi\n”);

4 ký tự ñược ghi vào file:

‘h’, ‘i’, ‘\r’, ‘\n’

3 ký tự ñược ghi vào file:

‘h’, ‘i’, ‘\n’

04/2010

Kiểu File (tệp)

• Các hàm chỉ đọc/ghi theo kiểu nhị phân

Thường được dùng để đọc/ghi các mẫu tin là cấu trúc, số thực, … fread và fwrite

Đọc n mẫu tin kích thước size từ file

fp lên vùng nhớ trỏ bởi ptr , hàm trả về

số mẫu tin thực sự ñược đọc

int fread( void *ptr, int

size, int n, FILE *fp)

Ghi n mẫu tin kích thước size từ vùng nhớ trỏ bởi ptr lên file fp , hàm trả về

số mẫu tin thực sự ghi

int fwrite( void *ptr, int

size, int n, FILE *fp)

Đọc một số nguyên (2 bytes) từ file

int getw(FILE *fp)

Ghi một số nguyên (2 bytes) lên file

int putw( int n, FILE *fp)

Ý nghĩa Hàm

Trang 20

Kỹ thuật lập trình C - Kiểu Dữ liệu nâng cao 39 bangtqh@hotmail.com

Kiểu File (tệp)

Giả sử file input.dat có cấu trúc như sau:

– Dòng 1 và dòng 2: Mỗi dòng ghi 01 số nguyên (lần lượt là M

và N)

– Từ dòng 3 đến cuối file: Mỗi dòng ghi N số nguyên (các số ghi cách nhau một dấu cách)

Anh/Chị hãy viết chương trình cho phép:

– Đọc các giá trị có trong file input.dat vào ma trận số nguyên

AMxN

– Tính và in ra màn hình giá trị lớn nhất (max) của mỗi cột trong

ma trận trên.

04/2010

Ngày đăng: 03/12/2015, 14:36

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm