Cơ bản ngôn ngữ lập trình C#
1
v 1.0 - 10/2012
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
chúng ta đã học...
1. Lập trình là gì ?
2. C# và .NET
3. Thiết kế thuật toán
2
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Giải bài toán trên máy tính
1. Xác định bài toán
2. Thiết kế thuật toán
3. Phân tích thuật toán
4. Cài đặt thuật toán
5. Kiểm tra / Bắt lỗi
6.
[ Sửa lỗi ]
3
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Nội dung
1. Lập trình hướng đối tượng
2. Cách tạo ra một chương trình C#
3. Các thành phần của một chương trình C#
4. Biến, kiểu dữ liệu, Hằng
5. Toán tử
6. Lập trình chương trình đơn giản với C#
4
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Lập trình hướng đối tượng
5
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
.NET và hướng đối tượng • Nền tảng .NET hỗ trợ hướng đối tượng từ dưới lên trên
Trình biên dịch hỗ trợ hướng đối tượng
Intermediate Language là hướng đối tượng
Base Class Library hoàn toàn là hướng đối tượng
• • • • Các ngôn ngữ lập trình chấp nhận .NET (.NET-aware languages) cũng là
hướng đối tượng
• Ngôn ngữ lập trình C# là ngôn ngữ lập trình hướng đối tượng
• Cần hiểu hai khái niệm :
• Lớp • Đối tượng
6
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Lớp & đối tượng • Lớp giống như một cái khuôn bánh
• Nó định nghĩa khuôn dạng của các đối tượng
• Các đối tượng như các cái bánh
• Chúng là các instances (thực thể/thể hiện) của lớp
7
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Document
name type state nameBorrower dateBorrow dateReminder
calculDateReminder
Lớp & đối tượng • Một đối tượng là một thực thể trong miền xác định có một định danh riêng (tên) • Một tập những đặc tính (attribute) mô tả
Đặc tả UML của một lớp
tình trạng của đối tượng
• Một tập các thao tác (phương thức / hàm - methods) định nghĩa
các hành vi của đối tượng
• Một đối tượng là một thể hiện (instance) của một lớp • Lớp là kiểu dữ liệu trừu tượng, được mô tả bởi những thuộc tính (đặc tính và phương thức) chung của các đối tượng và cho phép tạo ra các đối tượng có những thuộc tính đó
8
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ
Car
Nhóm các dữ liệu và xử lý liên quan trong một lớp
mark color registering
twingo : Car
Object : một thể hiện của lớp
start driver stop
9
mark = Renault color = gray registering = 995 LKZ 75
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Lớp & đối tượng trong C#
Định nghĩa lớp
Sử dụng từ khoá class
Định nghĩa một kiểu dữ liệu mới
Tạo một đối tượng của một lớp
Khai báo một biến có kiểu dữ liệu nào đó và ghi dữ liệu vào biến đó
Bitmap bm = new Bitmap(20, 20);
Sử dụng từ khoá new
Đặc tính
Các biến thành phần (gọi tắt là biến)
Thao tác
Phương thức / hàm
Có hai loại hàm với hai cách triệu gọi khác nhau :
• Hàm không tĩnh - Gọi từ đối tượng Bitmap bm = new Bitmap(20, 20); bm.Save("bitmap.png");
• Hàm tĩnh (từ khoá static) - Gọi từ lớp Console.Write("Please enter a number :");
10
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
.NET Base Class Library • Một tập hợp khổng lồ các đoạn mã lớp được giám quản
(managed code) mà Microsoft đã viết ra, cho phép bạn làm bất cứ việc gì với máy tính mà Windows API hỗ trợ • Bạn có thể sử dụng các lớp cơ bản .NET này để...
Tạo các thể hiện (object)
Truy xuất các phương thức / hàm thành phần các lớp cung cấp
• • • Cung cấp, truy xuất các dữ liệu của các thể hiện của lớp
• Để nghiên cứu về các lớp cung cấp cái gì...
Sử dụng Object Browser
• • MSDN - http://msdn.microsoft.com/en-us/library/gg145045%28v=vs.100%29.aspx
Bên cạnh các giải thích còn có các ví dụ hướng dẫn sử dụng
•
11
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace (1/5) • Là cách mà .NET tránh né việc các định danh (tên lớp, tên
biến, tên hàm,...) choảng nhau vì trùng tên
• Là việc gộp lại những kiểu dữ liệu có liên hệ với nhau về mặt
ngữ nghĩa
System.IO gộp các kiểu dữ liệu liên quan đến xuất nhập dữ liệu trên tập tin
System.Data gộp các kiểu dữ liệu cơ bản về cơ sở dữ liệu
• •
• Tên tất cả các kiểu dữ liệu trong phạm vi namespace sẽ tự động
được gán một tiền tố mang tên namespace
Lớp Array nằm trong System, nên tên trọn vẹn của nó là System.Array
•
• .NET đòi hỏi các kiểu dữ liệu phải được định nghĩa trong một namespace nào đó
12
System.Console System.Array
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace (2/5) •
[Lời khuyên của Microsoft] Nên cung cấp ít nhất hai namespace lồng nhau :
namespace đầu : tên công ty
• •
namespace thứ hai : tên công nghệ, tên gói phần mềm, tên phần mềm hoặc tên project
• Trong .NET, hầu hết những namespace quan trọng đều xoay
quanh namespace System
Namespace này cung cấp phần cốt lõi các kiểu dữ liệu
• • Một chương trình C# ít nhất phải khai báo sử dụng namespace này • Việc tìm hiểu từng kiểu dữ liệu được chứa đựng trong mỗi
namespace đòi hỏi thời gian
13
YourCompanyName.ProjectName.ClassName
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace (3/5)
System
.NET Namespace Ý nghĩa
System.Collections
Chứa các lớp cốt lõi liên quan đến các kiểu dữ liệu bẩm sinh, tính toán số học...
Định nghĩa một số đối tượng như ArrayList, Queue, SortedList
System.Data System.Data.Common System.Data.SqlClient
Những namespace dùng trong việc thao tác với các cơ sở dữ liệu
System.Drawing System.Drawing.Drawing2D System.Drawing.Printing
System.IO
Chứa các kiểu dữ liệu về vẽ đồ hoạ, in ấn
System.Net
Chứa các kiểu dữ liệu lo việc xuất nhập dữ liệu
System.Web
Các kiểu dữ liệu liên quan đến lập trình mạng
System.Windows.Form
Các kiểu dữ liệu cho việc triển khai những ứng dụng Web, kể cả ASP.NET
System.XML
Các kiểu dữ liệu cho phép xây dựng giao diện đồ hoạ
14
Các kiểu dữ liệu cho phép tương tác với dữ liệu XML
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace (4/5) • Sử dụng từ khoá using để qui chiếu đến các namespace trong
chương trình
using System; using System.Drawing; using System.Windows.Forms; using System.Data; using System.Data.SqlClient;
• Một khi đã qui chiếu các namespace, bạn tự do tạo ra những thể
hiện của những kiểu dữ liệu mà namespace đó chứa đựng using System.Drawing; ... Bitmap bm = new Bitmap(20, 20); // Không cần viết tên lớp bao gồm cả namespace
System.Drawing.Bitmap bm = new System.Drawing.Bitmap(20, 20);
Cách 1 :
• Nên dùng cách 1, chỉ dùng cách 2 khi muốn tránh sự nhập nhằng về tên
• Có thể dùng các alias cho các tên namespace dài
using WF = System.Windows.Forms;
15
Cách 2 :
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace (5/5) • Một tập tin assembly (vd : mscorlib.dll) có thể chứa một
lượng bất kỳ các namespace
• Cần phải báo cho trình biên dịch về tên của assembly chứa các
namespace có các kiểu được tham chiếu (được sử dụng) •
Tất cả các assembly được lưu trong GAC (Global Assembly Cache) - C:\Windows\Assembly
•
Trong Visual Studio, trên ngăn Solution Explorer, nháy phải chuột lên thư mục References, nháy mục Add References
Làm việc này rồi thì mới using được
•
16
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Cách tạo ra một chương trình C#
17
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình C# • Mỗi Project được đặt trong một Solution • Mỗi Solution có thể chứa nhiều Project
• Một Project bao gồm một hoặc nhiều đơn vị biên dịch
(compilation units) • Mỗi đơn vị là một file mã nguồn riêng biệt (.cs) •
Program.cs là tên mặc định của đơn vị biên dịch đầu tiên của project • Mỗi Project được biên dịch thành một tập tin assembly (.exe
hoặc .dll)
• Hai đơn vị biên dịch khác nhau có thể chứa cùng namespace • Hai project khác nhau phải chứa hai namespace khác nhau
18
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Cấu trúc chương trình C#
Solution
biên dịch thành .exe
biên dịch thành .dll
Project 1
Project 2
File1.cs
File2.cs
File3.cs
File1.cs
namespace A {...}
namespace B {...}
namespace C {...}
namespace A {...}
class X {...}
class Y {...}
class Z {...}
19
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Namespace vs Assembly
Namespace là cấu trúc thời gian biên dịch (compile-time)
• •
Assembly là cấu trúc thời gian chạy (run-time) • Có thể chứa các kiểu dữ liệu từ các namespace khác nhau
file A.cs
file A.exe namespace X { "class A {...} }
chứa X.A và Y.B csc A.cs B.cs file B.cs
namespace Y { "class B {...} }
file C.cs
file C.exe
chứa X.C csc C.cs
20
namespace X { "class C {...} }
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Assembly được tạo ra ntn ? • Mỗi biên dịch tạo ra hoặc một assembly hoặc một module
• Các module khác có thể được thêm vào sử dụng trình assembly linker
(AL)
sources
assembly A.cs
B.cs .exe .dll executable library có manifest
modules csc
module C.netmodule
.netmodule không có manifest libraries
D.dll
21
chỉ đề giải quyết các tham chiếu
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
22
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Biên dịch chương trình
csc /out:Square.exe Program.cs Square.cs
csc /out:Square.exe *.cs
• csc.exe cung cấp vài tham số dòng lệnh sau :
/out : chỉ định tên của Assembly
/target:exe : (mặc định) Assembly kiểu .exe
/target:library : Assembly kiểu .dll
• • • •
/target:module : Assembly kiểu .netmodule, dùng cho biên dịch Assembly nhiều tập tin
•
/reference : tham chiếu các Assembly .dll mà Assembly biên dịch cần sử dụng • Nên sử dụng Visual Studio 2010 Command Prompt để biên dịch
cmd.exe /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat""
23
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Assembly kiểu .dll
using System;
using System; using SquareLibrary;
namespace Square { class Program { static void Main(string[] args) { double n;
namespace SquareLibrary { class Square { public static double square(double n) { return n * n; } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
Console.WriteLine("The square of {0} is {1}", n, SquareLibrary.Square.square(n)); Console.ReadKey(); } } }
csc /t:library /out:Square.dll Square.cs csc /r:Square.dll /out:Square.exe Program.cs
24
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Các thành phần của một chương trình C#
25
Monday, October 15, 12
Tên bài giảng Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
26
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
• Các tập tin .cs là các tập tin mã nguồn C# • Mỗi tập tin nên chứa cài đặt cho một và chỉ một lớp • Program.cs là tập tin mặc định đầu tiên được tạo ra trong Project để chứa đoạn chương trình là điểm bắt đầu của chương trình
27
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
• Mỗi câu lệnh trong C# được kết thúc bằng dấu chấm phẩy (;)
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
• Nhiều câu lệnh có thể được gộp lại thành khối và đặt trong cặp dấu ngoặc nghéo { }
28
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
// nhap mot so vao tu ban phim Các dẫn hướng biên dịch đặt ở đầu mỗi tập tin mã nguồn
Console.Write("Please enter a number:"); n = int.Parse(Console.ReadLine());
• •
•
Console.ReadKey(); } } }
sử dụng từ khoá using // in ra binh phuong cua so do báo cho trình biên dịch biết bạn sẽ sử dụng những kiểu dữ liệu trong Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); namespace nào đây cũng là cách để bạn giảm thiểu việc gõ tên namespace trước tên lớp, tên hàm
29
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
•
namespace Square { class Square { public static double square(double n) { Khai báo một namespace sử dụng từ khoá return n * n; // tinh binh phuong cua n } namespace } } Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
Tên namespace bắt đầu bằng kí tự viết hoa (không bắt buộc) Namespace có thể có hoặc không
// in ra binh phuong cua so do • Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
Những kiểu dữ liệu thuộc namespace nào thì đặt trong cặp dấu ngoặc nhọn của namespace đó Có thể khai báo các namespace lồng nhau
30
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Khai báo một lớp bằng tên lớp theo sau từ khoá class Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
Tên lớp bắt đầu bằng kí tự viết hoa
•
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
Thân lớp được đặt trong cặp dấu ngoặc nhọn {} Đối với C#, mọi biến và hàm đều phải được đặt trong một định nghĩa kiểu nào đó
Không cho phép global functions và global datas
•
31
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
đây là điểm đầu vào của một chương trình
// nhap mot so vao tu ban phim
namespace Square { class Square { Trong C#, một chương trình luôn bắt đầu public static double square(double n) { bằng hàm Main() : return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
• •
có thể có nhiều hàm Main để xử lý cho nhiều trường hợp khởi động chương trình khác nhau
không thuộc về một lớp nào, global function
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
là một hàm tĩnh (từ khoá static)
người ta có thể truyền tham số cho nó
Console.ReadKey(); } } }
có nhiều dạng giá trị trả về của hàm này
• • • •
ở đây là void, tức là không cần giá trị trả về
•
32
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); Khai báo biến : n = double.Parse(Console.ReadLine());
có thể khai báo bất cứ đâu trong chương trình
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
biến sẽ có kiểu và tên
• •
Console.ReadKey(); } } }
Các tên biến, tên hàm, tên lớp gọi chung là các định danh và nên tuân theo qui tắc đặt tên :
C# phân biệt chữ hoa, chữ thường cho các định danh
33
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
• Write - in chuỗi văn bản chỉ định ra
màn hình
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
using System; Xuất dữ liệu ra màn hình sử dụng namespace Square lớp System.Console : { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
• WriteLine - in chuỗi văn bản chỉ định ra màn hình rồi xuống dòng • Thông số đầu tiên đại diện cho chuỗi
ký tự in ra màn hình
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
• Các token giữ chỗ {0}, {1} là vị trí các giá trị của các thông số tiếp theo sẽ được chèn vào
Xem cách định dạng chuỗi chữ tại Ch.2 sách Lập trình Visual C# thế nào ?, tập 1 của Dương Quang Thiện
34
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
• ReadLine - đọc vào một dòng
// nhap mot so vao tu ban phim
namespace Square { Nhậ dữ liệu từ bàn phím sử dụng class Square { lớp System.Console : public static double square(double n) { return n * n; // tinh binh phuong cua n } • } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
Kết quả đọc vào là một chuỗi ký tự. Do đó, ta phải dùng hàm Parse của kiểu double để chuyển từ chuỗi thành số • ReadKey - đọc vào một ký tự
•
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Ở đây, chức năng của hàm này là dừng màn hình để cho người sử dụng đọc các kết quả xuất ra màn hình
Console.ReadKey(); } } }
35
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
Khi gọi một hàm, hàm này phải thuộc về một lớp nào đó :
•
namespace Square { class Program { static void Main(string[] args) { double n;
Lời gọi hàm phải tuân theo qui định của lời gọi hàm (Xem slide 10) // nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Console.ReadKey(); } } }
36
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Chương trình đầu tiên
using System;
using System;
namespace Square { class Program { static void Main(string[] args) { double n;
// nhap mot so vao tu ban phim
namespace Square { class Square { public static double square(double n) { return n * n; // tinh binh phuong cua n } } }
Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());
// in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square.square(n));
Thêm các ghi chú để chú thích cho các dòng lệnh của chương trình : • C# cung cấp 3 dạng chú thích
Console.ReadKey(); } } }
• // line comment • /* block comment */ • /// documentation comment
37
Program.cs Square.cs
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Biến, kiểu dữ liệu, Hằng
38
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Bộ nhớ của con người
1. Đầu tiên, yêu cầu bạn nhớ con số 5
5
2. Sau đó, yêu cầu bạn nhớ đồng thời
5
2
con số 2
3. Yêu cầu bạn cộng 1 vào con số đầu
6
2
tiên
= 4
6
2
4. Trừ hai số đó
39
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Bộ nhớ của máy tính • Máy tính có thể chứa hàng triệu số cùng lúc và thực hiện tính
toán số học trên chúng
• Chúng ta có thể định nghĩa một biến như một phần của bộ
nhớ để lưu trữ một giá trị xác định
• Mỗi biến cần có một định danh (tên) để phân biệt với các biến
khác
• Ví dụ : a, b, result là các định danh biến
a = 5; b = 2; a = a + 1; result = a - b;
40
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Định danh • Định danh là chuỗi các ký tự, số và dấu gạch chân và luôn bắt
đầu bằng ký tự, dấu gạch chân hoặc ký tự @
someName sum_of3 _10percent @while
𝛑 \u03c0 b\u0061ck
Phân biệt chữ hoa và chữ thường
Ký hiệu @ được sử dụng để chỉ một từ khoá là định danh
• Trong C#, định danh : • Hỗ trợ ký tự Unicode • •
if - từ khoá
•
@if - định danh if
•
• Có thể chứa các chuỗi mã Unicode (vd : \u03c0 tương đương 𝛑)
41
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Từ khoá
Có tất cả 77 từ khoá
abstract as bool break base
byte case char checked catch
continue decimal class const default
delegate do else enum double
event explicit falsea finally extern
fixed float foreach goto for
if implicit int interface in
internal is long namespace lock
new null operator out object
override params public protected private
readonly ref sealed sbyte return
short sizeof string stackalloc static
struct switch truea throw this
try typeof uncheched ulong uint
unsafe ushort virtual void using
42
volatile while
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Quy tắc đặt tên • Chữ hoa, chữ thường
Ký tự đầu tiên được viết hoa, ngoại trừ tên biến
• Các từ được viết hoa chữ cái đầu tiên (vd : ShowDialog) • hằng
viết hoa
SIZE, MAX_VALUE
biến
viết thường, ký hiệu lạc đà
i, top, sum, data, lastElement
viết hoa, ký hiệu Pascal
hàm, hằng, lớp • Từ đầu tiên
•
Tên của các hàm có kiểu trả về là void nên bắt đầu bằng một động từ (vd : GetHashCode)
• Các tên khác nên bắt đầu bằng một danh từ (vd : size, IndexOf,
Collections)
• Các hằng liệt kê (enumeration) hay các biến kiểu logic có thể bắt đầu bằng
một tính từ (vd : Red, Empty)
43
Add, IndexOf
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Hệ thống kiểu
Types
Value Types
Reference Types
Pointers
Primitive Types Enums Structs Classes Interfaces Arrays Delegates
bool char
User-defined Types
float double decimal
sbyte short int long
byte ushort uint ulong
• Tất cả các kiểu dữ liệu đều thừa kế từ System.Object
có thể được gán cho các biến kiểu Object
có thể sử dụng tất cả các hàm của kiểu Object
• •
44
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Kiểu trị & kiểu tham chiếu
Biến kiểu
Kiểu trị
Kiểu tham chiếu
Chứa
Giá trị
Tham chiếu
Stack
Heap
Lưu trữ
0, false, ‘\0’
null
Giá trị khởi tạo
Phép gán
sao chép giá trị
sao chép tham chiếu
Ví dụ
int i = 17; int j = i;
string s = “Hello”; string s1 = s;
i 17
s
0x0a10
Hello
j 17
s1 0x0a10
45
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Stack vs Heap
heap
myobj = new Object()
được quản lý theo lời gọi hàm
• stack được đặt trong bộ nhớ máy tính chứa tất cả các biến được khai báo và khởi tạo trước thời gian chạy (runtime) •
• heap là một phần của bộ nhớ máy tính
stack
chứa tất cả các biến được tạo ra và khởi tạo trong thời gian chạy (các biến động - dynamic memory) •
main()
sử dụng từ khoá new để cấp phát vùng nhớ
int y
•
được quản lý hoàn toàn bởi hệ thống (Bộ gom rác)
static data
• stack là nhanh hơn so với heap nhưng
code
nhỏ hơn và đắt đỏ hơn
46
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Kiểu dữ liệu cơ bản
Kiểu C#
Kiểu .NET
Mô tả
sbyte byte
System.SByte System.Byte
số nguyên có dấu 8 bit số nguyên ko dấu 8 bit
short ushort
System.Int16 System.UInt16
số nguyên có dấu 16 bit số nguyên ko dấu 16 bit
int uint
System.Int32 System.UInt32
số nguyên có dấu 32 bit số nguyên ko dấu 32 bit
long ulong
System.Int64 System.UInt64
số nguyên có dấu 64 bit số nguyên ko dấu 64 bit
float double decimal
System.Single System.Double System.Decimal
số thực 32 bit số thực 64 bit số thực 128 bit
bool char
System.Boolean System.Char
true, false ký tự Unicode
Các kiểu dữ liệu này đều có các hàm thành phần rất hữu ích. Vd : int.MaxValue
47
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
17
int
Cách xác định kiểu số • Số nguyên
987654321
long
Không có hậu tố Kiểu nhỏ nhất từ int, uint, long, ulong
17L
long
17u
uint
Hậu tố u, U
Kiểu nhỏ nhất từ int, uint
0x3f
int
Hậu tố l, L
Kiểu nhỏ nhất từ long, ulong
ox100000000
long
0x3fL
long
• Số thực Không có hậu tố double
3.14
double
float
1.00E-02
double
Hậu tố f, F
“.1”
double
double
Hậu tố d, D
10f
float
decimal
Hậu tố m, M
48
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Tính tương thích giữa các kiểu
long
short
sbyte
decimal
double
float
int
ulong
uint
ushort
byte
Chỉ với ép kiểu
char
• Theo chiều mũi tên là thích hợp
(type)expression
•
cho một chuyển đổi kiểu từ kích thước lớn sang kích thước nhỏ hoặc cho phép chia
int i = (int)3.14159; // always truncates int i = (int)(3.14159 + 2.7); unsigned int i = (unsigned int)75; double x = (double)1/3;
49
intVar = shortVar; intVar = charVar; floatVar = charVar; decimalVar = (decimal)doubleVar; • Chuyển đổi kiểu tường minh có thể được gọi bằng các ép kiểu :
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Khai báo và khởi tạo biến • Phải được khai báo trước khi sử dụng : bao gồm cả kiểu dữ
liệu và định danh
int dollars; int quarters, dimes, nickels, pennies; int money = 217; double x, pi = 3.14159; char begin = ‘A’, end = ‘Z’, newLine = ‘\n’;
int i;
i undenfined
0x0a000010
i chưa được khởi tạo
i
n a g i ờ h t
i = 10;
i 10
0x0a000010
i bằng 10
50
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Phạm vi của biến
using System;
Biến thành phần
namespace Square { class Program { int Interger; int Interger; char aCharacter; char aCharacter; string aString; string aString; uint numberOfSon; uint numberOfSon;
Biến cục bộ
static void Main(string[] args) { ushort Age; ushort Age; float aNumber, anotherOne; float aNumber, anotherOne;
Console.Write("Enter your age:"); Age = ushort.Parse(Console.ReadLine()); } } }
Biến sẽ bị hủy khi kết thúc khối lệnh định nghĩa biến đó
51
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Lớp System.String • Chứa chuỗi các ký tự, là kiểu tham chiếu
Không phải kiểu cơ bản, nhưng hành động như một kiểu dữ liệu cơ bản
•
string mystring = "This is the initial string content"; mystring = "This is a different string content";
• Chú ý :
• Các chuỗi trong kiểu string là không thể thay đổi (Dùng lớp StringBuilder nếu muốn sửa đổi các chuỗi string)
Lấy một ký tự trong chuỗi : mystring[i]
Lấy độ dài chuỗi : mystring.Length
So sánh giá trị chứa trong chuỗi bằng toán tử == và !=
• Nối chuỗi sử dụng toán tử + • • • •
Lớp String còn có các hàm : CompareTo, IndexOf, StartsWith, SubString,...
52
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Hằng ký tự và chuỗi • Cú pháp
‘c‘ - hằng ký tự “char” - chuỗi chuỗi
• Một ký tự có thể là bất kỳ ký tự nào ngoại trừ dấu nháy, ký hiệu
\’
‘
\”
“
kết thúc dòng hoặc dấu \ • Các ký tự escape thông dụng
\\
\
"file \"C:\\sample.txt\"" file "C:\sample.txt"
\n
dòng mới
\r
về đầu dòng
\t
tab
• Nếu trước một chuỗi có ký tự @
dấu \ không được xem là ký tự escape
dấu “ phải được gấp đôi
chuỗi có thể được viết trên nhiều dòng
• • •
53
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Hằng • Là một biến nhưng trị không thể thay đổi được suốt thời gian thi
hành chương trình
• Hằng phải được khởi gán giá trị lúc khai báo và khai báo là thành phần của một
lớp
• Khi khai báo có thể gán giá trị là kết quả của một biểu thức
• Hai cách khai báo hằng
const float PI = 3.14159; const char NewLine = '\n'; const int PathWidth = 100; const int SquarePi = Pi * Pi;
• Lợi ích :
• Dễ đọc, thay thế những con số vô cảm bằng những tên có ý nghĩa • Dễ sửa chương trình, ít mắc lỗi
54
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Toán tử
55
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Toán tử và thứ tự ưu tiên
Toán tử sơ cấp
(x) x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked
+ - ~ ! ++x --x (T)x Toán tử một ngôi
* / % Nhân
+ - Cộng
<< >> Dịch bit
< > <= >= is as Quan hệ
== ! So sánh bằng
& Toán tử AND
^ Toán tử XOR
| Toán tử OR
&& AND điều kiện
|| OR điều kiện
c?x:y Toán tử điều kiện
56
= += -= *= /= %= <<= >>= &= ^= |= Toán tử gán
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Phép toán tăng / giảm
x = 10;
Toán tử
Ý nghĩa
Kết quả
a = x++;
a = x; x = x + 1;
a == 10; x == 11;
a = ++x;
x = x + 1; a = x;
a == 11; x == 11;
a = x--;
a = x; x = x - 1;
a == 10; x == 9;
a = --x;
x = x - 1; a = x;
a == 9; x == 9;
57
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Phép gán kết hợp
+=, -=, *=, /=, %=, ~=, <<=, >>=
x += 10; i -= 2; a /= b; index %= size; mask <<= 2;
x = x + 10; i = i - 2; a = a / b; index = index % size; mask = mask << 2;
58
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Lập trình chương trình đơn giản với C#
59
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ 1 - tiền tệ của Mỹ Dollar, Quarter, Dime, Nickel, Penny
nickel = 5 pennies
dime = 10 pennies
quarter = 25 pennies
dollar = 100 pennies
Từ một số lượng Penny được cho, biểu diễn số lượng đó sử dụng tất cả các đơn vị tiền tệ trên.
60
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Ví dụ 1 - tiền tệ của Mỹ
• Input : số tiền - money (pennies) • Output : 1 dollars 3 quarters 2 dimes 1 nickels 4 pennies • Xử lý :
• dollars = money / 100 • quarters = phần còn lại của money / 25 • dimes = phần còn lại của money / 10 • nickels = phần còn lại của money / 5 • pennies = phần còn lại của money
61
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
// a program that converts a number of pennies into the equivalant // value expressed in dollars, quarters, dimes, nickels, and pennies. using System;
namespace Penny { class Program { static void Main(string[] args) { int"money;
Console.Write("Enter the number of pennies: "); " money =
int.Parse(Console.ReadLine());
Console.WriteLine("{0} pennies =", money);
int"dollars = money / 100;
" " money = money % 100;
int"quarters = money / 25;
" " money %= 25;
int"dimes = money / 10;
" " money %= 10;
int"nickels = money / 5;
" " money %= 5;
"
int"pennies = money;
Console.WriteLine("{0} dollars", dollars); Console.WriteLine("{0} quarters", quarters); Console.WriteLine("{0} dimes", dimes); Console.WriteLine("{0} nickels", nickels); Console.WriteLine("{0} pennies", pennies); Console.ReadKey(); } } }
62
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn
Cảm ơn sự chú ý Câu hỏi ?
63
Monday, October 15, 12
Cơ bản NNLT C# Lê Viết Mẫn - lvman@hce.edu.vn