TỔNG QUAN VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Giới thiệu
Phương pháp lập trình thủ tục
Chương trình là một hệ thống các thủ tục và hàm
Mỗi thủ tục hay mỗi hàm sẽ thực hiện những công việc nào đó
Chương trình sẽ gọi các thủ tục hay các hàm để giải quyết vấn đề
- Chương trình rõ ràng, dễ hiểu, dễ theo dõi
- Tư duy giải thuật rõ ràng, dễ cài đặt
- Các hàm đều sử dụng biến toàn cục, dữ liệu (tham số) phải truyền qua rất nhiều hàm trung gian trước khi thực hiện công việc, vì vậy khó kiểm soát và phát triển khi chương trình quá lớn
- Khi thay đổi cấu trúc dữ liệu, phải thay đổi giải thuật
Các cấu trúc sử dụng trong lập trình thủ tục:
Hiện nay có ba cấu trúc điều khiển thông dụng để viết chương trình:
- Cấu trúc tuần tự (sequence): Các lệnh trong cấu trúc này lần lược được thực hiện theo trình tự từng dòng lệnh, lệnh 1 lệnh 2 lệnh 3 lệnh n…
- Cấu trúc lựa chọn (selection): Một điều kiện sẽ được kiểm tra trước khi chuyển hướng xử lý theo nhánh lệnh 1 hay nhánh lệnh 2
Hình 1 1-Cấu trúc lựa chọn
- Cấu trúc lặp (iteration): Một nhóm lệnh sẽ được thực hiện lặp đi lặp lại cho tới khi điều kiện được kiểm tra không còn đúng nữa
Lập trình hướng đối tượng
• Lập trình hướng đối tượng là xây dựng những lớp đối tượng làm nền tảng để xây dựng chương trình Đối tượng là sự liên kết giữa dữ liệu và phương thức thực hiện trên dữ liệu này
• Lập trình hướng đối tượng là phương pháp lập trình dựa trên kiến trúc lớp (class) và đối tượng (object)
Tập trung vào dữ liệu thay cho các hàm
Chương trình được chia thành các đối tượng độc lập
Cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng
Dữ liệu bên trong mỗi đối tượng được bảo mật
Các đối tượng trao đổi với nhau thông qua các hàm
Chương trình được thiết kế theo hướng tiếp cận từ dưới lên
Một số ưu điểm nổi bật
Không có nguy cơ dữ liệu bị thay đổi tự do trong chương trình
Khi thay đổi cấu trúc dữ liệu của một đối tượng, không cần thay đổi mã nguồn của các đối tượng khác
Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên
Phù hợp với các dự án phần mềm lớn, phức tạp.
Các tính chất đặc thù lập trình hướng đối tượng cơ bản
Tính đóng gói (Encapsulation): Khả năng bảo vệ dữ liệu riêng biệt và phương thức tác động lên dữ liệu đó Do vậy chúng ta không phải quan tâm tới “phải làm như thế nào” mà chỉ điều khiển bằng “làm việc gì” Đóng gói giúp đồng nhất giữa dữ liệu và các thao tác tác động lên dữ liệu đó
Thừa kế (inheritance): Giúp tạo đối tượng mới từ đối tượng có sẵn, bổ sung những đặc tính cần thiết trong đối tượng mới
Lớp đối tượng đã có được sử dụng lại gọi là lớp cơ sở
Lớp thừa kế lớp cơ sở gọi là lớp dẫn xuất (Child class)
Tính đa hình (pholymorphism): Đa hình nghĩa là có nhiều hình thái khác nhau Đa hình xuất hiện khi có một cấu trúc cấp bậc của các lớp và chúng liên quan với nhau bởi tính thừa kế
Tính trừu tượng (abstraction): Thể hiện tính tổng quát hóa lên một vấn đề mà không cần quan tâm đến các chi tiết bên trong Là phương pháp trừu tượng hóa định nghĩa lên những hành động, tính chất của loại đối tượng nào đó cần phải có.
Các ngôn ngữ hỗ trợ lập trình hướng đối tượng
Giới thiệu về NET
Net hay còn được gọi đầy đủ là NET framework, chứa một bộ thư viện rất lớn các loại công cụ khác nhau giúp người lập trình xử lý được hầu hết các công việc thường gặp trong quá trình phát triển ứng dụng do Microsoft phát triển Vì vậy, lập trình ứng dụng với NET framework thường có hiệu quả rất cao và thời gian làm việc ngắn hơn Một số công nghệ trong NET framework được hỗ trợ:
Console: Xây dựng ứng dụng với giao diện dòng lệnh (Command line) Windows Forms: Xây dựng ứng dụng Desktop cho windows
Windows Presentation Foundation: Công nghệ mới xây dựng ứng dụng Desktop cho windows;
ASP.NET: Nền tảng để phát triển các ứng dụng web chạy trong chương trình máy chủ IIS, bao gồm ASP.NET Web Forms, ASP.NET MVC, ASP.NET Web API;
ADO.NET và Entity Framework, LINQ: Công nghệ cho phép chương trình kết nối và sử dụng cơ sở dữ liệu quan hệ (SQL Server, Oracle, MySQL, MongoDB…);
Windows Communications Foundation: Công nghệ cho phép phát triển ứng dụng mạng hướng dịch vụ (Service Oriented Application, SOA)
Cài đặt và sử dụng công cụ lập trình Visual Studio
Trong phần này tác giả hướng dẫn cách cài đặt Visual Studio phiên bản 2019, để tải Visual Studio 2019, các bạn vào liên kết dưới đây: https://visualstudio.microsoft.com/download
Hình 1 3- Giao diện chọn công cụ cài đặt Ở hình 1.3 có ba phiên bản Visual Studio 2019: Community, Professional và Enterprise Chúng ta chọn bản Community để tải và cài đặt, đây là phiên bản miễn phí và hỗ trợ các chức năng phổ biến cần thiết cho việc học tập và nghiên cứu Hình bên dưới minh họa phiên bản Community đã tải về máy thành công
Hình 1 4-Tập tin cài đặt Visual Studio
Nhấp đôi vào tên tập tin được tải về để thực hiện việc cài đặt.
Hình 1 5-Tiến trình tải và cài đặt ứng dụng
Tùy vào cấu hình của máy tính cũng như đường truyền Internet, sau khi tải xong màn hình xuất hiện như hình dưới đây:
Hình 1 6 - Lựa chọn ngôn ngữ
Tùy vào nhu cầu lập trình mà ta sẽ chọn các gói cài đặt khác nhau, theo kinh nghiệm làm dự án của các nhà phát triển, phần lớn chúng ta sẽ triển khai các dự án phổ biến dưới đây (tick vào hộp kiểm).Ví dụ trong trường hợp này tác giả thường triển khai các dự án về: Deskop application, Web Application, NodeJS, Mobile Application thì ta cần chọn các lựa chọn như hình dưới đây:
Hình 1 7- Chọn các gói (công cụ) cài đặt
Tiếp theo chọn thẻ Individual components, chọn mục Class Designer (thiết kế lớp) và LINQ to SQL tools (lập trình với LINQ):
- Ứng dụng cần tối thiểu 9,24 GB để cài đặt các tính năng phổ biến.- Tùy vào cấu hình máy tính và nhu cầu lập trình, chọn các gói cài đặt phù hợp và bấm nút Install để tiến hành cài đặt.
Hình 1 9 - Tiến trình cài đặt đang diễn ra
Sau khi tiến trình cài đặt hoàn thành, màn hình yêu cầu đăng nhập hệ thống:
Hình 1 10- Màn hình yêu cầu đăng nhập hệ thống
Màn hình lúc khởi động Visual Studio 2019:
Hình 1 11- Màn hình khởi động Visual Studio
Sau khi khởi động, giao diện Visual 2019 xuất hiện như dưới đây:
Hình 1 12- Màn hình hiển thị các chọn lựa tạo dự án mới
Danh sách bên trái: Chọn những dự án cũ (nếu bạn đã tạo trước đó hoặc kể cả ở các version cũ cũng tự động hiển thị ở đây)
Chọn Continue without code: Mục này sẽ mở Visual Studio không có dự án
Chọn “Create a New Project”: Chương trình sẽ hiển thị màn hình tạo Project mới:
Hình 1 13- Tạo mới một dự án
Ta có thể tìm kiếm, lọc theo: Ngôn ngữ lập trình (C#, VB ), lọc theo Platform (Android, IOS, Windows…), theo Project Type (Cloud, Console, Machine Learning…) Việc tìm kiếm và lựa chọn giúp chúng ta dễ dàng lựa chọn đúng và nhanh chóng các loại dự án muốn triển khai
Ví dụ: Tạo 1 Project tên “HelloWorld” viết bằng ngôn ngữ C#, platform (nền tảng) dùng Windows, Project Type (loại dự án) là Desktop, ta thực hiện theo các bước dưới đây:
Bước 1: Trong mục All Language chọn C#
Hình 1 14- Chọn ngôn ngữ lập trình C#
Mục All Platform chọn Windows
Hình 1 15-Chọn môi trường lập trình Windows
Bước 3: Mục All Project Type, chọn Desktop
Hình 1 16 - Chọn môi trường Desktop và giao diện Windows
Chọn Console Application nếu sử dụng giao diện dòng lệnh, chọn Windows forms
App (.NET Framework) nếu sử dụng giao diện người dùng Windows, màn hình dưới đây minh họa chọn giao diện Windows, bấm Next:
Màn hình Configure your new project hiển thị như dưới đây:
Hình 1 17- Đặt tên và chọn nơi lưu trữ cho dự án mới
Project name: Đặt tên cho dự án Ví dụ “HelloWorld”
Location: Nơi lưu trữ dự án, nên lưu khác ổ đĩa C, tạo thư mục không nhập dấu Tiếng
Solution name: Một Solution có nhiều dự án, mỗi lần tạo một dự án ta có Solution đính kèm để quản lý Thông thường, tên của Solution name trùng với Project name
Framework: Đây là phiên bản mới nhất được cài đặt tại thời điểm (17/06/2021) nên có ký hiệu là 4.7.2
Bước cuối cùng, bấm Create để tạo Project:
Hình 1 18- Màn hình thiết kế Windows Forms
Vài nét về các chức năng trên màn hình giao diện:
Mục số 1: Hộp công cụ (toolbox) để lựa chọn các điều khiển (control) cho phù hợp với nhu cầu, kéo thả trực tiếp vào mục số 2
Mục số 2: Nơi thể hiện màn hình tương tác người dùng
Mục số 3: Nơi tổ chức sắp xếp hệ thống các lớp, tập tin, thư viện… trong dự án
Mục số 4: Nơi cấu hình các thuộc tính cho các đối tượng trên giao diện
Mục số 5: Các tiện ích giúp thao tác nhanh với hệ thống, để thực thi ứng dụng ta chọn nút Start hoặc nhấn phím F5.
Khi nhấn F5 chạy, kết quả như dưới đây:
Hình 1 19- Giao diện Windows khi chạy chương trình
CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH C#
Các kiểu dữ liệu cơ bản trong C#
Kiểu dữ liệu là các loại dữ liệu và phạm vi giá trị của chúng trong bộ nhớ mà người lập trình sử dụng để lưu trữ
Có 2 loại: kiểu dữ liệu dựng sẵn & kiểu dữ liệu tự định nghĩa
Kiểu dữ liệu dựng sẵn:
Bảng 2 1- Phạm vi các biến[Nguồn Microsoft]
Data Type Description Size(bits) Range Example int Whole numbers 32 –2 31 through 2 31 – 1 int nSize; long Whole numbers
(bigger range) 64 –2 63 through 2 63 – 1 long lSize; float Floating-point numbers 32 ±1.5 × 10 45 through ±3.4 × 10 38 float fDelta; double
(more accurate) floating-point numbers
64 ±5.0 × 10 −324 through ±1.7 × 10 308 double dDelta; decimal Monetary values 128 28 significant figures decimal decKe; string Sequence of characters
16 bits per character Not applicable string strName; char Single character 16 0 through 2 16 – 1 char chrAns; bool Boolean 8 True or false bool bRet;
Biến, cách thức và quy tắc đặt tên biến
Biến là tên gọi cho một vùng nhớ (bên trong bộ nhớ máy tính khi chương trình được chạy) có khả năng chứa được một giá trị
Biến bược khai báo và sử dụng để chứa dữ liệu của chương trình
Kiểu_biến tên_biến [= giá_trị];
Quy tắc đặt tên biến
Tên biến phân biệt chữ hoa và chữ thường
• tenBien khác với TenBien và Tenbien
Không bắt đầu bằng số
Không chứa các ký tự đặt biệt như ~ ! @ # $ % ^ & * ( )
Không đặt tên biến trùng với từ khoá
• string, int, private: tên không hợp lệ
Khi khai báo biến nên khởi tạo giá trị mặc định cho biến:
Hằng số trong C#
Hằng số là giá trị không đổi trong quá trình chạy chương trình, có thể là nguyên, thực, ký tự hoặc chuỗi.
Ví dụ: Const float PI = 3,1415927; const int x = 5;
Biểu thức
Biểu thức là một phép toán đơn giản Ví dụ: int x=5+3;
Biểu thức là một phép toán phức tạp Ví dụ: int x=(5+3)*(4-2)/6
Biểu thức là sự kết hợp giữa các phép toán và các phương thức:
Ví dụ: double x=fn(9)*fn(8)+2-(8*2)+3
Các phép toán trong C#
Ký hiệu Mô tả Ví dụ
= Gán giá trị cho biến a = 1
+= Cộng hoặc nối chuỗi toán hạng sau vào toán hạng đầu và gán kết quả cho toán hạng đầu a += 1
-= Trừ toán hạng sau khỏi toán hạng đầu và gán kết quả cho toán hạng đầu a -= 1 a=a-1
*= Nhân toán hạng sau vào toán hạng đầu và gán kết quả cho toán hạng đầu a *= 2
/= Chia toán hạng sau cho toán hạng đầu và gán kết quả cho toán hạng đầu a /= 2
Bảng 2 3-Toán tử số học
Lưu ý nếu các toán hạng là số nguyên thì phép chia có kết quả là số nguyên Ví dụ 5/2 có kết quả là 2 chứ không phải 2.5
Bảng 2 4-Toán tử một ngôi
+ Chỉ định giá trị không âm
- Chỉ định giá trị âm
! Phép toán phủ định trên một giá trị luận lý Toán tử so sánh
Bảng 2 5- Toán tử so sánh
Chỗ này ta hay sai, vì ta có thói quen gõ
>= So sánh lớn hơn hoặc bằng
, =, = 0)
Console.WriteLine("{0} is a positive.",a); Console.ReadLine();//Lệnh này dừng màn hình để xem kết quả
Giải thích: Nếu nhập một số a >=0 thì câu lệnh Console.WriteLine("{0} is a positive.",a); sẽ được thực hiện, ngược lại câu lệnh này không được thực hiện
Hình 2 2- Kết quả kiểm tra số âm-dương
Dạng 2: if (expression) statement1; else statement2;
Lưu đồ cú pháp: Ý nghĩa: Đầu tiên expression được định trị Nếu kết quả là true (0) thì statement1 được thực thi Ngược lại, statement2 được thực thi
Ví dụ 2: Viết chương trình nhập vào một số nguyên a In ra màn hình kết quả kiểm tra a là số âm hay dương
3 using System; using System.Collections.Generic; using System.Linq;
Hình 2 3- Cấu trúc lựa chọn IF (dạng 2)
22 using System.Text; using System.Threading.Tasks; namespace ConsoleApp1
{ static void Main(string[] args)
Console.Write("Input a = "); a=int.Parse(Console.ReadLine()); if (a >= 0)
Console.WriteLine("{0} is a positive.",a); else Console.WriteLine("{0} is a negative.", a);
Console.ReadLine(); // Lệnh này dừng màn hình để xem kết quả
Hình 2 4-Kết quả kiểm tra số âm - dương
Ví dụ 3: Viết chương trình nhập vào một số nguyên dương là tháng trong năm và in ra số ngày của tháng đó Biết rằng:
16 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NgayCuaThang
{ static void Main(string[] args)
Console.Write("Mời bạn nhập vào 1 tháng: "); month = int.Parse(Console.ReadLine());
45 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
Console.WriteLine(" Tháng {0} có 31 ngày ", month); else if (month == 4 || month == 6 || month == 9 || month == 11)
Console.WriteLine(" Tháng {0} có 30 ngày", month); else
Console.Write("Mời bạn nhập vào 1 năm: "); year = int.Parse(Console.ReadLine()); if ((year % 4 == 0 && year % 100 != 0) ||
(year % 400 == 0)) Console.WriteLine("Tháng {0} có 29 ngày", month); else
Console.WriteLine("Tháng {0} có 28 ngày", month);
Console.WriteLine("Tháng {0} không hợp lệ!", month);
Hình 2 5- Kết quả kiểm tra số ngày trong tháng
Cấu trúc lựa chọn SWITCH
Cấu trúc switch là một cấu trúc lựa chọn có nhiều nhánh Khi có nhiều sự lựa chọn thì đây là cấu trúc phù hợp thay vì phải dùng một chuỗi lệnh if…else lồng nhau
Hình 2 6 - Lưu đồ cú pháp Switch
- Đầu tiên chương trình sẽ định trị expression
- Nếu giá trị của expression bằng value_1 thì thực hiện statement_1 và kết thúc switch
- Nếu giá trị của expression khác value _1 thì so sánh với value_2 , nếu bằng value_2 thì thực hiện statement_2 và kết thúc switch…., so sánh tới value_n
- Nếu tất cả các phép so sánh trên đều sai thì thực hiện statement của trường hợp default
Ví dụ 1: Nhập vào một số nguyên, chia số nguyên này cho 2 lấy phần dư Kiểm tra nếu phần dư bằng 0 thì in ra thông báo “là số chẵn”, nếu số dư bằng 1 thì in thông báo “là số lẻ”
4 using System; using System.Collections.Generic; using System.Linq; using System.Text;
28 using System.Threading.Tasks; namespace ConsoleApp1
{ static void Main(string[] args)
Console.Write("Input an number: "); n = int.Parse(Console.ReadLine()); remainder = (n % 2); switch (remainder)
Console.Write("{0} is an even",n); break; case 1:
Console.Write("{0} is an odd", n); break;
Hình 2 7- Kết quả kiểm tra số chẵn - lẻ
Ví dụ 2: Viết chương trình thực hiện nhập 2 số nguyên a và b, biến tt là 1 ký tự nhập từ bàn phím (+,-,*,/) Nếu nhập tt là phép toán nào thì tự động tính toán cho a,b
16 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LenhSwitch
{ static void Main(string[] args)
Console.Write("Nhập vào số a ="); a = int.Parse(Console.ReadLine());
Console.Write("Nhập vào số b ="); b = int.Parse(Console.ReadLine());
Console.Write("Nhập vào các phép toán (+,-,*,/):"); tt = Console.ReadLine()[0]; // ReadLine() là trả về 1 chuỗi, ở đây ta lấy 1 ký tự đầu nên phải viết [0] switch (tt)
Console.WriteLine("{0} * {1} = {2}", a, b, a * b); break; case '/': if (b != 0)
Console.WriteLine("Không thể chia cho 0"); break;
Hình 2 8-Kết quả thực hiện phép toán
Cấu trúc lặp cho phép lặp lại nhiều lần 1 câu lệnh hay 1 khối lệnh nào đó cho đến khi biểu thức điều kiện còn thỏa Trong C# có các cấu trúc lặp sau: while, do … while, for, foreach
Cấu trúc while cho phép thực hiện statement trong khi expression vẫn còn đúng
Cú pháp: while(expression) Lưu đồ: statement;
− Bước 1: Expression được định trị
− Bước 2: Nếu kết quả là true thì statement thực thi và quay lại bước 1
− Bước 3: Nếu kết quả là false thì thoát khỏi vòng lặp while
− Để thoát vòng lặp: dùng break
− Để kết thúc sớm 1 vòng lặp: dùng lệnh continue
− Lệnh trong while có thể không được thực hiện lần nào
Ví dụ 1: Viết chương trình tính giai thừa của 1 số:
28 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1
{ static void Main(string[] args)
Console.Write("Nhập vào 1 số:"); so = int.Parse(Console.ReadLine()); while (i