MC&TT Co., Ltd

Bài 02 C# OOP - Lập trình C# căn bản

Chia sẻ:

Trong bài học đầu tiên này chúng ta sẽ học những nội dung sau:

Biến trong C#

Cũng tương tự như khái niệm biến trong khoá học lập trình căn bản với C, biến trong C# cũng có thể coi là một container (vùng lưu trữ) để chứa dữ liệu. Giá trị của biến có thể thay đổi bất cứ lúc nào trong suốt quá trình mà chương trình chạy. Để xác định và phân biệt vùng lưu trữ đó, mỗi biến phải được đặt một tên duy nhất (định danh). Tên biến chỉ là đại diện tượng trưng của một vị trí bộ nhớ. C# cung cấp một số loại biến khác nhau:

  • Biến cục bộ: lưu trữ thông tin trong phạm vi phương thức.
  • Biến thành viên: lưu trữ thông tin trong phạm vi class hoặc struct.
  • Tham số: tạm thời lưu trữ thông tin để truyền vào phương thức.

Kiểu dữ liệu trong C#

Trong C# bạn có thể sử dụng đến hàng chục ngàn kiểu dữ liệu khác nhau! Đó là những kiểu dữ liệu được định nghĩa trong hàng loạt thư viện của .NET. Tuy vậy, nếu nói một cách nghiêm ngặt thì C# lại không hề định nghĩa kiểu dữ liệu nào! Đây là một điều rất lạ, rất khác biệt của C#. Vấn đề là, C# không tồn tại độc lập. Nó là một ngôn ngữ gắn liền với .NET. .NET mới là người cung cấp hàng chục nghìn kiểu dữ liệu cho C#. .NET không chỉ cung cấp những kiểu dữ liệu “đỉnh cao” mà nó cung cấp cả những kiểu dữ liệu cơ bản nhất mà nhẽ ra ngôn ngữ thường tự định nghĩa như số nguyên, số thực, logic, v.v.. Để đơn giản hóa code, C# định nghĩa các biệt danh (alias) riêng cho một số kiểu cơ bản của .NET bằng từ khóa. Ví dụ, int (C#) là biệt danh của System.Int32 (.NET), string (C#) là biệt danh của System.String (.NET). Các biệt danh này làm cho C# nhìn rất giống C/C++ hay Java nhưng bản chất lại khác nhau. Ngoài việc tạo biệt danh, C# đơn giản hóa cú pháp cho việc sử dụng chúng. Đây là lý do khiến nhiều bạn khi làm việc với C# thắc mắc sự khác biệt giữa các tên kiểu, một số toàn viết thường (double, bool, string, char) với một số viết hoa (Double, Boolean, String, Char). Bản chất chúng nó là một nhưng cách sử dụng khác nhau một chút. C# khuyến khích sử dụng các biệt danh (nếu có) để code nhìn bớt phức tạp.

Phân loại kiểu dữ liệu trong C#

C# là ngôn ngữ lập trình hướng đối tượng nên cách phân chia kiểu dữ liệu cũng khác so với lập trình C. Cụ thể trong C# hỗ trợ các loại kiểu dữ liệu sau:
  • Kiểu dữ liệu giá trị (Value Type) Bao gồm các kiểu dữ liệu cơ bản như int, float, double, boolean, …
  • Kiểu dữ liệu tham chiếu (Reference Type): Là các kiểu dữ liệu đại diện cho các đối tượng có sẵn trong C# như Array, String, Object và cả những đối tượng do chúng ta tạo nên.

Đặc điểm của các kiểu dữ liệu giá trị trong C#

Kiểu giá trị và kiểu tham chiếu là hai loại chính của kiểu C#. Một biến của kiểu giá trị chứa một thể hiện của kiểu. Điều này khác với một biến của kiểu tham chiếu, trong đó có một tham chiếu đến một thể hiện của kiểu. Theo mặc định, khi gán, truyền một đối số cho một phương thức và trả về một kết quả của phương thức, các giá trị của biến sẽ được sao chép. Trong trường hợp các biến kiểu giá trị, các thể hiện kiểu tương ứng sẽ được sao chép.

Các kiểu số nguyên

Đây là kiểu dữ liệu đại diện cho các số nguyên. Tất cả các kiểu số nguyên đều là kiểu giá trị. Chúng cũng là những kiểu đơn giản và có thể được khởi tạo bằng các ký tự. Tất cả các kiểu số nguyên đều hỗ trợ toán tử số học, logic bit và so sánh.

Từ khoá Khoảng giá trị Kích cỡ Kiểu .NET
sbyte -128 to 127 8-bit System.SByte
byte 0 to 255 8-bit System.Byte
short -32,768 to 32,767 16-bit System.Int16
ushort 0 to 65,535 16-bit System.UInt16
int -2,147,483,648 to 2,147,483,647 32-bit System.Int32
uint 0 to 4,294,967,295 32-bit System.UInt32
long -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 64-bit System.Int64
ulong 0 to 18,446,744,073,709,551,615 64-bit System.UInt64
nint Tuỳ thuộc vào hệ thống 32-bit hoặc 64-bit System.IntPtr
nuint Tuỳ thuộc vào hệ thống 32-bit hoặc 64-bit System.UIntPtr

Trong tất cả các hàng của bảng trên trừ hai hàng cuối cùng, mỗi từ khóa kiểu dữ liệu trong C# từ cột ngoài cùng bên trái là một bí danh cho một kiểu dữ liệu .NET tương ứng. Từ khóa và tên loại .NET có thể hoán đổi cho nhau. Ví dụ, các khai báo sau khai báo các biến cùng kiểu:

int a = 123;
System.Int32 b = 123;

Các kiểu nint và nuint trong hai hàng cuối cùng của bảng là các số nguyên có kích thước gốc. Chúng được thể hiện bên trong bằng các kiểu .NET được chỉ định, nhưng trong mỗi trường hợp, từ khóa và kiểu .NET không thể hoán đổi cho nhau. Trình biên dịch cung cấp các hoạt động và chuyển đổi cho nint và nuint dưới dạng các kiểu số nguyên mà nó không cung cấp cho các kiểu con trỏ System.IntPtr và System.UIntPtr.

Cơ số

Tất cả các kiểu số nguyên đều có thể nhận giá trị biểu diễn ở nhiều cơ số (base) khác nhau: cơ số 10 (decimal), 16 (hex), 8 (octal), 2 (binary). Giá trị biểu diễn ở các cơ số khác 10 phải sử dụng thêm tiếp tố (prefix) tương ứng.

long a = 0x12af; // số hexa, prefix là 0x hoặc 0X 
byte b = 0b1010; // số nhị phân, prefix là 0b hoặc 0B 
int c = 0123; // số hệ cơ số 8, prefix là 0

Integer literal

Khi dùng từ khóa var để khai báo biến thuộc kiểu số nguyên, C# mặc định sẽ hiểu nó là kiểu int. Nếu muốn chỉ định giá trị nguyên thuộc một kiểu nào đó khác, bạn phải sử dụng một cách viết riêng gọi là integer literal.

Integer literal là các ký tự viết vào cuối giá trị số (postfix) để báo hiệu kiểu dữ liệu, bao gồm: U (hoặc u) báo hiệu số nguyên không dấu; L (hoặc l) báo hiệu giá trị thuộc kiểu long; UL (hoặc ul) cho kiểu ulong. Có thể sử dụng các ký tự này khi viết ở hệ cơ số khác 10. 

C# 7 cho phép sử dụng dấu _ giữa các chữ số để tách các chữ số cho dễ đọc hơn với các giá trị lớn. Dấu _ gọi là digit separator.

Ví dụ:

var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;

Các kiểu dữ liệu dấu phẩy động

Các kiểu số dấu phẩy động đại diện cho các số thực. Tất cả các kiểu số dấu phẩy động đều là kiểu giá trị. Chúng cũng là những kiểu đơn giản và có thể được khởi tạo bằng các giá trị.

C# hỗ trợ các kiểu dấu phẩy động được xác định trước sau:

Từ khoá Khoảng giá trị Độ chính xác Kích cỡ Kiểu .NET
float ±1.5 x 10−45 tới ±3.4 x 1038 ~6-9  chữ số 4 byte System.Single
double ±5.0 × 10−324 tới ±1.7 × 10308 ~15-17 chữ số 8 byte System.Double
decimal ±1.0 x 10-28 tới ±7.9228 x 1028 28-29 chữ số 16 byte System.Decimal
double a = 12.3;
System.Double b = 12.3;

Giá trị mặc định của mỗi kiểu dấu phẩy động là 0, 0. Mỗi kiểu dấu phẩy động có các hằng số MinValue và MaxValue cung cấp giá trị hữu hạn nhỏ nhất và lớn nhất của kiểu đó. Loại float và double cũng cung cấp các hằng số đại diện cho các giá trị không phải là số và vô cực. Ví dụ, kiểu kép cung cấp các hằng số sau: Double.NaN, Double.NegativeInfinity và Double.PositiveInfinity.

Bạn có thể trộn các kiểu tích phân và kiểu float và double trong một biểu thức. Trong trường hợp này, các kiểu tích phân được chuyển đổi ngầm định thành một trong các kiểu dấu phẩy động và, nếu cần, kiểu float được chuyển đổi ngầm thành kép. Biểu thức được đánh giá như sau:

  • Nếu có kiểu double trong biểu thức, thì biểu thức sẽ đánh giá là double hoặc bool trong các phép so sánh quan hệ và bình đẳng.
  • Nếu không có kiểu kép trong biểu thức, thì biểu thức được đánh giá là float hoặc bool trong các phép so sánh quan hệ và bình đẳng.

Bạn cũng có thể kết hợp kiểu tích phân và kiểu thập phân trong một biểu thức. Trong trường hợp này, các kiểu tích phân được chuyển đổi hoàn toàn sang kiểu thập phân và biểu thức được đánh giá thành thập phân hoặc thành bool trong các phép so sánh quan hệ và bình đẳng. Bạn không thể kết hợp kiểu thập phân với kiểu float và double trong một biểu thức.

Trong trường hợp này, nếu bạn muốn thực hiện các phép toán số học, so sánh hoặc bình đẳng, bạn phải chuyển đổi rõ ràng các toán hạng từ hoặc sang kiểu thập phân, như ví dụ sau cho thấy:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

Floating-point Number Literal

Loại của một chữ thực được xác định bởi hậu tố của nó như sau:

  • Chữ không có hậu tố hoặc có hậu tố d hoặc D thuộc loại double
  • Chữ với hậu tố f hoặc F thuộc loại float
  • Chữ có hậu tố m hoặc M thuộc loại thập phân

Đoạn mã sau minh họa một ví dụ về từng loại:

double d = 3D;
d = 4d;
d = 3.934_001;

float f = 3_000.5F;
f = 5.4f;

decimal myMoney = 3_000.5m;
myMoney = 400.75M;

Ví dụ trước cũng cho thấy việc sử dụng _ làm dấu phân tách chữ số, được hỗ trợ bắt đầu bằng C # 7.0. Bạn có thể sử dụng dấu phân tách chữ số với tất cả các loại chữ số. Bạn cũng có thể sử dụng ký hiệu khoa học, nghĩa là, chỉ định một phần lũy thừa của một ký tự thực, như ví dụ sau cho thấy:

double d = 0.42e2;
Console.WriteLine(d);  // output 42

float f = 134.45E-2f;
Console.WriteLine(f);  // output: 1.3445

decimal m = 1.5E6m;
Console.WriteLine(m);  // output: 1500000

Chuyển đổi

Chỉ có một chuyển đổi ngầm giữa các kiểu số dấu phẩy động: từ float sang double. Tuy nhiên, bạn có thể chuyển đổi bất kỳ kiểu dấu phẩy động nào thành bất kỳ kiểu dấu phẩy động nào khác với kiểu ép kiểu rõ ràng.

Kiểu Boolean

Từ khóa kiểu bool là một bí danh cho kiểu cấu trúc .NET System.Boolean đại diện cho một giá trị Boolean, có thể là true hoặc false. Để thực hiện các phép toán logic với các giá trị của kiểu bool, hãy sử dụng các toán tử logic Boolean. Kiểu bool là kiểu kết quả của các toán tử so sánh và bình đẳng. Một biểu thức bool có thể là một biểu thức điều kiện điều khiển trong câu lệnh if, do, while, and for và trong toán tử điều kiện?:.

Giá trị mặc định của kiểu bool là false.

bool check = true;
Console.WriteLine(check ? "Checked" : "Not checked");  // output: Checked

Console.WriteLine(false ? "Checked" : "Not checked");  // output: Not checked

Kiểu ký tự

Từ khóa kiểu char là một bí danh cho kiểu cấu trúc .NET System.Char đại diện cho một ký tự Unicode UTF-16.

Kiểu Khoảng Kích cỡ Kiểu .NET
char U+0000 to U+FFFF 16 bit System.Char

Giá trị mặc định của kiểu char là \0, tức là, U+0000.

Kiểu char hỗ trợ các toán tử so sánh, bình đẳng, tăng và giảm. Hơn nữa, đối với toán hạng char, các toán tử logic số học và bitwise thực hiện một phép toán trên các mã ký tự tương ứng và tạo ra kết quả là kiểu int.

Kiểu chuỗi biểu thị văn bản dưới dạng một chuỗi các giá trị char.

Char Literal

Bạn có thể chỉ định một giá trị char với:

  • Một ký tự cụ thể.
  • Một chuỗi escape sequence unicode, được theo sau bởi biểu diễn thập lục phân bốn ký hiệu của một mã ký tự.
  • Một chuỗi escape sequence thập lục phân, sau đó là \x là biểu diễn thập lục phân của mã ký tự.
var c = 'A';
var c1 = '\u0041'; 
var c2 = '\x0041';
var c3 = (char) 65;

Escape sequence

Tương tự như C, C# cũng định nghĩa một số ký tự đặc biệt gọi là escape sequence:

  • \’: dấu nháy đơn
  • \”: dấu nháy kép
  • \\: dấu backslash (dùng trong đường dẫn)
  • \0: Null
  • \a: cảnh báo (alert)
  • \b: xóa lùi (backspace)
  • \n: dòng mới
  • \r: quay về đầu dòng
  • \t: dấu tab ngang
  • \v: dấu tab dọc

Chuyển đổi

Kiểu char có thể chuyển đổi hoàn toàn thành các kiểu tích phân sau: ushort, int, uint, long và ulong. Nó cũng hoàn toàn có thể chuyển đổi thành các kiểu số dấu phẩy động cài sẵn: float, double và decimal. Nó có thể chuyển đổi rõ ràng thành các loại tích phân sbyte, byte và ngắn. Không có chuyển đổi ngầm nào từ các kiểu khác sang kiểu char. Tuy nhiên, bất kỳ kiểu số tích phân hoặc dấu phẩy động nào cũng có thể chuyển đổi rõ ràng thành char.

Kiểu giá trị Nullable

Giá trị nullable kiểu T? đại diện cho tất cả các giá trị của kiểu giá trị cơ bản T và một giá trị rỗng bổ sung. Ví dụ: bạn có thể gán bất kỳ giá trị nào trong ba giá trị sau đây cho bool? biến: true, false hoặc null. Một kiểu giá trị cơ bản T không thể là một kiểu giá trị nullable.

Bạn thường sử dụng kiểu giá trị nullable khi bạn cần đại diện cho giá trị không xác định của kiểu giá trị cơ bản. Ví dụ, một biến Boolean hoặc bool chỉ có thể là true hoặc false. Tuy nhiên, trong một số ứng dụng, một giá trị biến có thể không được xác định hoặc bị thiếu. Ví dụ, một trường cơ sở dữ liệu có thể chứa true hoặc false, hoặc nó có thể không chứa giá trị nào, nghĩa là NULL. Bạn có thể sử dụng bool? gõ vào kịch bản đó.

Khai báo và gán giá trị

Vì một kiểu giá trị có thể chuyển đổi hoàn toàn thành kiểu giá trị nullable tương ứng, bạn có thể gán giá trị cho một biến của kiểu giá trị nullable như cách bạn làm điều đó cho kiểu giá trị cơ bản của nó. Bạn cũng có thể gán giá trị null. Ví dụ:

double? pi = 3.14;
char? letter = 'a';

int m2 = 10;
int? m = m2;

bool? flag = null;

Kiểm tra một phiên bản của kiểu giá trị nullable

Bắt đầu với C # 7.0, bạn có thể sử dụng toán tử is với một mẫu kiểu để vừa kiểm tra một phiên bản của kiểu giá trị nullable cho null và truy xuất một giá trị của kiểu cơ bản:

int? a = 42;
if (a is int valueOfA)
{
    Console.WriteLine($"a is {valueOfA}");
}
else
{
    Console.WriteLine("a does not have a value");
}
// Output:
// a is 42

Ví dụ sau sử dụng thuộc tính HasValue để kiểm tra xem biến có chứa giá trị hay không trước khi hiển thị:

int? b = 10;
if (b.HasValue)
{
    Console.WriteLine($"b is {b.Value}");
}
else
{
    Console.WriteLine("b does not have a value");
}
// Output:
// b is 10

Chuyển đổi từ kiểu giá trị nullable sang kiểu cơ bản

Nếu bạn muốn gán giá trị của kiểu giá trị nullable cho biến kiểu giá trị không thể nullable, bạn có thể cần chỉ định giá trị được gán thay cho giá trị null. Sử dụng toán tử kết hợp null ?? Để làm việc đó.

int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}");  // output: b is 28

int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}");  // output: d is -1

Kiểu dữ liệu tham chiếu

Các biến của kiểu tham chiếu lưu trữ các tham chiếu đến dữ liệu (đối tượng) của chúng, trong khi các biến của kiểu giá trị chứa trực tiếp dữ liệu của chúng. Với kiểu tham chiếu, hai biến có thể tham chiếu đến cùng một đối tượng; do đó, các hoạt động trên một biến có thể ảnh hưởng đến đối tượng được tham chiếu bởi biến kia. Với các kiểu giá trị, mỗi biến có bản sao dữ liệu riêng của nó và không thể để các hoạt động trên một biến này ảnh hưởng đến biến kia (ngoại trừ trường hợp các biến tham số in, ref và out; xem trong, ref và out tham số sửa đổi ).

C# cũng cung cấp các kiểu tham chiếu được tạo sẵn sau:

  • dynamic

  • object

  • string

Kiểu object

Kiểu object là một bí danh cho System.Object trong .NET. Trong hệ thống kiểu thống nhất của C#, tất cả các kiểu (được tạo trước và do người dùng định nghĩa, kiểu tham chiếu và kiểu giá trị) đều kế thừa trực tiếp hoặc gián tiếp từ System.Object.

Bạn có thể gán giá trị của bất kỳ kiểu nào cho các biến của đối tượng kiểu. Bất kỳ biến đối tượng nào cũng có thể được gán cho giá trị mặc định của nó bằng cách sử dụng chữ null. Khi một biến của kiểu giá trị được chuyển đổi thành đối tượng, nó được cho là được đóng hộp. Khi một biến của đối tượng kiểu được chuyển đổi thành kiểu giá trị, nó được cho là không được đóng hộp.

Boxing và unboxing

Boxing là quá trình chuyển đổi một kiểu giá trị sang đối tượng kiểu hoặc sang bất kỳ kiểu giao diện nào được thực hiện bởi kiểu giá trị này. Khi thời gian chạy ngôn ngữ chung (CLR) đóng hộp một loại giá trị, nó sẽ bao bọc giá trị bên trong một cá thể System.Object và lưu trữ nó trên heap được quản lý. Mở hộp trích xuất loại giá trị từ đối tượng. Quyền anh là mặc nhiên; mở hộp là rõ ràng. Khái niệm quyền anh và mở hộp làm nền tảng cho quan điểm thống nhất C # về hệ thống kiểu trong đó giá trị của bất kỳ kiểu nào cũng có thể được coi như một đối tượng.

Trong ví dụ sau, biến số nguyên i được đóng hộp và gán cho đối tượng o.

int i = 123;
// the following command boxes i
object o = i;

Đối tượng o sau đó có thể được mở hộp và gán cho biến số nguyên i:

o = 123;
i = (int)o;  // unboxing

Phần 2: Câu lệnh lựa chọn và vòng lặp

Câu lệnh lựa chọn trong C#

Các câu lệnh sau chọn các câu lệnh để thực thi từ một số câu lệnh có thể dựa trên giá trị của một biểu thức:

  • Câu lệnh if: chọn một câu lệnh để thực thi dựa trên giá trị của một biểu thức Boolean.
  • Câu lệnh switch: chọn một danh sách câu lệnh để thực thi dựa trên sự so khớp mẫu với một biểu thức.

Câu lệnh if

Câu lệnh if có thể là bất kỳ dạng nào trong hai dạng sau:

Chỉ có mệnh đề if

Phần thân của câu lệnh if chỉ được thực thi chỉ khi một biểu thức Boolean đánh giá là true.

Ví dụ:

if (value < 0 || value > 100)
{
    Console.Write("Warning: not acceptable value! ");
}

Console.WriteLine($"The measurement value is {value}");

Gồm 2 mệnh đề if..else

Câu lệnh này sẽ gồm 2 khối tương tương ứng với từng trường hợp điều kiện Boolean là true hay false để thực thi khối lệnh trong đó.

Mệnh đề chỉ thực thi khi điều kiện Boolean là false.

Ví dụ:

if (tempInCelsius < 20.0)
{
    Console.WriteLine("Cold.");
}
else
{
    Console.WriteLine("Perfect!");
}

Bạn có thể kết hợp các trường hợp khoảng điều kiện khác nhau trong câu lệnh if..else..if như sau:

if (char.IsUpper(ch))
{
    Console.WriteLine($"An uppercase letter: {ch}");
}
else if (char.IsLower(ch))
{
    Console.WriteLine($"A lowercase letter: {ch}");
}
else if (char.IsDigit(ch))
{
    Console.WriteLine($"A digit: {ch}");
}
else
{
    Console.WriteLine($"Not alphanumeric character: {ch}");
}

Câu lệnh switch

Câu lệnh switch chọn thực thi một danh sách câu lệnh dựa trên so sánh với một điều kiện cụ thể. Điều kiện này thường là sự khớp theo 1 giá trị cụ thể.

Ví dụ:

switch (measurement)
{
    case < 0.0:
        Console.WriteLine($"Measured value is {measurement}; too low.");
        break;
    case > 15.0:
        Console.WriteLine($"Measured value is {measurement}; too high.");
        break;
    case double.NaN:
        Console.WriteLine("Failed measurement.");
        break;
    default:
        Console.WriteLine($"Measured value is {measurement}.");
        break;
}

Trường hợp  chỉ định các câu lệnh sẽ thực thi khi một biểu kiểm tra không khớp với bất kỳ giá trị trong các case.

Câu lệnh lặp

Câu lệnh lắp là các câu lệnh thực hiện lặp lại một câu lệnh hoặc một khối câu lệnh. Trong C# có các câu lệnh lặp sau:

  • Câu lệnh for: thực thi phần thân của nó trong khi một biểu thức Boolean được chỉ định đánh giá là true.
  • Câu lệnh foreach: liệt kê các phần tử của một tập hợp và thực thi phần thân của nó cho mỗi phần tử của tập hợp.
  • Câu lệnh do: thực thi có điều kiện phần thân của nó một hoặc nhiều lần.
  • Câu lệnh while: thực thi có điều kiện phần thân của nó không hoặc nhiều lần.

Tại bất kỳ thời điểm nào trong phần nội dung của câu lệnh lặp, bạn có thể thoát ra khỏi vòng lặp bằng cách sử dụng câu lệnh break hoặc chuyển sang bước lặp tiếp theo trong vòng lặp bằng cách sử dụng câu lệnh continue.

Câu lệnh for

Câu lệnh for thực hiện một câu lệnh hoặc một khối câu lệnh trong khi một biểu thức Boolean được chỉ định đánh giá là true.

Câu lệnh for có 3 thành phần:

  • Phần khởi tạo chỉ được thực thi một lần trước khi vào vòng lặp. Thông thường, bạn khai báo và khởi tạo một biến vòng lặp cục bộ trong phần đó. Không thể truy cập biến đã khai báo từ bên ngoài câu lệnh for.
  • Phần điều kiện xác định xem có nên thực hiện lần lặp tiếp theo trong vòng lặp hay không. Nếu nó đánh giá là true hoặc không có, thì lần lặp tiếp theo sẽ được thực hiện; nếu không, vòng lặp bị thoát. Phần điều kiện phải là một biểu thức Boolean.
  • Phần trình lặp xác định điều gì sẽ xảy ra sau mỗi lần thực thi phần thân của vòng lặp.

Chi tiết về câu lệnh for, các bạn có thể xem lại ở phần vòng lặp trong Lập trình C.

Ví dụ:

for (int i = 0; i < 3; i++)
{
    Console.Write(i);
}
// Output:
// 012

Câu lệnh foreach

Trong C# có bổ xung thêm 1 câu lệnh mới là foreach cho phép bạn duyệt lần lượt các phần tử trong 1 mảng hoặc danh sách.

Ví dụ:

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
    System.Console.Write("{0} ", i);
}
// Output: 4 5 6 1 2 3 -2 -1 0

Câu lệnh do

Câu lệnh do thực thi một câu lệnh hoặc một khối câu lệnh trong khi một biểu thức Boolean được chỉ định đánh giá là true. Bởi vì biểu thức đó được đánh giá sau mỗi lần thực hiện vòng lặp, một vòng lặp do thực thi một hoặc nhiều lần. Điều này khác với vòng lặp while, thực hiện không hoặc nhiều lần.

Ví dụ:

int n = 0;
do
{
    Console.Write(n);
    n++;
} while (n < 5);
// Output:
// 01234

Câu lệnh while

Câu lệnh while thực hiện một câu lệnh hoặc một khối câu lệnh trong khi một biểu thức Boolean được chỉ định đánh giá là true. Bởi vì biểu thức đó được đánh giá trước mỗi lần thực hiện vòng lặp, một vòng lặp while thực hiện không hoặc nhiều lần. Điều này khác với vòng lặp do, thực hiện một hoặc nhiều lần.

Ví dụ:

int n = 0;
while (n < 5)
{
    Console.Write(n);
    n++;
}
// Output:
// 01234

Mục tiêu bài thực hành

Để đảm bảo đúng yêu cầu đạt được sau bài học, các bạn hãy đọc kỹ hướng dẫn bên dưới và cố gắng làm bài tập thực hành cẩn thận. Nếu trong quá trình làm bài tập mà vẫn không chạy được thì các bạn có thể tham khảo thêm mã nguồn tham khảo bên dưới từng bài.

Kiến thức

  • Biến, kiểu dữ liệu và các toán tử
  • Đầu vào / đầu ra trên màn hình Console
  • Câu lệnh điều kiện
  • Câu lệnh lặp

Kỹ năng

  • Thành thạo thao tác khai báo và sử dụng các loại biến
  • Làm việc với câu lệnh lựa chọn if, switch
  • Làm việc với câu lệnh for, foreach, do, while

Bài tập thực hành

Viết chương trình nhập vào số n và hiển thị các số nguyên tố từ 0 tới n (n > = 10).

Code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bai_02_1
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            int re;
            int j;
            int i = 2;

            Console.Write("input n: ");
            n = Int32.Parse(Console.ReadLine());
            while (n>=i)
            {
                re = 1;
                j = 2;
                while (j<=i/2)
                {
                    if (i%j==0)
                    {
                        re = 0;
                        break;
                    }
                    j++;
                }
                if (re==1)
                {
                    Console.Write(i + " ");
                }
                i++;
            }
            Console.WriteLine("");
            Console.ReadLine();
        }
    }
}

Bạn đang xem: Bài 02 C# OOP - Lập trình C# căn bản
Bài trước Bài sau
VIẾT BÌNH LUẬN CỦA BẠN

Địa chỉ email của bạn sẽ được bảo mật. Các trường bắt buộc được đánh dấu *

Đăng nhập
Đăng ký
Hotline: 0904251826
x