1. Trang chủ
  2. » Công Nghệ Thông Tin

Chapter2 Kiểu dữ liệu c++

82 228 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Chương 2: Kiểu dữ liệu C++
Trường học Đại Học Bách Khoa Hà Nội
Chuyên ngành Lập trình C và C++
Thể loại Giáo trình
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 82
Dung lượng 613,1 KB

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

Nội dung

Kiểu dữ liệu c++

Trang 1

Nội dung chương 2

2.1 Tổ chức chương trình C/C++

2 2 Biế à á kiể dữ liệ bả

2.2 Biến và các kiểu dữ liệu cơ bản

2.3 Các kiểu dữ liệu dẫn xuất trực tiếp

2 4 Định nghĩa kiểu dữ liệu mới

2.4 Định nghĩa kiểu dữ liệu mới

2.5 Các lệnh ₫iều khiển chương trình

2.6 Hàm và thư viện

2.6 Hàm và thư viện

Trang 2

2.1 Tổ chức chương trình C/C++

T d á dù g i l t di t 2008

Tạo dự án dùng visual studio net 2008

Trang 3

Chương trình tính giai thừa: Phiên bản C

printf(“\n Nhap mot nguyen duong"); /* Viet ra man hinh*/

scanf("%d",&N); /* Nhap tu ban phim cho N*/

kq = gthua(N); q g ( );

printf(“\n Giai thua cua %d la %d", N, kq);

printf(“\n Ban co muon tiep tuc khong? Y/N");

c = getch();

} while (c=='y' || c=='Y');

}

int gthua(int n) {

Trang 4

Chương trình tính giai thừa: Phiên bản C++

Trang 5

Qui tắc soạn thảo mã nguồn

1 Tên biến, tên hàm, tên kiểu mới:

ƒ Tránh sử dụng các từ khóa và tên kiểu cơ sở

Chỉ ₫ dù á ký t ‘A’ ’Z’ ‘ ’ ’ ’ ‘0’ ’9’ ‘ ’

ƒ Chỉ ₫ược dùng các ký tự sau: ‘A’ ’Z’, ‘a’ ’z’, ‘0’ ’9’, ‘_’

ƒ Chỉ ₫ược bắt ₫ầu bằng chữ cái hoặc dấu _

ƒ Phân biệt giữa chữ hoa và chữ thường

ƒ Nên ₫ặt tên ngắn gọn và có ý nghĩa (có tính mô tả)

2 Sau mỗi câu lệnh có chấm phảy (;)

3 Đ { } ₫ i là hó lệ h khô ó dấ

3 Đoạn { … } ₫ược coi là nhóm lệnh, không có dấu

chấm phảy sau ₫ó, trừ khi khai báo kiểu

4 Cấu trúc mã nguồn theo kiểu phân cấp => dễ ₫ọc

4 Cấu trúc mã nguồn theo kiểu phân cấp => dễ ₫ọc

5 Bổ sung chú thích hợp lý (/* chú thích một ₫oạn */ hoặc

Trang 6

Các từ khóa trong C

break else long switch

const float short unsigned

default goto sizeof volatile

Trang 7

Từ khóa trong C++

const const cast continue default

const const_cast continue default

float dynamic cast export for

float dynamic_cast export for

short signed sizeof static

Trang 8

Biên dịch (compile)

ƒ Trong Visual studio Net 2008: Gọi Compile (Ctrl + F7) ₫ể biên dịch riêng rẽ hoặc Build (F6) ₫ể kết hợp biên dịch và liên kết

cho toàn bộ dự án

ƒ Các kiểu lỗi biên dịch (compile error):

— Lỗi cú pháp: Sử dụng tên sai qui ₫ịnh hoặc chưa khai báo, thiếu

dấu chấm phảy ; dấu ₫óng }

— Lỗi kiểu: Các số hạng trong biểu thức không tương thích kiểu, gọi hàm với tham số sai kiểu

— … …

ƒ Các kiểu cảnh báo biên dịch (warning):

— Tự ₫ộng chuyển ₫ổi kiểu làm mất chính xác

Hàm khai báo có kiểu trả về nhưng không trả về

— Hàm khai báo có kiểu trả về nhưng không trả về

— Sử dụng dấu = trong trường hợp nghi vấn là so sánh ==

— …

Trang 9

Liên kết (link)

ƒ Liên kết là quá trình ghép nhiều file ₫ích (*.obj, *.lib)

₫ể tạo ra chương trình chạy cuối cùng *.exe

₫ể tạo a c ươ g t c ạy cuố cù g e e

ƒ Trong Visual studio Net 2008: Gọi Build (F6)

ƒ Lỗi liên kết có thể là do:

— Sử dụng hàm nhưng không có ₫ịnh nghĩa hàm

— Biến hoặc hàm ₫ược ₫ịnh nghĩa nhiều lần

— …

Trang 10

Chạy thử và gỡ rối (debug)

ƒ Chạy thử trong Visual studio Net 2008: Start

without debugging hoặc Ctrl+F5

ƒ Tìm lỗi:

— Lỗi khi chạy là lỗi thuộc về phương pháp, tư duy, thuật toán, không phải về cú pháp

— Lỗi khi chạy bình thường không ₫ược báo

— Lỗi khi chạy rất khó phát hiện, vì thế trong ₫a số trường hợp

cần tiến hành debug cần tiến hành debug.

ƒ Chạy Debug trong Visual studio Net 2008:

— Chạy tới chỗ ₫ặt cursor: F9

— Chạy từng dòng lệnh: F10

— Chạy vào trong hàm: F11

Trang 11

(tham biến, biến

i

Trang 12

2.2 Biến và dữ liệu

ƒ Biểu thức = dữ liệu + phép toán

ƒ Biểu diễn dữ liệu: Thông qua biến hoặc hằng số, kèm theo kiểu

ƒ Nội dung trong phần này:

Cá kiể dữ liệ bả

— Các kiểu dữ liệu cơ bản

— Các phép toán áp dụng

— Tương thích và chuyển ₫ổi kiểu

— Khai báo biến, phân loại biến

Trang 13

2.2.1 Các kiểu dữ liệu cơ bản của C/C++

Trang 15

Tương thích và chuyển ₫ổi kiểu

ƒ Những kiểu dữ liệu tương thích nhau có thể tự ₫ộng chuyển ₫ổi kiểu:

— Giữa các kiểu số nguyên với nhau (lưu ý phạm vi giá trị)

— Giữa các kiểu số thực với nhau (lưu ý ₫ộ chính xác)

— Giữa các kiểu số nguyên và số thực (lưu ý phạm vi giá trị vàG ữa các ểu số guyê và số t ực ( ưu ý p ạ v g á t ị và

₫ộ chính xác)

— Kiểu bool sang số nguyên, số thực: true => 1, false => 0

— Số nguyên số thực sang kiểu bool:Số nguyên, số thực sang kiểu bool: ≠ 0 => true, 0 => false≠ 0 => true 0 => false

ƒ Nếu có lỗi hoặc cảnh báo => khắc phục bằng cách ép chuyển ₫ổi kiểu

— VD:

Trang 16

2.2.2 Khai báo biến

char c = 'N';

bool b = true;

int kq;

Khai báo và khởi tạo giá trị

Chỉ khai báo giá trị bất ₫ịnh

Đặt iá t ị ₫ầ t l 66 hứ khô hải 82

ƒ C: Toàn bộ biến phải khai báo ngay ₫ầu thân hàm

ƒ C++: Có thể khai báo tại chỗ nào cần

unsigned voctal=082; Đặt giá trị ₫ầu octal -> 66 chứ không phải 82

C++: Có thể khai báo tại chỗ nào cần

ƒ Phân loại biến:

— Biến toàn cục: Khai báo ngoài hàm, lưu giữ trong vùng nhớ dữ liệu chương trình

— Biến cục bộ: Khai báo trong thân hàm, lưu giữ trong ngăn xếp

(vùng nhớ tự do)

— Tham biến: Khai báo trên danh sách tham số của hàm, lưu giữ , g

Trang 17

Ví dụ khai báo các loại biến

Trang 18

2.3 Các kiểu dữ liệu dẫn xuất trực tiếp

ƒ Kiểu liệt kê

Trang 19

2.3.1 Kiểu liệt kê (enum)

enum Color {Red Green Blue};

enum WeekDay {Mon = 2,Tue, Wed, Thu, Fri, Sat, Sun = 1 };

Trang 20

2.3.2 Kiểu hằng (const)

ƒ Khi muốn một biến không bị thay ₫ổi trong suốt

chương trình => khai báo hằng số

Trang 21

2.3.3 Kiểu con trỏ

ƒ Trong chương trình, mỗi biến chiếm một số byte

nhất ₫ịnh và lưu ở một vị trí cụ thể trong bộ nhớ

máy tính

ƒ Con trỏ là một biến mang ₫ịa chỉ của một ô nhớ

(của một biến khác hoặc một hàm)

ƒ Cách khai báo: Data_type* pointer_var_name;

int x = 2;

Trang 22

Kết luận về con trỏ

ƒ Con trỏ là một biến chứa ₫ịa chỉ byte ₫ầu của một biến dữ liệu,

₫ược sử dụng ₫ể truy cập gián tiếp dữ liệu ₫ó

ƒ Nếu khai báo con trỏ mà không khởi tạo mặc ₫ịnh con trỏ mang

ƒ Nếu khai báo con trỏ mà không khởi tạo, mặc ₫ịnh con trỏ mangmột ₫ịa chỉ bất ₫ịnh

ƒ Để khởi tạo giá trị cho con trỏ, ta có thể cho nó trỏ vào một ₫ịa chỉ nhớ cụ thể hoặc ₫ịa chỉ của một biến khác thông qua toán tửchỉ nhớ cụ thể hoặc ₫ịa chỉ của một biến khác thông qua toán tử lấy ₫ịa chỉ &

ƒ Con trỏ có thể mỗi lúc ₫ại diện cho một biến dữ liệu khác, do ₫ó

₫ịa chỉ mà con trỏ mang có thể thay ₫ổi ₫ược

₫ịa chỉ mà con trỏ mang có thể thay ₫ổi ₫ược

ƒ Dùng toán tử * ₫ể truy nhập nội dung của biến mà con trỏ trỏ tới, có thể ₫ọc hoặc thay ₫ổi nội dung của biến ₫ó

ƒ Không bao giờ sử dụng toán tử truy nhập nội dung, nếu con trỏchưa mang một ₫ịa chỉ ô nhớ mà chương trình có quyền kiểm

soát

Trang 24

Khai báo mảng

ƒ Số phần tử của mảng phải là hằng số nguyên.

ƒ Khai báo không khởi tạo:

Trang 25

Khai báo mảng (tiếp)

ƒ Khai báo và khởi tạo giá trị các phần tử, số phần tử ₫ược tự

Trang 26

Mảng ₫ặc biệt: Chuỗi ký tự

ƒ Trong C/C++, chuỗi ký tự không phải là kiểu cơ bản,

mà thực chất là một mảng

ƒ Phân biệt chuỗi ký tự thường và chuỗi ký tự kết 0

ƒ Phân biệt chuỗi ký tự thường và chuỗi ký tự kết 0

ƒ Với C++, chuỗi ký tự ₫ược ₫ịnh nghĩa bằng lớp

string trong thư viện chuẩn, không sử dụng byte kết g g ệ , g ụ g y

0

Trang 27

Con trỏ và mảng

ƒ Tên mảng là ₫ịa chỉ của phần tử ₫ầu tiên của

mảng.

void main() { int a[3]; // a co 3 phan tu, gia tri chua xac dinh int* p;

p = a; // p tro den a[0]

p = &a[0]; // tuong tu nhu tren

*p = 1; // a[0]=1++p; // p tro den a[1]

*p = 2; // a[1]=2p++; // p tro den a[2]

*p = 3; // a[2]=3}

Trang 28

Kết luận về mảng

ể ắ ế ề ề

ƒ Mảng là một tập hợp các dữ liệu cùng kiểu, sắp xếp liền kề

trong bộ nhớ

ƒ Số phần tử của mảng (tĩnh) là cố ₫ịnh (khi khai báo phải là

hằng số) không bao giờ thay ₫ổi ₫ược

ƒ Có thể truy cập các phần tử mảng thông qua tên mảng kèm theochỉ số hoặc thông qua biến con trỏ (theo ₫ịa chỉ của từng phầntử)

ƒ Biến mảng (tĩnh) thực chất là một con trỏ hằng, mang ₫ịa chỉ

của phần tử ₫ầu tiên

ƒ Có thể ₫ặt giá trị ₫ầu cho các phần tử của mảng qua danh sáchkhởi tạo

ƒ Không gán ₫ược hai mảng cho nhau Nếu cần sao chép hai

mảng thì phải sử dụng hàmg p g

ƒ Không bao giờ ₫ược phép truy nhập với chỉ số nằm ngoài phạm

vi, nếu N là số phần tử thì phạm vi cho phép là từ 0 N-1

ƒ Con trỏ không phải là một mảng, nó chỉ có thể mang ₫ịa chỉ

Trang 29

2.3.5 Kiểu tham chiếu (C++)

Một biế th hiế là ột biế ₫ i diệ t tiế h ột biế

ƒ Một biến tham chiếu là một biến ₫ại diện trực tiếp cho một biếnkhác (dùng ₫ể làm bí danh cho biến ₫ó và nó sử dụng vùng nhớ của biến này)

Trang 30

Hằng tham chiếu

ƒ Có thể tham chiếu ₫ến một biến hoặc một hằng

ƒ Không cho phép dùng hằng tham chiếu ₫ể thay ₫ổi giá trị vùng nhớ mà nó tham chiếu.

ƒ Ý nghĩa: thường ₫ược sử dụng làm ₫ối của hàm ₫ể cho phép hàm sử dụng giá trị của các tham số trong lời gọi

phép hàm sử dụng giá trị của các tham số trong lời gọi hàm nhưng tránh không làm thay ₫ổi giá trị của các tham số

ƒ VD: int n=10, m;

const int &r=n;

n++;//OK m=2*n;//m=20

Trang 31

Kết luận về biến tham chiếu

ƒ Khi khai báo phải chỉ rõ nó tham chiếu ₫ến biến nào.

ƒ Có thể tham chiếu ₫ến một phần tử của mảng

ƒ Không cho phép khai báo mảng tham chiếu

ƒ Có thể tham chiếu ₫ến một hằng Khi ₫ó nó sẽ sử dụng

vùng nhớ của hằng và nó có thể làm thay ₫ổi giá trị

chứa trong vùng nhớ này.

Trang 32

2.3.6 Typedef

ƒ Từ khóa typedef tạo ra một tên mới cho một kiểu dữ

liệu có sẵn, không ₫ịnh nghĩa một kiểu mới

ƒ Ý nghĩa: ₫ưa tên mới dễ nhớ, phù hợp với ứng dụng

typedef int tuoi; /* T tê ới h kiể i t là “t i" */

typedef int tuoi; /* Tạo tên mới cho kiểu int là “tuoi" */

typedef char ten[30]; /*Tạo tên mới cho kiểu char là “ten"*/

tuoi sv_tuoi, gv_tuoi;

ten sv_ten, gv_ten;, g ;

}

Trang 33

2.4 Định nghĩa kiểu dữ liệu mới

ƒ Cấu trúc (struct):

— Tập hợp những dữ liệu dùng ₫ể mô tả một ₫ối tượng, truy nhập

th tê (biế thà h iê )

theo tên (biến thành viên)

— Thông dụng nhất trong C, ý nghĩa ₫ược mở rộng trong C++

Trang 34

ƒ Khởi tạo giá trị cho biến struct giống như với mảng,

₫ặt các giá trị trong dấu { }, phân cách nhau bằng dấu

Trang 35

Ví dụ minh họa struct

Trang 36

Kết luận về struct

ƒ Cấu trúc (struct) ₫ược sử dụng ₫ể nhóm các dữ liệu liên quan

mô tả một ₫ối tượng, các dữ liệu có thể cùng hoặc khác kiểu

ƒ Định nghĩa kiểu cấu trúc bằng cách khai báo tên các biến

thành viên Định nghĩa kiểu cấu trúc chưa phải là ₫ịnh nghĩa

các biến cụ thể, vì thế không ₫ược ₫ặt giá trị ₫ầu cho các biến

ƒ Kích cỡ của cấu trúc >= tổng kích cỡ các thành viên

ƒ Kích cỡ của cấu trúc >= tổng kích cỡ các thành viên

ƒ Truy cập một biến cấu trúc:

dụng ₫ể khởi tạo cho nhau (khác hẳn với mảng)

ƒ Có thể sử dụng con trỏ ₫ể truy nhập dữ liệu cấu trúc thông qua toán tử toán tử (*.) hoặc (->)

Trang 37

Hợp nhất (union)

ƒ Cú pháp khai báo:

union union_name{

//Khai báo các thành phần của unionpType1 field1;

unsigned long u;

unsigned char a[4];

};

void main() { VD vd1;

vd1.u=0xDDCCBBAA;

Trang 38

Kết luận về hợp nhất

ƒ Hợp nhất (union) là một tập hợp (không có cấu trúc chặt chẽ)

chứa các biến sử dụng chung ô nhớ, ở mỗi ngữ cảnh chỉ sử dụng một biến riêng biệtộ g ệ

ƒ Union thường ₫ược sử dụng khi dữ liệu ₫ầu vào có thể có kiểu khác nhau

ƒ Các thành viên của một union không liên quan ₫ến nhau không

ƒ Các thành viên của một union không liên quan ₫ến nhau, không cùng nhau tạo thành một thực thể thống nhất

ƒ Kích cỡ của union bằng kích cỡ của biến lớn nhất

biến trực tiếp hoặc qua biến con trỏ

ƒ Union có thể chứa struct, struct có thể chứa union, union có thể chứa mảng, các phần tử của mảng có thể là union

Trang 39

Các lệnh ₫iều khiển chương trình

Trang 42

case 'Y':

cout<< "Yes" ;

; break;

case constant-expr2:

stmt;

break;

cout<< Yes ; break;

case 'N':

cout<<"No" ;

;

default:

stmt }

break;

default:

cout<< "What?" ; }

Trang 43

Cấu trúc switch-case (…)

ƒ Có thể dùng nhiều nhãn case trên cùng một nhánh

switch( c ) {

case 'Y':

case 'y':

cout<< "Yes" ; break;

Trang 44

cout<<x;

x++;

}}

Trang 45

ƒ Lệnh (khối lệnh) stmt ₫ược thực hiện cho ₫ến khi

expression còn ₫úng.

ƒ Ví dụ:

lng = 0;

do{

c = getchar();

++lng;

Trang 46

ƒ Tính toán init-expr nếu có

ƒ Tính toán cont-expr nếu có

ƒ Nếu cont-expr là true hoặc ₫ược bỏ qua thì thực hiện stmt, p ặ ợ q ự ệ ,sau ₫ó loop-expr ₫ược thực hiện

ƒ Lặp lại bước 2 ₫ến khi cont-expr là false

Trang 47

Cấu trúc for (…)

ƒ Ví dụ:

/* Bảng cửu chương*/

const int max=9

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

9 times 0 is 0

9 times 1 is 9

9 times 2 is 18 for ( i = 0; i <= max; i++ )

cout<<i<< “ times”<<j<<“ is”<<i*j<“\n”;

9 times 8 is 72

Trang 48

2.6 Hàm và thư viện

ƒ Một ₫ơn vị tổ chức chương trình, một ₫oạn mã

Hàm là gì?

chương trình có cấu trúc ₫ể thực hiện một chức

năng nhất ₫ịnh, có giá trị sử dụng lại

ƒ Các hàm có quan hệ với nhau thông qua lời gọi các

ƒ Các hàm có quan hệ với nhau thông qua lời gọi, các biến tham số (₫ầu vào, ₫ầu ra) và giá trị trả về

ƒ Cách thực hiện cụ thể một hàm phụ thuộc nhiều vào

dữ kiện (tham số, ₫ối số của hàm):

— Thông thường, kết quả thực hiện hàm mỗi lần ₫ều giống

nhau nếu các tham số ₫ầu vào như nhau

— Một hàm không có tham số thì giá trị sử dụng lại rất thấp

ƒ Trong C/C++: Không phân biệt giữa thủ tục và hàm,

Trang 52

void Hien thi (int a, int b, int kq) {

cout << "Tong tu " << a << " den " << b

<< " la " << kq << endl;

}

Trang 53

Ưu nhược ₫iểm của phân hoạch hàm

ƒ Chương trình dễ ₫ọc hơn => dễ phát hiện lỗi

ƒ Chạy chậm hơn ạy ậ

 Không phải cứ phân hoạch thành nhiều hàm là tốt,

mà vấn ₫ề nằm ở cách phân hoạch và thiết kế hàm

Trang 54

3.2 Khai báo và ₫ịnh nghĩa hàm

ƒ Định nghĩa hàm: tạo mã thực thi hàm

Tê hà Th biế (hì h thứ ) Kiể t ả ề

int Tinh_tong(int a, int b) {

ƒ Khai báo hàm thuần túy: không tạo mã hàm

int Tinh_tong (int a, int b);

ƒ Tại sao và khi nào cần khai báo hàm?

Tên hàm Kiểu tham biến Kiểu trả về

Trang 55

Khai báo hàm và lời gọi hàm

ƒ Ý nghĩa của khai báo hàm:

— Khi cần sử dụng hàm (gọi hàm)

T h b d h ầ l kh b h ₫ể k ể l h

— Trình biên dịch cần lời khai báo hàm ₫ể kiểm tra lời gọi hàm

₫úng hay sai về cú pháp, về số lượng các tham số, kiểu các tham số và cách sử dụng giá trị trả về

int Tinh_tong(int a, int b);

— Có thể khai báo hàm ₫ộc lập với việc ₫ịnh nghĩa hàm (tất

nhiên phải ₫ảm bảo nhất quán)

ƒ Có thể ₫ịnh nghĩa hàm sau lời gọi hàm

ƒ Gọi hàm: yêu cầu thực thi mã hàm với tham số thực tế (tham

trị)ị)

int x = 5;

Trang 56

Khai báo hàm C/C++ ở ₫âu?

ƒ Ở phạm vi toàn cục (ngoài bất cứ hàm nào)

ƒ Một hàm phải ₫ược khai báo trước lời gọi ₫ầu tiên Một hàm phải ₫ược khai báo trước lời gọi ₫ầu tiên

trong một tệp tin mã nguồn

ƒ Nếu sử dụng nhiều hàm thì sẽ cần rất nhiều dòng mã

khai báo (mất công viết, dễ sai và mã chương trình

lớn lên?):

— Nếu người xây dựng hàm (₫ịnh nghĩa hàm) ₫ưa sẵn tất cả g y ự g ( ị g )

phần khai báo vào trong một tệp tin => Header file (*.h,

*.hx, ) thì người sử dụng chỉ cần bổ sung dòng lệnh

#include <filename>

— Mã chương trình không lớn lên, bởi khai báo không sinh mã!

ƒ Một hàm có thể khai báo nhiều lần tùy ý!

Trang 57

Định nghĩa hàm ở ₫âu?

ƒ Ở phạm vi toàn cục (ngoài bất cứ hàm nào)

ƒ Có thể ₫ịnh nghĩa trong cùng tệp tin với mã chương trình chính, hoặc tách ra một tệp tin riêng Trong Visual C++:

*.c => C compiler,

*.cpp => C++ compiler

ƒ Một hàm ₫ã có lời gọi thì phải ₫ược ₫ịnh nghĩa chính xác 1 lầnMột hàm ₫ã có lời gọi thì phải ₫ược ₫ịnh nghĩa chính xác 1 lần trong toàn bộ (dự án) chương trình, trước khi gọi trình liên kết (lệnh Build trong Visual C++)

ƒ Đưa tệp tin mã nguồn vào dự án, không nên:

Trang 58

Tham biến hình thức và tham số thực tế

int Tinh_tong (int a, int b) {

int k = Tinh_tong (x, 10);

Tham số (thực tế)

int a = 2;

(thực tế)

k = Tinh_tong (a,x);

Trang 59

a = 5

b = 10

k = 45

// Dinh nghia ham

int Tinh_tong(int a, int b) {

x = 5 Ngăn xếp

Ngày đăng: 27/03/2014, 12:10

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w