Cơ bản ngôn ngữ lập trình C# - Cài đặt thuật toán

pdf 63 trang vanle 3080
Bạn đang xem 20 trang mẫu của tài liệu "Cơ bản ngôn ngữ lập trình C# - Cài đặt thuật toán", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfco_ban_ngon_ngu_lap_trinh_c_cai_dat_thuat_toan.pdf

Nội dung text: Cơ bản ngôn ngữ lập trình C# - Cài đặt thuật toán

  1. Cơ bản ngôn ngữ lập trình C# v 1.0 - 10/2012 Lê Viết Mẫn - lvman@hce.edu.vn 1 Cơ bản NNLT C# Monday, October 15, 12
  2. chúng ta đã học 1. Lập trình là gì ? 2. C# và .NET 3. Thiết kế thuật toán Lê Viết Mẫn - lvman@hce.edu.vn 2 Cơ bản NNLT C# Monday, October 15, 12
  3. 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 ] Lê Viết Mẫn - lvman@hce.edu.vn 3 Cơ bản NNLT C# Monday, October 15, 12
  4. 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# Lê Viết Mẫn - lvman@hce.edu.vn 4 Cơ bản NNLT C# Monday, October 15, 12
  5. Lập trình hướng đối tượng Lê Viết Mẫn - lvman@hce.edu.vn 5 Cơ bản NNLT C# Monday, October 15, 12
  6. .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 Lê Viết Mẫn - lvman@hce.edu.vn 6 Cơ bản NNLT C# Monday, October 15, 12
  7. 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 Lê Viết Mẫn - lvman@hce.edu.vn 7 Cơ bản NNLT C# Monday, October 15, 12
  8. Document name Lớp & đối tượng type state nameBorrower • Một đối tượng là một thực thể trong miền dateBorrow xác định có một định danh riêng (tên) dateReminder calculDateReminder • Một tập những đặc tính (attribute) mô tả tình trạng của đối tượng Đặc tả UML của một lớp • 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 đó Lê Viết Mẫn - lvman@hce.edu.vn 8 Cơ bản NNLT C# Monday, October 15, 12
  9. Ví dụ Car Nhóm các dữ liệu và xử lý liên mark quan trong một lớp color registering start driver stop twingo : Car Object : một thể hiện của lớp mark = Renault color = gray registering = 995 LKZ 75 Lê Viết Mẫn - lvman@hce.edu.vn 9 Cơ bản NNLT C# Monday, October 15, 12
  10. 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 Khai báo một biến có kiểu dữ liệu nào đó và ghi dữ của một lớp liệu vào biến đó Sử dụng từ khoá new Bitmap bm = new Bitmap(20, 20); Đặ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 :"); Lê Viết Mẫn - lvman@hce.edu.vn 10 Cơ bản NNLT C# Monday, October 15, 12
  11. .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 - • Bên cạnh các giải thích còn có các ví dụ hướng dẫn sử dụng Lê Viết Mẫn - lvman@hce.edu.vn 11 Cơ bản NNLT C# Monday, October 15, 12
  12. 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 System.Console System.Array • 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 đó Lê Viết Mẫn - lvman@hce.edu.vn 12 Cơ bản NNLT C# Monday, October 15, 12
  13. Namespace (2/5) • [Lời khuyên của Microsoft] Nên cung cấp ít nhất hai namespace lồng nhau : YourCompanyName.ProjectName.ClassName • 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 Lê Viết Mẫn - lvman@hce.edu.vn 13 Cơ bản NNLT C# Monday, October 15, 12
  14. Namespace (3/5) .NET Namespace Ý nghĩa Chứa các lớp cốt lõi liên quan đến các kiểu dữ liệu bẩm sinh, System tính toán số học System.Collections Định nghĩa một số đối tượng như ArrayList, Queue, SortedList System.Data Những namespace dùng trong việc thao tác với các cơ sở dữ System.Data.Common System.Data.SqlClient liệu System.Drawing System.Drawing.Drawing2D Chứa các kiểu dữ liệu về vẽ đồ hoạ, in ấn System.Drawing.Printing System.IO Chứa các kiểu dữ liệu lo việc xuất nhập dữ liệu System.Net Các kiểu dữ liệu liên quan đến lập trình mạng Các kiểu dữ liệu cho việc triển khai những ứng dụng Web, kể System.Web cả ASP.NET System.Windows.Form Các kiểu dữ liệu cho phép xây dựng giao diện đồ hoạ System.XML Các kiểu dữ liệu cho phép tương tác với dữ liệu XML Lê Viết Mẫn - lvman@hce.edu.vn 14 Cơ bản NNLT C# Monday, October 15, 12
  15. 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; Cách 1 : Bitmap bm = new Bitmap(20, 20); // Không cần viết tên lớp bao gồm cả namespace Cách 2 : System.Drawing.Bitmap bm = new System.Drawing.Bitmap(20, 20); • 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; Lê Viết Mẫn - lvman@hce.edu.vn 15 Cơ bản NNLT C# Monday, October 15, 12
  16. 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 Lê Viết Mẫn - lvman@hce.edu.vn 16 Cơ bản NNLT C# Monday, October 15, 12
  17. Cách tạo ra một chương trình C# Lê Viết Mẫn - lvman@hce.edu.vn 17 Cơ bản NNLT C# Monday, October 15, 12
  18. 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 Lê Viết Mẫn - lvman@hce.edu.vn 18 Cơ bản NNLT C# Monday, October 15, 12
  19. Cấu trúc chương trình C# biên dịch Solution 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 A { } namespace C { } class X { } class Y { } class Z { } Lê Viết Mẫn - lvman@hce.edu.vn 19 Cơ bản NNLT C# Monday, October 15, 12
  20. 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 namespace X { class A { } } file A.exe file B.cs csc A.cs B.cs chứa X.A và Y.B namespace Y { class B { } } file C.cs file C.exe namespace X { class C { } csc C.cs chứa X.C } Lê Viết Mẫn - lvman@hce.edu.vn 20 Cơ bản NNLT C# Monday, October 15, 12
  21. 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 A.cs assembly .exe executable có B.cs .dll library manifest modules csc C.netmodule module không có .netmodule manifest libraries D.dll chỉ đề giải quyết các tham chiếu Lê Viết Mẫn - lvman@hce.edu.vn 21 Cơ bản NNLT C# Monday, October 15, 12
  22. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } 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(); } } } Lê Viết Mẫn - lvman@hce.edu.vn 22 Cơ bản NNLT C# Monday, October 15, 12
  23. 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"" Lê Viết Mẫn - lvman@hce.edu.vn 23 Cơ bản NNLT C# Monday, October 15, 12
  24. Assembly kiểu .dll Program.cs Square.cs using System; using System; using SquareLibrary; namespace SquareLibrary namespace Square { { class Square class Program { { public static double square(double n) static void Main(string[] args) { { return n * n; double 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 Lê Viết Mẫn - lvman@hce.edu.vn 24 Cơ bản NNLT C# Monday, October 15, 12
  25. Các thành phần của một chương trình C# Lê Viết Mẫn - lvman@hce.edu.vn 25 Tên bài giảng Monday, October 15, 12
  26. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } 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(); } } } Lê Viết Mẫn - lvman@hce.edu.vn 26 Cơ bản NNLT C# Monday, October 15, 12
  27. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } Console.Write("Please enter a number:"); } n = double.Parse(Console.ReadLine()); // in Cácra binh tập phuong tin cua.cs so làdo các tập tin mã nguồn C# Console• .WriteLine("The square of {0} is Mỗi tập{1}" ,tin n, nênSquare chứa.square(n)); cài đặt cho một và chỉ một lớp Console• .ReadKey(); } } • 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 Lê Viết Mẫn - lvman@hce.edu.vn 27 Cơ bản NNLT C# Monday, October 15, 12
  28. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } Console.Write("Please enter a number:"); } n = double.Parse(Console.ReadLine()); • Mỗi câu lệnh trong C# được // in ra binh phuong cua so do kết thúc bằng dấu chấm Console.WriteLine("The square of {0} is {1}", n, Square.square(n)); phẩy (;) 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 { } Lê Viết Mẫn - lvman@hce.edu.vn 28 Cơ bản NNLT C# Monday, October 15, 12
  29. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } Các Console dẫn.Write( hướng"Please biên enter dịch a number:" đặt );ở đầu} mỗi tập tin mã nguồn n = int.Parse(Console.ReadLine()); • sử dụng từ khoá using // in ra binh phuong cua so do •Consolebáo.WriteLine( cho trình"The biên square dịch ofbiết {0} bạn is sẽ sử dụng những kiểu dữ liệu trong namespace{1}", n, Square.square(n)); Console.ReadKey(); 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 Lê Viết Mẫn - lvman@hce.edu.vn 29 Cơ bản NNLT C# Monday, October 15, 12
  30. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; Khai báo một namespace return n * sửn; //dụng tinh binhtừ khoáphuong cua n } // nhap mot so vao tu bannamespace phim } Console.Write("Please enter a number:"Tên namespace); } bắt đầu bằng kí tự viết hoa n = double.Parse(Console.ReadLine());• (không bắt buộc) // in ra binh phuong cua so do Console.WriteLine("The square• ofNamespace {0} is có thể có hoặc không {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 Lê Viết Mẫn - lvman@hce.edu.vn 30 Cơ bản NNLT C# Monday, October 15, 12
  31. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { 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ừ // nhap mot so vao tu ban phim } Console.Write("Please enterkhoá a number:" class); } 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 squareThân of lớp{0} isđược đặt trong cặp dấu ngoặc {1}", n, Square.square(n)); Console.ReadKey(); 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 Lê Viết Mẫn - lvman@hce.edu.vn 31 Cơ bản NNLT C# Monday, October 15, 12
  32. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) Trong C#, mộtpublic chương static double trình square( luôndouble bắt n) đầu { { double n; bằng hàm Main() return n: * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim • đây là } điểm đầu vào của một chương trình Console.Write("Please enter a number:"); } n = double.Parse(Console.ReadLine());• có thể có nhiều hàm Main để xử lý cho nhiều // in ra binh phuong cua so do trường hợp khởi động chương trình khác nhau Console.WriteLine("The square of {0} is {1}", n, Square.square(n));• không thuộc về một lớp nào, global function Console.ReadKey(); } • là một hàm tĩnh (từ khoá static) } } • người ta có thể truyền tham số cho nó • 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ề Lê Viết Mẫn - lvman@hce.edu.vn 32 Cơ bản NNLT C# Monday, October 15, 12
  33. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } Console.Write("Please enter a number:"); } n = double.Parse(KhaiConsole báo.ReadLine()); biến : // in ra binh phuong• cuacó sothể do khai báo bất cứ đâu trong chương trình Console.WriteLine("The square of {0} is {1}", •n, Squarebiến .square(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 Lê Viết Mẫn - lvman@hce.edu.vn 33 Cơ bản NNLT C# Monday, October 15, 12
  34. Chương trình đầu tiên Program.cs Square.cs using System; using System; Xuất dữ liệu ra màn hình sử dụng namespace Square namespace Square { { System.Console class Program lớp class Square : { { static void Main(string[] args) • publicWrite static - in doublechuỗi square(văn bảndouble chỉ địnhn) ra { { màn hình double n; return n * n; // tinh binh phuong cua n } WriteLine - in chuỗi văn bản chỉ // nhap mot so vao tu ban phim •} Console.Write("Please enter a number:"); } định ra màn hình rồi xuống dòng n = double.Parse(Console.ReadLine()); • Thông số đầu tiên đại diện cho chuỗi // in ra binh phuong cua so do Console.WriteLine("The square of {0} is ký tự in ra màn hình {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 Lê Viết Mẫn - lvman@hce.edu.vn 34 Cơ bản NNLT C# Monday, October 15, 12
  35. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program Nhậ class dữ Square liệu từ bàn phím sử dụng { { static void Main(string[] args) lớp publicSystem.Console static double square( : double n) { { double n; • returnReadLine n * n; - //đọc tinh vào binh một phuong dòng cua n } Kết quả đọc vào là một chuỗi ký tự. Do đó, ta // nhap mot so vao tu ban phim } • Console.Write("Please enter a number:"); } phải dùng hàm Parse của kiểu double để n = double.Parse(Console.ReadLine()); chuyển từ chuỗi thành số // in ra binh phuong cua so do • ReadKey - đọc vào một ký tự 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 Console.ReadKey(); hình để cho người sử dụng đọc các kết quả } xuất ra màn hình } } Lê Viết Mẫn - lvman@hce.edu.vn 35 Cơ bản NNLT C# Monday, October 15, 12
  36. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square Khi{ gọi một hàm, hàm này phải { class Program class Square thuộc { về một lớp nào đó : { static void Main(string[] args) public static double square(double n) • {Lời gọi hàm phải tuân theo qui định { double n; return n * n; // tinh binh phuong cua n của lời gọi hàm (Xem slide 10) } // nhap mot so vao tu ban phim } 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(); } } } Lê Viết Mẫn - lvman@hce.edu.vn 36 Cơ bản NNLT C# Monday, October 15, 12
  37. Chương trình đầu tiên Program.cs Square.cs using System; using System; namespace Square namespace Square { { class Program class Square { { static void Main(string[] args) public static double square(double n) { { double n; return n * n; // tinh binh phuong cua n } // nhap mot so vao tu ban phim } Console.Write("Please enter a number:"); } n = double.Parse(Console.ReadLine()); // in ra binh phuong cua so do Console.WriteLine("The square of {0}Thêm is các ghi chú để chú thích cho các {1}", n, Square.square(n)); Console.ReadKey(); dòng lệnh của chương trình : } } • C# cung cấp 3 dạng chú thích } • // line comment • /* block comment */ • /// documentation comment Lê Viết Mẫn - lvman@hce.edu.vn 37 Cơ bản NNLT C# Monday, October 15, 12
  38. Biến, kiểu dữ liệu, Hằng Lê Viết Mẫn - lvman@hce.edu.vn 38 Cơ bản NNLT C# Monday, October 15, 12
  39. 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. Trừ hai số đó 6 2 = 4 Lê Viết Mẫn - lvman@hce.edu.vn 39 Cơ bản NNLT C# Monday, October 15, 12
  40. 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; Lê Viết Mẫn - lvman@hce.edu.vn 40 Cơ bản NNLT C# Monday, October 15, 12
  41. Đị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 Trong C#, định danh : � • \u03c0 • Hỗ trợ ký tự Unicode 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 • if - từ khoá • @if - định danh if • Có thể chứa các chuỗi mã Unicode (vd : \u03c0 tương đương �) Lê Viết Mẫn - lvman@hce.edu.vn 41 Cơ bản NNLT C# Monday, October 15, 12
  42. Từ khoá Có tất cả 77 từ khoá abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern falsea finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw truea try typeof uint ulong uncheched unsafe ushort using virtual void volatile while Lê Viết Mẫn - lvman@hce.edu.vn 42 Cơ bản NNLT C# Monday, October 15, 12
  43. Quy tắc đặt tên • Chữ hoa, chữ thường • Các từ được viết hoa chữ cái đầu tiên (vd : ShowDialog) • Ký tự đầu tiên được viết hoa, ngoại trừ tên biến hằng viết hoa SIZE, MAX_VALUE biến viết thường, ký hiệu lạc đà i, top, sum, data, lastElement hàm, hằng, lớp viết hoa, ký hiệu Pascal Add, IndexOf • 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) Lê Viết Mẫn - lvman@hce.edu.vn 43 Cơ bản NNLT C# Monday, October 15, 12
  44. Hệ thống kiểu Types Value Types Reference Types Pointers Primitive Types Enums Structs Classes Interfaces Arrays Delegates bool sbyte byte float char short ushort double int uint decimal User-defined Types long 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 Lê Viết Mẫn - lvman@hce.edu.vn 44 Cơ bản NNLT C# Monday, October 15, 12
  45. 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 Lưu trữ Stack Heap Giá trị khởi tạo 0, false, ‘\0’ null Phép gán sao chép giá trị sao chép tham chiếu int i = 17; string s = “Hello”; Ví dụ int j = i; string s1 = s; i 17 s 0x0a10 Hello j 17 s1 0x0a10 Lê Viết Mẫn - lvman@hce.edu.vn 45 Cơ bản NNLT C# Monday, October 15, 12
  46. Stack vs Heap • stack được đặt trong bộ nhớ máy tính heap chứa tất cả các biến được khai báo và myobj = new Object() khởi tạo trước thời gian chạy (runtime) • được quản lý theo lời gọi hàm • heap là một phần của bộ nhớ máy tính 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) stack • sử dụng từ khoá new để cấp phát vùng nhớ main() int y • được quản lý hoàn toàn bởi hệ thống (Bộ gom rác) static data stack heap • là nhanh hơn so với nhưng code nhỏ hơn và đắt đỏ hơn Lê Viết Mẫn - lvman@hce.edu.vn 46 Cơ bản NNLT C# Monday, October 15, 12
  47. Kiểu dữ liệu cơ bản Kiểu C# Kiểu .NET Mô tả sbyte System.SByte số nguyên có dấu 8 bit byte System.Byte số nguyên ko dấu 8 bit short System.Int16 số nguyên có dấu 16 bit ushort System.UInt16 số nguyên ko dấu 16 bit int System.Int32 số nguyên có dấu 32 bit uint System.UInt32 số nguyên ko dấu 32 bit long System.Int64 số nguyên có dấu 64 bit ulong System.UInt64 số nguyên ko dấu 64 bit float System.Single số thực 32 bit double System.Double số thực 64 bit decimal System.Decimal số thực 128 bit bool System.Boolean true, false char System.Char 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 Lê Viết Mẫn - lvman@hce.edu.vn 47 Cơ bản NNLT C# Monday, October 15, 12
  48. Cách xác định kiểu số • Số nguyên 17 int 987654321 long Không có hậu tố Kiểu nhỏ nhất từ int, uint, long, ulong 17L long Hậu tố u, U Kiểu nhỏ nhất từ int, uint 17u uint 0x3f int l L long ulong Hậu tố , Kiểu nhỏ nhất từ , ox100000000 long 0x3fL long • Số thực Không có hậu tố double 3.14 double Hậu tố f, F float 1.00E-02 double Hậu tố d, D double “.1” double 10f float Hậu tố m, M decimal Lê Viết Mẫn - lvman@hce.edu.vn 48 Cơ bản NNLT C# Monday, October 15, 12
  49. Tính tương thích giữa các kiểu decimal double float long int short sbyte ulong uint ushort byte Chỉ với ép kiểu char • Theo chiều mũi tên là thích hợp 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 : (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; Lê Viết Mẫn - lvman@hce.edu.vn 49 Cơ bản NNLT C# Monday, October 15, 12
  50. 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 thời gian i = 10; i 10 0x0a000010 i bằng 10 Lê Viết Mẫn - lvman@hce.edu.vn 50 Cơ bản NNLT C# Monday, October 15, 12
  51. Phạm vi của biến using System; namespace Square { class Program { intint Interger;Interger; charchar aCharacter;aCharacter; stringstring aString;aString; Biến thành phần uintuint numberOfSon;numberOfSon; static void Main(string[] args) { ushortushort Age;Age; floatfloat aNumber,aNumber, anotherOne;anotherOne; Biến cục bộ 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 đó Lê Viết Mẫn - lvman@hce.edu.vn 51 Cơ bản NNLT C# Monday, October 15, 12
  52. 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) • Nối chuỗi sử dụng toán tử + • 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à != • Lớp String còn có các hàm : CompareTo, IndexOf, StartsWith, SubString, Lê Viết Mẫn - lvman@hce.edu.vn 52 Cơ bản NNLT C# Monday, October 15, 12
  53. 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 Lê Viết Mẫn - lvman@hce.edu.vn 53 Cơ bản NNLT C# Monday, October 15, 12
  54. 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 Lê Viết Mẫn - lvman@hce.edu.vn 54 Cơ bản NNLT C# Monday, October 15, 12
  55. Toán tử Lê Viết Mẫn - lvman@hce.edu.vn 55 Cơ bản NNLT C# Monday, October 15, 12
  56. 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 Toán tử một ngôi + - ~ ! ++x x (T)x Nhân * / % Cộng + - Dịch bit > Quan hệ = is as 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 || Toán tử điều kiện c?x:y Toán tử gán = += -= *= /= %= >= &= ^= |= Lê Viết Mẫn - lvman@hce.edu.vn 56 Cơ bản NNLT C# Monday, October 15, 12
  57. Phép toán tăng / giảm x = 10; Toán tử Ý nghĩa Kết quả a = x; a == 10; a = x++; x = x + 1; x == 11; x = x + 1; a == 11; a = ++x; a = x; x == 11; a = x; a == 10; a = x ; x = x - 1; x == 9; x = x - 1; a == 9; a = x; a = x; x == 9; Lê Viết Mẫn - lvman@hce.edu.vn 57 Cơ bản NNLT C# Monday, October 15, 12
  58. Phép gán kết hợp +=, -=, *=, /=, %=, ~=, >= x += 10; x = x + 10; i -= 2; i = i - 2; a /= b; a = a / b; index %= size; index = index % size; mask <<= 2; mask = mask << 2; Lê Viết Mẫn - lvman@hce.edu.vn 58 Cơ bản NNLT C# Monday, October 15, 12
  59. Lập trình chương trình đơn giản với C# Lê Viết Mẫn - lvman@hce.edu.vn 59 Cơ bản NNLT C# Monday, October 15, 12
  60. 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. Lê Viết Mẫn - lvman@hce.edu.vn 60 Cơ bản NNLT C# Monday, October 15, 12
  61. 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 Lê Viết Mẫn - lvman@hce.edu.vn 61 Cơ bản NNLT C# Monday, October 15, 12
  62. // 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) { intmoney; Console.Write("Enter the number of pennies: "); money = int.Parse(Console.ReadLine()); Console.WriteLine("{0} pennies =", money); intdollars = money / 100; money = money % 100; intquarters = money / 25; money %= 25; intdimes = money / 10; money %= 10; intnickels = money / 5; money %= 5; intpennies = 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(); } } } Lê Viết Mẫn - lvman@hce.edu.vn 62 Cơ bản NNLT C# Monday, October 15, 12
  63. Cảm ơn sự chú ý Câu hỏi ? Lê Viết Mẫn - lvman@hce.edu.vn 63 Cơ bản NNLT C# Monday, October 15, 12