Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
865,47 KB
Nội dung
LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 1 TÓM TẮT CHƢƠNG 2 : C++/CLI CĂN BẢN. 1) Tạo và biên dịch một chƣơng trình C++/CLI : a) Dùng phần mềm Visual Studio : Mở chươngtrình VS 2008. Trong màn hình khởi động, chọn File - > New -> Project Trong cửa sổ New Project : Chọn kiểu project là CLR, trong cửa sổ Templates chọn CLR Console Application. Nhập tên của project vào ô Name và chọn thư mục chứa project trong ô Location. Nhấp OK. LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 2 Xuất hiện cửa sổ Project, chúng ta có thể bắt đầu viết chươngtrìnhtrong vùng soạn thảo. Sau khi hoàn tất chương trình, nhấn vào biểu tượng Debug để chạy chươngtrình (hoặc nhấn F5). Khi Debug, nếu chươngtrìnhco lỗi về mặt cú pháp, VS sẽ thông báo các lỗi này trong cửa sổ Error, nhấp kép chuột vào dòng thông báo lỗi để biết vị trí lỗi. Nếu không thấy cửa sổ Error, trên thanh công cụ chọn View -> Other Windows -> Error List. (Hoặc nhấn Ctrl+F5). b) Dùng Notepad : Mở Notepad và bắt đầu viết chươngtrìnhtrong cửa sổ soạn thảo của Notepad. LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 3 Sau khi hoàn tất, lưu lại với đuôi .cpp. (Ví dụ muốn lưu lại với tên là Vidu thì trong ô File name nhập Vidu.cpp, trong ô Save as type chọn All Files. Để biên dịch chương trình, mở VS Command Prompt. Trong màn hình Command Prompt, chuyển đến thư mục đang chứa tập tin muốn biên dịch bằng lệnh cd. Ví dụ nếu tập tin Vidu.cpp được lưu trong thư mục CLI trong ổ E thì nhập cd E:\CLI. LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 4 Sau khi chuyển đến thư mục, tiến hành biên dịch bằng lệnh : cl name /clr:safe . Trong đó, name là tên tập tin muốn biên dịch bao gồm cả đuôi mở rộng (Ví dụ : Vidu.cpp). Sau khi biên dịch thành công, hai tập tin Vidu.exe và Vidu.obj sẽ được tạo ra. Ta có thể chạy chươngtrình bằng cách nhấp kép vào Vidu.exe trong thư mục chứa tập tin lậptrình hoặc chạy trực tiếp trên Command Prompt bằng cách nhập vào tên của tập tin tại dấu nhắc (không bao gồm đuôi mở rộng). Lưu ý : Nếu chươngtrìnhcó lỗi về mặt cú pháp, quá trình biên dịch sẽ thất bại. 2) Class CONSOLE : LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 5 Class quản lí việc tương tác với màn hình Console. Các phương thức (hàm) cơ bản của lớp: Write(a) : Hàm một đối số. Xuất ra màn hình Console giá trị của a (a có thể là biến hoặc hằng số). VD : Console::Write (10); -> 10 Console::Write(“Hello”); -> Hello WriteLine(a) : Hàm một đối số. Tương tự như Write() nhưng sau khi xuất giá trị ra màn hình sẽ xuống dòng. VD : Console::WriteLine(10); -> 10 Console::WriteLine(“Hello”); -> Hello Read() : Hàm không có đối số. Kiểu dữ liệu trả về là interger. Nhận một kí tự được nhập từ bàn phím. VD : int a = Console::Read (); 5 : a = 5 A : a = 65 (số thập phân tương ứng mã ASCII của kí tự A ) AB : a = 65 (khi nhập vào một chuỗi kí tự thì chỉ nhận kí tự đầu tiên). ReadLine() : Hàm không có đối số. Kiểu dữ liệu trả về là String. Nhận một chuỗi kí tự được nhập từ bàn phím. VD : String^ b = Console::ReadLine (); Hello : b = “Hello”. ReadKey() : Hàm không có đối số. Kiểu dữ liệu trả về là ConsoleKeyInfo. Nhận phím được nhấn từ bàn phím (trừ các phím đặc biệt Ctrl, Shift, Alt). VD : ConsoleKeyInfo b = Console::ReadKey (); Console::Write(b.Key); (Nhấn phím) Esc -> Escape Kiểm tra xem có phải phím x đã được nhấn : b.Key == ConsoleKey::x ; VD : if (b.Key ==ConsoleKey::Escape) Console::Write(L “Phím ESC”); else Console::Write(L “Không phải phím ESC”); Clear() : Hàm không có đối số.Xóa toàn bộ màn hình Console. VD : Console::Clear (); LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 6 3) Biến và Con trỏ : a) Biến: Các biến chúng ta đã biết và sử dụng trước đây đều là biến có kích thước và kiểu dữ liệu xác định. Người ta gọi các biến kiểu này là biến tĩnh. Khi chúng ta khai báo biến, phần mềm lậptrình sẽ tự động tìm một vùng nhớ còn trốngtrong bộ nhớ để lưu trữ giá trị của biến, kích thước của vùng nhớ tùy thuộc vào kiểu dữ liệu của biến. Bất cứ một biến nào cũng có một địa chỉ trong bộ nhớ của máy tính (địa chỉ này được lưu trữ trong các thanh ghi (register) đặc biệt của CPU). Khi khai báo biến tĩnh, một lượng ô nhớ cho các biến này sẽ được cấp phát mà không cần biết trong quá trình thực thi chươngtrìnhcó sử dụng hết lượng ô nhớ này hay không. Mặt khác, các biến tĩnh dạng này sẽ tồn tại trong suốt thời gian thực thi chươngtrình dù có những biến mà chươngtrình chỉ sử dụng 1 lần rồi bỏ. Các kiểu biến tĩnh : các biến kiểu giá trị như interger, float, decimal, boolean và character. Một số hạn chế có thể gặp phải khi sử dụng các biến tĩnh: Cấp phát ô nhớ dư, gây ra lãng phí ô nhớ. Cấp phát ô nhớ thiếu, chươngtrình thực thi bị lỗi. Để tránh những hạn chế trên, ngôn ngữ C++ cung cấp cho ta một loại biến đặc biệt gọi là biến động với các đặc điểm sau: Chỉ phát sinh trong quá trình thực hiện chươngtrình chứ không phát sinh lúc bắt đầu chương trình. Khi chạy chương trình, kích thước của biến, vùng nhớ và địa chỉ vùng nhớ được cấp phát cho biến có thể thay đổi. Sau khi sử dụng xong có thể giải phóng để tiết kiệm chỗ trong bộ nhớ. Các kiểu biến động : String, Object, array, interface, delegate … Tuy nhiên các biến động không có địa chỉ nhất định nên ta không thể truy cập đến chúng được. Vì thế, ngôn ngữ C lại cung cấp cho ta một loại biến đặc biệt nữa để khắc phục tình trạng này, đó là biến con trỏ (pointer) với các đặc điểm: Biến con trỏ không chứa dữ liệu mà chỉ chứa địa chỉ của dữ liệu hay chứa địa chỉ của ô nhớ chứa dữ liệu. Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, luôn có kích thước cố định là 2 byte. Tất cả các biến động đều phải khai báo thông qua con trỏ. b) Pointer : (*) Muốn truy xuất giá trị của một biến, thì có thể gọi tên biến trongchươngtrình hoặc truy xuất trực tiếp đến vùng nhớ thông qua địa chỉ của biến. Để truy xuất trực tiếp đến vùng nhớ của biến, ta dùng biến con trỏ (pointer). Nói đơn giản, con trỏ là một biến chứa địa chỉ của biến khác. Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu, luôn có kích thước cố định là 2 byte. Cú pháp khai báo : type* name; LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 7 Trong đó type là kiểu dữ liệu của biến mà con trỏ chứa địa chỉ và name là tên của biến con trỏ. VD : int* a; //Khai báo biến con trỏ a để chứa địa chỉ của một biến có kiểu int. Khi mới khai báo, biến con trỏ sẽ có giá trị ngẫu nhiên. Nghĩa là nó đang chỉ tới một vị trí bất kì nào đó trong bộ nhớ. Để gán địa chỉ của một biến cho con trỏ, ta dùng toán tử địa chỉ & VD : int k = 10; int* a = &k; //Con trỏ a đang chứa địa chỉ của biến k. Để truy cập nội dung của ô nhớ mà con trỏ đang chỉ tới, ta sử dụng toán tử gián tiếp *. VD : int y =*a; //Biến y sẽ được gán giá trị của ô nhớ mà con trỏ a đang chỉ tới. Ta có thể cộng (+), trừ (-) 1 con trỏ với 1 số nguyên N nào đó; kết quả trả về là 1 con trỏ. Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử (vùng nhớ) . Kích thước của vùng nhớ phụ thuộc vào kiểu dữ liệu của biến mà con trỏ chỉ tới (mỗi ô nhớ có kích thước 1 byte). VD : int k = 10; int* a = &k; int* b = a + 3; // Nếu a đang chỉ tới ô nhớ 1000 thì b sẽ chỉ tới ô nhớ có địa chỉ 1012 (kiểu int có kích thước 32-bit (4 byte), do đó mỗi vùng nhớ của biến kiểu int là 4 ô nhớ; địa chỉ của con trỏ b cách con trỏ a 4 phần tử tương ứng với 12 ô nhớ ). Ta không thể công hai biến con trỏ với nhau nhưng có thể trừ hai biến con trỏ (kết quả là một số nguyên cho biết khoảng cách giữa hai ô nhớ mà hai con trỏ đang trỏ tới). VD : int k1=10, k2=20; int *a =&k1, *b =&k2; int y = a – b; // Nếu a đang chỉ tới ô nhớ 1000 và b chỉ tới ô nhớ 1012 thì y = 12. Do con trỏ cũng là một biến nên cũng được lưu trữ trong bộ nhớ, nên ta có thể dùng một con trỏ khác để chỉ tới địa chỉ này. VD: int*a = &k1; int**b = &a; c) Handle : (^) Handle cũng có chức năng tương tự như pointer. Chỉ khác là nó không phản ánh được địa chỉ thật của đối tượng nằm ở đâu trên bộ nhớ mà nó phản ánh được 1 giá trị 32 bit do CLR quản LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 8 lý. Do đó handle còn có thể được xem là một con trỏ ảo cho phép tương tác với bộ nhớ thông qua CLR. Do không phản ánh địa chỉ thật của đối tượng trên bộ nhớ nên ta không thể thực hiện các phép toán công trừ với số nguyên như pointer. Cơ chế quản lý bộ nhớ của một số ngôn ngữ : 4) String (Kiểu chuỗi kí tự) : String là kiểu dữ liệu cho phép lưu trữ giá trị dưới dạng một dãy các kí tự. Để dễ hình dung, ta có xem String như là một vectơ gồm nhiều phần tử liên tiếp nhau, mỗi phần tử là một kí tự. Cú pháp khai báo : String^ name; //name là tên biến. Để gán giá trị cho biến kiểu String, ta đặt chuỗi kí tựtrong cặp dấu “”. VD : String^ a = “Xinchao”; Do kích thước của kiểu String là không xác định (vì không biết chính xác chiều dài của chuỗi kí tự). Nên String thuộc kiểu dữ liệu tham chiếu (reference type) và khi khai báo cần có ^ (handle). Ta có thể truy xuất đến bất kì một phần tử nào trong chuỗi nếu biết vị trí của phần tử đó. VD : String^ a = “Xinchao”; Char b = a [3]; // b = „c‟ (a[3] có nghĩa là phần tử thứ 4, phần tử đầu tiên là a[0]). Trong C++/CLI, có riêng một Class quản lí kiểu chuỗi là Class String. Các biến (variable) và phương thức (method) cơ bản của Class String : LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 9 Length : biến có kiểu interger. Trả về chiều dài của chuỗi (số lượng các kí tự của chuỗi). VD : String^ a = “Xinchao” ; int x = a->Length; // x sẽ có giá trị = 7. Concat() : Hàm nhiều đối số. Kiểu dữ liệu trả về là String. Thực hiện chức năng nối các chuỗi lại với nhau. VD : String ^ a = “Welcome”, ^b = “ To ”, ^c = “Viet Nam”; String ^ d = String::Concat(a,b,c); // d = “Welcome to Viet Nam” Substring(int n) : Hàm một đối số. Kiểu dữ liệu trả về là String. Tạo một chuỗi mới từ chuỗi ban đầu bằng cách loại đi n phần tử đầu tiên . VD : String^ a = “Hello”; String^ b = a->Substring(2); // b = “llo” ToUpper() : Hàm không đối số. Kiểu dữ liệu trả về là String. Thực hiện chức năng chuyển tất cả các kí tự của chuỗi thành chữ HOA VD : String ^ a = “Welcome”; String ^ b = a->ToUpper(); // b= “WELCOME” ToLower() : Hàm không đối số. Kiểu dữ liệu trả về là String. Thực hiện chức năng chuyển tất cả các kí tự của chuỗi thành chữ thường. VD : String ^ a = “Welcome”; String ^ b = a->ToLower(); // b= “welcome” Remove(int n, int m) : Hàm hai đối số. Kiểu dữ liệu trả về là String. Tạo một chuỗi mới từ chuỗi ban đầu bằng cách loại đi m các phần tửtừ vị trí n . VD : String^ a = “Hello Viet Nam”; String^ b = a->Remove(2,5); // b = “Heiet Nam” Replace(String^ n, String^ m) : Hàm hai đối số. Kiểu dữ liệu trả về là String. Tạo một chuỗi mới từ chuỗi ban đầu bằng cách thay thế chuỗi n bằng chuỗi m. VD : String^ a = “Hello Hell”; String^ b = a->Replace(“ell”, “i”); // b = “Hio Hi” Insert(int n, String^ m) : Hàm hai đối số. Kiểu dữ liệu trả về là String. Tạo một chuỗi mới từ chuỗi ban đầu bằng cách chèn thêm vào chuỗi m tại vị trí thứ n . VD : String^ a = “Hello”; LậptrìnhứngdụngtrongkỹthuậtChương2 Bộ môn Cơđiệntử Trang 10 String^ b = a->Insert(2, “hi”); // b = “Hehillo” Trim() : Hàm không đối số. Kiểu dữ liệu trả về là String. Loại bỏ các kí tự khoảng trắng (spacebar) ở đầu và cuối chuỗi. VD : String^ a = “ Hello VN ”; String^ b = a->Trim() ; // b = “Hello VN” 5) Array (Kiểu mảng) : array là kiểu dữ liệu dạng tập hợp (collection) cho phép lưu trữ giá trị dưới dạng một mảng các phần tửcó cùng kiểu dữ liệu. Để dễ hình dung, ta có xem array như là một ma trận nhiều chiều gồm nhiều phần tử, kiểu dữ liệu của mỗi phần tử là bất kì. Với phiên bản VS 2005 (.Net Framework 1.1), muốn sử dụng kiểu mảng cần khai báo namespace stdcli::language. Tuy nhiên từ phiên bản VS 2008 (.Net Framework 2.0) thì không cần khai báo. Cú pháp khai báo : Mảng 1 chiều : array <type>^ name; //name là tên biến, type là kiểu dữ liệu của biến. Mảng n chiều : array <type, n>^ name; //n là số chiều của mảng. VD : array <int>^ a; //mảng 1 chiều, phần tửcó kiểu interger. array <String^, 2>^ b; //mảng 2 chiều, kiểu dữ liệu là String. array <array<int,2>^,2>^ b; //mảng 2 chiều, mỗi phần tử lại là 1 array 2 chiều. Số chiều tối đa của mảng là 32. Trước khi sử dụng mảng, ta phải thực hiện việc cấp phát bộ nhớ cho mảng. Việc cấp phát bộ nhớ được thực hiện bằng lệnh gcnew(). Cú pháp : name = gcnew array<type,n>(k1,k2,…,kn); // k1,k2,…,kn là số phần tửứng với chiều thứ 1,2,…,n của mảng. VD : array<int,2>^ M; M = gcnew array<int,2>(5,3); //mảng 2 chiều 5x3 (5 hàng, 3 cột). Muốn gán giá trị cho mảng, ta phải gán giá trị cho từng phần tử một. Để truy xuất đến từng phần tử của mảng, ta dùng cú pháp : name[i1,i2,…,in] //name là tên mảng, i1,i2,…,in là vị trí của phần tửtrong mảng VD : array<int,2>^ M = gcnew array<int,2>(5,3); [...]... hàm và truyền tham số cho hàm // z = -2 } Lưu ý : Tất cả các biến được khai báo bên trong hàm đều là biến tạm, các biến này sẽ bị xóa sau khi hàm kết thúc Do đó, các biến bên trong hàm và biến trongchươngtrình chính có thể trùng tên nhau Hàm có thể được gọi nhiều lần trongchươngtrình chính Bộ môn Cơđiệntử Trang 20 LậptrìnhứngdụngtrongkỹthuậtChương2 b) Hàm không trả về dữ liệu : Hàm... về result2 VD : int x = 5, y = 3; int z = (x > y) ? (x+y) : (x-y); int k = (x < y) ? (x+y) : (x-y); // z = 8 : x > y đúng nên z = x + y // z = 2 : x < y sai nên z = x - y e) Toán tử gán : Thực hiện việc gán giá trị cho các biến Bao gồm 11 toán tử gán Bộ môn Cơđiệntử Trang 13 Lập trìnhứngdụngtrongkỹthuật Chương 2 = : Gán trực tiếp += : Thực hiện công rồi mới gán ( x += a x = x + a) -= : Thực... Console::Write(“{0}\t”, x); } VD : Kết quả in ra màn hình Bộ môn Cơđiệntử : A B C D Trang 19 Lập trìnhứngdụngtrongkỹthuật Chương 2 8) Hàm (Function) : Hàm được xem như là trung tâm của các chươngtrình C++/CLI Về cơ bản, hàm là một khối lệnh và có thể được thực thi khi được gọi ra từ bất cứ vị trí nào trongchươngtrìnhCó hai kiểu hàm cơ bản : hàm trả về kiểu dữ liệu và hàm không trả về kiểu dữ... không bằng Toán tử logic thực hiện các phép toán trên số bool Bao gồm 3 toán tử : Bộ môn Cơđiệntử Trang 12 Lập trìnhứngdụngtrongkỹthuật ! Chương2 : Phép NOT && : Phép AND || : Phép OR VD : int x = 5, y = 3; int z = x%y; int k = x++%y; int t = ++z%y; // z = 2 (5 chia 3 dư 2) // k = 2 , x = 6 ( thực hiện x% y trước rồi mới tăng x) // t = 0 , z = 3 (tăng z rồi mới thực hiện z%y) c) Toán tử thao tác... điều kiện sai thì thực hiện đoạn mã lệnh 2 Nếu có nhiều vòng if lồng nhau (nhiều điều kiện) thì có thể dùng cấu trúc sau : if (conditon 1) { Statement 1; } else if (condition 2) { Statement 2; Bộ môn Cơđiệntử //Nếu điều kiện 1 đúng thì thực hiện đoạn mã lệnh 1 // Nếu điều kiện 2đúng thì thực hiện đoạn mã lệnh 2 Trang 15 Lập trìnhứngdụngtrongkỹthuật Chương 2 } else { // Nếu tất cả đều sai thì thực... thì thoát khỏi case constant2: Statement2; break; default: Statement3; // Nếu kết quả biểu thức = constant2 thì thực hiện đoạn mã lệnh Statement2 // Sau khi kết thúc Statement2 thì thoát khỏi // Đoạn lệnh mặc định } VD : int x = 4,y; switch (x%3) { case 0: Console::WriteLine(“x chia het cho 3”); break; Bộ môn Cơđiệntử Trang 16 Lập trìnhứngdụngtrongkỹthuật Chương 2 case 1: Console::WriteLine(“x.. .Lập trìnhứngdụngtrongkỹthuật M[3 ,2] = 10; ở hàng 1 cột 1 là M[0,0]) Chương2 //gán giá trị 10 cho phần tử ở hàng thứ 4, cột 3 (phần tử Ngoài ra, nếu giá trị tất cả các phần tử của mảng đã biết Ta códùng cách gán trực tiếp như sau : VD : array ^ M = { {1 ,2, 3}, {2, 3,0},{1 ,2, 3} }; //mảng 3x3 Lưu ý : khi dùng cách gán giá trị trực tiếp,... array^ M = { 5,1,3,3 ,2 }; Array::Sort(M); // M = {1 ,2, 3,3,5} Sort(array^ x, array^ y) : Hàm hai đối số Không trả về dữ liệu Thực hiện chức năng sắp xếp thứ tự của 2 mảng 1 chiều dựa vào mảng thứ nhất VD : array^ M = { 5,1,3,3 ,2 }; array^ C = {„A‟, „D‟, „K‟, „E‟, „F”}; Bộ môn Cơđiệntử Trang 11 Lậptrìnhứngdụngtrongkỹthuật Array::Sort(M,C); Chương2 // M = {1 ,2, 3,3,5} C = {„D‟, „F‟,... % y = x; // y tham chiếu đến biến x Bộ môn Cơđiệntử Trang 14 Lậptrìnhứngdụngtrongkỹthuật x = 10; int z = y; y = 20 ; Chương2 // x = 10, y =10 : vì y tham chiếu đến x nên khi x thay đổi giá trị thì y cũng thay đổi giá tri // z = 10 // x = 20 , y =20 : khi y thay đổi giá trị thì x cũng thay đổi giá trị h) Thứ tự ƣu tiên của các toán tử : (Tham khảo trong tài liệu) 7) Cấu trúc điều khiển (Control... tham số cho hàm // Hàm tính bình phương của một số // *a là toán tử gián tiếp { int ^x = 5; Binh_phuong (x); Console::WriteLine(x); } Kết quả in ra màn hình : 25 VD : void Binh_phuong (int &a) { Bộ môn Cơđiệntử // Gọi hàm và truyền tham số cho hàm // Hàm tính bình phương của một số Trang 22 LậptrìnhứngdụngtrongkỹthuậtChương2 a = a*a; } void main() { int x = 5; Binh_phuong (x); // Gọi hàm . project trong ô Location. Nhấp OK. Lập trình ứng dụng trong kỹ thuật Chương 2 Bộ môn Cơ điện tử Trang 2 Xuất hiện cửa sổ Project, chúng ta có thể bắt đầu viết chương trình trong vùng. rộng). Lưu ý : Nếu chương trình có lỗi về mặt cú pháp, quá trình biên dịch sẽ thất bại. 2) Class CONSOLE : Lập trình ứng dụng trong kỹ thuật Chương 2 Bộ môn Cơ điện tử Trang 5 Class. gcnew array<int ,2& gt;(5,3); Lập trình ứng dụng trong kỹ thuật Chương 2 Bộ môn Cơ điện tử Trang 11 M[3 ,2] = 10; //gán giá trị 10 cho phần tử ở hàng thứ 4, cột 3 (phần tử ở hàng 1 cột 1