LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBài 2 Các kiểu dữ liệu-Khai báo biến Nội dung - Các kiểu dữ liệu: giá trị , tham chiếu - Khai báo biến : qui tắc, cách đặt tên - Các kiểu dữ liệu cơ bản... Ngoài
Trang 1LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 2 Các kiểu dữ liệu-Khai báo biến
Nội dung
- Các kiểu dữ liệu: giá trị , tham chiếu
- Khai báo biến : qui tắc, cách đặt tên
- Các kiểu dữ liệu cơ bản
Trang 2Các kiểu dữ liệu
• C# cung cấp 2 kiểu thể hiện dữ liệu
• Kiểu dữ liệu có sẵn – chuẩn Ví dụ kiểu số nguyên : có thể lưu trữ 1 giá trị số nguyên Ngoài thông tin lưu trữ ra , các biến kiểu này không có thêm bất kỳ thông tin nào khác
• Kiểu do NSD định nghĩa , thường gọi là lớp (class): có thể chứa thông tin cùng nhiều nhiều thông tin khác
Trang 3Các kiểu dữ liệu(tt)
• Ví dụ : Có thể xây dựng 1 lớp để thể hiện lớp mèo nhà , trong lớp này, ta có những thông tin như : tuổi, màu lông Cũng tropng lớp này, ta lại mô tả những khả năng của lớp mèo như : kêu meo meo, ăn hay ngủ
• Các khả năng của 1 lớp thiết kế và thi công : gọi là phương thức của 1 lớp
• Kiểu do NSD định nghĩa bao gồm các lớp và giao diện do người lập trỉnh xây dựng và đóng góp thêm vào thư viện NET Framework
Trang 4Cách lưu trữ và truy xuất dữ liệu
• Kiểu dữ liệu giá trị : lưu trữ trên stack, biến chứa giá trị trong chính nó
• Kiểu dữ liệu tham chiếu: có 2 phần phần tham chiếu (con trỏ, số hiệu – handle) chứa trên stack, bản thân thông tin đối tượng lưu trữ trên heap (do C# quản lý) Phần tham chiếu chứa địa chỉ của đối tượng trên heap
• Satck được C# quản lý nhằm chứa tất cả các biến được tạo ra trong chương trình
• Biến lưu trên heap được tạo bởi lập trình viên
Trang 5Lưu trữ biến trên stack và heap
• Biến kiểu nguyên (integer : kiểu giá trị) ,biến kiểu chuổi (string : kiểu tham chiếu), biến ký tự (kiểu giá trị)
Trang 6Sao chép dữ liệu – phép gán
• Ngoài sự khác biệt về việc lưu trữ thông tin, kiểu giá trị và tham chiếu còn có khác biệt cơ bản trong thao tác “sao chép”
• Khi 1 biến kiểu giá trị đưọc gán bởi 1 biến khác : Giá trị lưu trữ sẽ được sao chép từ biến này sang biến kia.
Trang 7Deep Copy
• Cả 2 biến count1 và count2 đều có dữ liệu riêng của chúng, trong trường hợp này là 5 Vùng dữ liệu của 2 biến độc lập nhau Nghĩa là nếu gán 6 cho count1 thì count2 vẫn có giá trị 5
• Kiểu sao chép này được gọi là “deep copy” (sao chép sâu): Giá trị, thông tin của biến dữ liệu được sao chép
Trang 8Shallow Copy
• Các biến tham chiếu thực hiện lệnh gán theo
1 cách khác
• Lưu ý là kiêu tham chiếu gồm 2 thành phần :
dữ liệu thực sử trên heap và địa chỉ tham
chiếu đến vùng dữ liệu này chứa trong stack
• Khi gán 1 biến tham chiếu này cho biến
tham chiếu khác : chỉ sao chép địa chỉ tham chiếu mà thôi cả 2 biến đều tham chiếu
đến cùng 1 vùng dữ liệu trên heap(shallow
copy)
• Ví dụ
Trang 9Ví dụ lệnh gán
Trang 10Ví dụ lệnh gán
Trang 11Ví dụ (phép gán với biến class)
class Point
{
public int x,y;
public Point(int u, int v){x=u;y=v;}
}
Trang 12public class VD4
{
static public void Main() {
Point a=new Point (1,2);
Point b=new Point (3,4);
Point c=new Point (1,2);
Console.WriteLine("a = b > {0}", a= =b); Console.WriteLine("a = c > {0}", a= =c);
Trang 14Khai báo biến
• Phần trình bày tiếp theo sẽ đề cập
• Như đã nói ở phần trên các kiểu
built-in là các kiểu giá trị: 1 biến kiểu này có thể xem như 1 vùng nhớ chứa trực tiếp giá trị dữ liệu
Trang 15Khai báo biến (tt)
• int count = 5;
float temperature = 99.5F;
• Giá trị kiểu float phải theo sau bằng ký tự "F"
Nếu không : hiểu là “doubles”
• Kiểu double cũng chứa giá trị số thực nhưng có
phạm vì biểu diễn rộng hơn và có độ chính xác cao hơn
Trang 16Ví dụ
static public void Main()
{ float x=23.12345678F, y=23.12345679F;
Trang 17Lưu trữ biến giá trị
•Tóm lại : biến kiểu giá trị là 1 vùng bộ nhớ chứa
Trang 18Qui tắc đặt tên biến
• Vấn đề : tên phải đặt sao cho hợp lệ và
có tính gợi nhớ, tránh sai sót
• Qui tắc đật tên trong C#
Tên (danh hiệu) bao gồm ký tự, ký số và lý tự gạch dướiunderscores (_)
Tên(danh hiệu phải bắt đầu bằng 1 ký tự hay
ký tự gạch dưới
Tên(danh hiệu) không được trùng với các từ khóa (keyword , reserved word).
Trang 19Tên biến nào hợp lệ?
Trang 21Lưu ý !!!!
• C# phân biệt chữ thường chữ hoa, vì vậy các khai báo dưới đây sẽ tạo ra 3 biến khác biệt nhau
Trang 22Thủ thuật đặt tên biến
• Việc đặt tên biến rất quan trọng : sử dụng trong chương trình, tìm lỗi,bảo trì,…
• Ví dụ :Biến lưu trữ năm sinh của 1 học viên
Trang 23Thủ thuật đặt tên biến (tt)
• Qui tắc do Microsoft đề xuất : không bắt đầu
bằng ký tự _, ký tự đầu tiên là ký tự thường,
các ký tự đầu tiên trong các từ tiếp theo ở dạng chữ hoa.
• Tránh dùng lại 1 tên biến dù sử dụng tính chất :
C# phân biệt ký tự thường/hoa.
int namSinh , namsinh, NamSinh ;
Trang 24Các kiểu dữ liệu giá trị
• Kiểu Kích cỡ Mô tả
• bool 1 byte true or false
• byte 1 byte Số nguyên không dấu (0-255)
• char 2 bytes ký tự trong bảng mã Unicode
• decimal 16 bytes độ chính xác đến 28 ký số
• double 8 bytes số thực (chính xác gấp 2)
• float 4 bytes số thực
• int 4 bytes Số nguyên:-2 tỷ đến 2 tỷ (xấp xỉ)
• long 8 bytes Số nguyên có dấu
• sbyte 1 byte -128 đến 127
• short 2 bytes -32000 đến 32000 (xấp xỉ)
• uint 4 bytes 0 4 tỳ
• ulong 8 bytes Số nguyên không dấu
• ushort 2 bytes Số nguyên từ 0 64000(xấp xỉ)
Trang 25Từ khoá (Keywords )
• readonly ref return sbyte sealed short sizeof stack
Trang 26Cú pháp khai báo biến giá trị
• Cú pháp khai báo biến:
<Kiểu dữ liệu> <tên biến>;
• Ví dụ :
int count;
float bendingMoment;
char myInitial;
• Lưu ý : kết thức khai báo biến bằng ký tự ;
• Các biến địa phương (local variables) là các biến nằm trong 1 phương thức (method) phải được khai báo trước khi sử dụng
Trang 27Khởi tạo và phép gán
• Khi khai báo và gán luôn giá trị cho 1 biến :
thường gọi là khởi tạo biến(initialization).
int count = 0;
double bodyTemperature=99.5; //gọi là khởi tạo-initialization string messages = "The elephant was pink";
• Cũng có thể khai báo và gán giá trị cho biến tại
các phần khác nhau trong chương trình
• int count; //Khai báo
Trang 28• Trong C#: Tất cả các biến đều phải lưu trữ dữ liệu nghĩa là chúng phải được khởi tạo hay gán trị trước khi sử dụng
• Nếu không tuân thủ : thông báo lỗi từ trình dịch
public static void Main()
Trang 29• Trong C/C++: Biến có thể sử dụng mà không cần được gán trước 1 giá trị mà không bị cảnh báo từ trình biên dịch Đây chính là nguyên nhân gây lỗi trong chương trìnhvà điểm yếu của ngôn ngữ C/C++
• Xem thử tình huống minh họa sau
Trang 31Chuyển kiểu(Conversions)
• Biến có thể được khởi tạo hay gán bới 1 giá trị cùng
kiểu với nó hay từ 1 giá trị thuộc các kiểu khác được ‘chuyển đỏi’ sang kiểu của nó
• Việc chuyển kiểu có thể là ngầm định hay rõ ràng
(implicit /explicit)
• Chuyển kiểu ngầm định xảy ra khi 1 giá trị của 1
kiểu có thể chuyển sang 1 kiểu khác mà không mất thông tin
• Ví dụ kiểu short và int ta có thể chuyển kiểu ngầm
định từ short sang int mà không mất thông tin
• Tương tự kiểu float và double.
• Chuyển kiểu ngầm định từ 1 kiểu có phạm vi biểu
diễn rộng sang 1 kiểu phạm vi nhỏ hơn sẽ gây ra lỗi Do vậy phải chuyển kiểu 1 cách rõ ràng (ép kiểu)
Trang 32Ví dụ về việc chuyển kiểu
Trang 34Nhận xét kết quả in ra !!!
i = (int) f; //Explicit Conversion
System.Console.WriteLine("i is {0}",i); }
Trang 35• Nhận xét : Giá trị biến d có các điểm
khác biệt so với giá trị biến f Lý do : f có
độ chính xác thấp hơn nên các bit dư trong d sẽ có giá trị ngẫu nhiên
• Nhận xét : Biến i mang giá trị 52
Trang 36Làm quen kiểu string
string str="Thu Khao Sat Du Lieu Chuoi Ky Tu";
System.Console.WriteLine("Chuoi ban dau : {0}",str);
System.Console.WriteLine("Doi sang dang chu hoa la :"+str.ToUpper());
System.Console.WriteLine("Doi sang dang chu thuong la :"+str.ToLower()); System.Console.WriteLine("Co tat ca la {0} ky tu ",str.Length);
//System.Console.WriteLine("abc < aBC = {0}" ,"abc"<"aBc");
System.Console.WriteLine("abc < aBC -> {0}" ,"abc".CompareTo("aBc")); System.Console.WriteLine("xyz = xyz -> {0}" ,"xyz".CompareTo("xyz"));
Trang 37Làm quen kiểu float
float f=1.4F;
string fnum= f.ToString();
System.Console.WriteLine("float f = {0} string fnum = {1}",f,fnum);
System.Console.WriteLine("So nho nhat kieu float bieu dien la :