Bài giảng C và ứng dụng

• .NET Framework là môi trường tích hợp để đơn giản hóa việc phát triển và thực thi cá cứng dụng trên Internet, desktop và các thiết bị di động . • Các mục tiêu chính: •Cung cấp một môi trường hướng đối tượng nhất quán cho nhiều loại ứng dụng •Cung cấp một môi trường giảm tối thiểu sự xung đột phiên bản.

pdf372 trang | Chia sẻ: lylyngoc | Lượt xem: 1554 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Bài giảng C và ứng dụng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nội dung học • Tổng quan về .net FrameWork • Ngôn ngữ lập trình C# • Ngôn ngữ lập trình hướng đối tượng với C# • Xử lý dữ liệu với ADO.NET • Xây dựng ứng dụng Web CHƯƠNG I Giới thiệu • .NET Framework là môi trường tích hợp để đơn giản hóa việc phát triển và thực thi các ứng dụng trên Internet, desktop và các thiết bị di động . • Các mục tiêu chính: • Cung cấp một môi trường hướng đối tượng nhất quán cho nhiều loại ứng dụng • Cung cấp một môi trường giảm tối thiểu sự xung đột phiên bản. • Cung cấp một môi trường linh động, dựa trên các chuẩn đã được chứng nhận để có thể chứa trên bất cứ hệ điều hành nào. Kiến trúc của .NET Framework Kiến trúc của .NET Framework •CLR (Common Language Runtime): Quản lý sự thực thi mã lệnh và tất cả các tác vụ liên quan đến nó: biên dịch, quản lý bộ nhớ, bảo mật, quản lý tuyến đoạn. Mã lệnh thực thi trong CLR chia làm 2 loại: - mã được quản lý - mã không được quản lý là mã lệnh không cài đặt những yêu cầu để thực thi trong CLR – chẳng hạn như COM hoặc các thành phần dựa trên Windows API. Kiến trúc của .NET Framework •FCL(Framework Class Library ) là thư viện kiểu dữ liệu có thể tái sử dụng (gồm các class, structure, …) dành cho các ứng dụng thực thi trong .NET. •Tất cả các ngôn ngữ hỗ trợ .NET Framework đều sử dụng thư viện lớp dùng chung này. Các bước thực hiện của Ct truyền thống Source Code Compiler Executable Code Code Executed R U N T I M E Các bước thực hiện của Ct truyền thống • Các ngôn ngữ trước đây có chương trình dịch riêng và có môi trường chạy riêng của nó. • Trong .NET, chương trình dịch dịch mã nguồn vào một "Intermediate Language (IL)“ và runtime được thay thế bởi CLR (Common Language Runtime). Các bước thực hiện của các ct .NET 1st Compliation 2nd Compliation .NET Source Code Language Compiler MSIL + Metadata CLR Machinecode Code executed Các chương trình .NET được dịch 2 lần: lần đầu chậm, lần thứ 2 tương đối nhanh hơn. Các bước thực hiện của các ct .NET • Chương trình nguồn trước hết sẽ được biên dịch và đóng gói thành một khối gọi là assembly (là tập hợp các thành phần được đóng gói trong file exe hoặc dll). Khối này sẽ chứa các mã lệnh ngôn ngữ trung gian (IL) và các metadata mô tả thông tin cần thiết cho sự hoạt động của khối. • Mỗi khi có yêu cầu thực thi assembly nói trên, CLR sẽ dùng trình biên dịch JIT (Just-in-Time) của môi trường thực thi để chuyển đối IL chứa trong nó sang dạng mã lệnh cụ thể của máy khi ứng dụng thực sự thực thi. Các bước thực hiện của các ct .NET Các kiểu dữ liệu cơ sở của CTS Nội dung • Giới thiệu • Môi trượng soạn thảo và chạy • Biến và các kiểu dữ liệu • Các cấu trúc điều khiển: if, switch • Các cấu trúc lặp; for, while, do while, foreach • Mảng, ArrayList, File văn bản. • Bài thực hành GIỚI THIỆU VỀ C# • Là NNLT đơn giản, hiện đại, an toàn và hướng đối tượng • Là ngôn ngữ mạnh nhất trong .NET • Thay thế cho C++ • Có cú pháp giống C++, Java • Sử dụng con trỏ dễ dàng hơn trong C++ GIỚI THIỆU VỀ C# - “bài toán” cần giải quyết là một solution. - Một solution bao gồm một hoặc nhiều project. - Một solution, nếu có nhiều project thì nên được tạo ra trong một thư mục riêng để có thể chứa các project trong nó. Cú pháp đơn giản của 1 Project •Using các Namespace [Namespace Ten] { - Tập hợp các lớp } Trong các lớp phải có lớp chứa hàm main, chương trình luôn bắt đầu từ hàm main public static void Main(string[] args) { } Dịch và chạy 1 chương trình C# trên Console • Soạn mã: Người sử dụng có thể dùng bất kỳ trình soạn thảo nào như: – Notepad – Microsoft Visual Studio – …. • Lưu lại thành file có phần mở rộng .cs • Start|Programs|Microsoft .NET Framework SDK v2.0|SDK Command Prompt – Gõ csc [ổ đĩa:]\[ đường dẫn]\ cần dịch – Gõ tên file cần chạy • Chú ý: file csc.exe định vị ở: – "C:\Program Files\Microsoft Visual Studio 8\ SDK\ v2.0\“ đối với 2005 – C:\WINNT\Microsoft.NET\Framework\v1.1.4322 đối với 2003 Ví dụ chương trình đơn giản using System; class Test { public static void Main() { string varStr; varStr = “A simple program"; Console.WriteLine(varStr); } } Sử dụng IDE Microsoft Visual Studio 2005 • Khởi động Microsoft Visual Studio 2005. File Æ New Æ Project để tạo mới một project Biến • Khai báo theo cú pháp: Mức truy cập Kiểu Tên biến public protected private int string ... Các kiểu số nguyên Tên Kiểu trong CTS Mô tả Vùng biểu diễn (min:max) sbyte System.SByte Số nguyên có dấu 8-bit -27:27-1 short System.Int16 Số nguyên có dấu 16-bit -215:215-1 int System.Int32 Số nguyên có dấu 32-bit -231:231-1 long System.Int64 Số nguyên có dấu 64-bit -263:263-1 byte System.Byte Số nguyên không dấu 8-bit 0:28-1 ushort System.UInt16 Số nguyên không dấu 16-bit 0:216-1 uint System.UInt32 Số nguyên không dấu 32-bit 0:232-1 ulong System.UInt64 Số nguyên không dấu 64-bit 0:264-1 Kiểu số thực, Boolean, ký tự • Kiểu số thực: float, double • Kiểu Boolean: bool: true|false • Kiểu ký tự: char – Biểu diễn 1 ký tự 16-bit (Unicode) Các hằng kiểu ký tự được gán bằng cách đóng trong cặp dấu nháy đơn, ví dụ 'A'. Kiễu dữ liệu tham chiếu được định nghĩa sẵn Tên Kiểu CTS Mô tả object System.Object Kiểu dữ liệu gốc, mọi kiểu dữ liệu khác trong CTS đều kế thừa từ đây (kể cả các kiểu dữ liệu giá trị) string System.String Chuỗi ký tự Unicode Ví dụ class Program { static void Main(string[] args) { object t; t = (object) 5; string[] st = new string[2] { "ab","cd" }; object[] t1; t1 = st; Console.Write(t1[1].ToString()); Console.ReadLine(); } } Các phương thức trên chuỗi using System; class ThaoTacTrenString {static void Main(string[] args) { string st1=" Nguyen Anh Trung "; string st2 = "le Tien Tang"; st1 = st1.Trim(); Console.Write("Chieu dai chuoi la {0}:\n", st1.Length); Console.WriteLine("Ky tu tai chi so thu 3 la {0}", st1[3]); string ten1=st1.Substring(st1.LastIndexOf(' ')+1); string ten2 = st2.Substring(st2.LastIndexOf(" ")+1, st2.Length - st2.LastIndexOf(" ")-1); Console.WriteLine("Ten2=ten1:{0}",ten2.Equals(ten1)); Console.WriteLine("so sanh ten1 voi ten 2: {0}", ten1.CompareTo(ten2)); Console.ReadLine(); } } Các phương thức trên chuỗi using System; class ThaoTacTrenString { static void Main(string[] args) { string st1="Nguyen Anh Trung "; Console.WriteLine("Tim chuoi con {0}", st1.Contains("yen")); st1=st1.Replace("Nguyen", "Le"); Console.WriteLine(st1); st1=st1.Remove(0, 3); Console.WriteLine(st1); st1 = "Le nam|tink26-dhkh"; char[] ts = new char[2] { '|', '-' }; string[] ds = st1.Split(ts); Console.WriteLine("ten:{0},lop:{1},truong{2}", ds[0], ds[1], ds[2]); } } …. Các toán tử Loại toán tử Ký hiệu Số học + - * / % Logic && || ! Cộng chuỗi + Tăng và giảm ++ -- Dịch bit > So sánh == != = Phép gán = += -= *= /= %= &= |= ^= >= Truy xuất thành phần . Indexing (cho array và các indexers) [] Ép kiểu () Điều kiện ?: Tạo đối tượng new Thông tin về kiểu Sizeof(Kiểu) Điều khiển Overflow exception checked unchecked Luồng điều khiển của chương trình • Các câu lệnh rẻ nhánh – if – switch • Các câu lệnh lặp – for – while – do – foreach Câu lệnh if using System; class Test { public static void Main() { int i = 10; if (i<10) { Console.WriteLine("less than 10"); } else { Console.WriteLine("greater or equal to 10"); } } } Câu lệnh Switch ... int i = 2; switch (i) { case 1: Console.WriteLine("one"); break; case 2: Console.WriteLine("two"); break; default: Console.WriteLine("another value"); break; } ... Câu lệnh For [1] using System; class Test { public static void Main() { int s = 0; for (int i=1; i<=10; i++) { s+=i; } Console.WriteLine(s); } } Câu lệnh For [2] Phạm vi của biến đếm: chỉ có tác dụng trong vòng lặp. using System;//Ví dụ lỗi class Test { public static void Main() { int s = 0; for (int i=1; i<=10; i++) { s+=i; } Console.WriteLine(i); //Error statement Console.WriteLine(s); } } Câu lệnh while using System; class Test { public static void Main() { int i = 1; int s = 0; while (i<=10) { s += i; i++; } Console.WriteLine(s); } } Câu lệnh do class Test { public static void Main() { int i = 1; int s = 0; do { s += i; i++; } while (i<=10); Console.WriteLine(s); } } Lệnh break có thể dùng trong các câu lệnh lặp Câu lệnh Foreach using System; class Test { public static void Main() { int[] a = new int[3]; a[0] = 10; a[1] = 20; a[2] = 30; foreach (int b in a) { Console.WriteLine(b); } } } Kiểu mảng [1] • Khai báo: - Mảng 1 chiều type[] identifier – Mảng nhiều chiều type[,] identifier – Mảng jagged: type[][] identifier Mảng1 chiều [2] using System; public class Test { public static void Main() { string[] students = new string[3]; students[0] = “Hung"; students[1] = “Lan"; students[2] = “Nga"; for (int i=0; i<3; i++) { Console.WriteLine(students[i]); } } } Mảng jagged [3] using System; public class Test { public static void Main() { int[][] a = new int[5][]; for (int i=0; i<a.Length; i++) { a[i] = new int[i+1]; for (int j=0; j<i+1; j++) { a[i][j] = j; } } Mảng jagged [4] for (int i=0;i<a.Length;i++) { for (int j=0;j<a[i].Length;j++) { Console.Write("{0}",a[i][j]); } Console.WriteLine(); } } } Kiểu mảng [5] • Có thể khởi tạo các giá trị cho mảng bằng cách dùng {}. • Nếu không khởi tạo C# sẽ lấy giá trị ngầm định, phụ thuộc váo kiểu dữ liệu của mảng – Số: 0 – Bool: False – Ngày: 01/01/0001 – Chuỗi: “” – … Khởi tạo mảng 1 chiều [6] using System; public class Test { public static void Main() { int[] a = new int[5] {1,2,3,4,5}; foreach (int i in a) { Console.WriteLine(i); } Khởi tạo mảng 2 chiều [7] int[,] b = new int[2,3] {{1,2,3},{4,5,6}}; foreach (int i in b) { Console.WriteLine(i); } Khởi tạo mảng jagged [8] //jagged array int[][] c = new int[2][] {new int[2] {0,1},new int[3] {2,3,4}}; for (int i=0; i<c.Length; i++) for (int j=0; j<c[i].Length; j++) { Console.WriteLine(c[i][j]); } } } ArrayList • Là mảng động, mỗi phần tử là một object • Namespace: System.Collections • Khai báo: ArrayList = new ArrayList(); ArrayList = new ArrayList(Số phần tử); Các phương thức trên ArrayList • Add(object): Chèn thêm 1 phần tử vào cuối mảng • Clear(): Xoá tất cả các phần tử • Contains(object): Tìm object trong mảng • IndexOf(object): Tìm chỉ số của object trong mảng (-1) • RemoveAt(index): Xoá phần tử thứ index • Thuộc tính: count: cho biết số phần tử trong mảng • … Ví dụ ArrayList class ThaoTacTrenArrayList { class test { public int t = 15; } static void Main(string[] args) { ArrayList a = new ArrayList(); a.Add("main");a.Add('m');a.Add(5);a.Add(DateTime.Now); test t = new test(); a.Add(t); for(int i=0;i<a.Count;i++) if (a[i] is test) { test tt =(test) a[i]; Console.WriteLine (tt.t); } else Console.WriteLine(" {0} ", a[i].ToString()); } Thao tác trên File • Namespace: System.IO; • Các đối tượng thao tác trên File: Stream, StreamReader, StreamWriter, FileStream. • Thao tác trên file văn bản: StreamReader, StreamWriter. • Mở file văn bản để đọc: StreamReader = new StreamReader(“dd"[,Encoding]); • Mở file văn bản để ghi: StreamWriter = new StreamWriter (“dd“[, bool append][,Encoding]) Các phương thức trên StreamReader • Close(): đóng file • Peek(): Trả về ký tự tiếp theo, -1;:EOF • Read(): Đọc ký tự tiếp theo • ReadBlock(…): Đọc dãy các byte • ReadLine(): Đọc 1 dòng • ReadToEnd(): Đọc hết file • … Các phương thức trên StreamWriter • Close(): đóng file • Write • WriteLine: ghi file static void Main(string[] args) { StreamWriter f = new StreamWriter("d:\\tt.txt",true,Encoding.Unicode); f.WriteLine("cộng"); f.Write("abc"); f.Close(); Console.ReadLine(); } Ví dụ StreamReader using System; using System.IO; class Program { static void Main(string[] args) { StreamReader f = new StreamReader("d:\\data.txt"); string ht; //while ((ht = f.ReadLine()) != null) while(f.Peek()>=0) { ht = f.ReadLine(); Console.WriteLine(ht); }// Console.WriteLine(f.ReadToEnd() ); f.Close(); } } Bài tập thực hành • Thực hành các bài 1,2,3,4,5 trong giáo trình. • Giải pt bằng Gaussian: – Vào ma trận hệ số A, vector B – Giải thuật để chuyển ma trận về tam giác trên: for(i = 0; i < n-1; i++)/* Trừ hàng đầu tiên */ for(j = i+1; j < n; j++){ m = a[j][i]/a[i][i]; for(k = i; k < n; k++) a[j][k] = a[j][k] – a[i][k]*m; b[j] = b[j] – b[i] * m; } - In ra nghiệm của hệ Bài tập thực hành về ArrrayList • Nhập vào danh sách họ tên và đtb của 1 lớp, số lượng sv không hạn chế, quá trình nhập dừng khi nhập họ tên rỗng: 0 1 2 3 4 5 Ht1 đtb1 Ht2 dtb2 … … • Hiển thị họ tên và Đtb của các sinh viên lên lớp •Nhập vào 1 họ tên, tìm xem có sv nào có họ tên này hay không •Tính Trung bình cộng của ĐTB •Xoá các sinh viên có đtb ra khỏi mảng Bài tập thực hành về File • Làm lại bài thực hành trên nhưng lấy dữ liệu từ file vào mảng • Cú pháp của file chứa dữ liệu như sau: Họ tên sv1 |đtb sv1 Họ tên sv2|dtb sv2 …. Nội dung • Lớp đối tượng – Hàm dựng – Hàm huỷ – Trường – Phương thức Lớp đối tượng Mứctruycập class : { - Hàm dựng (Constructors) – Hàm huỷ (Destructors) – Hằng (Constants) – Trường (Fields) – Phương thức (Methods) – Thuộc tính (Properties) – Chỉ mục (Indexers) – Sự kiện (Events) – Con trỏ hàm (Delegates) – Lớp con (Classes) – Giao diện (Interfaces) – Cấu trúc (Structs) } Mức truy cập Mức truy cập Mô tả public Biến hoặc phương thức có thể được truy xuất từ bất cứ nơi nào internal Biến hoặc phương thức chỉ có thể truy xuất trong phạm vi cùng assembly protected Biến hoặc phương thức chỉ có thể truy xuất từ bên trong kiểu dữ liệu mà nó thuộc về, hoặc các kiểu dữ liệu dẫn xuất protected internal Biến hoặc phương thức có thể được truy xuất trong phạm vi assembly hiện tại, hoặc từ các kiểu dữ liệu dẫn xuất từ kiểu dữ liệu chứa nó private Biến hoặc phương thức chỉ có thể được truy xuất từ bên trong kiểu dữ liệu mà nó thuộc về Ví dụ public class Class_b { private class Class_b1 { } public class Class_b2 { } } class Program { static void Main(string[] args) { Class_b t2 = new Class_b(); Class_b.Class_b1 t21 = new Class_b.Class_b1(); Class_b.Class_b2 t22= new Class_b.Class_b2(); } } Hàm dựng (Constructors) • Là một loại đặc biệt của phương thức trong một lớp • Được gọi khi một lớp được tạo. • Thường được sử dụng để khởi tạo các giá trị trong một lớp. • Tên trùng với tên lớp • Không trả về giá trị • Nếu không tạo ra hàm dựng C# sẽ tạo ra hàm dựng ngầm định • Một lớp có thể có nhiều hàm dựng nhưng khác nhau về số lượng hoặc kiểu của tham số Ví dụ về Constructors using System; public class Person { string Ten,dc=“Khong co”; public Person(string Ten) { this.Ten = Ten; } public Person(string Ten,string dc) { this.Ten = Ten; this.dc = dc; } public void SayName() { Console.WriteLine(“Ht: {0} Dc {1}",Ten,dc); } } Ví dụ về Constructors class Program { static void Main(string[] args) { Person p1 = new Person("Cu Do"); p1.SayName(); Person p2 = new Person("Nguyen Ha","Ngu Tay"); p2.SayName(); } } Private Constructors • Được sử dụng khi một lớp chỉ có các thành viên tĩnh và lớp không cần phải tạo ra. public class MathConstant { private MathConstant() { } public static double Pi=3.14; } public class Test { public static void Main() { //MathConstant m = new MathConstant(); Console.WriteLine(MathConstant.Pi); } } Static Constructors • Được gọi tự động (chỉ 1 lần) trước khi thực thể đầu tiên của đối tượng được tạo hoặc các thành viên tĩnh được tham chiếu. • Không có tham số public class Bus { static Bus() // Static constructor: { System.Console.WriteLine("Ham tinh duoc goi"); } public static void Drive() { System.Console.WriteLine("Phuong thuc Drive duoc goi"); } } class TestBus { static void Main() { Bus.Drive(); Bus b = new Bus(); Bus c= new Bus(); } } Destructor • Destructors trong C# gọi là bộ thu gom rác Garbage Collectors. • Bộ thu gom rác sẽ giải phóng bộ nhớ khi đối tượng không còn yêu cầu hoặc tham chiếu. • Destructors khai báo như sau: ~()//giống tên lớp { //các cài đặt của người lập trình } Các trường (Fields) • Lưu trữ giá trị • Cú pháp: • Mức truy cập: public, private, protected, internal, protected internal • Kiểu: – Kiểu giá trị được định nghĩa sẳn (int,char …) – Kiểu tham chiếu: lớp, struct, mảng, chuỗi,…. Ví dụ namespace Vidu { class Class_Lop{ } class SinhVien { public string hoten; private bool GioiTinh; protected DateTime NgaySinh; internal float[] DsDiem = new float[100]; Class_Lop Lop= new Class_Lop(); } class Program { static void Main(string[] args) { SinhVien sv =new SinhVien(); sv.hoten = "Nguyen Nam"; //sv.GioiTinh = false; //sv.NgaySinh = DateTime.Parse("12/10/79"); sv.DsDiem[0] = 5; } }} Trường tĩnh [1] • Được khai báo trong 1 lớp • Khi sử dụng không cần phải tạo ra lớp chứa trường tĩnh • Khi khai báo chỉ cần dùng static trước tên biến • Truy xuất: .tên trường tĩnh Ví dụ trường tĩnh using System; public class List { public static int Dem = 0; public List()//Hàm dựng: được gọi khi tạo lớp { Dem ++; } } class Test { public static void Main() { Console.WriteLine(List.Dem ); List n1 = new List(); Console.WriteLine(List.Dem); List n2 = new List(); Console.WriteLine(List.Dem); } } Trường chỉ đọc • Sử dụng readonly khi khai báo • Chỉ có thể gán giá trị khi khai báo hoặc trong hàm dựng class test { public readonly int a = 10; public readonly int b; public test() { b = 12; } } class TestBus { static void Main() { test t = new test(); //t.a++; Console.WriteLine("a= {0}b= {1}",t.a,t.b); }} Constants • Khai báo hàm dùng bổ từ const. • Không thể thay đổi giá trị của hằng. • Hằng sử dụng như trường tĩnh. Ví dụ về Constants using System; public class Gender { public const int male = 1; public const int female = 2; } class Test { public static void Main() { Console.WriteLine("male = {0}",Gender.male); Console.WriteLine("female = {1}",Gender.female); } } Phương thức(method) • Là tập hợp các câu lệnh • Được khai báo trong lớp hoặc cấu trúc, phải chỉ rõ mức truy cập, tên, kiểu trả về,danh sách các tham số. Nếu không có tham số phải có cặp dấu ngoặc • Phương thức không trả về giá trị có kiểu trả về là void • Dùng return để trả về giá trị của phương thức Ví dụ về methods using System; public class Person { string name; public Person(string name) { this.name = name; } public void SayName() { Console.WriteLine("My name is {0}",name); } } Tham chiếu ref and out [1] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(int x,int y) { x = this.x; y = this.y; } } Tham chiếu ref and out [2] class Test { public static void Main() { int x = 0; //int x; --> Error int y = 0; //int y; --> Error Point p = new Point(100,200); p.GetPoint(x,y); Console.WriteLine("({0},{1})",x,y); } } Output: (0,0) Tham chiếu ref and out [3] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(ref int x,ref int y) { x = this.x; y = this.y; } } Tham chiếu ref and out [4] class Test { public static void Main() { int x = 0; // int x; --> Error int y = 0; // int y; --> Error Point p = new Point(100,200); p.GetPoint(ref x,ref y); Console.WriteLine("({0},{1})",x,y); } } Output: (100,200) - phải khởi tạo giá trị cho các tham số -Khi xây dựng và gọi phương thức phải dùng ref Tham chiếu ref and out [5] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(out in
Tài liệu liên quan