1.2.3. Chú thích
Chú thích là hình thức cho phép chèn thêm dòng chỉ dẫn, tài liệu vào
trong đoạn mã lệnh. Khi biên dịch, trình biên dịch sẽ bỏ qua các dòng được chú
thích. C# cho phép 3 kiểu chú thích sau:
Chú thích một dòng:
Sử dụng cặp “//” để chú thích một dòng. Chú thích có hiệu lực từ khi gặp
cắp dấu này cho đến hết dòng (gặp dấu kết thúc dòng).
Chú thích nhiều dòng:
Sử dụng hai cặp dấu “/*” và “*/” để chú thích nhiều dòng liên tiếp. Chú
thích có hiệu lực từ khi gặp cặp dấu “/*” cho đến khi gặp dấu “*/”.
Ví dụ dưới đây minh họa về chú thích một dòng và chú thích nhiều dòng:
// Day la chu thich mot dong
/* Day la chu thich nhieu dong lien tiep.
So dong co the rat nhieu.
So dong la 1 cung duoc.*/ Cau nay khong duoc chu thich.
Chú ý:
Ta có thể dùng nhiều chú thích một dòng để chú thích cho nhiều dòng và
dùng chú thích nhiều dòng để chú thích cho một dòng. Tuy nhiên, người ta
thường dùng:
- Chú thích một dòng cho mã lệnh tạm thời chưa dùng hoặc có thể sai.
Điều này làm cho giúp cho việc soạn thảo mã lệnh được nhanh chóng.
- Chú thích nhiều dòng cho tài liệu.
Chú thích tài liệu XML:
Sử dụng bộ dấu “///” để chèn tài liệu XML vào mã lệnh. Chú thích chỉ có
hiệu lực như chú thích một dòng. Tuy nhiên, C# có thể hiểu được các chú thích
này trên nhiều dòng được chú thích liên tiếp. Khi biên dịch, khi trình biên dịch
gặp chú thích này, trình biên dịch sẽ biên dịch vào Assembly.
Ví dụ dưới đây minh họa về chú thích tài liệu XML:
///  documentation here 
Với dòng chú thích trên, chúng ta có thể hiểu đó là một thẻ XML. Cụ thể
ở đây là thẻ có tên là “summary” và có nội dung là “documentation here”.
Chú thích loại này thường được dùng để chú thích cho các lớp, phương
thức, Tuy nhiên, chú thích này phải được đặt ngay trước mã lệnh tương ứng
với đối tượng cần chú thích
                
              
                                            
                                
            
                       
            
                 61 trang
61 trang | 
Chia sẻ: thanhle95 | Lượt xem: 724 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C# (Phần I), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
 TRƯỜNG ĐẠI HỌC PHẠM VĂN ĐỒNG 
KHOA CÔNG NGHỆ THÔNG TIN 
NGUYỄN VĂN TOÁN 
BÀI GIẢNG 
LẬP TRÌNH C# 
Quảng Ngãi, 2018 
TRƯỜNG ĐẠI HỌC PHẠM VĂN ĐỒNG 
KHOA CÔNG NGHỆ THÔNG TIN 
NGUYỄN VĂN TOÁN 
BÀI GIẢNG 
LẬP TRÌNH C# 
(DÙNG CHO SINH VIÊN BẬC ĐẠI HỌC 
NGÀNH CÔNG NGHỆ THÔNG TIN VÀ SƯ PHẠM TIN HỌC) 
LƯU HÀNH NỘI BỘ 
 i 
LỜI NÓI ĐẦU 
Lập trình C# là môn học tìm hiểu các kiến thức cơ 
bản về lập trình xây dựng ứng dụng bằng ngôn ngữ lập 
trình C#. Nội dung cơ bản của môn học này giới thiệu các 
kiến thức cơ bản của C#, hướng đối tượng trong C#, các 
điều khiển hỗ trợ thiết kế giao diện và các điều khiển hỗ trợ 
truy cập CSDL, in kết quả. 
Bài giảng được biên soạn và giảng dạy cho sinh viên 
ngành Công nghệ thông tin với sinh viên đã có kiến thức cơ 
bản về lập trình, lập trình hướng đối tượng, hệ quản trị cơ 
sở dữ liệu Microsoft SQL Server. Vì thế, những nội dung liên 
quan đến các phần kiến thức này trong bài giảng chủ yếu là 
tóm tắt, nhắc lại. 
Ngôn ngữ C# hiện đang được cập nhật thường 
xuyên. Qua mỗi phiên bản, mẫu lập trình được thay đổi 
theo hướng tiện lợi hơn và các công nghệ mới, hiện đại 
được bổ sung vào. Hiện nay, phạm vi kiến thức của ngôn 
ngữ C# rất rộng. Nội dung kiến thức được trình bày trong 
bài giảng này chỉ mới đề cập ngang phiên bản .NET 
Framework 2.0. Mong rằng, qua bài giảng này, sinh viên có 
thể nắm bắt được những vấn đề cốt lõi của ngôn ngữ lập 
trình C# để làm cơ sở cho việc nghiên cứu sâu hơn về ngôn 
ngữ lập trình này. 
Bài giảng không sao tránh khỏi những thiếu sót. 
Mong các thầy cô và các bạn sinh viên đóng góp ý kiến để 
hoàn thiện hơn trong những lần chỉnh sửa sau. 
Xin chân thành cảm ơn. 
 Quảng Ngãi, tháng 11 năm 2018 
 Nguyễn Văn Toán 
 ii 
MỤC LỤC 
Chương 1: Giới thiệu Microsoft .NET, cơ sở của ngôn ngữ C# .................... 1 
1.1. Tổng quan Microsoft .NET ................................................................. 1 
1.1.1. Kiến trúc .NET framework ..................................................... 1 
1.1.2. Biên dịch và ngôn ngữ trung gian .......................................... 3 
1.2. Giới thiệu ngôn ngữ C# ...................................................................... 4 
1.2.1. Chương trình đầu tiên ............................................................. 4 
1.2.2. Kiểu dữ liệu, biểu thức, câu lệnh ............................................ 6 
1.2.3. Chú thích ............................................................................... 12 
1.2.4. Các cấu trúc dữ liệu .............................................................. 13 
1.3. Câu hỏi và bài tập ............................................................................. 16 
1.4. Bài mẫu ............................................................................................. 17 
Chương 2: Hướng đối tượng trong C# ........................................................... 20 
2.1. Lớp, đối tượng................................................................................... 20 
2.1.1. Các thành phần của lớp ......................................................... 21 
2.1.2. Phạm vi truy cập của lớp ...................................................... 21 
2.1.3. Ví dụ về lớp .......................................................................... 22 
2.2. Không gian tên, lệnh using ............................................................... 24 
2.2.1. Không gian tên ...................................................................... 24 
2.2.2. Lệnh using ............................................................................ 25 
2.2.3. Bí danh của không gian tên .................................................. 25 
2.3. Quản lý ngoại lệ ................................................................................ 26 
2.3.1. Cấu trúc của một ngoại lệ ..................................................... 26 
2.3.2. Ném ngoại lệ ......................................................................... 27 
2.3.3. Bắt ngoại lệ ........................................................................... 27 
2.4. Một số lớp thông dụng ...................................................................... 29 
2.4.1. List ........................................................................................ 29 
2.4.2. String ..................................................................................... 30 
2.4.3. StreamReader, StreamWriter ................................................ 31 
2.5. Câu hỏi và bài tập ............................................................................. 33 
2.6. Bài mẫu ............................................................................................. 34 
 iii 
Chương 3: Ứng dụng Windows trong C# ...................................................... 39 
3.1. Giao diện ứng dụng và các điều khiển thông dụng .......................... 39 
3.1.1. Giao diện ứng dụng .............................................................. 39 
3.1.2. Các điều khiển thông dụng trên Form .................................. 43 
3.2. Một số hộp thoại thông dụng ............................................................ 46 
3.2.1. MessageBox .......................................................................... 46 
3.2.2. OpenDialog ........................................................................... 47 
3.3. Menu, ToolStrip ................................................................................ 47 
3.3.1. Menu ..................................................................................... 47 
3.3.2. ToolStrip ............................................................................... 47 
3.4. Câu hỏi và bài tập ............................................................................. 48 
3.5. Bài mẫu ............................................................................................. 49 
Chương 4: Quản lý dữ liệu với Microsoft SQL Server ................................ 56 
4.1. Các khái niệm về cơ sở dữ liệu trong MS SQL Server .................... 56 
4.1.1. Các khái niệm về cơ sở dữ liệu ............................................. 56 
4.1.2. Khái niệm về cơ sở dữ liệu trong MS SQL Server .............. 57 
4.2. Ngôn ngữ SQL .................................................................................. 57 
4.2.1. Các câu lệnh SQL ................................................................. 58 
4.2.2. Kiểu dữ liệu .......................................................................... 58 
4.2.3. Toán tử .................................................................................. 60 
4.2.4. Một số hàm thường dùng ...................................................... 61 
4.2.5. Các câu lệnh SQL thường dùng ............................................ 62 
4.3. Câu hỏi và bài tập ............................................................................. 65 
4.4. Bài mẫu ............................................................................................. 65 
Chương 5: Truy cập cơ sở dữ liệu với ADO.NET ......................................... 67 
5.1. Mô hình kết nối và truy cập dữ liệu với ADO.NET ......................... 67 
5.1.1. Mô hình kết nối và truy cập dữ liệu tổng quát ..................... 67 
5.1.2. Connection ............................................................................ 68 
5.1.3. Kết nối đến cơ sở dữ liệu ...................................................... 69 
5.1.4. Transaction ........................................................................... 70 
5.2. Mô hình truy cập dữ liệu với Command ........................................... 71 
5.2.1. Command .............................................................................. 71 
 iv 
5.2.2. DataReader ........................................................................... 72 
5.3. Mô hình truy cập dữ liệu nâng cao với cơ sở dữ liệu ảo .................. 73 
5.3.1. DataSet .................................................................................. 73 
5.3.2. DataAdapter .......................................................................... 74 
5.4. Buộc dữ liệu ...................................................................................... 75 
5.4.1. Mô hình truy cập và hiển thị dữ liệu .................................... 75 
5.4.2. Buộc dữ liệu .......................................................................... 76 
5.5. Câu hỏi và bài tập ............................................................................. 77 
5.6. Bài mẫu ............................................................................................. 78 
Chương 6: Report và đóng gói ứng dụng ....................................................... 90 
6.1. Report ................................................................................................ 90 
6.1.1. Tổng quan về Report ............................................................ 90 
6.1.2. Tiến trình xây dựng Report .................................................. 91 
6.1.3. Các công cụ hỗ trợ tạo Report .............................................. 91 
6.2. Đóng gói ứng dụng ........................................................................... 96 
6.2.1. Lợi ích ................................................................................... 96 
6.2.2. Các thành phần đưa vào gói ứng dụng ................................. 96 
6.2.3. Setup Project ......................................................................... 97 
6.3. Câu hỏi và bài tập ............................................................................. 97 
6.4. Bài mẫu ............................................................................................. 98 
TÀI LIỆU THAM KHẢO .............................................................................. 103 
Trang 1 
Chương 1: 
Giới thiệu Microsoft .NET, cơ sở của ngôn ngữ C# 
Thời lượng: 8 tiết 
Mục tiêu: 
- Biết được tổng quan về Microsoft .NET, kiến trúc .NET Framework, 
- Hiểu được các thành phần cơ bản của C#, 
- Viết được các chương trình đơn giản bằng C#. 
1.1. Tổng quan Microsoft .NET 
Nền tảng Microsoft .NET (.NET) cung cấp tất cả các công cụ và kỹ thuật 
cần thiết để người dùng có thể xây dựng một ứng dụng trên môi trường internet. 
Trong chương trình học, nền tảng .NET được mô tả đơn giản như Hình 1-1. 
Trung tâm của .NET là .NET framework và môi trường phát triển (IDE - 
Integrated Development Environment). Framework cung cấp những gì cần thiết, 
căn bản (hạ tầng cơ sở) theo một quy ước nhất định để giúp cho việc phát triển 
ứng dụng. IDE là môi trường giúp việc phát triển ứng dụng trở nên dễ dàng và 
nhanh chóng. Nếu không có IDE, chúng ta cũng có thể phát triển được ứng dụng 
trên .NET. Tuy nhiên, việc này rất mất thời gian. Chúng ta nên sử dụng một IDE 
nào đó để phát triển ứng dụng. 
Hình 1-1 Mô tả đơn giản nền tảng .NET 
1.1.1. Kiến trúc .NET framework 
.NET framework gồm 2 thành phần chính: khối thực thi ngôn ngữ nền 
.NET Framework 
Common Language Specification 
Visual 
Basic 
C++ C# J#  V
isu
a
l S
tu
d
io
 .N
E
T
(ID
E
) 
Trang 2 
tảng (CLR - Common Language Runtime) và thư viện lớp (FCL - Framework 
Class Library). CLR là nền tảng của .NET framework. CLR quản lý sự thực thi 
mã lệnh và các quản lý liên quan: biên dịch, quản lý bộ nhớ, quản lý thực hiện 
tiểu trình, bảo mật, Mã lệnh được thực thi trong CLR là mã lệnh được quản lý 
(managed code), khác với mã lệnh không được quản lý như COM, các thành 
phần dựa trên Windows API. FCL là thư viện kiểu dữ liệu (gồm các class, struct, 
enum,) dành cho ứng dụng thực thi trong .NET. Tất cả các ngôn ngữ hỗ trợ 
.NET framework đều sử dụng thư viện lớp dùng chung này. 
Các thành phần trong CLR: 
Thành phần Mô tả 
Class Loader Quản lý siêu dữ liệu, khởi tạo và trình bày các lớp 
MSIL to Native Compilers Chuyển từ MSIL sang mã nhị phân 
Code Manager Quản lý việc thực thi 
Garbage Collector Dọn rác tự động 
Security Engine Bảo mật 
Debug Engine Phát hiện lỗi 
Type Checker Kiểm tra kiểu 
Exception Manager Quản lý ngoại lệ 
Thread Support Hỗ trợ các lớp, giao diện cho lập trình đa luồng 
COM Marshaler Chuyển đổi thành phần COM 
Base Class Library Support Hỗ trợ thư viện các lớp cơ sở 
Thư viện các lớp cơ sở trong CFL: 
Không gian tên Mô tả 
S
y
st
em
. 
Collections Danh sách (mảng) động 
Configuration Cấu hình 
IO Vào/ra dữ liệu 
Net Kết nối mạng 
Trang 3 
Reflection Phản chiếu (dịch ngược) 
Resources Tài nguyên (file, chuỗi, hình ảnh) 
Security Bảo mật 
Text Chuỗi 
Threading Đa luồng 
Runtime Thực thi thời gian thực 
1.1.2. Biên dịch và ngôn ngữ trung gian 
a) Các bước thực hiện của chương trình truyền thống: 
Các ngôn ngữ trước đây (Pascal, C, C++, Visual Basic) có chương trình 
dịch và và môi trường thực thi của riêng nó và một chương trình chỉ cần dịch 
một lần để thực thi. 
Các bước thực hiện của một chương trình truyền thống như Hình 1-2: 
- Bước 1: biên dịch mã nguồn thành mã có thể thực thi. 
- Bước 2: Thực thi thời gian thực mã có thể thực thi. 
Hình 1-2 Các bước thực thi một chương trình truyền thống 
b) Các bước thực hiện của chương trình .NET: 
.NET có chương trình dịch và môi trường thực thi cho mọi máy tính đã 
cài đặt .NET Framework. Một chương trình trong .NET phải được dịch hai lần 
trước khi được thực thi. 
Quá trình biên dịch trong .NET được thực hiện qua 2 giai giai đoạn như 
Hình 1-3: 
Giai đoạn 1: biên dịch mã nguồn 
Bước 1: biên dịch mã nguồn thành mã MSIL (Microsoft Intermediate 
Language) và siêu dữ liệu. 
Giai đoạn 2: biên dịch mã MSIL 
Mã 
nguồn 
Mã có thể 
thực thi 
Mã nhị 
phân 
Thực thi Biên dịch 
Trang 4 
Bước 2: từ siêu dữ liệu, CLR biên dịch mã MSIL thành mã có thể thực thi 
được và thực thi thời gian thực. 
Hình 1-3 Quá trình biên dịch một chương trình .NET 
Các chương trình .NET được biên dịch 2 lần. Kết quả biên dịch của lần 
thứ nhất chỉ ở dạng mã MSIL. Kết quả biên dịch lần thứ hai sẽ là mã máy. 
Khi thực thi một chương trình .NET thì thường lần đầu chậm và lần thứ 2 
sẽ tương đối nhanh. Khi thực thi lần đầu, chương trình phải được dịch sang mã 
nhị phân và khi thực hiện phải lưu vào bộ nhớ cache. Điều này làm cho quá trình 
thực hiện bị chậm. Khi thực hiện lần thứ hai, chương trình không cần phải dịch 
lại và dữ liệu đã có trong bộ nhớ cache nên việc thực hiện tương đối nhanh. 
1.2. Giới thiệu ngôn ngữ C# 
Có nhiều ngôn ngữ có thể sử dụng để xây dựng ứng dụng trên môi trường 
.NET. Tuy nhiên, C# là một ngôn ngữ lập trình đặc biệt, được thiết kế để xây 
dựng ứng dụng trên môi trường này. 
C# là một ngôn ngữ lập trình đơn giản, hiện đại, an toàn và hướng đối 
tượng. Nó là ngôn ngữ mạnh nhất trong .NET, thay thế cho C++ và việc sử dụng 
con trỏ dễ dàng hơn C++. 
Trong C#, một bài toán là một vấn đề cần được giải quyết (Problem) và 
tập hợp những gì ta làm bằng C# để giải quyết vấn đề nào đó là một giải pháp 
(Solution). Để có được một giải pháp thì cần nhiều dự án (Project) cho nên giải 
pháp trong C# thường có một hoặc nhiều dự án. Dự án trong C# có thể là một 
chương trình đơn giản hoặc một thư viện hoặc một bộ cài đặt 
1.2.1. Chương trình đầu tiên 
a) Không sử dụng IDE: 
- Sử dụng Notepad tạo và lưu lại với tên file là ChaoMung.CS trong ổ đĩa 
D:\ với nội dung sau: 
Mã 
nguồn 
MSIL 
+ 
Siêu dữ liệu 
Mã nhị 
phân 
Sử dụng CLR 
Thực thi 
Biên dịch 
Biên dịch lần 1 
Biên dịch lần 2 
Trang 5 
class ChaoMung 
{ 
 static void Main() 
 { 
 System.Console.Write(“Hello, World”); 
 System.Console.ReadKey(); 
 } 
} 
- Khởi động Visual Studio Command Prompt: Start > Programs > 
Microsfoft Visual Studio > Visual Studio Tools > Visual Studio Command 
Prompt. 
- Gõ lệnh sau để biên dịch file ChaoMung.CS. 
D:\> csc /t:exe /out:chaomung.exe ChaoMung.CS 
- Sau khi biên dịch thành công, thực thi file chaomung.exe ta được kết 
quả: 
D:\> chaomung.exe 
Hello, World 
Hình 1-4 Giao diện khởi động Microsoft Visual Studio 2008 
Trang 6 
b) Sử dụng IDE: 
- Khởi động Microsoft Visual Studio: 
Lưu ý: nếu là trường hợp khởi động IDE lần tiên sau khi cài thì chương 
trình yêu cầu lựa chọn môi trường lập trình mặc định. Trong trường hợp này ta 
nên chọn C#. Khi khởi động, chương trình có giao diện như Hình 1-4: 
- Tạo mới dự án: 
Chọn File > New > Project để tạo một project mới. Giao diện tạo mới 
một dự án như Hình 1-5: 
Hình 1-5 Giao diện tạo dự án mới trên Microsoft Visual Studio 2008 
- Thêm nội dung sau vào hàm Main: 
Console.WriteLine("Hello, World"); 
Console.ReadKey(); 
- Nhấn phím F6 để biên dịch. 
- Nhấn phím F5 để thực thi. 
- Kết quả thực thi: Dòng chữ “Hello, World” được in ra màn hình. 
1.2.2. Kiểu dữ liệu, biểu thức, câu lệnh 
a) Kiểu dữ liệu: 
C# có 2 loại kiểu dữ liệu: kiểu giá trị và kiểu tham chiếu. Các kiểu dữ liệu 
của C# được mô tả ở bảng sau: 
Trang 7 
Kiểu dữ liệu Mô tả 
K
iể
u
 g
iá
 t
rị
Kiểu đơn giản 
Số nguyên có dấu: sbyte, short, int, long 
Số nguyên không dấu: byte, ushort, uint, 
ulong 
Ký tự Unicode: char 
Số thực: float, double 
Kiểu decimal: decimal 
Kiểu logic: bool 
Kiểu enum enum E {...} 
Kiểu struct struct S {...} 
K
iể
u
 t
h
am
 c
h
iế
u
Kiểu class 
Kiểu cơ sở của các kiểu khác: object 
Unicode: string 
class C {...} 
Kiểu interface interface I {...} 
Kiểu mảng int[] and int[,] 
Kiểu delegate delegate T D(...) 
Kiểu dữ liệu số của C# được mô tả ở bảng sau: 
Danh mục kiểu Số bit Kiểu Phạm vi 
Có dấu 8 sbyte –128...127 
 16 short –32,768...32,767 
 32 int –2,147,483,648 ... 2,147,483,647 
 64 long –9,223,372,036,854,775,808 ... 
9,223,372,036,854,775,807 
Không dấu 8 byte 0...255 
16 ushort 0...65,535 
32 uint 0...4,294,967,295 
64 ulong 0...18,446,744,073,709,551,615 
Số thực 32 float 1.5 × 10−45 to 3.4 × 1038, 7-chữ số lẻ 
64 double 5.0 × 10−324 to 1.7 × 10308, 15-chữ số lẻ 
Decimal 128 decimal 1.0 × 10−28 to 7.9 × 1028, 28-chữ số lẻ 
Trang 8 
b) Biểu thức: 
Danh mục Biểu thức Mô tả 
Dành riêng x.m Truy xuất thành viên 
x(...) Phương thức hoặc delegate 
x[...] Truy cập mảng hoặc chỉ mục 
new T(...) Tạo mới 1 đối tượng hoặc delegate 
new T[...] Tạo mới mảng 
typeof(T) Lấy kiểu dữ liệu 
Phép một ngôi +x Phép cộng 
-x Phép trừ 
!x Phép phủ định 
~x Phép đảo bit 
++x, x++ Phép tăng 1 
--x, x-- Phép giảm 1 
(T)x Ép (chuyển) kiểu 
Phép nhân x * y Phép nhân 
x / y Phép chia 
x % y Phép chia lấy dư 
Phép thêm x + y Phép cộng, nối chuỗi, thêm delegate 
x – y Phép trừ, loại bỏ delegate 
Dịch bit x << y Dịch trái 
x >> y Dịch phải 
Phép so sánh x < y Bé hơn 
x > y Lớn hơn 
x <= y Bé hơn bằng 
x >= y Bé hơn bằng 
x is T trả về true nếu x là kiểu T, false 
trong trường hợp ngược lại 
x as T Trả về x là kiểu T, hoặc null nếu x 
không có kiểu là T 
So sánh bằng x == y Bằng 
Trang 9 
x != y Không bằng 
Phép AND bit x & y AND 2 số nguyên hoặc 2 giá trị logic 
Phép XOR bit x ^ y XOR 2 số nguyên hoặc 2 giá trị logic 
Phép OR bit x | y OR 2 số nguyên hoặc 2 giá trị logic 
Phép AND x && y Điều kiện AND 
Phép OR x || y Điều kiện OR 
Phép điều kiện x ? y : z Phép toán 3 ngôi 
Phép gán x = y Phép gán 
x op= y Nối phép toán với phép gán. op có thể là: 
*= /= %= += -= >= &= 
^= |= 
c) Câu lệnh: 
Các câu lệnh trong C#: 
Câu lệnh Ví dụ 
Khai báo biến 
địa phương 
static void Main() { 
 int a; 
 int b = 2, c = 3; 
 a = 1; 
 Console.WriteLine(a + b + c); 
 // In ra man hinh 
} 
Khai báo 
hằng địa 
phương 
static void Main() { 
 const float pi = 3.1415927f; 
 const int r = 25; 
 Console.WriteLine(pi * r * r); 
} 
Các câu lệnh, 
biểu thức 
static void Main() { 
 int i; 
 i = 123; 
 Console.WriteLine(i); 
 i++; 
 Console.WriteLine(i); 
} 
Lệnh if static void Main(string[] args) { 
 if (args.Length == 0) { 
 Console.WriteLine("Không đối số"); 
 } 
 else { 
 Console.WriteLine("1 hoặc n đối s