Bài giảng Cơ sở lập trình - Bài 3: Cơ bản ngôn ngữ lập trình C#
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cơ sở lập trình - Bài 3: Cơ bản ngôn ngữ lập trình C#", để 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:
- bai_giang_co_so_lap_trinh_bai_3_co_ban_ngon_ngu_lap_trinh_c.pdf
Nội dung text: Bài giảng Cơ sở lập trình - Bài 3: Cơ bản ngôn ngữ lập trình C#
- Cơ bản ngôn ngữ lập trình C# v 1.1 - 09/2013 Lê Viết Mẫn - lvman@hce.edu.vn 1 Cơ bản NNLT C# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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. Xuất dữ liệu 7. 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# Sunday, September 8, 13
- Lập trình hướng đối tượng Lê Viết Mẫn - lvman@hce.edu.vn 5 Cơ bản NNLT C# Sunday, September 8, 13
- .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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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 thành phần 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# Sunday, September 8, 13
- .NET Base Class Library • Một tập hợp khổng lồ các lớp được cung cấp cho người lập trình, cho phép bạn làm bất cứ việc gì với máy tính mà hệ điều hành có 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 trong các thể hiện của lớp • Để nghiên cứu về các lớp cung cấp cái gì, nằm ở assembly (tập tin .dll) nào, cách sử dụng • Sử dụng Object Browser • MSDN - Lê Viết Mẫn - lvman@hce.edu.vn 11 Cơ bản NNLT C# Sunday, September 8, 13
- 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# Sunday, September 8, 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- 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 • Trong môn học này, chúng ta chủ yếu biên soạn chương trình trong tập tin này • Mỗi Project được biên dịch thành một tập tin assembly (.exe hoặc .dll) Lê Viết Mẫn - lvman@hce.edu.vn 18 Cơ bản NNLT C# Sunday, September 8, 13
- 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# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) { double 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(n)); Console.ReadKey(); } static double Square(double n) { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 20 Cơ bản NNLT C# Sunday, September 8, 13
- Biên dịch chương trình csc /out:Square.exe Program.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 21 Cơ bản NNLT C# Sunday, September 8, 13
- Các thành phần của một chương trình C# Lê Viết Mẫn - lvman@hce.edu.vn 22 Tên bài giảng Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) { double 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(n)); Console.ReadKey(); } static double Square(double n) { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 23 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) { double n; // nhap mot so vao tu ban phim Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine()); // in ra binh.cs phuong cua so do • Các Console tập .WriteLine(tin là"The các square tập of tin {0} mã is {1}"nguồn, n, square(n)); C# Console.ReadKey(); • Mỗi } tập tin nên chứa cài đặt cho một và chỉ một lớp • Program.cs public static doublelà tập square( tin mặcdouble địnhn) đầu tiên được tạo ra { trong return Project n * n; // để tinh chứa binh phuong đoạn cua chương n trình, là điểm bắt } đầu} của chương trình } Lê Viết Mẫn - lvman@hce.edu.vn 24 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs • Mỗi câu lệnh trong C# using System; được kết thúc bằng dấu namespace Square { chấm phẩy (;) class Program { static void Main(string[] args) • Nhiều câu lệnh có thể { double n; được gộp lại thành khối // nhap mot so vao tu ban phim và đặt trong cặp dấu Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine()); ngoặc nhọn { } // in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square(n)); Console.ReadKey(); } static double Square(double n) { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 25 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square Các dẫn hướng biên dịch đặt ở đầu { class Program mỗi tập tin mã nguồn { static void Main(string[] args) • sử dụng từ khoá using { double n; • 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 namespace // nhap mot so vao tu ban phim Console.Write("Please enter a number:"); nào n = double.Parse(Console.ReadLine()); • đây cũng là cách để bạn giảm thiểu việc // in ra binh phuong cua so do namespace Console.WriteLine("The square of {0} is {1}", n,gõ square(n)); tên trước tên lớp, tên hàm Console.ReadKey(); • để báo cho trình biên dịch biết, mã nguồn } của bạn cần dùng assembly nào thì trong static double Square(double n) { Visual Studio, trên ngăn Solution return n * n; // tinh binh phuong cua n Explorer, nháy phải chuột lên mục } } References, nháy mục Add References } Lê Viết Mẫn - lvman@hce.edu.vn 26 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) { double n; Khai báo một namespace sử dụng từ khoá namespace // nhap mot so vao tu ban 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 Namespace Console.WriteLine("The square of {0}• is {1}", n, square(n)); có thể có hoặc không Console.ReadKey(); } Những kiểu dữ liệu thuộc namespace nào static double Square(double n) thì đặt trong cặp dấu ngoặc nhọn của { return n * n; // tinh binh phuong namespacecua n đó } } Có thể khai báo các namespace lồng nhau } Lê Viết Mẫn - lvman@hce.edu.vn 27 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) Khai báo một lớp bằng tên lớp theo sau từ { double n; khoá class Tên lớp bắt đầu bằng kí tự viết hoa // nhap mot so vao tu ban phim • Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine());Thân lớp được đặt trong cặp dấu ngoặc // in ra binh phuong cua so do nhọn {} Console.WriteLine("The square of {0} is {1}", n, square(n)); Console.ReadKey(); Đố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 đó static double Square(double n) { Trong môn này, mã nguồn của chúng ta chỉ return n * n; // tinh binh phuong cua n } nằm trong lớp Program } } Lê Viết Mẫn - lvman@hce.edu.vn 28 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { Trong C#, một chương trình luôn bắt đầu static void Main(string[] args) { bằng hàm Main() : double n; • đây là điểm đầu vào của một chương trình // nhap mot so vao tu ban phim Console.Write("Please enter a number:");• có thể có nhiều hàm Main để xử lý cho nhiều n = double.Parse(Console.ReadLine()); trường hợp khởi động chương trình khác nhau // in ra binh phuong cua so do Console.WriteLine("The square of {0} is• {1}",không n, thuộcsquare(n)); về một lớp nào, global function Console.ReadKey(); } • là một hàm tĩnh (từ khoá static) static double Square(double n) • người ta có thể truyền tham số cho nó { return n * n; // tinh binh phuong cua 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 29 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; Khai báo biến : namespace Square • có thể khai báo bất cứ đâu trong chương { class Program trình { static void Main(string[] args) • biến sẽ có kiểu dữ liệu và tên { double n; Một biến sau khi đã khai báo thì có // nhap mot so vao tu ban phim thể gán giá trị và sử dụng biến đó để Console.Write("Please enter a number:"); n = double.Parse(Console.ReadLine()); tính toán // in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square(n)); Console.ReadKey(); } static double Square(double n) { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 30 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; Xuất dữ liệu ra màn hình sử dụng lớp namespace Square System.Console : { class Program • Write - in chuỗi văn bản chỉ định ra màn hình { static void Main(string[] args) • WriteLine - in chuỗi văn bản chỉ định ra màn { double n; hình rồi xuống dòng // 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(n)); Console.ReadKey(); } Thông số đầu tiên đại diện cho chuỗi ký tự in ra static double Square(double n) • { màn hình return n * n; // tinh binh phuong cua n } • 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 Lê Viết Mẫn - lvman@hce.edu.vn 31 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { Nhập dữ liệu từ bàn phím sử dụng static void Main(string[] args) { lớp System.Console : double n; • ReadLine - đọc vào một dòng // nhap mot so vao tu ban phim Kết quả đọc vào là một chuỗi ký tự. Do đó, ta Console.Write("Please enter a number:"); • n = double.Parse(Console.ReadLine()); phải dùng hàm Parse của kiểu double để chuyển từ chuỗi thành số // in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n,• squReadKeyare(n)); - đọc vào một ký tự Console.ReadKey(); } • Ở đâ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ả static double Square(double n) xuất ra màn hình { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 32 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; Khi gọi một hàm, hàm này phải tồn namespace Square tại (đã được định nghĩa) : { class Program • Lời gọi hàm phải tuân theo qui định { static void Main(string[] args) của lời gọi hàm (Xem slide 10) { double n; • Trong lời gọi hàm, cung cấp đầy đủ giá trị cho các tham số theo định // nhap mot so vao tu ban phim Console.Write("Please enter a number:"); nghĩa hàm n = double.Parse(Console.ReadLine()); // in ra binh phuong cua so do Console.WriteLine("The square of {0} is {1}", n, Square(n)); Console.ReadKey(); } static double Square(double n) { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 33 Cơ bản NNLT C# Sunday, September 8, 13
- Chương trình đầu tiên Program.cs using System; namespace Square { class Program { static void Main(string[] args) { double n; Thêm các ghi chú để chú thích cho các // nhap mot so vao tu ban phim Console.Write("Please enter a number:");dòng lệnh của chương trình : n = double.Parse(Console.ReadLine()); // in ra binh phuong cua so do • C# cung cấp 3 dạng chú thích Console.WriteLine("The square of {0} is {1}",• n,// square(n)); line comment Console.ReadKey(); } • /* block comment */ /// documentation comment public static double Square(double n) • { return n * n; // tinh binh phuong cua n } } } Lê Viết Mẫn - lvman@hce.edu.vn 34 Cơ bản NNLT C# Sunday, September 8, 13
- Biến, kiểu dữ liệu, Hằng Lê Viết Mẫn - lvman@hce.edu.vn 35 Cơ bản NNLT C# Sunday, September 8, 13
- 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 36 Cơ bản NNLT C# Sunday, September 8, 13
- 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 37 Cơ bản NNLT C# Sunday, September 8, 13
- Định danh • Các tên biến, tên hàm, tên lớp gọi chung là các định danh và phải tuân sau quy tắc đặt tên • Đị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 Trong C#, định danh : @while • � • Hỗ trợ ký tự Unicode \u03c0 • Phân biệt chữ hoa và chữ thường b\u0061ck • 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 38 Cơ bản NNLT C# Sunday, September 8, 13
- 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 39 Cơ bản NNLT C# Sunday, September 8, 13
- 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ý pháp lạc đà i, top, sum, data, lastElement hàm, lớp viết hoa, ký pháp 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 40 Cơ bản NNLT C# Sunday, September 8, 13
- Hệ thống kiểu dữ liệ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 41 Cơ bản NNLT C# Sunday, September 8, 13
- 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 stack stack heap Lê Viết Mẫn - lvman@hce.edu.vn 42 Cơ bản NNLT C# Sunday, September 8, 13
- 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 43 Cơ bản NNLT C# Sunday, September 8, 13
- Kiểu dữ liệu cơ bản Kiểu C# Kiểu .NET Mô tả G.t mặc định sbyte System.SByte số nguyên có dấu 8 bit 0 byte System.Byte số nguyên ko dấu 8 bit short System.Int16 số nguyên có dấu 16 bit 0 ushort System.UInt16 số nguyên ko dấu 16 bit int System.Int32 số nguyên có dấu 32 bit 0 uint System.UInt32 số nguyên ko dấu 32 bit long System.Int64 số nguyên có dấu 64 bit 0 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 0.0 decimal System.Decimal số thực 128 bit bool System.Boolean true, false false char System.Char ký tự Unicode ‘\0’ 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 44 Cơ bản NNLT C# Sunday, September 8, 13
- 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 45 Cơ bản NNLT C# Sunday, September 8, 13
- Khai báo và khởi tạo biến • Phải được khai báo và khởi gán giá trị trước khi sử dụng • Cú pháp bao gồm kiểu dữ liệu và tên biến int dollars; int quarters, dimes, nickels, pennies; int money = 217; double x, pi = 3.14159; char begin = ‘A’, end = ‘Z’, newLine = ‘\n’; • Lựa chọn kiểu dữ liệu cho biến phụ thuộc vào phạm vi dữ liệu mà biến đó sẽ nhận • một biến dùng để lưu điểm thi thì cần dùng kiểu float • một biến dùng để lưu tuổi của một người thì chỉ cần dùng kiểu byte • Chú ý • Không thể khai báo nhiều biến cùng tên trong cùng một phạm vi • Có thể khai báo nhiều biến cùng tên trong các phạm vi khác nhau Lê Viết Mẫn - lvman@hce.edu.vn 46 Cơ bản NNLT C# Sunday, September 8, 13
- 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 47 Cơ bản NNLT C# Sunday, September 8, 13
- Cách xác định kiểu số • Cách xác định kiểu số float C, F = 68; C = (5 / 9) * (F - 32); C = (F - 32) * (5 / 9); C = (F - 32) * 5 / 9; C = (F - 32) * (5f / 9); Lê Viết Mẫn - lvman@hce.edu.vn 48 Các cấu trúc điều khiển 1 Sunday, September 8, 13
- 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 • Dùng khi gán dữ liệu kiểu này cho biến có kiểu dữ liệu khác • Chuyển đổi ngầm định (implicit) theo chiều mũi tên là thích hợp short x = 5; int y = x; • Chuyển đổi kiểu tường minh (explicit) có thể được gọi bằng các ép kiểu, có thể xảy ra mất dữ liệu hoặc giá trị không mong muốn int i = (int)3.14159; long i = 3000000000; int i = (int)(3.14159 + 2.7); int j = (int)i; // -1294967296 uint i = (uint)75; double x = (double)1f/3; Lê Viết Mẫn - lvman@hce.edu.vn 49 Cơ bản NNLT C# Sunday, September 8, 13
- Hằng ký tự và chuỗi • Cú pháp ‘c‘ - hằng ký tự “char” - chuỗi ký tự • 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 50 Cơ bản NNLT C# Sunday, September 8, 13
- 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 • Khai báo hằng trong phạm vi một lớp và bên ngoài các hàm • Hằng phải được khởi gán giá trị lúc khai báo • Khi khai báo có thể gán giá trị là kết quả của một biểu thức • Không thể khởi gán hằng từ giá trị của một biến • 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 51 Cơ bản NNLT C# Sunday, September 8, 13
- Phạm vi của biến • Phạm vi mà biến vẫn còn có thể được sử dụng • Thông thường, sẽ nằm trong cặp dấu ngoặc nhọn • Hết phạm vi này, biến và vùng dữ liệu của biến đó sẽ bị huỷ • Đối với biến có kiểu dữ liệu tham chiếu, vùng dữ liệu trong heap sẽ bị huỷ sau một khoảng thời gian không được sử dụng bởi Garbage Collector Lê Viết Mẫn - lvman@hce.edu.vn 52 Các cấu trúc điều khiển 1 Sunday, September 8, 13
- Toán tử Lê Viết Mẫn - lvman@hce.edu.vn 53 Cơ bản NNLT C# Sunday, September 8, 13
- 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 54 Cơ bản NNLT C# Sunday, September 8, 13
- 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 55 Cơ bản NNLT C# Sunday, September 8, 13
- 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 56 Cơ bản NNLT C# Sunday, September 8, 13
- Xuất dữ liệu Lê Viết Mẫn - lvman@hce.edu.vn 57 Tên bài giảng Sunday, September 8, 13
- Hàm xuất dữ liệu • Có thể xuất dữ liệu cho mọi kiểu dữ liệu sử dụng hàm Write hoặc WriteLine của lớp Console Console.Write(c); Console.Write(c.ToString()); Console.Write(“Nhiet do C la ” + c); Console.Write(“Nhiet do C la {0}”, c); Console.Write(“Nhiet do C cua do {1} do F la {0}”, c, f); • Cú pháp của token giữ chỗ {n[,width][:format[precision]]} • n - số thứ tự của token giữ chỗ, bắt đầu từ 0 • width - độ rộng của vùng được dùng để in giá trị. {0,10:f2} {1,-5} • Giá trị này là dương - canh lề bên phải, là âm - canh lề bên trái {2:d} • format - ký tự định dạng cho kiểu số {3:x} • precision - số chữ số phần thập phân hoặc số chữ số của số Lê Viết Mẫn - lvman@hce.edu.vn 58 Các cấu trúc điều khiển 1 Sunday, September 8, 13
- Ký tự định dạng cho số Định dạng số thập phân (số nguyên với các số 0 được điền ở d, D -xxxxx đầu). precision = số chữ số Định dạng số dấu chấm động cố định (số thực) f, F -xxxxx.xx precision = số chữ số phần thập phân (mặc định = 2) Định dạng số cơ bản (dấu phẩy để phân cách phần ngàn). n, N -xx,xxx.xx precision = số chữ số phần thập phân (mặc định = 2) Định dạng số mũ khoa học e, E -x.xxxE+xxx precision = số chữ số phần thập phân Định dạng tiền tệ c, C $xx,xxx.xx precision = số chữ số phần thập phân Định dạng số thập lục phân x, X xxx precision = số chữ số Xem thêm trang 2-79, sách Lập trình Visual C# thế nào ? (Dương Quang Thiện) Lê Viết Mẫn - lvman@hce.edu.vn 59 Các cấu trúc điều khiển 1 Sunday, September 8, 13
- Lập trình chương trình đơn giản với C# Lê Viết Mẫn - lvman@hce.edu.vn 60 Cơ bản NNLT C# Sunday, September 8, 13
- 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 61 Cơ bản NNLT C# Sunday, September 8, 13
- 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 62 Cơ bản NNLT C# Sunday, September 8, 13
- // 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(); } } } Lê Viết Mẫn - lvman@hce.edu.vn 63 Cơ bản NNLT C# Sunday, September 8, 13
- Ví dụ 2 - nhiệt độ Chuyển đổi độ F sang độ C C = (F - 32) * 5 / 9 Lê Viết Mẫn - lvman@hce.edu.vn 64 Cơ bản NNLT C# Sunday, September 8, 13
- Ví dụ 3 - tính payment Tính tiền thanh toán (payment) mỗi kỳ khi biết số tiền mượn (p - principal), số kỳ thanh toán (nper - number of periods) và tỷ suất r / 12 payment = principal * R / (1 - pow(1 + R, -nper)) Lê Viết Mẫn - lvman@hce.edu.vn 65 Cơ bản NNLT C# Sunday, September 8, 13
- Cảm ơn sự chú ý Câu hỏi ? Lê Viết Mẫn - lvman@hce.edu.vn 66 Cơ bản NNLT C# Sunday, September 8, 13