LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 3 Các phép toán – khai báo hằng
Nội dung
Các phép toán trên các kiểu dữ liệu cơ
bản
Kiểu liệt kê (enumeration)
Hằng
Các phép toán -Operators
Tạo 1 project mới để thử nghiệm các phép toán
Đặt tên cho tập tin class này . Ví dụ OperarorDemo.cs
•
Nhập thử chương trình sau
namespace Example1
{
class OperatorDemo
{
static void Main(string[] args)
{
float a = 5.5f;
float b = 2.0f;
float c;
int i = 7;
int j = 2;
int k;
c = a + b;
Console.WriteLine("c = {0}",c);
c = a - b;
Console.WriteLine("c = {0}",c);
c = a * b;
Console.WriteLine("c = {0}",c);
c = a / b;
Console.WriteLine("c = {0}",c);
k = i + j;
Console.WriteLine("k = {0}",k);
k = i - j;
Console.WriteLine("k = {0}",k);
k = i * j;
Console.WriteLine("k = {0}",k);
}
}
}
•
Kết quả in ra :
c = 7.5
c = 3.5
c = 11
c = 2.75
k = 9
k = 5
k = 14
Press any key to continue
Nhận xét
•
Lưu ý phép chia các số nguyên
•
int i = 7;
int j = 2;
int k;
k = i / j;
Console.WriteLine("k is {0}",k}
•
Kết quả in ra :
k is 3
•
Phép chia 7/2 cho kết quả là 3.
•
int i = 7;
int j = 2;
double d;
d = i / j;
•
System.Console.WriteLine(d); /////????
Phép chia lấy phần dư
•
Phép chia lếy phần dư : Áp dụng cho 2
số nguyên.
•
Ký hiệu : %
•
Ví dụ
•
7 % 2 = 1
•
11 % 3 = 2
•
8 % 4 = 0
Ví dụ
•
using System;
namespace Example2
{
class ModuleExample
{
static void Main(string[] args)
{
int a = 7;
int b = 2;
int c;
c = a % b;
Console.WriteLine("c is {0}",c);
} } }
•
Kết quả:
c is 1
Phép toán tự gán
Self Assignment
•
Lý do : Trong lập trình thường xuất hiện các chỉ
thị như vậy.
•
double d = 59.0;
d = d * 2.0;
d = d - 5.0;
•
C# cung cấp nhiều phép toán tự gán như +=,
-=, *=, /=
•
Ví dụ Dùng phép toán tự gán
•
d = d * 2.0; d *= 2.0;
•
d = d + 7.0; d += 7.0;
•
d = d - 5.0; d -= 5.0;
•
d = d / 2.0; d /= 2.0;
Ví dụ
•
using System;
namespace Example3
{
class ShortHandExample
{
static void Main(string[] args)
{
int i = 2;
i += 2;
Console.WriteLine("i is {0}",i);
i *= 3;
Console.WriteLine("i is {0}",i);
} } }
•
Kết quả :
i is 4
i is 12
Kết hợp phép toán-độ ưu tiên
•
Xét thử biểu thức sau 5 * 2 + 6 * 3
Có thể là
5 * 2 + 6 * 3
10 + 6 * 3
10 + 18
28
Có thể là
5 * 2 + 6 * 3
5 * 8 * 3
40 * 3
120
Có thể là
5 * 2 + 6 * 3
10 + 6 * 3
16 * 3
48
•
Trường hợp 1 chính là cách biểu thức được tính
toán trong chương trình
•
Lý do : Độ ưu tiên của các toán tử
•
Ghi nhớ PEMDAS. : các phép toán có độ ưu tiên
theo qui tắc sau:
parenthesis exponents multiplication division
addition subtraction
Xem lại ví dụ
5 * 2 + 6 * 3
Phép nhân có độ ưu tiên cao hơn.
10 + 18
Sau đó thi hành phép cộng.
28
• Sử dụng dấu ( và ) để thay đổi thứ tự tính toán.
5 * ( 2 + 6 ) * 3
5 * 8 * 3
40 * 3
120
•
Xem ví dụ sau.
4 * 3 / 2
Có thể là
4 * 3 / 2
4 * 1
4
Có thể là
4 * 3 / 2
12 / 2
6
Trả lời
•
Giá trị biểu thức phụ thuộc vào qui tắc
thực hiện từ trái sang phải hay từ phải
sang trái
•
Các toán tử nhị phân (nhận 2 toán
hạng) trừ toán tử gán là các toán tử liên
kết trái
Ví dụ 3 + 8 – 12 * 8
•
Các toán tử gán và điều kiện là toán tử
phải
Ví dụ a = b = c
using System
class Test
{
static vod Main()
{
int a=1, b = 2, c =3 ;
Console.Writeln(“ a = {0}, b={1},c= {3}”,a,b,c);
a = b = c;
Console.Writeln(“ a = {0}, b={1},c= {3}”,a,b,c);
} }
Kết quả in ra ????
Toán tử tự tăng/giảm
•
int a = 5;
float b = 16.0f;
Console.WriteLine("a = {0}", a);
a++;
Console.WriteLine("a = {0}", a);
a ;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
b++;
Console.WriteLine("b = {0}", b);
b ;
Console.WriteLine("b = {0}", b);
•
Kết quả:
a = 5
a = 6
a = 5
b = 16.0
b = 17.0
b = 16.0
•
Toán tử ++ av2 – có thề đi trước hay sau 1 biến
Postfix: a++, a
Prefix: ++a, a
int a = 5, b;
b = a++;
•
Sau phép gán thì b = 5, a = 6;
int a = 5, b;
b = ++a;
•
Sau phép gán thì b = 6, a = 6;
Bảng tổng kết toán tử và độ ưu tiên
Loại toán tử Toán Tử
Gốc (Primary) (x) x.y f(x) a[x] x++ x– new …
Đơn nguyên (1 toán hạng) + - ! ~ ++x x (T)x
Tích * / %
Tổng + -
Dịch chuyển (Shift) << >>
Quan hệ > < >= <=
Bằng = =
AND, OR, XOR logic & | ^
AND, OR điều kiện && ||
Điều kiện ? :
Gán = *= /= %= += -= <<= >>= …
Kiểu liệt kê- Enumerations
•
Là 1 trong các kiểu dữ liệu do NSD xây dựng. Nhắc lại:
User-defined data types trong C# : lớp(classes), giao
diện (interfaces), cấu trúc(structs) và liệt kê
(enumerations).
•
Kiểu liệt kê cho phép thể hiện 1 danh sách các phần tử
có quan hệ với nhau , số lượng phần tử giới hạn và dùng
các tên gợi nhớ (symbolic constants) để mô tả.
•
Ví dụ
•
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
•
Ngầm định : tên đầu tiên trong tập liệt kê có giá trị là 0.
Các giá trị kế tiếp tự động tăng lên 1. Trong ví dụ trên
Sun = 0, Mon = 1, Tue = 2, và tiếp theo.
•
Có khả năng thiết lập giá trị cho từng phần tử trong tập
liệt kê.
•
enum Days {Sun = 1, Mon, Tue, Wed = 57, Thu, Fri, Sat}
•
Trong ví dụ trên Sun = 1, Mon = 2, Tue =
3, Wed = 57, Thu = 58, Fri = 59, Sat =
60
•
Cũng có thể gán 1 giá trị cho nhiều phần
tử khác nhau trong 1 tập liệt kê.
•
enum Days {Sat = 0, Sun = 0, Mon, Tue, Wed, Thu,
Fri}
• Sat=0,Sun=0, Mon=1,Tue=2,….Fri=5.
• Ngầm định : các phần tử trong tập liệt kê
tương ứng với 1 giá trị kiểu int . Tuy vậy,
có thể sử dụng 1 kiểu nguyên khác.
•
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}????//int
enum Days : int {Sun, Mon, Tue, Wed, Thu, Fri,
Sat}????//tương đương
enum Days : short {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
enum Days : ulong {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
Sử dụng kiểu liệt kê
•
Một trong những ưu đêểm của kiểu liệt kê là ta có thể
khai báo các biến thuộc kiểu này (do nó là 1 kiểu dữ liệu)
•
Ta cũng có thể gán 1 giá trị trong kiểu liệt kê cho biến
tương ứng
•
enum Days {Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat}
Days dayOfWeek;
dayOfWeek = Days.Mon; // Gán 2 cho biến dayOfWeek
dayOfWeek = 8; // báo lỗi
•
chỉ có thể gán dayOfWeek với 1 trong các giá trị của kiểu liệt kê
Days, ví dụ Days.Tue
Ví dụ
using System;
namespace Example2
{
enum Days {Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat}
class EnumerationDemo
{
static void Main(string[] args)
{
Days dayOfWeek;
dayOfWeek = Days.Sun;
Console.WriteLine("The day of the week is
{0}",dayOfWeek);
dayOfWeek = Days.Fri;
Console.WriteLine("The day of the week is
{0}",dayOfWeek);
Console.WriteLine("Friday has value {0}",(int) dayOfWeek);
} } }
•
Kết quả in ra :
The day of the week is Sun
The day of the week is Fri
Friday has value 6
•
Ngầm định : Phương thức WriteLine sẽ
in ra tên phần tử trong kiểu liệt kê.
Trong ví dụ trên sẽ in ra Sun và Fri , chứ
không in ra 1 và 6.
•
Để in giá trị ứng với 1 phần tử kiểu liệt
kê, ta phải thực hiện ép kiểu.
Hằng - Constants
•
Thường có nhu cầu về việc thể hiện các
đại lương có giá trị không đổi trong khi
chương trình thi hành
•
Ví dụ : tốc độ ánh sáng, phần trăm lãi
suất/tháng
•
Có thể sử dụng hằng trong chương trình
theo 3 cách : mô tả giá trị trực
tiếp(literal constant), sử dụng tên mô tả
(symbolic constant), sử dụng tên trong
kiểu liệt kê