You are on page 1of 43

BỘ GIÁO DỤC VÀ ĐÀO TẠO

ĐẠI HỌC KINH TẾ THÀNH PHỐ HỒ CHÍ MINH


PHÂN HIỆU VĨNH LONG

___________________________

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TIỂU LUẬN NHÓM KẾT THÚC HỌC PHẦN

GVHD Lê Hoàng Son

MÔN Cơ sở lập trình

NHÓM SV THỰC HIỆN Nhóm 5

LỚP K48 – Thương mại điện tử

23C9INF50900501
LHP

BẢNG PHÂN CHIA CÔNG VIỆC NHÓM 5


Phần
Thành viên Nội dung công việc trăm
(%)
Chương trình:
- Trang trí chương trình
- Tham gia góp ý
1. Trần Thị Phương Thảo Tiểu luận:
31221570400 - Biên dịch và ngôn ngữ trung gian 100%
MSIL
- Phân tích chương trình
- Đánh giá chương trình

Chương trình:
- Xoá danh bạ

2. Phạm Minh Thư - Trang trí chương trình


100%
31221570401 - Tham gia góp ý
Tiểu luận:
- Phân tích chương trình

Chương trình:
- Trang trí chương trình
3. Hà Thị Ngọc Diệp
- Tham gia góp ý 100%
31221570413
Tiểu luận:
Phân tích chương trình

4. Nguyễn Ngọc Phương Thảo Chương trình: 100%


31221570386 - Tìm kiếm liên hệ
- Tham gia góp ý

Tiểu luận:
- 1. C Sharp ( C#):

2
- Lời mở đầu
Chương trình:
- Tham gia góp ý
5. Nguyễn Thị Thảo My Tiểu luận:
- Lời mở đầu 100%
31221570393
- Lời cảm ơn
- 4. Nền tảng .NET

Chương trình:
- Lưu trữ dữ liệu
- Sửa liên hệ
6. Trần Lê Anh Thy
- Tổng hợp chương trình 100%
31221570384
- Sửa lỗi chương trình
Tiểu luận:
- Tổng hợp nội dung tiểu luận

Chương trình:
- Thêm liên hệ
- Sửa liên hệ
7. Nguyễn Thị Tuyết Nga
- Hiển thị danh bạ 100%
31221570381
- Sửa lỗi chương trình
Tiểu luận:
- 2. NET Framework

3
Mục lục
LỜI MỞ ĐẦU............................................................................................................3
I. Cơ sở lí thuyết:....................................................................................................4
1. C Sharp ( C#):.................................................................................................4
a. Khái quát về C#:............................................................................................4
b. Đặc trưng C#:................................................................................................4
c. Lợi ích của C#:..............................................................................................6
d. Hạn chế của C#:............................................................................................6
2. NET Framework.............................................................................................7
a. Khái niệm......................................................................................................7
b. Đặc điểm........................................................................................................7
c. Cách thức hoạt động của .NET framework...................................................8
d. Ưu & Nhược điểm.........................................................................................8
3. Biên dịch và ngôn ngữ trung gian MSIL....................................................10
4. Nền tảng .NET...............................................................................................12
a. Khái niệm....................................................................................................12
b. Đặc điểm......................................................................................................12
c. Thời gian chạy ngôn ngữ của NET.............................................................13
d. Khung mô hình ứng dụng............................................................................14
e. Cách thức hoạt động....................................................................................15
f. Lợi ích và hạn chế của .NET.......................................................................15
II. Ứng dụng quản lí danh bạ...........................................................................16
1. Khái quát.......................................................................................................16
2. Nội dung chương trình.................................................................................16
3. Phân tích........................................................................................................35
4. Đánh giá.........................................................................................................39
a. Ưu điểm:......................................................................................................39
b. Hạn chế:......................................................................................................40
LỜI CẢM ƠN..........................................................................................................41
TÀI LIỆU THAM KHẢO:.....................................................................................42

4
LỜI MỞ ĐẦU
Hiện nay, danh bạ là một trong những ứng dụng quen thuộc với tất cả mọi
người. Ứng dụng này có thể lưu trữ nhiều thông tin liên lạc như là số điện thoại
của gia đình, người thân hoặc phục vụ cho công việc hay là những số điện thoại
khẩn cấp lúc cần thiết.

Những thông tin liên lạc quan trọng sẽ được lưu trữ an toàn, dễ dàng tìm kíếm
các thông tin cần thiết mà không cần mất quá nhiều thời gian. Vì vậy danh bạ trở
thành một ứng dụng cần thiết và không thể thiếu của mọi người. Tuy nhiên, việc
tạo ra danh bạ là một việc khá khó khăn , nó không chỉ đòi hỏi ứng dụng này phải
an toàn, bảo mật mà còn phải dễ dàng tìm kiếm và sử dụng.

Do đó “Ứng dụng quản lí danh bạ” là một ứng dụng quản lý cần thiết, nó có
thể cho phép người dùng nhập thông tin liên hệ tương ứng với từng cá nhân. Khi
đó, người dùng có thể tìm kiếm thông tin một cách dễ dàng, ta chỉ cần nhập số
điện thoại hoặc tên của người mà ta cần tìm kiếm, thì nó sẽ hiện thị mọi thông tin
cá nhân mà ta đã lưu trước đó.

Ở đồ án lần này, nhóm chúng em đã thiết kế một ứng dụng quản lý danh bạ cơ
bản bằng ngôn ngữ lập trình C#. Với mục đích là lưu trữ những thông tin của người
dùng như tên, số điện thoại, email, giúp danh bạ người dùng được tổ chức một cách
hiệu quả, tối ưu, dễ đọc thông tin. Ngoài ra, còn có thể sử dụng một số tính năng
khác như thêm, sửa, xoá, tìm kiếm nhằm đáp ứng nhu cầu bổ sung, cập nhật của
người dùng khi cần thiết, xoá bớt những thông tin dư hoặc sai.

5
I. Cơ sở lí thuyết:
1. C Sharp ( C#):
a. Khái quát về C#:

C# (hay C sharp) là một ngôn ngữ lập trình đơn giản, được phát triển vào
năm 2000 bởi đội ngũ kỹ sư của Microsoft, trong đó người dẫn đầu là Anders
Hejlsberg là tác giả của Turbo Pascal, một ngôn ngữ lập trình PC phổ biến và Scott
Wiltamuth từng là Giám đốc Đối tác Quản lý Chương trình cho Visual Studio Pro.
C# là ngôn ngữ lập trình hiện đại, hướng đối tượng và được xây dựng trên nền tảng
của hai ngôn ngữ mạnh nhất là C++ và Java.

C# được thiết kế để chạy trên nền tảng Microsoft .NET, một framework phần
mềm mà Microsoft phát triển để hỗ trợ phát triển và thực thi ứng dụng trên môi
trường Windows và nền tảng khác. C# thường được sử dụng cho nhiều mục đích,
bao gồm phát triển ứng dụng máy tính, ứng dụng di động, ứng dụng web, và nhiều
loại phần mềm khác. Nó là một ngôn ngữ lập trình hướng đối tượng (OOP), có
nghĩa là nó hỗ trợ các khái niệm như lớp, đối tượng, kế thừa, đa hình, và đóng gói.
Một trong những điểm mạnh của C# là tích hợp sâu sắc với các công nghệ và
framework của Microsoft, như .NET Framework và sau này là .NET Core. Điều này
giúp C# trở thành một lựa chọn phổ biến cho việc phát triển ứng dụng trên nền tảng
Microsoft.

b. Đặc trưng C#:

Ngôn ngữ lập trình C# (C Sharp) có nhiều đặc trưng đặc biệt, bao gồm cả
những tính năng thiết kế, quản lý bộ nhớ, và tích hợp với framework, ngoài ra C#
còn là một ngôn ngữ hiện đại, ít từ khoá bên cạnh đó còn một số đặc trưng quan
trọng của C# như:

 Hướng Đối Tượng (OOP): C# được thiết kế với hướng đối tượng, hỗ trợ
các khái niệm như lớp, đối tượng, kế thừa, đa hình, và đóng gói. Điều này
giúp tổ chức mã nguồn một cách có tổ chức và dễ hiểu.

6
 Tích Hợp Mạnh Mẽ với .NET Framework/.NET Core: C# tích hợp
chặt chẽ với .NET Framework hoặc .NET Core, cung cấp một nền tảng
mạnh mẽ để phát triển ứng dụng trên nhiều nền tảng.
 Garbage Collection: Sử dụng Garbage Collection giúp quản lý bộ nhớ tự
động, giảm bớt gánh nặng cho lập trình viên trong việc quản lý vòng đời
của đối tượng.
 Cú Pháp Linh Hoạt: Cú pháp của C# dễ đọc và linh hoạt, giúp lập trình
viên viết mã nguồn một cách hiệu quả và nhanh chóng.
 Kiểu Dữ Liệu An Toàn: C# có kiểu dữ liệu mạnh mẽ, kiểm tra kiểu dữ
liệu tại thời điểm biên dịch, giúp giảm số lượng lỗi runtime và tăng tính
ổn định của ứng dụng.
 Thuộc Tính và Sự Kiện: Hỗ trợ đặc tính (properties) và sự kiện (events)
giúp quản lý và tương tác với đối tượng một cách dễ dàng và có tổ chức.
 Xử Lý Ngoại Lệ (Exception Handling): C# hỗ trợ xử lý ngoại lệ, giúp
kiểm soát và xử lý tình huống ngoại lệ một cách an toàn.
 Lập Trình Đa Luồng: C# hỗ trợ lập trình đa luồng, giúp xử lý các tác vụ
đồng thời một cách hiệu quả.
 ASP.NET: Dùng để phát triển ứng dụng web thông qua framework
ASP.NET, cung cấp mô hình MVC (Model-View-Controller) và Web
API.
 LINQ (Language Integrated Query): LINQ là một phần quan trọng của
C# cho phép truy vấn dữ liệu trong mã nguồn, làm cho xử lý dữ liệu trở
nên thuận tiện và mạnh mẽ.
 Interop với Ngôn Ngữ Khác: C# hỗ trợ interoperability với các ngôn
ngữ khác như C++ thông qua P/Invoke, giúp tích hợp các thư viện có sẵn.
 Phong Cách Lập Trình Linh Hoạt: C# hỗ trợ cả lập trình hướng sự
kiện và lập trình hàm, cung cấp sự linh hoạt trong việc phát triển ứng
dụng.

7
c. Lợi ích của C#:
 Dễ Học và Sử Dụng: Cú pháp của C# tương đối giống với nhiều ngôn
ngữ lập trình khác như C++ và Java, điều này giúp lập trình viên dễ học
và chuyển đổi giữa các ngôn ngữ.
 Hỗ Trợ Đối Tượng Hóa (OOP): C# được thiết kế với hướng đối tượng,
giúp tổ chức mã nguồn thành các đối tượng, dễ quản lý và tái sử dụng.
 Tích Hợp Mạnh Mẽ với .NET Framework/.NET Core: Tích hợp sâu
sắc với các framework của Microsoft, cung cấp nền tảng mạnh mẽ cho
phát triển ứng dụng đa dạng.
 Quản Lý Bộ Nhớ Tự Động (Garbage Collection): C# sử dụng Garbage
Collection giúp quản lý bộ nhớ tự động, giảm gánh nặng cho lập trình
viên trong việc quản lý vòng đời của đối tượng.
 An Toàn và Bảo Mật: C# được thiết kế với các tính năng an toàn, như
kiểm soát kiểu dữ liệu và quản lý bộ nhớ an toàn, giúp giảm nguy cơ lỗi
như tràn bộ nhớ.
 Phong Cách Lập Trình Đa Luồng: Hỗ trợ lập trình đa luồng giúp xử lý
hiệu quả các tác vụ đồng thời.
 Phát Triển Ứng Dụng Đa Nền Tảng: Với sự ra đời của .NET Core, C#
giờ đây có khả năng phát triển ứng dụng đa nền tảng, không chỉ giới hạn
trên Windows.
 Cộng Đồng Lớn và Hỗ Trợ Tốt: C# có một cộng đồng lập trình viên lớn
và tích cực, cung cấp nhiều tài nguyên và hỗ trợ trực tuyến.
d. Hạn chế của C#:
 Phụ Thuộc vào Ecosystem của Microsoft: C# thường phải phụ thuộc
vào các sản phẩm và công nghệ của Microsoft, điều này có thể tạo ra sự
ràng buộc đối với người phát triển muốn sử dụng nền tảng khác.
 Hiệu Suất Không Cao Như Các Ngôn Ngữ Gần Sàn (Low-Level): So
với một số ngôn ngữ lập trình gần sàn như C++ hay Rust, C# có thể
không đạt được hiệu suất cao nhất trong một số tình huống đặc biệt.

8
 Khả Năng Tích Hợp Giữa Các Ngôn Ngữ Khó Khăn: Mặc dù C# có
thể tương tác với các ngôn ngữ khác trên nền tảng .NET, nhưng tích hợp
với một số ngôn ngữ không phải là .NET có thể gặp khó khăn.
 Giới Hạn Trong Môi Trường Máy Ảo (Virtual Machine): Việc chạy
trên máy ảo (CLR - Common Language Runtime) có thể tạo ra một chút
độ trễ so với các ngôn ngữ biên dịch trực tiếp.
 Kích Thước File Thực Thi Lớn: Ứng dụng C# thường có kích thước
file thực thi lớn hơn so với một số ngôn ngữ khác, điều này có thể quan
trọng trong môi trường có hạn băng thông hoặc dung lượng lưu trữ.
2. NET Framework:
a. Khái niệm:
.NET Framework là một nền tảng lập trình nguồn mở và đa nền tảng. Được
xây dựng bởi hai thành phần chính là Framework Class Library (FCL) và Common
Language Runtime (CLR). FCL là một bộ thư viện lớn bao gồm hàng ngàn lớp,
giao diện, cấu trúc, phương thức, thuộc tính, và sự kiện. Cung cấp các chức năng cơ
bản và nâng cao để xây dựng các ứng dụng cho các lĩnh vực khác nhau như: web,
desktop, điện toán đám mây, game, app di động, app AI ,… . CLR là một máy ảo
đảm nhiệm quản lý việc thực thi các ứng dụng .NET. Chúng cung cấp các dịch vụ
như: quản lý bộ nhớ, bảo mật, xử lý ngoại lệ và làm việc với các ngôn ngữ lập trình
khác nhau.

b. Đặc điểm:

 Bảo mật: .NET Framework bảo đảm an toàn cho các ứng dụng và dữ liệu của
người dùng. Các cơ chế bảo mật bao gồm: mã hóa dữ liệu, kiểm soát quyền truy
cập, xác thực danh tính, ký số dữ liệu, và áp dụng các chính sách và quyền bảo
mật.
 Tối ưu hóa: .NET Framework giảm thiểu chi phí và thời gian phát triển các
ứng dụng bằng cách cung cấp các công cụ và IDE (Môi trường phát triển tích
hợp) hiệu quả nhất. Các công cụ và IDE này bao gồm: Visual Studio, Visual
Studio Code, .NET Core, .NET Standard, và nhiều công cụ khác.

9
 Đa nền tảng: .NET Framework có thể hoạt động trên nhiều nền tảng khác
nhau, như Windows, Linux, macOS, iOS, Android, và nhiều nền tảng khác.
Điều này giúp tăng tính linh hoạt và tiện lợi cho người dùng, khi có thể sử dụng
các ứng dụng .NET trên nhiều thiết bị và hệ điều hành khác nhau.
 Tính hiện đại: .NET Framework theo kịp các công nghệ và xu hướng mới nhất
như: điện toán đám mây, trí tuệ nhân tạo, máy học, và nhiều lĩnh vực khác. Điện
toán đám mây là việc sử dụng các tài nguyên và dịch vụ trên mạng internet,
thay vì sử dụng các máy tính cá nhân hay máy chủ cục bộ. Trí tuệ nhân tạo là
việc tạo ra các máy móc và phần mềm có khả năng học hỏi, suy luận, và thực
hiện các nhiệm vụ thông minh. Máy học là một nhánh của trí tuệ nhân tạo, liên
quan đến việc phân tích và xử lý dữ liệu lớn, để tạo ra các mô hình và thuật toán
có khả năng tự học hỏi và cải thiện.

c. Cách thức hoạt động của .NET framework:

Khi lập trình viên viết mã nguồn bằng một trong những ngôn ngữ lập trình
được hỗ trợ bởi .NET Framework như: C#, Visual Basic, F#, C++ và nhiều ngôn
ngữ khác. Mã nguồn đó sẽ được biên dịch thành một ngôn ngữ trung gian gọi là
Microsoft Intermediate Language (MSIL) hay IL. Ngôn ngữ này là một ngôn ngữ
nhị phân, độc lập với ngôn ngữ lập trình và nền tảng, và có thể được chuyển đổi
thành mã máy để thực thi trên một máy ảo.CLR quản lý việc thực thi các ứng
dụng .NET, bằng cách cung cấp các dịch vụ như: quản lý bộ nhớ, bảo mật, xử lý
ngoại lệ và làm việc với các ngôn ngữ lập trình khác nhau. CLR biên dịch mã IL
thành mã máy tùy thuộc vào nền tảng mà ứng dụng đang chạy, bằng cách sử dụng
một trình biên dịch gọi là Just-In-Time (JIT) Compiler. Điều này giúp tăng tính độc
lập và hiệu suất của các ứng dụng .NET.NET Framework còn bao gồm một bộ thư
viện lớn FCL. FCL là một phần của .NET Standard, một tập hợp các giao diện và
lớp cơ bản mà tất cả các phiên bản của .NET Framework phải tuân theo.

10
d. Ưu & Nhược điểm:

Ưu điểm

 Nhanh, an toàn, thân thiện, và hoạt động tốt: .NET Framework cho phép tạo
ra các ứng dụng chạy nhanh, bảo mật, dễ sử dụng, và ổn định. .NET Framework
sử dụng các kỹ thuật như biên dịch trước (ahead-of-time compilation), biên dịch
chỉ một lần (just-in-time compilation) và tối ưu hóa mã trung gian (intermediate
language optimization) để cải thiện hiệu suất và bảo mật của các ứng
dụng. Ngoài ra còn cung cấp giao diện người dùng đẹp mắt, thân thiện, và đa
dạng, cho phép người dùng tương tác với các ứng dụng một cách dễ dàng và
thoải mái .
 Có cộng đồng lập trình viên lớn và năng động: .NET Framework có cộng
đồng lập trình viên lớn và năng động, gồm nhiều lập trình viên chuyên nghiệp
và nghiệp dư, từ nhiều quốc gia và lĩnh vực khác nhau. Cộng đồng lập trình
viên .NET thường xuyên chia sẻ kiến thức, kinh nghiệm, và mã nguồn, thông
qua các kênh như Stack Overflow, GitHub, MSDN, .NET Foundation, và nhiều
kênh khác. Cộng đồng lập trình viên .NET cũng thường tổ chức các sự kiện, hội
thảo, và cuộc thi, để thúc đẩy sự học hỏi, sáng tạo, và hợp tác .
 Dễ dàng bảo trì và nâng cấp: .NET Framework cho phép tạo ra các ứng dụng
dễ dàng bảo trì và nâng cấp, bằng cách sử dụng các kỹ thuật như lập trình
hướng đối tượng (object-oriented programming), lập trình hướng thành phần
(component-based programming), và lập trình hướng khía cạnh (aspect-oriented
programming).
 Hỗ trợ nhiều loại ứng dụng: .NET Framework hỗ trợ nhiều loại ứng dụng
khác nhau, như ứng dụng web, ứng dụng desktop, ứng dụng điện toán đám mây,
ứng dụng game, ứng dụng di động, ứng dụng AI, và nhiều ứng dụng khác.

Nhược điểm

 Yêu cầu cài đặt .NET Framework trên máy tính để chạy các ứng dụng: Để
chạy các ứng dụng .NET, người dùng cần phải cài đặt .NET Framework trên

11
máy tính của mình. Điều này có thể gây ra một số vấn đề, như tốn dung lượng ổ
cứng, tốn thời gian cài đặt, và có thể gây ra xung đột với các phiên bản cũ
của .NET Framework .
 Không tương thích hoàn toàn với các phiên bản cũ của .NET
Framework: .NET Framework có nhiều phiên bản khác nhau, từ phiên bản 1.0
đến phiên bản 4.8. Mỗi phiên bản có những thay đổi và cải tiến về chức năng,
hiệu suất, và bảo mật. Tuy nhiên, điều này cũng có thể gây ra một số vấn đề về
tương thích, khi một số ứng dụng được viết cho một phiên bản cũ của .NET
Framework có thể không chạy được trên một phiên bản mới hơn, hoặc ngược
lại . Điều này có thể gây ra sự bất tiện và lỗi cho người dùng và lập trình viên.
 Có thể gặp khó khăn khi làm việc với các ngôn ngữ lập trình không phải
của Microsoft: .NET Framework hỗ trợ nhiều ngôn ngữ lập trình khác nhau,
như C#, Visual Basic, F#, C++, và nhiều ngôn ngữ khác. Tuy nhiên, một số
ngôn ngữ lập trình không phải của Microsoft, như Java, Python, Ruby, và nhiều
ngôn ngữ khác, có thể không được hỗ trợ hoặc không tương thích tốt với .NET
Framework . Điều này có thể gây ra một số khó khăn khi muốn sử dụng các thư
viện, công cụ, hoặc tính năng của các ngôn ngữ lập trình này trên .NET
Framework, hoặc khi muốn chuyển đổi từ một ngôn ngữ lập trình này sang một
ngôn ngữ lập trình khác trên .NET Framework.

3. Biên dịch và ngôn ngữ trung gian MSIL:

Trong .NET Framework, chương trình không được biên dịch trực tiếp thành
các tập tin thực thi như trong các ngôn ngữ lập trình khác. Thay vào đó, chúng được
biên dịch thành Microsoft Intermediate Language (MSIL), một ngôn ngữ trung
gian. MSIL là một ngôn ngữ assembly dựa trên ngăn xếp, không phụ thuộc vào một
kiến trúc phần cứng cụ thể nào. Điều này có nghĩa là mã MSIL không chứa các chỉ
thị cụ thể cho một kiến trúc xử lý nào, mà thay vào đó chứa các chỉ thị trừu tượng
được gọi là "chỉ thị IL".

Ví dụ, một chỉ thị IL có thể thực hiện việc chuyển đổi từ một kiểu dữ liệu
sang kiểu khác, gọi một phương thức, quản lý bộ nhớ và thực hiện nhiều thao tác

12
khác. Điều này cho phép mã MSIL có khả năng di động giữa các kiến trúc phần
cứng khác nhau, mà không cần phải biên dịch lại từng lần cho từng kiến trúc.
Những tập tin MSIL được tạo ra từ các ngôn ngữ như C# hoặc VB.NET đều tương
tự nhau, không phụ thuộc vào ngôn ngữ mã nguồn ban đầu. Điều quan trọng là
chúng được thực thi trong môi trường chung (Common Language Runtime - CLR)
của .NET Framework. CLR là một môi trường thực thi đa nền tảng, cung cấp các
dịch vụ quản lý bộ nhớ, quản lý luồng và quản lý tài nguyên cho các ứng
dụng .NET. Điều này cho phép các ứng dụng được viết bằng các ngôn ngữ khác
nhau trong .NET Framework có thể chạy trên cùng một runtime, giúp tăng tính
tương thích và sự chia sẻ mã nguồn giữa các ứng dụng.

Trong quá trình build project, mã nguồn C# được biên dịch thành MSIL
(Microsoft Intermediate Language). Mã MSIL này được lưu vào trong một tập tin
trên đĩa. Khi chúng ta chạy chương trình, MSIL này được biên dịch một lần nữa, sử
dụng trình biên dịch Just-In-Time (JIT) của Common Language Runtime (CLR)
trong .NET Framework. Trình biên dịch JIT nhìn vào các tập tin MSIL và chuyển
đổi chúng thành mã máy, cụ thể là mã máy dành cho kiến trúc phần cứng mà
chương trình đang chạy trên. Quá trình này xảy ra trong thời gian chạy (runtime) và
mã máy được thực thi bởi bộ xử lý của máy tính.

Trình biên dịch Just-In-Time (JIT) này là một công cụ quan trọng giúp tăng
hiệu suất và tương thích của ứng dụng. Khi một phương thức được gọi, trình biên
dịch JIT sẽ phân tích mã MSIL và tạo ra mã máy tương ứng, được tối ưu hóa để
chạy nhanh và hiệu quả. Trình biên dịch JIT có khả năng nhận ra khi một phần mã
đã được biên dịch trước đó. Thay vì phải biên dịch toàn bộ mã MSIL thành mã máy
trước khi chương trình chạy, chỉ các phần mã MSIL cần thiết để thực thi ban đầu sẽ
được biên dịch và thực thi. Các phần mã MSIL khác sẽ được biên dịch khi cần thiết,
theo nguyên tắc "chỉ biên dịch khi cần" (just-in-time). Do đó, khi chạy ứng dụng,
quá trình biên dịch chỉ xảy ra khi cần thiết, tức là chỉ biên dịch các phần mã MSIL
chưa được biên dịch thành mã máy. Điều này giúp tăng hiệu suất chương trình và
giảm thời gian khởi động ban đầu.

13
Một lợi ích quan trọng của việc sử dụng MSIL là khả năng tương thích đa
nền tảng. Mã MSIL không phụ thuộc vào một kiến trúc phần cứng cụ thể nào, cho
phép bạn chạy cùng một tệp MSIL trên nhiều nền tảng khác nhau, bao gồm
Windows, Linux và macOS. Điều này giúp ứng dụng .NET dễ dàng di chuyển giữa
các hệ điều hành và kiến trúc phần cứng khác nhau mà không cần phải viết lại mã
nguồn. Cho phép mã MSIL được tối ưu hóa và chạy nhanh trên các nền tảng khác
nhau. Điều này giúp rút ngắn thời gian phát triển và cho phép ứng dụng .NET di
chuyển linh hoạt giữa các hệ điều hành và kiến trúc phần cứng.

Do tất cả các ngôn ngữ .NET Framework cùng tạo ra MSIL, các đối tượng
được tạo ra từ một ngôn ngữ có thể được truy cập và dẫn xuất từ một ngôn ngữ khác
trong .NET. Điều này có nghĩa là có thể sử dụng một đối tượng được tạo ra từ C#
trong VB.NET hoặc ngược lại mà không gặp vấn đề. Làm cho .NET Framework trở
thành một môi trường phát triển linh hoạt, cho phép lập trình viên sử dụng ngôn ngữ
ưa thích của họ và tận dụng lại mã nguồn từ các ngôn ngữ khác trong cùng một dự
án.

4. Nền tảng .NET:

a. Khái niệm:
.NET là một nền tảng nguồn mở để xây dựng các ứng dụng trên máy tính để
bàn, web và thiết bị di động có thể chạy nguyên bản trên bất kỳ hệ điều hành nào.
Hệ thống .NET bao gồm các công cụ, thư viện và ngôn ngữ hỗ trợ phát triển phần
mềm hiện đại, có quy mô linh hoạt và hiệu năng cao. Một cộng đồng nhà phát triển
hoạt động tích cực trong việc duy trì và hỗ trợ nền tảng .NET.
b. Đặc điểm:

 Thư viện lập trình lớn: .NET sở hữu những thư viện lập trình rất lớn, có
khả năng hỗ trợ tối đa cho việc tạo lập, xây dựng các ứng dụng web; Truy
cập, kết nối các CSDL, cấu trúc dữ liệu; Lập trình giao diện,… Những đặc
trưng này khiến nó trở thành nền tảng chính được rất nhiều lập trình viên lựa
chọn.

14
 Nǎng suất làm việc cao: Lập trình, thiết kế ứng dụng với .NET tiết kiệm rất
nhiều thời gian bởi nó cung cấp sẵn khá nhiều thành phần dùng trong thiết
kế. Chỉ cần bạn biết cách sử dụng cũng như tùy biến những đoạn code có
sẵn này cho phù hợp với dự án của mình, việc lập trình sẽ trở nên đơn giản
hơn bao giờ hết.
 Biến đổi linh hoạt nhờ kiến trúc “ghép nối lỏng”: .NET được thiết kế,
xây dựng với khả năng biến đổi linh hoạt nhờ cấu trúc ‘ghép nối lỏng’. Điều
này mang lại nhiều lợi thế về năng suất.
 Đa ngôn ngữ: .NET là nền tảng hỗ trợ cho đa ngôn ngữ. Lập trình viên có
thể sử dụng nền tảng này để tạo lập các ứng dụng web bằng nhiều ngôn ngữ
lập trình khác nhau mà vẫn đảm bảo khả năng tích hợp của nó.

Ví dụ như là: C# (phát âm là C sharp), F# (phát âm là F sharp) và Visual


Basic là ba ngôn ngữ được Microsoft hỗ trợ để phát triển .NET. Các công ty và nhà
phát triển khác nhau cũng đã tạo ra những ngôn ngữ khác hoạt động với nền
tảng .NET.

 Bảo mật cao: .NET có phần kiến trúc bảo mật được thiết kế theo dạng từ
dưới lên. Điều này giúp bảo vệ dữ liệu cũng như các ứng dụng khỏi sự đe
dọa của hacker thông qua mô hình bảo mật tinh vi là evidence-based.
 Tận dụng các dịch vụ sẵn có trong hệ điều hành: Windows sở hữu rất
nhiều dịch vụ có khả năng hoạt động trên mọi nền tảng như truy cập dữ liệu,
mô hình dạng đối tượng thành phần, giao diện người dùng tương tác, bảo
mật tích hợp và cả giám sát giao dịch. .NET tận dụng những dịch vụ này để
đơn giản hóa cách sử dụng, giúp lập trình trên nền tảng này trở nên dễ dàng
hơn.
 Thành phần của kiến trúc .NET: có 3 thành phần chính
 Ngôn ngữ .NET
 Khung mô hình ứng dụng
 Thời gian chạy .NET

15
c. Thời gian chạy ngôn ngữ của NET:

Thời gian chạy .NET, còn gọi là Thời gian chạy ngôn ngữ chung (CLR), biên
dịch và thực thi các chương trình .NET trên những hệ điều hành khác nhau.

 Biên dịch tức thời

CLR biên dịch mã khi nhà phát triển viết mã. Trong quá trình biên dịch, CLR
dịch mã thành Ngôn ngữ trung gian chung (CIL).

 Thực thi

Thời gian chạy .NET quản lý quá trình thực thi mã CIL. CIL tương thích liên
nền tảng, đồng thời, bất kỳ hệ điều hành nào cũng có thể xử lý CIL. Khả năng tương
thích liên nền tảng đề cập đến khả năng ứng dụng có thể chạy trên nhiều hệ điều
hành khác nhau với thao tác sửa đổi ở mức tối thiểu.

d. Khung mô hình ứng dụng:


 Ứng dụng web

Khung ASP.NET mở rộng nền tảng nhà phát triển .NET, đặc biệt để xây
dựng các ứng dụng dựa trên web. Khung này hỗ trợ các công nghệ web như API
REST, HTML, CSS và JavaScript. ASP.NET cung cấp một cơ sở dữ liệu người
dùng tích hợp với quá trình xác thực nhiều yếu tố và từ bên ngoài.

 Ứng dụng di động

Bạn có thể sử dụng Xamarin/Mono để chạy các ứng dụng .NET trên tất cả
các hệ điều hành chính trên thiết bị di động, bao gồm iOS và Android. Xamarin bao
gồm khung giao diện người dùng di động nguồn mở Xamarin.Forms. Các nhà phát
triển .

 Ứng dụng máy tính để bàn

Bạn có thể sử dụng Xamarin để phát triển ứng dụng máy tính để bàn. Ngoài
ra, Universal Windows Platform mở rộng phát triển ứng dụng .NET trên Windows

16
10. Windows Presentation Foundation và Windows Forms là những khung khác để
thiết kế giao diện người dùng trên Windows.

 Các ứng dụng khác

Với ML.NET, bạn có thể phát triển và tích hợp mô hình máy học tùy chỉnh
vào ứng dụng .NET của mình. Bạn có thể sử dụng Thư viện .NET IoT để phát triển
ứng dụng trên cảm biến và những thiết bị thông minh khác. Đối với bất kỳ giải pháp
nào không có sẵn trong khung, bạn có thể tìm thấy nhiều thư viện hàm cụ thể trên
kho NuGet công cộng. Bạn có thể sử dụng Nuget để tạo, chia sẻ và sử dụng nhiều
thư viện .NET cho hầu hết mọi mục đích.
e. Cách thức hoạt động

.NET sử dụng một ngôn ngữ trung gian gọi là Common Intermediate
Language (CIL) hoặc Microsoft Intermediate Language (MSIL) để biên dịch mã
nguồn thành mã trung gian 2. Mã trung gian này sau đó được biên dịch thành mã
máy tại thời điểm chạy bởi Common Language Runtime (CLR) 23. CLR là một
máy ảo được thiết kế để thực thi mã trung gian và cung cấp các tính năng như quản
lý bộ nhớ, quản lý luồng và bảo mật 2.

Mã nguồn .NET có thể được viết bằng nhiều ngôn ngữ lập trình khác nhau,
bao gồm C#, F# và Visual Basic 1. .NET cũng hỗ trợ nhiều nền tảng khác nhau, bao
gồm Windows, Linux và macOS 1.

f. Lợi ích và hạn chế của .NET:


Lợi ích

 Độc lập nền tảng: .NET cho phép phát triển ứng dụng trên nhiều nền tảng
khác nhau, bao gồm Windows, Linux và macOS 1.
 Hiệu suất tốt: .NET cung cấp hiệu suất tốt hơn so với các framework phát
triển phần mềm khác 1.
 Hỗ trợ đa ngôn ngữ: .NET hỗ trợ nhiều ngôn ngữ lập trình, bao gồm C#, F#
và Visual Basic 1.

17
 Cộng đồng lớn: .NET có một cộng đồng lớn và nhiều tài liệu hướng dẫn
trực tuyến 1.

Hạn chế:

 Chi phí: .NET có chi phí sử dụng và cần phải mua các công cụ phát triển
phần mềm bổ sung 1.
 Khó khăn trong việc chuyển đổi: Chuyển đổi từ các framework phát triển
phần mềm khác sang .NET có thể gặp khó khăn 1.
 Không hỗ trợ tốt cho các ứng dụng lớn: .NET không hỗ trợ tốt cho các
ứng dụng lớn và phức tạp 1.
II. Ứng dụng quản lí danh bạ:
1. Khái quát:

Bằng ngôn ngữ lập trình C# chúng tôi đã thiết kế được ứng dụng quản lý
danh bạ với mục đích là lưu trữ những thông tin của người dùng như tên, số điện
thoại, email, giúp danh bạ người dùng được tổ chức một cách hiệu quả, tối ưu, dễ
đọc thông tin. Ngoài ra còn có thể sử dụng một số tính năng khác như thêm, sửa,
xoá, tìm kiếm đáp ứng nhu cầu bổ sung, cập nhật người dùng khi cần thiết, xoá bớt
những thông tin dư hoặc sai và ứng dụng cũng cung cấp khả năng tìm kiếm thông
tin một cách nhanh chóng giúp người dùng tiết kiệm thời gian khi cần liên hệ với ai
đó. Tóm lại, ứng dụng quản lý danh bạ không chỉ là công cụ tiện ích mà còn là
người bạn đồng hành đắc lực trong việc duy trì mối liên hệ và liên lạc trong thế giới
kỹ thuật số ngày nay.

Ứng dụng quản lý danh bạ gồm các phần sau:

- Menu
- Thêm danh bạ
- Sửa danh bạ
- Xoá danh bạ
- Tìm kiếm danh bạ
- Hiển thị danh bạ

18
- Lưu trữ
- Thoát
2. Nội dung chương trình:

using System;
using System.IO;
using System.Threading;
namespace Ứng_dụng_quản_lí_danh_bạ
{
internal class Program
{
static string[,] danhba = new string[50, 3];
static
int soluong = 0;
static void Main(string[] args)
{
Modau();
Mucluc();
}
static void Modau()
{
string a = " *(^o^)* ";
int yPos = 2;
int xPos = 2;
int count = 0;
while (true)
{
Console.Clear();

19
yPos++;
xPos++;
if (yPos > Console.WindowHeight - 1)
{
yPos = 2;
xPos = 7;
}
if (count < 15)
{
Console.WriteLine("Xin chao ban den voi ung dung quan ly danh ba
cua nhom 5");
Console.WriteLine("LOADING...");
Console.SetCursorPosition(xPos, 1);
Console.WriteLine(a);
System.Threading.Thread.Sleep(40);
}
else
{
Console.WriteLine("Moi ban nhan Enter de tiep tuc chuong trinh!");
Console.ReadLine(); // Đợi người dùng nhấn Enter
break;
}
count++;
System.Threading.Thread.Sleep(80);
Console.Clear();
}
}
static void Mucluc()

20
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("QUAN LI DANH BA:");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("=================================");
Console.WriteLine("| 1. Them lien he |");
Console.WriteLine("| 2. Sua lien he |");
Console.WriteLine("| 3. Xoa lien he |");
Console.WriteLine("| 4. Tim kiem lien he |");
Console.WriteLine("| 5. Hien thi danh ba |");
Console.WriteLine("| 6. Luu tru du lieu |");
Console.WriteLine("| 7. Thoat |");
Console.WriteLine("=================================");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write(" Xin moi ban chon chuong trinh ma ban muon thuc hien: ");
int chon = int.Parse(Console.ReadLine()); ;
switch (chon)
{
case 1:
Themdanhba();
break;
case 2:
Suadanhba();
break;
case 3:
Xoadanhba();

21
break;
case 4:
Timkiemdanhba();
break;
case 5:
Hienthidanhba();
break;
case 6:
Luutru();
break;
case 7:
Console.Clear();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("Cam on ban da su dung chuong trinh. Hen gap lai!
*(^o^)* ");
Thread.Sleep(2000);
Environment.Exit(0);
return;
default:
Console.WriteLine("Lua chon khong hop le.");
break;
}
Console.ReadKey();
}
public static void Themdanhba()
{
{
Console.Clear();

22
Console.ForegroundColor = ConsoleColor.Green;
string hoten, sodienthoai, email;
bool kiemtra = false;
while (!kiemtra)
{
if (soluong >= danhba.Length)
{
Console.WriteLine("Danh ba cua ban da day.");
break;
}
else
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(" Nhap thong tin lien he ");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Ho va ten : ");
Console.ForegroundColor = ConsoleColor.White;
hoten = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("So dien thoai : ");
Console.ForegroundColor = ConsoleColor.White;

23
sodienthoai = Console.ReadLine();
Console.ResetColor();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Email : ");
Console.ForegroundColor = ConsoleColor.White;
email = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.WriteLine();
if (hoten == "" || email == "" || sodienthoai == "")

{
Console.WriteLine("Ban phai nhap day du thong tin lien he.");
}
else
{
danhba[soluong, 0] = hoten;
danhba[soluong, 1] = sodienthoai;
danhba[soluong, 2] = email;
soluong++;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Da cap nhat hoan tat vao danh ba.");
Console.ResetColor();
Console.Write("Ban muon tiep tuc cap nhat danh ba? 1 (Co) hoac
2 (Khong): ");
int chon = int.Parse(Console.ReadLine());

24
if (chon != 1)
{
Console.Clear();
break;
}
Console.Clear();
}
}
}
Mucluc();
}
}
public static void Hienthidanhba()
{
Console.Clear();

if (soluong == 0)
{
Console.WriteLine("Danh ba hien tai dang trong.");
}
else
{
for (int i = 0; i < soluong; i++)
{
string hoten = danhba[i, 0];
string sodienthoai = danhba[i, 1];
string email = danhba[i, 2];
Console.ForegroundColor = ConsoleColor.Yellow;

25
Console.WriteLine("Danh ba lien he: ");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("{0}. Ho va ten: ", i + 1);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(hoten);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("So dien thoai: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(sodienthoai);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Email: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(email);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
}
}
Console.ResetColor();
Console.ForegroundColor = ConsoleColor.Gray;

26
Console.WriteLine("Nhan Enter de quay lai menu chinh...");
Console.ReadLine();
Mucluc();
}
public static void Suadanhba()
{
while (true)
{
Console.Clear();
bool timthay = false;
if (soluong == 0)
{
Console.WriteLine("Danh ba hien tai dang trong.");
Console.WriteLine("Nhan Enter de quay lai menu chinh...");
Console.ReadLine();
Mucluc();
}
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("Nhap tu khoa can sua:");
string tukhoa = Console.ReadLine();
for (int i = 0; i < soluong; i++)
{
string hoten = danhba[i, 0];
string sodienthoai = danhba[i, 1];
string email = danhba[i, 2];

if (hoten == tukhoa || sodienthoai == tukhoa || email == tukhoa)

27
{
timthay = true;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("{0}. Ho va ten: ", i + 1);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(hoten);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("So dien thoai: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(sodienthoai);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Email: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(email);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.WriteLine();
bool hople = false;
while (!hople)

28
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Nhap ho ten moi: ");
Console.ResetColor();
string hotenmoi = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Nhap so dien thoai moi: ");
Console.ResetColor();
string sodienthoaimoi = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Nhap email moi: ");
Console.ResetColor();
string emailmoi = Console.ReadLine();
if (hotenmoi == "" || sodienthoaimoi == "" || emailmoi == "")
{
Console.WriteLine("Ban phai nhap day du thong tin lien he.");
}
else
{
danhba[i, 0] = hotenmoi;
danhba[i, 1] = sodienthoaimoi;
danhba[i, 2] = emailmoi;
Console.Clear();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Danh ba da duoc sua thanh cong.");
Console.ResetColor();
hople = true;

29
}
}
}
}
if (!timthay)
{
Console.WriteLine("Khong tim thay ket qua nao.");
}
Console.ForegroundColor = ConsoleColor.White;
Console.Write("Ban muon tiep tuc sua? 1 (Co) hoac 2 (Khong): ");
int chon = int.Parse(Console.ReadLine());
if (chon != 1)
{
Console.Clear();
break;
}
}
Mucluc();
}
public static void Xoadanhba()
{
while (true)
{
Console.Clear();
if (soluong == 0)
{
Console.WriteLine("Danh ba hien tai dang trong.");

30
Console.WriteLine("Nhan Enter de quay lai menu chinh...");
Console.ReadLine();
Mucluc();
}
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Danh ba hien tai:");
for (int i = 0; i < soluong; i++)
{
string hoten = danhba[i, 0];
string sodienthoai = danhba[i, 1];
string email = danhba[i, 2];
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(" {0}. Ho va ten: ", i + 1);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(hoten);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("So dien thoai: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(sodienthoai);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");

31
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Email: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(email);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
}
Console.ResetColor();
Console.ForegroundColor = ConsoleColor.White;
Console.Write("Nhap so thu tu lien he can xoa hoac nhap 0 de quay ve
menu: ");
int sothutu = int.Parse(Console.ReadLine());
if (sothutu > soluong)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("So thu tu khong hop le. Vui long nhan Enter de
nhap lai.");
Console.ReadLine(); // Dừng màn hình để người dùng đọc thông báo
continue;
}
if(sothutu==0)
{
Mucluc();
}
string hotenbixoa = danhba[sothutu - 1, 0];
for (int i = sothutu - 1; i < soluong - 1; i++)
{
danhba[i, 0] = danhba[i + 1, 0];

32
danhba[i, 1] = danhba[i + 1, 1];
danhba[i, 2] = danhba[i + 1, 2];
}
soluong--;
Console.Clear();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Lien he '{0}' da duoc xoa khoi danh ba.",
hotenbixoa);
if (soluong == 0)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Danh ba sau khi xoa dang trong.");
}
Console.ResetColor();
Console.Write("Ban muon tiep tuc xoa? 1 (Co) hoac 2 (Khong): ");
int chon = int.Parse(Console.ReadLine());
if (chon != 1)
{
Mucluc();
}
}
}
public static void Timkiemdanhba()
{
while (true)
{
Console.Clear();
if (soluong == 0)

33
{
Console.WriteLine("Danh ba hien tai dang trong.");
Console.WriteLine("Nhan Enter de quay lai menu chinh...");
Console.ReadLine();
Mucluc();
}
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("Nhap tu khoa can tim kiem: ");
string tu = Console.ReadLine();
bool timthay = false;
for (int i = 0; i < soluong; i++)
{
if (danhba[i, 0] == tu || danhba[i, 1] == tu || danhba[i, 2] == tu)
{
timthay = true;
string hoten = danhba[i, 0];
string sodienthoai = danhba[i, 1];
string email = danhba[i, 2];
Console.WriteLine("=========================");
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write(" {0}. Ho va ten: ", i + 1);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(hoten);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");

34
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("So dien thoai: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(sodienthoai);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("│ ");
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Email: ");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(email);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("=========================");
Console.WriteLine();
}
}
if (!timthay)
{
Console.WriteLine("Khong tim thay ket qua nao.");
}
Console.ResetColor();
Console.Write("Ban muon tiep tuc tim kiem? 1 (Co) hoac 2 (Khong): ");
int chon = int.Parse(Console.ReadLine());
if (chon != 1)
{
Mucluc();
}
}

35
}
static void Luutru()
{
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
if (soluong == 0)
{
Console.WriteLine("Danh ba hien tai dang" +
" trong. Khong co gi de luu.");
Console.WriteLine("Nhan Enter de quay lai man hinh chinh...");
Console.ReadLine();
Mucluc();
}
Console.WriteLine("Hay nhap ten tep tin ban muon tao hoac su dung");
string tenteptin = Console.ReadLine();
int stt = 1;
string phanloai = string.Format("{0,-5} {1,-20} {2,-15} {3,-30}\n", "STT",
"Ho va ten", "So dien thoai", "Email");
File.WriteAllText(tenteptin, phanloai);
for (int i = 0; i < soluong; i++)
{
string hoten = danhba[i, 0];
string sodienthoai = danhba[i, 1];
string email = danhba[i, 2];
string dulieu = string.Format("{0,-5} {1,-20} {2,-15} {3,-30}\n", stt,
hoten, sodienthoai, email);
Console.WriteLine();
File.AppendAllText(tenteptin, dulieu);

36
stt++;
}
Console.ResetColor();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine(" Thong tin danh ba cua ban da duoc luu vao tep tin
{0}.\n", tenteptin);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Nhan Enter de quay lai man hinh chinh...");
Console.ReadLine();
Mucluc();
}
}
}
3. Phân tích:
a. Phân tích khái quát:

- Environment.Exit(0); : Thoát khỏi chương trình với mã thoát là 0. Mã thoát 0


thường được sử dụng để chỉ rằng chương trình đã kết thúc một cách bình thường.

- int yPos = 2; : khai báo một biến yPos kiểu int và gán giá trị 2 cho nó.

- Đoạn mã kiểm tra nếu yPos vượt quá chiều cao của cửa sổ console
(Console.WindowHeight - 1), thì yPos và xPos sẽ được đặt lại về giá trị ban đầu: if
(yPos > Console.WindowHeight - 1).

- Console.SetCursorPosition(xPos, 1); : Cho phép bạn điều khiển vị trí in ra của


các dòng văn bản trên màn hình console.

- static string[,] danhba = new string[50, 3]; :Khai báo mảng hai chiều có tên là
danhba, kiểu dữ liệu là string. Mảng này có kích thước là 50 hàng và 3 cột. Mỗi
phần tử trong mảng danhba là một chuỗi ký tự.

- public static void Themdanhba() : Thêm chương trình phụ.

37
- Console.Clear(); : Xóa nội dung hiện tại của cửa sổ console sau khi nhấn chọn thứ
tự trong menu chuyển qua giao diện nội dung đã chọn.

- string hoten, sdt, email; :Khai báo chuỗi kí tự.

- bool kiemtra = false; : Khai báo một biến có tên là kiemtra kiểu dữ liệu là bool
(boolean). Biến này được sử dụng để lưu trữ giá trị logic, chỉ có thể nhận hai giá trị
là true (đúng) hoặc false (sai).

- Console.WriteLine("Danh ba cua ban da day."); : Xuất ra dữ liệu danh bạ của


bạn đã đầy

- File.AppendAllText(tenteptin, dulieu); :Ghi dữ liệu vào cuối một tệp tin đã tồn tại
hoặc tạo một tệp tin mới nếu tệp tin chưa tồn tại.

- return; : Quay lại màn hình menu.

- Thread.Sleep(40), Thread.Sleep(80); : Tạm dừng thực thi chương trình trong 1


giây trước khi tiếp tục thực hiện các lệnh tiếp theo. Thường được sử dụng để hiển
thị thông điệp trước khi thoát chương trình.

- Console.ForegroundColor = ConsoleColor.Green; : Sử dụng để đặt màu chữ


trong cửa sổ console thành màu xanh lá cây. Điều này có thể giúp làm nổi bật hoặc
tạo điểm nhấn cho các thông điệp hoặc dữ liệu được hiển thị trên console.

- Console.ResetColor(); : Đặt lại màu chữ và màu nền của cửa sổ console về mặc
định. Khi sử dụng lệnh này, màu chữ và màu nền sẽ trở về giá trị mặc định được
định nghĩa bởi hệ điều hành. Giúp đảm bảo rằng các thông điệp và dữ liệu tiếp theo
được hiển thị trên console sẽ không bị ảnh hưởng bởi màu sắc trước đó.

- File.WriteAllText(tenteptin, phanloai); : File.WriteAllText() được sử dụng để tạo


hoặc ghi đè nội dung vào tệp tin tenteptin với nội dung là phanloai. Biến phanloai
chứa một chuỗi định dạng đặc biệt với thông tin cột (STT, Họ và tên, Số điện thoại,
Email) dùng cho việc ghi tiêu đề của danh bạ vào tệp tin.

38
- Trong câu lệnh string dulieu = string.Format("{0,-5} {1,-20} {2,-15} {3,-30}\n",
stt, hoten, sodienthoai, email);, string.Format() được sử dụng để tạo một chuỗi mới
dựa trên một chuỗi định dạng và các đối số được cung cấp. Trong định dạng chuỗi
này, các {0,-5}, {1,-20}, {2,-15}, {3,-30} đại diện cho các đối số được truyền vào
(stt, hoten, sodienthoai, email). Các số âm đằng sau dấu phẩy trong định dạng này
chỉ định chiều rộng tối thiểu của các trường dữ liệu, giúp căn chỉnh chuỗi.

- Mucluc: Hiển thị một menu để quản lý sổ địa chỉ. Nó cung cấp nhiều tùy chọn
khác nhau như thêm danh bạ, chỉnh sửa, xóa, tìm kiếm, hiển thị, lưu dữ liệu vào tệp
hoặc thoát khỏi chương trình. Phương pháp này dường như xử lý các tương tác của
người dùng và thực hiện các thao tác dựa trên lựa chọn của người dùng thông qua
menu bảng điều khiển. Còn có thể được gọi lặp đi lặp lại ở các giai đoạn khác nhau
để điều hướng người dùng thông qua các chức năng khác nhau do ứng dụng cung
cấp. Khi quay lại màn hình chính sau khi thực hiện một thao tác cụ thể (như thêm,
xóa hoặc chỉnh sửa liên hệ), Mucluc sẽ được gọi lại để hiển thị menu chính, cho
phép người dùng chọn các tùy chọn khác hoặc thoát khỏi chương trình.

- continue : Được sử dụng trong vòng lặp chuyển ngay sang lần lặp tiếp theo của
vòng lặp. Nó được sử dụng cùng với các câu lệnh có điều kiện để bỏ qua phần còn
lại của khối mã trong vòng lặp cho lần lặp cụ thể đó và tiếp tục đến lần lặp tiếp theo.

b. Phân tích phần nhỏ:

Vd: phân tích phần public static void Xoadanhba():

- Console.Clear();: Dòng lệnh này được sử dụng để xóa nội dung hiển thị trên màn
hình console, để tạo không gian mới cho việc hiển thị thông tin mới.

- if (soluong == 0) { ... }: Đây là một câu lệnh điều kiện (if statement) kiểm tra giá
trị của biến soluong. Nếu soluong bằng 0, tức là danh bạ không có bất kỳ mục nào,
thì một thông báo sẽ được hiển thị trên màn hình console thông
qua Console.WriteLine(). Sau đó, chương trình sẽ chờ người dùng nhấn Enter để
quay lại menu chính và gọi lại phương thức Main() để bắt đầu lại chương trình.

39
- Console.WriteLine("Danh ba hien tai đang trong.");: Dòng lệnh này được sử
dụng để hiển thị thông điệp "Danh ba hien tai dang trong." trên màn hình console.

- for (int i = 0; i < soluong; i++) { ... }: Đây là một vòng lặp for được sử dụng để
lặp qua danh sách các mục trong danh bạ. Biến i được sử dụng để đếm các mục
trong danh bạ. Dòng lệnh bên trong vòng lặp được sử dụng để hiển thị thông tin về
từng mục trong danh bạ, bao gồm họ tên, email và số điện thoại.

- string hoten = danhba[i, 0];: đang gán giá trị được lưu trữ trong cột đầu tiên (chỉ
số ‘0’) của hàng i trong mảng hai chiều “danhba” vào biến “hoten”

- Console.Write("Nhap so thu tu lien he can xoa hoac nhap 0 de quay ve menu:


");: Dòng lệnh này được sử dụng để hiển thị thông điệp yêu cầu người dùng nhập
số thứ tự của liên hệ mà họ muốn xóa hoặc nhập 0 để quay lại menu chính.

- int sothutu = int.Parse(Console.ReadLine());: Dòng lệnh này được sử dụng để


đọc giá trị người dùng nhập từ bàn phím và lưu vào biến sothutu.
Hàm int.Parse() được sử dụng để chuyển đổi chuỗi nhập vào thành một giá trị số
nguyên.

- if (sothutu == 0) { ... }: Đây là một câu lệnh điều kiện (if statement) kiểm tra giá
trị của biến sothutu. Nếu sothutu bằng 0, tức là người dùng muốn quay lại menu
chính, thì một thông báo sẽ được hiển thị trên màn hình console thông
qua Console.Clear() và sau đó chương trình sẽ gọi lại phương thức Main() để bắt
đầu lại chương trình.

- string hotenbixoa = danhba[sothutu - 1, 0];: Dòng lệnh này được sử dụng để lưu
tên của liên hệ cần xóa vào biến hotenbixoa. Giá trị này sẽ được sử dụng để hiển thị
thông báo sau khi liên hệ được xóa.

- for (int i = sothutu - 1; i < soluong - 1; i++) { ... }: Đây là một vòng lặp for được
sử dụng để di chuyển các liên hệ từ vị trí sothutu đến cuối danh bạ lên một vị trí.
Điều này giúp xóa liên hệ tại vị trí sothutu bằng cách ghi đè lên các giá trị của liên
hệ tiếp theo trong danh bạ.

40
- soluong--;: Dòng lệnh này được sử dụng để giảm giá trị của biến soluong đi 1,
đồng nghĩa với việc giảm số lượng liên hệ trong danh bạ sau khi một liên hệ đã
được xóa.

- Console.WriteLine("Lien he '{0}' da duoc xoa khoi danh ba.", hotenbixoa);:


Dòng lệnh này được sử dụng để hiển thị thông báo xác nhận rằng liên hệ đã được
xóa khỏi danh bạ. Giá trị của biến hotenbixoa được sử dụng để hiển thị tên của liên
hệ đã bị xóa.

- if (soluong == 0) { ... }: Đây là một câu lện h điều kiện (if statement) kiểm tra giá
trị của biến soluong. Nếu soluong bằng 0, tức là danh bạ không còn bất kỳ mục nào,
thì một thông báo sẽ được hiển thị trên màn hình console thông
qua Console.WriteLine().

- Console.ResetColor();: Đây là thao tác trả lại màu sắc mặc định của Console, bao
gồm màu nền và màu văn bản ban đầu, để các đoạn văn bản tiếp theo trong Console
hiển thị với màu sắc mặc định, không phụ thuộc vào các thay đổi màu sắc trước đó.

- Console.Write("Ban muon tiep tuc xoa? 1 (Co) hoac 2 (Khong): ");: Dòng lệnh
này được sử dụng để hiển thị thông điệp yêu cầu người dùng nhập lựa chọn để tiếp
tục xóa liên hệ hay không.

- int chon = int.Parse(Console.ReadLine());: Dòng lệnh này được sử dụng để đọc


giá trị người dùng nhập từ bàn phím và lưu vào biến chon. Hàm int.Parse() được sử
dụng để chuyển đổi chuỗi nhập vào thành một giá trị số nguyên.

- if (chon != 1) { ... }: Đây là một câu lệnh điều kiện (if statement) kiểm tra giá trị
của biến chon. Nếu chon khác 1, tức là người dùng không muốn tiếp tục xóa liên hệ,
thì một thông báo sẽ được hiển thị trên màn hình console thông
qua Console.Clear() và sau đó chương trình sẽ gọi lại phương thức Main() để bắt
đầu lại chương trình.

- break;: Dòng lệnh này được sử dụng để thoát khỏi vòng lặp while gần nhất, kết
thúc quá trình xóa liên hệ và quay lại menu chính.

41
4. Đánh giá:
a. Ưu điểm:
 Code của ứng dụng quản lí danh bạ được viết một cách cẩn thận và dễ hiểu
với tên biến và hàm được đặt một cách rõ ràng và mô tả chính xác chức năng
của chúng. Điều này giúp cho việc đọc và hiểu code trở nên tiện lợi hơn giúp
cho cả nhóm có thể dễ dàng trao đổi và làm việc cùng nhau.
 Được sắp xếp và cấu trúc rõ ràng, phân chia từng nhóm với chức năng hợp
lí giúp luồng logic của chương trình trở nên dễ theo dõi, giúp cho việc đọc
code trở nên dễ hơn. Các phần tử dữ liệu được quản lí một cách hiệu quả và
hợp lý, giúp tối ưu hiệu suất và giúp cho ứng dụng hoạt động mượt mà và
nhanh chóng.
 Ngoài ra còn được viết để có thể dễ dàng mở rộng và bảo trì ứng dụng. Các
phần của code được phân chia thành các phần độc lập, giúp tách biệt logic và
dữ liệu thuận tiện cho việc thay đổi, sửa đổi và bổ sung các tính năng trong
tương lai.
b. Hạn chế:
 Chương trình được viết bằng những mã nguồn đơn giản. Do đó chương trình
tương đối dài.
 Chương trình chưa cung cấp các biện pháp bảo mật cần thiết để đảm bảo an
toàn thông tin người dùng, điều quan trọng khi chương trình được triển khai
trong môi trường thực tế.
 Cấu trúc dữ liệu còn đơn giản làm cho việc quản lý thông tin trở nên phức tạp
khi chương trình mở rộng. Làm cho việc quản lý và bảo trì trở nên khó khăn,
gây ảnh hưởng đến khả năng hiểu và phát triển của mã nguồn.

42
LỜI CẢM ƠN
Nhóm 5 xin gửi lời cảm ơn chân thành nhất đến với giảng viên Lê Hoàng
Son. Trong quá trình học tập và tìm hiểu về môn học, nhóm chúng em còn khá bỡ
ngỡ về những kiến thức mới, cũng như việc tiếp cận với C#. Nhưng nhờ có sự quan
tâm, giúp đỡ, hướng dẫn nhiệt tình của thầy trong các buổi học, từ những kiến thức
cơ bản đến những khía cạnh phức tạp hơn của ngôn ngữ lập trình. Chúng em đã có
cơ hội tiếp cận và hiểu sâu hơn về C#. Thầy đã truyền đạt cho chúng em những kiến
thức quan trọng, giúp chúng em có đủ kiến thức và kỹ năng để hoàn thành đồ án với
đề tài “Ứng dụng quản lý danh bạ”. Tuy nhiên, do còn hạn chế về mặt kiến thức nên
trong quá trình làm bài chúng em khó có thể tránh khỏi những sai sót. Do đó, chúng
em mong nhận được sự hướng dẫn chi tiết và những lời góp ý chân thành từ thầy để
đồ án của chúng em trở nên hoàn thiện hơn.

Xin chân thành cảm ơn thầy

TÀI LIỆU THAM KHẢO:


[1] Dtech; (2019, July 28); “ C# là gì ? Tổng quan về C#.”

From: https://www.dtechvn.com/c-la-gi-tong-quan-ve-c.html

[2] CodeGym; (2020, June 29); “ C# là gì ? Tìm hiểu về ngôn ngữ lập trình C#.”

From: https://codegym.vn/blog/2020/06/29/c-la-gi-tim-hieu-ve-ngon-ngu-lap-trinh-

[3] Bizfly; (2018, September 12); “ .NET framework là gì? Các khái niệm cơ bản về
.NET framework”

From: https://bizflycloud.vn/tin-tuc/

[4] aws; (2022); “.NET là gì?”

From: https://aws.amazon.com/vi/what-is/net/

43

You might also like