Dịch bit | <<>> | Trái | |
6 | Quan hệ | <><= >= is as | Trái |
7 | So sánh bằng | == != | Phải |
8 | Phép toán logicAND | & | Trái |
9 | Phép toán logicXOR | ^ | Trái |
10 | Phép toán logic OR | | | Trái |
11 | Điều kiện AND | && | Trái |
12 | Điều kiện OR | || | Trái |
13 | Điều kiện | ?: | Phải |
14 | Phép gán | = *= /= %= += -= <<= >>= &= ^= |= | Phải |
Có thể bạn quan tâm!
- Lập trình cơ bản - 2
- Các Bước Lựa Chọn Một Project Mới Visual Studio 2010
- Các Phép Toán Quan Hệ Và Logic Các Phép Toán Quan Hệ
- Kết Quả Chương Trình Ví Dụ2.12.
- Kết Quả Chương Trình Ví Dụ 2.18.
- Các Phương Thức Và Thuộc Tính Của System.array.
Xem toàn bộ 212 trang tài liệu này.
Bảng 2.8: Thứ tự ưu tiên các phép toán.
Các phép toán được liệt kê cùng loại sẽ có thứ tự theo mục thứ tự của bảng: thứ tự trái tức là độ ưu tiên của các phép toán từ bên trái sang, thứ tự phải thì các phép toán có độ ưu tiên từ bên phải qua trái. Các toán tử khác loại thì có độ ưu tiên từ trên xuống dưới, do vậy các toán tử loại cơ bản sẽ có độ ưu tiên cao nhất và phép toán gán sẽ có độ ưu tiên thấp nhất trong các toán tử.
Biểu thức điều kiện
Hầu hết các toán tử đòi hỏi có một toán hạng như toán tử (++, --) hay hai toán hạng như (+,-,*,/,...). Tuy nhiên, C# còn cung cấp thêm một toán tử có ba toán hạng (?:). Toán tử này có cú pháp sử dụng như sau:
<Biểu thức điều kiện > ? <Biểu thức thứ 1>: <Biểu thức thứ 2>
Toán tử này sẽ xác định giá trị của biểu thức điều kiện và biểu thức điều kiện này phải trả về một giá trị kiểu bool. Khi điều kiện đúng thì <biểu thức thứ 1> sẽ được thực hiện, còn ngược lại điều kiện sai thì <biểu thức thứ 2> sẽ được thực hiện. Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này có ý nghĩa: ―Nếu điều kiện đúng thì làm công việc thứ nhất, còn ngược lại điều kiện sai thì làm công việc thứ hai‖. Cách sử dụng toán tử ba ngôi này được minh họa trong ví dụ 2.9 sau.
Ví dụ 2.9: Lập chương trình tìm số lớn nhất của hai số
namespace Vidu2_9
{
class Program
{
static void Main(string[] args)
{
int so1; int so2; int max; so1 = 10;
so2 = 20;
max = so1 > so2 ? so1 : so2;
Console.WriteLine("Gia tri thu nhat {0}, gia tri thu hai {1}, gia tri lon nhat {2}", so1, so2, max);
short x;
int i = 345; x = (short)i;
Console.WriteLine("x = "+x.ToString()); Console.ReadLine();
}
}
}
Kết qủa chương trình:
Hình 2.5: Kết quả chương trình ví dụ 2.9
Trong ví dụ minh họa trên toán tử ba ngôi được sử dụng để kiểm tra xem giá trị củaso1 có lớn hơn giá trị của so2, nếu đúng thì trả về giá trị của so1, tức là gán giá trị so1 cho biến max, còn ngược lại thì gán giá trị so2 cho biến max.
2.4.7. Chuyển đổi kiểu giá trị
Những đối tượng của một kiểu dữ liệu này có thể được chuyển sang những đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi tường minh hay ngầm định.
Chuyển đổi ngầm định
Chuyển đỗi ngầm định xảy ra khi:
- Ép từ kiểu nhỏ qua kiểu lớn
- Ép từ lớp dẫn xuất qua lớp cơ sở
Ví dụ, có thể gán ngầm định một số kiểu short (2 byte) vào một số kiểu int (4 byte) một cách ngầm định. Sau khi gán hoàn toàn không mất dữ liệu vì bất cứ giá trị nào của short cũng thuộc về int:
short x = 10;
int y = x; // chuyển đổi ngầm định
Tuy nhiên, nếu thực hiện chuyển đổi ngược lại, chắc chắn sẽ bị mất thôngtin. Nếu giá trị của số nguyên đó lớn hơn 32.767 thì nó sẽ bị cắt khi chuyển đổi. Trình biêndịch sẽ không thực hiện việc chuyển đổi ngầm định từ số kiểu int sang số kiểu short:
short x;
int y = 100;
x = y; // Không biên dịch, lỗi!!!
Chuyển đổi tường minh:
- Do lập trình viên chỉ định
- Xảy ra khi: Ép từ kiểu lớn qua kiểu nhỏ (có thể mất giá trị), Ép từ lớp cơ sở qua lớp dẫn xuất
Để thực hiện chuyển đổi tường minh ta có thể sử dụng một trong ba cách sau:
- Để không bị lỗi phải dùng lệnh gán tường minh Ví dụ:
short x;
int y = 500;
x = (short) y; // Ép kiểu tường minh, trình biên dịch không báo lỗi.
- Sử dụng phương thức Parse, TryParse
Trong mỗi kiểu dữ liệu trên đều có hai phương thức sẽ thường xuyên được sử dụng trong tập bài giảng này đó là Parse và TryParse, được dùng để chuyển đổi một đối tượng bất kỳ sang kiểu dữ liệu gọi các phương thức này. Sự khác biệt giữa hai phương thức đó là TryParse sẽ kiểm tra tính hợp lệ của dữ liệu chuyển đổi trước khi chuyển đổi còn phương thức Parse thì không. Ví dụ với câu lênh:
int x = int.Parse(”123”);
thực hiện chuyển đổi chuỗi 123 sang số nguyên và gán cho biến x. Nếu tham số truyền vào không phải là số nguyên thì khi chạy chương trình sẽ phát sinh ngoại lệ. Để tránh điều này có thể sử dụng phương thức TryParse như sau:
bool kt = int.TryParse(”123”, out x)
Câu lệnh trên sẽ thực hiện chuyển đổi chuỗi 123 sang số nguyên, nếu thành công thì sẽ gán giá trị 123 cho biến x, phương thức sẽ trả về giá trị true, ngược lại phương thức sẽ trả về giá trị false còn biến x sẽ không được gán giá trị mới.
- Sử dụng lớp Convert
C# cung cấp lớp Convert để thực hiện chuyển đổi kiểu dữ liệu. Ví dụ câu lệnh:
int y = Convert. ToInt32(“32”)
thực hiện chuyển đổi chuỗi ―32‖ thành số và gán cho biến y. Trong lớp Convert còn có rất nhiều các phương thức chuyển đổi đối tượng bất kỳ sang các kiểu dữ liệu như short, float, double, …sinh viên tự tìm hiểu thêm.
2.4.8. Lớp Math
Để xây dựng các công thức toán học, ngoài các phép toán cơ bản đã được giới thiệu còn cần rất nhiều các hàm toán học mà chưa được đề cập tới. Trong C# có lớp Math là lớp chứa các phương thức hay thuộc tính liên quan tới các hàm toán học như tính sin, cos, logarit,…. Bảng 2.9 sau liệt kê một số phương thức có trong lớp Math.
Mô tả | Ví dụ | |
Abs | Trả về trị tuyệt đối của một số | Math.Abs(x) ≈ |x| |
Ceiling | Trả về giá trị nhỏ nhất hay bằng của một số thực | Math.Ceiling(123.456 ) = 124 |
Exp | Trả về giá trị e với mũ là tham số đầu vào | Math.Exp(x) ≈ ex |
Floor | Trả về giá trị lớn nhất hay bằng của một số thực | Math.Floor(123.456) = 123 |
Log | Trả về giá trị logarit của một số | Math.Log(x) ≈ ln(x) |
Log10 | Trả về giá trị logarit cơ số 10 của một số | Math.Log10(x) ≈ log10(x) |
Max | Trả về số lớn nhất trong hai số | Max(3,7) = 7 |
Min | Trả về số nhỏ nhất trong hai số | Min(3,7) = 3 |
Pow | Trả về giá trị mũ của hai số = | Math.Pow(x,y) ≈ xy |
Round | Trả về giá trị được làm tròn của một số thực | Math.Round(123.456) = 123 |
Sign | Trả về dấu của một số, -1 nếu số âm và 1 nếu số dương | Math.Sign(3) = 1 |
Sqrt | Trả về căn bậc hai của một số | Math.Sqrt(x) ≈𝑥 |
Cos | Trả về giá trị cosin của một góc | Math.Cos(x) ≈ cos(x) |
Trả về giá trị sin của một góc | Math.Sin(x) ≈ sin(x) | |
Tan | Trả về giá trị tang của một góc | Math.Tan(x) ≈ tan(x) |
Bảng 2.9: Một số phương thức của lớp Math.
Ngoài ra, lớp Math có hai thuộc tính PI, E, trong đó PI = 3.14159265358979323846 vàE = 2.7182818284590452354.
2.5. Câu lệnh rẽ nhánh
2.5.1. Câu lệnh if
1. Câu lệnh if không đầy đủ Cú pháp:
Hoạt động:
if (<biểu thức logic>)
{<Lệnhhoặc khối lệnh>;}
Tính biểu thức logic. Nếu biểu thức logic nhận giá trị true thì thực hiện lệnh hoặc khối lệnh. Ngược lại bỏ qua lệnh hoặc khối lệnh và kết thúc câu lệnh if.
Cụ thể hoạt động của câu lệnh trên được mô tả trong hình sau:
Bắt đầu
Biểu thức logic
True
False
Kết thúc
Lệnh hoặc khối lệnh
Hình 2.6: Hoạt động của câu lệnh if không đầy đủ
Ví dụ 2.10: Lập trình tìm và hiển thị số lớn nhất của hai số thực được nhập vào từ bàn phím.
namespace Vidu_2_10
{
class Program
{
static void Main(string[] args)
{ float a, b;
Console.Write("Nhap a = "); a = float.Parse(Console.ReadLine()); Console.Write("Nhap b = "); b = float.Parse(Console.ReadLine()); float max = a;
if(max < b) max = b;
Console.WriteLine("So lon nhat: {0} ", max); Console.ReadLine();
}
}
}
Kết quả chương trình:
Hình 2.7: Kết quả chương trình ví dụ 2.10
Trong trường hợp lệnh hoặc khối lệnh là một lệnh thì có thể bỏ cặp dấu{ }.
2. Câu lệnh if đầy đủ Cú pháp:
if (<biểu thức logic>)
{<Lệnh hoặc khối lệnh 1>;}
Hoạt động:
else
{<Lệnh hoặc khối lệnh 2>;}
Trước hết tính biểu thức logic. Nếu biểu thức nhận giá trị true thì thực hiện lệnh hoặc khối lệnh 1. Ngược lại thực hiện lệnh hoặc khối lệnh 2 và kết thúc câu lệnh if.
Cụ thể hoạt động của câu lệnh trên được mô tả trong hình sau:
Bắt đầu
Biểu thức logic
False
True
Kết thúc
Lệnh hoặc khối lệnh 2
Hình 2.8: Hoạt đông của câu lệnh if đầy đủ
Ví dụ 2.11: Lập chương trình giải phương trình bậc nhất ax + b = 0, với a, b là các số thực nhập từ bàn phím.
namespace Vidu_2_11
{
class Program
{
static void Main(string[] args)
{
float a, b, c;
Console.Write("Nhap a = "); a = float.Parse(Console.ReadLine()); Console.Write("Nhap b = "); b = float.Parse(Console.ReadLine());
if (a != 0) Console.WriteLine("Phuong trinh co nghiem duy nhat x = " + (-b / a).ToString());
else if (b != 0) Console.WriteLine("Phuong trinh vo nghiem"); else Console.WriteLine("Phuong trinh vo so nghiem"); Console.ReadLine();
}
}
}
Kết quả chương trình:
Hình 2.9: Kết quả chương trình ví dụ 2.11
3. Câu lệnh if lồng nhau
Các câu lệnh if trên chỉ cho phép rẽ 1 hoặc 2 nhánh, trong trường hợp rẽ nhiều hơn 2 nhánh thì có thể sử dụng câu lệnh if lồng nhau.
Cú pháp:
if (<biểu thức logic 1>)
{<Lệnh hoặc khối lệnh 1>;} else if (<biểu thức logic 2>)
{<Lệnh hoặc khối lệnh 2>;}
......
else if (<biểu thức logic n-1>)
{<Lệnh hoặc khối lệnh n-1>;} else
{<Lệnh hoặc khối lệnh n>;}
Hoạt động:
Bước 1: Thực hiện tính biểu thức logic 1, nếu biếu thức logic 1 là đúng thì thực hiện lệnh hoặc khối lệnh 1 và kết thúc câu lệnh if lồng nhau. Ngược lại lệnh hoặc khối lệnh 1 bị bỏ qua.
Bước 2: Thực hiện tính biểu thức logic 2, nếu biếu thức logic 2 là đúng thì thực hiện lệnh hoặc khối lệnh 2 và kết thúc câu lệnh if lồng nhau. Ngược lại lệnh hoặc khối lệnh 2 bị bỏ qua.
…
Bước n-1: Thực hiện tính biểu thức logic n-1, nếu biếu thức logic n-1 là đúng thì thực hiện lệnh hoặc khối lệnh n-1 và kết thúc câu lệnh if lồng nhau. Ngược lại lệnh hoặc khối lệnh n - 1 bị bỏ qua.
Bước n: Thực hiện lệnh hoặc khối lệnh n và kết thúc câu lệnh if lồng nhau.
Ví dụ 2.12: Lập chương trình giải phương trình bậc hai ax2 + bx + c = 0 với a, b, c là các số thực nhập từ bàn phím.
namespace Vidu2_12
{
class Program
{
static void Main(string[] args)
{
double a, b, c, delta, x1, x2; Console.Write("Nhap a = ");
a = double.Parse(Console.ReadLine()); Console.Write("Nhap b = ");
b = double.Parse(Console.ReadLine()); Console.Write("Nhap c = ");