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