Thứ Ba, 13 tháng 4, 2010

// // Leave a Comment

Toán tử C#

1.Định nghĩa toán tử

   Toán tử được kí hiệu bằng một biểu tượng dùng để thực hiện một hành động. Các kiểu ữ liệu cơ bản của C# như kiểu nguyên hỗ trợ rất nhiều các toán tử như toán tử gán, toán tử toán học, logic...

2. Các loại toán tử

a. Toán tử gán

   Đến lúc này toán tử gán khá quen thuộc với chúng ta, hầu hết các chương trình minh họa từ đầu đều đã sử dụng phép gán. Toán tử gán hay phép gán làm cho toán hạng bên trái thay đổi giá trị bằng với giá trị của toán hạng bên phải. Toán tử gán là toán tử hai ngôi. Đây là toán tử đơn giản nhất thông dụng nhất và cũng dễ sử dụng nhất. ví dụ a = b


b. Toán tử toán học

    Ngôn ngữ C# cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu các phép toán cơ bản. Toán tử cuối cùng là toán tử chia nguyên lấy phần dư.

     Các phép toán số học cơ bản (+,-,*,/)

Các phép  toán này không  thể  thiếu  trong bất  cứ ngôn ngữ  lập  trình nào,  C# cũng không ngoại lệ, các phép toán số học đơn giản nhưng rất cần thiết bao gồm: phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/) nguyên và không nguyên %. Khi chia hai số nguyên, thì C# sẽ bỏ phần phân số, hay bỏ phần dư, tức là nếu ta chia 8/3 thì sẽ được kết quả là 2 và sẽ bỏ phần dư là 2. Tuy nhiên, khi chia cho số thực có kiểu như  float, double, hay decimal thì kết quả chia được trả về là một số thực.

      Phép toán chia lấy dư

Để tìm phần dư của phép chia nguyên, chúng ta sử dụng toán tử chia lấy dư (%). Ví dụ, câu lệnh sau  8%3 thì kết quả trả về là 2 (đây là phần dư còn lại của phép chia nguyên). Thật sự phép toán chia lấy dư rất hữu dụng cho người lập trình . Khi chúng ta thực hiện một phép chia dư n cho một số khác, nếu số này là bội số của n thì kết quả của phép chia dư là 0.

Ví dụ 20 % 5 = 0 vì 20 là một bội số của 5. Điều này cho phép chúng ta ứng dụng trong vòng lặp, khi muốn thực hiện một công việc nào đó cách khoảng n lần, ta chỉ cần kiểm tra phép chia dư n, nếu kết quả bằng 0 thì thực hiện công việc. Cách sử dụng này đã áp dụng trong ví dụ minh họa sử dụng vòng lặp for bên trên.

Ví dụ:  Phép chia và phép chia lấy dư.
using System;
class Tester
{
          public static void Main()
          {
           int i1, i2;
           float f1, f2;
          double d1, d2;
          decimal dec1, dec2;
           i1 = 17;
          i2 = 4;
          f1 = 17f;
          f2 =  4f;
          d1 = 17;
          d2 = 4;
          dec1 = 17;
          dec2 = 4;
          Console.WriteLine("Integer: \t{0}", i1/i2);
          Console.WriteLine("Float: \t{0}", f1/f2);
Console.WriteLine("Double: \t{0}", d1/d2);
          Console.WriteLine("Decimal: \t{0}", dec1/dec2);
          Console.WriteLine("\nModulus: : \t{0}", i1%i2);
          Console.ReadLine();
          }
}

Kết quả:
Integer: 4
float: 4.25
double: 4.25
decimal: 4.25
Modulus: 1

c.Toán tử tăng và giảm
   Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào biến, trừ đi một  giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của biến sau đó gán giá trị mới vừa tính toán cho chính biến đó.
 

d. Tính toán và gán trở lại

   Giả sử chúng ta có một biến tên Luong lưu giá trị lương của một    người, biến Luong này có giá trị hiện thời là 1.500.000, sau đó để tăng thêm 200.000 ta có thể viết như sau:

     Luong= Luong +200.000;

   Trong câu lệnh trên phép cộng được thực hiện trước, khi đó kết quả của vế phải là 1.700.000  và kết  quả này sẽ được gán  lại  cho biến  Luong,  cuối  cùng  Luong  có giá  trị   là 1.700.000. Chúng ta có thể thực hiện việc thay đổi giá trị rồi gán lại cho biến với bất kỳ phép toán số học nào:
Luong = Luong * 2;
Luong = Luong – 100.000;
Do việc tăng hay giảm giá trị của một biến rất thường xảy ra trong khi tính toán nên C# cung cấp các phép toán tự gán (self- assignment). Bảng sau liệt kê các phép toán tự gán.
Toán tử
 Ý nghĩa

+=
Cộng  thêm giá  trị   toán hạng bên phải
vào giá trị toán hạng bên trái


-=
Toán hạng bên trái được trừ bớt đi một
lượng bằng giá  trị  của  toán hạng bên
phải


*=
Toán hạng bên trái được nhân với một
lượng bằng giá  trị  của  toán hạng bên
phải.


/=
Toán hạng bên trái  được chia với  một
lượng bằng giá  trị  của  toán hạng bên
phải.


%=
Toán hạng bên trái được chia lấy dư với
một   lượng bằng giá  trị  của  toán hạng
bên phải.
















                           Bảng mô tả các phép toán tự gán.
Dựa trên các phép toán tự gán trong bảng ta có thể thay thế các lệnh tăng giảm lương như sau:
Luong  += 200.000;
Luong  *= 2;
Luong  -=  100.000;
Kết quả của lệnh thứ nhất là giá trị của Luong sẽ tăng thêm 200.000, lệnh thứ hai sẽ làm cho  giá trị Luong nhân đôi tức là tăng gấp 2 lần, và lệnh cuối cùng sẽ trừ bớt 100.000 của Luong.  Do việc tăng hay giảm 1 rất phổ biến trong lập trình nên C# cung cấp hai toán tử đặc biệt là tăng một (++) hay giảm một (--).
Khi đó muốn tăng đi một giá trị của biến đếm trong vòng lặp ta có thể viết như sau:
     bienDem++;


e. Toán tử tăng giảm tiền tố và tăng giảm hậu tố

Giả sử muốn kết hợp các phép toán như gia tăng giá trị của một biến và gán giá trị của biến cho biến thứ hai, ta viết như sau:
var1 = var2++;
Câu hỏi được đặt ra là gán giá trị trước khi cộng hay gán giá trị sau khi đã cộng. Hay nói cách  khác giá trị ban đầu của biến var2 là 10, sau khi thực hiện ta muốn giá trị của var1 là 10,  var2 là 11, hay var1 là 11, var2 cũng 11?
Để giải quyết yêu cầu trên C# cung cấp thứ tự thực hiện phép toán tăng/giảm với phép toán gán, thứ tự này được gọi là tiền tố (prefix) hay hậu tố (postfix). Do đó ta có thể v iết:  var1 = var2++; // Hậu tố
Khi lệnh này được thực hiện thì phép gán sẽ được thực hiện trước tiên, sau đó mới đến phép  toán tăng. Kết quả là var1 = 10 và var2 = 11. Còn đối với trường hợp tiền tố:      var1 = ++var2;
Khi đó phép tăng sẽ được thực hiện trước tức là giá trị của biến var2 sẽ là 11 và cuối cùng  phép gán được thực hiện. Kết quả cả hai biến var1 và var2 điều có giá trị là 11. 
Minh hoạ sử dụng toán tử tăng trước và tăng sau khi gán.
using System;
class Tester
{
    static int Main()
    {
        int valueOne = 10;
        int valueTwo;
        valueTwo = valueOne++;
        Console.WriteLine("Thuc hien tang sau: {0}, {1}",
        valueOne, valueTwo);
        valueOne = 20;
        valueTwo = ++valueOne;
        Console.WriteLine("Thuc hien tang truoc: {0}, {1}",
        valueOne, valueTwo);
        Console.ReadLine();
        return 0;
    }
}
Kết quả:
Thuc hien tang sau: 11, 10
Thuc hien tang truoc: 21, 21

f. Toán tử quan hệ
   Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau đó trả về kết quả là một giá trị logic kiểu bool (true hay false). Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong khi 2 > 5 trả về giá trị false. Các toán tử quan hệ trong ngôn ngữ C# được trình bày ở bảng 3.4 bên dưới. Các toán tử trong bảng được minh họa với hai biến là value1 và value2, trong đó value1 có giá trị là 100 và value2 có giá trị là 50.


Tên toán tử
Kí hiệu
Biểu thức so sánh
Kết quả
So sánh bằng
==
Value1==100
Value1==50
True
False
Không bằng
!=
 Value2 !=100
Value2 !=50
False
True
Lớn hơn
> 
Value1> value2
Value2> value1
True
False
Lơn hơn hoặc bằng
>=
Value2 >= 50
True
Nhỏ hơn
< 
Value1
Value2
False
True
Nhỏ hơn hoặc bằng
<=
Value1<=value2
False
         Các toán tử so sánh (giả sử value1 = 100, và value2 = 50).


Như trong bảng 3.4 trên ta lưu ý toán tử so sánh bằng (==), toán tử này được ký hiệu bởi hai  dấu bằng (=) liền nhau và cùng trên một hàng , không có bất kỳ khoảng trống nào xuất hiện giữa chúng. Trình biên dịch C# xem hai dấu này như một toán tử.



g. Toán tử logic
Trong câu lệnh if mà chúng ta đã tìm hiểu trong phần trước, thì khi điều kiện là true  thì biểu thức bên trong if mới được thực hiện. Đôi khi chúng ta muốn kết hợp nhiều điều kiện với nhau như: bắt buộc cả hai hay nhiều điều kiện phải đúng hoặc chỉ cần một trong các điều kiện đúng là đủ hoặc không có điều kiện nào đúng...C# cung cấp một tập hợp các toán tử logic để phục vụ cho người lập trình.

Bảng sau  liệt kệ ba phép toán logic, bảng này cũng sử dụng hai biến minh họa là  x, và y trong đó x có giá trị là 5 còn y có giá trị là 7

Tên toán tử
 Kí hiệu
Biểu thức logic
Giá trị
 Logic
And
&&
(x==3)&&(y==7)
False
Cả hai điều kiện phải đúng
Or
||
(x==3)||(y==7)
True
Chỉ cần một điều kiện đúng
Not
!
! (x==3)
True
Biểu thức trong ngoặc phải sai

h.Toán tử ba ngôi
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:

? :
Toán tử này sẽ xác định giá trị của một 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ì sẽ được thực hiện, còn ngược lại điều kiện sai thì 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ụ  sau.
Sử dụng toán tử bao ngôi.
using System;
class Tester
{
    public static int Main()
    {
        int value1;
        int value2;
        int maxValue;
        value1 = 10;
        value2 = 20;
        maxValue = value1 > value2 ? value1 : value2;
        Console.WriteLine("Gia tri thu nhat {0}, gia tri thu hai {1}, gia tri lon nhat {2}",value1, value2, maxValue);
        Console.ReadLine();
        return 0;
    }
}

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ủa  value1 có lớn hơn giá trị của value2, nếu đúng thì trả về giá trị của value1, tức là gán giá trị value1 cho biến maxValue, còn ngược lại thì gán giá trị value2 cho biến maxValue.

0 comments: