Hình thành công thức điều chỉnh testfunc khi thực hiện chia với zero

50 6 0
Hình thành công thức điều chỉnh testfunc khi thực hiện chia với zero

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trong ví dụ này, phương thức DoDivide() sẽ không cho phép chúng ta chia cho zero bởi một số khác, và cũng không cho phép chia số zero. Nó sẽ phát sinh một đối tượng của Divide- ByzeroException nếu chúng ta thực hiện chia với zero. Trong toán học việc lấy zero chia cho một số khác là được phép, nhưng trong ví dụ minh họa của chúng ta không cho phép thực hiện việc này, nếu thực hiện sẽ phát sinh ra một ngoại lệ Arithmetic Exception....

Giáo trình hình thành cơng thức điều chỉnh Ngơn Ngữ Lập Trình C# testfunc thực chia với zero { public static void Main() { Test t = new Test(); t.TestFunc(); } // ta thử chia hai phần xử lý ngoại lệ riêng public void TestFunc() { try { double a = 5; double b = 0; Console.WriteLine(“{0} / {1} = {2}”, a, b, DoDivide(a,b)); } catch (System.DivideByZeroException) { Console.WriteLine(“DivideByZeroException caught!”); } catch (System.ArithmeticException) { Console.WriteLine(“ArithmeticException caught!”); } catch { Console.WriteLine(“Unknown exception caught”); } } // thực phép chia hợp lệ public double DoDivide(double a, double b) { if ( b == 0) throw new System.DivideByZeroException(); if ( a == 0) throw new System.ArithmeticException(); return a/b; } } 372 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# }  Kết quả: DivideByZeroException caught! Trong ví dụ này, phương thức DoDivide() không cho phép chia cho zero số khác, không cho phép chia số zero Nó phát sinh đối tượng DivideByzeroException thực chia với zero Trong toán học việc lấy zero chia cho số khác phép, ví dụ minh họa không cho phép thực việc này, thực phát sinh ngoại lệ ArithmeticException Khi ngoại lệ phát sinh, CLR kiểm tra khối xử lý ngoại lệ theo thứ tự lấy khối thích hợp Khi thực với a=5 b=7 kết sau: / = 0.7142857142857143 Như mong muốn, khơng có ngoại lệ phát sinh Tuy nhiên, thay đổi giá trị a 0, kết là: ArithmeticException caught! Ngoại lệ phát sinh, CLR kiểm tra ngoại lệ đầu tiên: DivideByZeroException Bởi khơng phù hợp, nên tiếp tục tìm khối xử lý ArithmeticException chọn Cuối cùng, giả sử thay đổi giá trị b Khi thực điều dẫn đến ngoại lệ DivideByZeroException Ghi chú: Chúng ta phải cẩn thận thứ tự câu lệnh catch, DivideByZeroException dẫn xuất từ ArithmeticException Nếu đảo thứ tự câu lệnh catch, ngoại lệ DivideByZeroException phù hợp với khối xử lý ngoại lệ ArithmeticException Và việc xử lý ngoại lệ không giao cho khối xử lý DivideByZeroException Thật vậy, thứ tự đảo, không cho phép ngoại lệ xử lý khối xử lý ngoại lệ DivideByZeroException Trình biên dịch nhận DivideByZeroException không thực thơng báo lỗi biên dịch Chúng ta phân phối câu lệnh try/ catch, cách bắt giữ ngoại lệ xác định hàm nhiều ngoại lệ tổng quát nhiều hàm Mục đích thực đưa thiết kế Giả sử có phương thức A, phương thức gọi phương thức khác tên phương thức B, đến lượt phương thức B gọi phương thức C Và phương thức C tiếp tục gọi phương thức D, cuối phương thức D gọi phương thức E Phương thức E mức độ sâu chương trình chúng ta, phương thức A, B mức độ cao Nếu đốn trước phương thức E phát sinh ngoại lệ, tạo khối try/catch để bắt giữ ngoại lệ chỗ gần nơi phát sinh ngoại lệ Chúng ta tạo nhiều khối xử lý ngoại lệ chung đoạn chương trình mức cao trường hợp ngoại lệ khơng đốn trước 373 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# Câu lệnh finally Trong số tình huống, việc phát sinh ngoại lệ unwind stack tạo số vấn đề Ví dụ mở tập tin hay trường hợp khác xác nhận tài nguyên, cần thiết hội để đóng tập tin giải phóng nhớ đệm mà chương trình chiếm giữ trước Ghi chú: Trong ngơn ngữ C#, vấn đề xảy chế thu dọn tự động C# ngăn ngừa ngoại lệ phát sinh từ việc thiếu nhớ Tuy nhiên, có số hành động mà cần phải quan tâm ngoại lệ phát sinh ra, việc đóng tập tin, có hai chiến lược để lựa chọn thực Một hướng tiếp cận đưa hành động nguy hiểm vào khối try sau thực việc đóng tập tin hai khối catch try Tuy nhiên, điều gây đoạn chương trình khơng đẹp sử dụng trùng lắp lệnh Ngôn ngữ C# cung cấp thay tốt khối finally Đoạn chương trình bên khối catch đảm bảo thực thi mà không quan tâm đến việc ngoại lệ phát sinh Phương thức TestFunc() ví dụ 13.5 minh họa việc mở tập tin hành động nó, sau phương thức thực vài phép tốn tốn học, sau tập tin đóng Có thể q trình mở tập tin đóng tập tin chương trình phát sinh ngoại lệ Nếu xuất ngoại lệ, tập tin cịn mở Người phát triển biết khơng có chuyện xảy ra, cuối phương thức tập tin đóng Do chức đóng tập tin di chuyển vào khối finally, thực thi mà không cần quan tâm đến việc có phát sinh hay khơng ngoại lệ chương trình  Ví dụ 13.5: Sử dụng khối finally namespace Programming_CSharp { using System; public class Test { public static void Main() { Test t = new Test(); t.TestFunc(); } // chia hai số xử lý ngoại lệ có public void TestFunc() { try 374 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# { Console.WriteLine(“Open file here”); double a = 5; double b = 0; Console.WriteLine(“{0} /{1} = {2}”, a, b, DoDivide(a,b)); Console.WriteLine(“This line may or not print”); } catch (System.DivideByZeroException) { Console.WriteLine(“DivideByZeroException caught!”); } catch { Console.WriteLine(“Unknown exception caught”); } finally { Console.WriteLine(“Close file here.”); } } // thực chia hợp lệ public double DoDivide(double a, double b) { if ( b == 0) { throw new System.DivideByZeroException(); } if ( a == 0) { throw new System.ArithmeticException(); } return a/b; } } }  Kết quả: Open file here 375 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# DivideByZeroException caught! Close file here Kết trường hợp b = 12 Open file here 5/ 12 = 0.416666666666 Close file here Trong ví dụ khối catch loại bỏ thêm vào khối finally Bất ngoại lệ có phát sinh hay khơng khối lệnh bên finally thực thi Do nên hai trường hợp ta thấy xuất thông điệp “Close file here” Những đối tượng ngoại lệ Cho đến lúc sử dụng tốt ngoại lệ cách xử lý khắc phục ngoại lệ Trong phần tiến hành việc tìm hiểu đối tượng xây dựng cho việc xử lý ngoại lệ Đối tượng System.Exception cung cấp số phương thức thuộc tính hữu dụng Thuộc tính Message cung cấp thơng tin ngoại lệ, lý ngoại lệ phát sinh Thuộc tính Message thuộc tính đọc, đoạn chương trình phát sinh ngoại lệ thiết lập thuộc tính Message đối mục cho khởi dựng ngoại lệ Thuộc tính HelpLink cung cấp liên kết để trợ giúp cho tập tin liên quan đến ngoại lệ Đây thuộc tính đọc Thuộc tính StackTrace thuộc tính đọc thiết lập CLR Trong ví dụ 13.6 thuộc tính Exception.HelpLink thiết lập truy cập để cung cấp thông tin cho người sử dụng ngoại lệ DivideBy-ZeroException Thuộc tính StackTrace ngoại lệ sử dụng để cung cấp thông tin stack cho câu lệnh lỗi Một thông tin stack cung cấp hàng loạt gọi stack phương thức gọi mà dẫn đến ngoại lệ phát sinh  Ví dụ 13.6: Làm việc với đối tượng ngoại lệ namespace Programming_CSharp { using System; public class Test { public static void Main() { Test t = new Test(); t.TestFunc(); } // chia hai số xử lý ngoại lệ 376 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# public void TestFunc() { try { Console.WriteLine(“Open file here”); double a = 12; double b = 0; Console.WriteLine(“{0} /{1} = {2}”, a, b, DoDivide(a,b)); Console.WriteLine(“This line may or not print”); } catch (System.DivideByZeroException e) { Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message); Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink); Console.WriteLine(“\nHere’s a stack trace: {0}\n”, e.StackTrace); } catch { Console.WriteLine(“Unknown exception caught”); } } // thực phép chia hợp lệ public double DoDivide( double a, double b) { if ( b == 0) { DivideByZeroException e = new DivideByZeroException(); e.HelpLink = “http://www.hcmunc.edu.vn”; throw e; } if ( a == 0) { throw new ArithmeticException(); } return a/b; } } } 377 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C#  Kết quả: Open file here DivideByZeroExceptión Msg: Attempted to divide by zero HelpLink: http://www.hcmuns.edu.vn Here’s a stack trace: at Programming_CSharp.Test.DoDivide(Double c, Double b) in c:\ exception06.cs: line 56 at Programming_CSharp.Test.TestFunc() in exception06.cs: line 22 Close file here Trong đoạn kết trên, danh sách trace stack hiển thị theo thứ tự ngược lại thứ tự gọi Nó hiển thị lỗi phương thức DoDivde(), phương thức gọi từ phương thức TestFunc() Khi phương thức gọi lồng nhiều cấp, thông tin stack giúp hiểu thứ tự phương thức gọi Trong ví dụ này, việc đơn giản phát sinh DidiveByZeroException, tạo thể hện ngoại lệ: DivideByZeroException e = new DivideByZeroException(); Chúng ta không truyền vào thông điệp chúng ta, nên thông điệp mặc định in ra: DivideByZeroException! Msg: Attemped to divide by zero Ở bổ sung dịng lệnh bên để truyền vào thông điệp tùy chọn sau: new DivideByZeroException(“You tried to divide by zero which is not meaningful”); Trước phát sinh ngoại lệ, thiết lập thuộc tính HelpLink sau: e.HelpLink = “http://www.hcmunc.edu.vn”; Khi ngoại lệ bắt giữ, chương trình in thơng điệp HelpLink hình: catch (System.DivideByZeroException e) { Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message); Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink); } Việc làm cho phép cung cấp thơng tin hữu ích cho người sử dụng Thêm vào thơng tin stack đưa cách sử dụng thuộc tính StackTrace đối tượng ngoại lệ: Console.WriteLine(“\n Here’s a stack trace: {0}\n”, e.StackTrace); Kết vết stack xuất ra: Here’s a stack trace: at Programming_CSharp.Test.DoDivide(Double c, Double b) 378 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# in c:\ exception06.cs: line 56 at Programming_CSharp.Test.TestFunc() in exception06.cs: line 22 Lưu ý rằng, phần đường dẫn viết tắt, kết bạn khác tí Bảng 13.1 sau mơ tả số lớp ngoại lệ chung khai báo bên namespace System CÁC LỚP NGOẠI LỆ Mô tả Tên ngoại lệ MethodAccessException ArgumentException ArgumentNullException ArithmeticException ArrayTypeMismatchException DivideByZeroException FormatException IndexOutOfRangeException InvalidCastException MulticastNotSupportedException NotFiniteNumberException NotSupportedException NullReferenceException OutOfMemoryException OverflowException StackOverflowException Lỗi truy cập, truy cập đến thành viên hay phương thức không truy cập Lỗi tham số đối mục Đối mục Null, phương thức truyền đối mục null không chấp nhận Lỗi liên quan đến phép toán Kiểu mảng khơng hợp, cố lưu trữ kiểu khơng thích hợp vào mảng Lỗi chia zero Định dạng khơng xác đối mục Chỉ số truy cập mảng không hợp lệ, dùng nhỏ số nhỏ hay lớn số lớn mảng Phép gán không hợp lệ Multicast không hỗ trợ, việc kết hợp hai delegate không Không phải số hữu hạn, số không hợp lệ Phương thức không hỗ trợ, gọi phương thức không tồn bên lớp Tham chiếu null không hợp lệ Out of memory Lỗi tràn phép toán Tràn stack Kiểu khởi tạo sai, khởi dựng tĩnh có lỗi Bảng 13.1 : Các ngoại lệ thường xuất TypeInitializationException Tạo riêng ngoại lệ CLR cung cấp kiểu liệu ngoại lệ bản, ví dụ trước tạo vài kiểu ngoại lệ riêng Thông thường cần thiết phải cung cấp thông tin mở rộng cho khối catch ngoại lệ phát sinh Tuy nhiên, có lúc 379 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# muốn cung cấp nhiều thơng tin mở rộng khả đặc biệt cần thiết ngoại lệ mà tạo Chúng ta dễ dàng tạo ngoại lệ riêng, hay gọi ngoại lệ tùy chọn (custom exception), điều bắt buộc với ngoại lệ chúng phải dẫn xuất từ System.ApplicationException Ví dụ 13.7 sau minh họa việc tạo ngoại lệ riêng  Ví dụ: Tạo ngoại lệ riêng namespace Programming_CSharp { using System; // tạo ngoại lệ riêng public class MyCustomException : System.ApplicationException { public MyCustomException( string message): base(message) { } } public class Test { public static void Main() { Test t = new Test(); t.TestFunc(); } // chia hai số xử lý ngoại lệ public void TestFunc() { try { Console.WriteLine(“Open file here”); double a = 0; double b = 5; Console.WriteLine(“{0} /{1} = {2}”, a, b, DoDivide(a,b)); Console.WriteLine(“This line may or not print”); } catch (System.DivideByZeroException e) { Console.WriteLine(“\nDivideByZeroException! Msg: {0}”, e.Message); 380 Xử Lý Ngoại Lệ Ngôn Ngữ Lập Trình C# Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink); } catch (MyCustomException e) { Console.WriteLine(“\nMyCustomException! Msg: {0}”, e.Message); Console.WriteLine(“\nHelpLink: {0}”, e.HelpLink); } catch { Console.WriteLine(“Unknown excepiton caught”); } finally { Console.WriteLine(“Close file here.”); } } // thực phép chia hợp lệ public double DoDivide( double a, double b) { if ( b == 0) { DivideByZeroException e = new DivideByZeroException(); e.HelpLink = “http://www.hcmunc.edu.vn”; throw e; } if ( a == 0) { MyCustomException e = new MyCustomException(“Can’t have zero divisor”); e.HelpLink = “http://www.hcmuns.edu.vn”; throw e; } return a/b; } } } - 381 Xử Lý Ngoại Lệ Ngơn Ngữ Lập Trình C# Console.WriteLine( “Ban cho mau cham”); goto case mauTim; case mauTim: Console.WriteLine( “Ban chon mau tim”); goto case mauLuc; default: Console.WriteLine( “Ban khong chon mau nao het”); break; } Console.WriteLine( “Xin cam on!”); } } Trong ví dụ 3.9 liệt kê bảy loại màu dùng câu lệnh switch để kiểm tra trường hợp chọn màu.Ở thử phân tích từg câu lệnh case mà khơng quan tâm đến giá trị biến chonMau Giá trị chonMau Câu lệnh case thực mauDo case mauDo mauCam case mauCam mauVang case mauVang Kết thực Ban chon mau Ban chon mau cam Ban chon mau luc case mauLuc mauLuc case mauLuc mauLam case mauLam case mauCham case mauTim case mauLuc mauCham case mauCham case mauTim case mauLuc mauTim case mauTim case mauLuc Ban chon mau luc Ban chon mau lam Ban chon mau cham Ban chon mau tim Ban chon mau luc Ban chon mau cham Ban chon mau tim Ban chon mau luc Ban chon mau tim Ban chon mau luc Bảng 3.3: Mô tả trường hợp thực câu lệnh switch Trong đoạn ví dụ giá trị biến chonMau = mauLuc nên vào lệnh switch case mauLuc thực kết sau:  Kết ví dụ 3.9 58 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Ban chon mau luc Xin cam on! Ghi chú: Đối với người lập trình C/C++, C# khơng thể nhảy xuống trường hợp case câu lệnh case khơng rỗng Vì phải viết sau: case 1: // nhảy xuống case 2: Như minh họa trường hợp xử lý case rỗng, nhiên viết sau: case 1: DoAnything(); // Trường hợp nhảy xuống case case 2: đoạn chương trình thứ hai trường hợp case có câu lệnh nên nhảy xuống Nếu muốn trường hợp case1 nhảy qua case ta phải sử dụng câu lệnh goto tường minh: case 1: DoAnything(); goto case 2; case 2: Do thực xong câu lệnh trường hợp muốn thực trường hợp case khác ta dùng câu lệnh nhảy goto với nhãn trường hợp đó: goto case Khi gặp lệnh break chương trình khỏi switch thực lệnh tiếp sau khối switch Nếu khơng có trường hợp thích hợp câu lệnh switch có dùng câu lệnh defalut câu lệnh trường hợp default thực Ta dùng default để cảnh báo lỗi hay xử lý trường hợp tất trường hợp case switch Trong ví dụ minh họa câu lệnh switch trước giá trị để kiểm tra trường hợp thích hợp số nguyên Tuy nhiên C# có khả cho phép dùng câu lệnh switch với giá trị chuỗi, viết sau: switch (chuoi1) { case “mau do”: break; case “mau cam”: 59 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# break; } Câu lệnh lặp C# cung cấp mở rộng câu lệnh lặp, bao gồm câu lệnh lặp for, while while Ngồi ngơn ngữ C# bổ sung thêm câu lệnh lặp foreach, lệnh người lập trình C/C++ thân thiện với người lập trình VB Cuối câu lệnh nhảy goto, break, continue, return  Câu lệnh nhảy goto Lệnh nhảy goto lệnh nhảy đơn giản, cho phép chương trình nhảy vơ điều kiện tới vị trí chương trình thơng qua tên nhãn Tuy nhiên việc sử dụng lệnh goto thường làm tính cấu trúc thuật tốn, việc lạm dụng dẫn đến chương trình nguồn mà giới lập trình gọi “mì ăn liền” rối mớ bịng bong Hầu hết người lập trình có kinh nghiệm tránh dùng lệnh goto Sau cách sử dụng lệnh nhảy goto:  Tạo nhãn  goto đến nhãn Nhãn định danh theo sau dấu hai chấm (:) Thường thường lệnh goto gắn với điều kiện đó, ví dụ 3.10 sau minh họa sử dụng lệnh nhảy goto chương trình  Ví dụ 3.10: Sử dụng goto using System; public class UsingGoto { public static int Main() { int i = 0; lap: // nhãn Console.WriteLine(“i:{0}”,i); i++; if ( i < 10 ) goto lap; // nhãy nhãn lap return 0; } } 60 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C#  Kết quả: i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9 Nếu vẽ lưu đồ chương trình có sử dụng nhiều lệnh goto, ta thấy kết nhiều đường chồng chéo lên nhau, giống sợi mì Chính nên đoạn mã chương trình có dùng lệnh goto cịn gọi “spaghetti code” Việc tránh dùng lệnh nhảy goto chương trình hồn tồn thực được, dùng vịng lặp while để thay hồn tồn câu lệnh goto  Vòng lặp while Ý nghĩa vịng lặp while là: “Trong điều kiện thực công việc này” Cú pháp sử dụng vòng lặp while sau: while (Biểu thức) Biểu thức vòng lặp while điều kiện để lệnh thực hiện, biểu thức bắt buộc phải trả giá trị kiểu bool true/false Nếu có nhiều câu lệnh cần thực vịng lặp while phải đặt lệnh khối lệnh Ví dụ 3.11 minh họa việc sử dụng vịng lặp while  Ví dụ 3.11: Sử dụng vòng lặp while using System; public class UsingWhile { public static int Main() { int i = 0; while ( i < 10 ) { Console.WriteLine(“ i: {0} ”,i); i++; Nền Tảng Ngôn Ngữ C# 61 Ngôn Ngữ Lập Trình C# } return 0; } }  Kết quả: i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9 Đoạn chương trình 3.11 cho kết tương tự chương trình minh họa 3.10 dùng lệnh goto Tuy nhiên chương trình 3.11 rõ ràng có ý nghĩa tự nhiên Có thể diễn giải ngơn ngữ tự nhiên đoạn vịng lặp while sau: “Trong i nhỏ 10, in giá trị i tăng i lên đơn vị” Lưu ý vòng lặp while kiểm tra điều kiện trước thực lệnh bên trong, điều đảm bảo từ đầu điều kiện sai vịng lặp khơng khởi tạo biến i có giá trị 11, vịng lặp khơng thực  Vịng lặp while Đơi vịng lặp while khơng thoả mãn u cầu tình sau, muốn chuyển ngữ nghĩa while “chạy điều kiện đúng” thành ngữ nghĩa khác “làm điều điều kiện cịn đúng” Nói cách khác thực hành động, sau hành động hồn thành kiểm tra điều kiện Cú pháp sử dụng vòng lặp while sau: while ( điều kiện ) Ở có khác biệt quan trọng vòng lặp while vòng lặp while dùng vịng lặp while tối thiểu có lần câu lệnh while thực Điều dễ hiểu lần vào vịng lặp while điều kiện chưa kiểm tra  Ví dụ 3.12: Minh hoạ việc sử dụng vòng lặp while 62 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# using System; public class UsingDoWhile { public static int Main( ) { int i = 11; { Console.WriteLine(“i: {0}”,i); i++; } while ( i < 10 ) return 0; } }  Kết quả: i: 11 Do khởi tạo biến i giá trị 11, nên điều kiện while sai, nhiên vòng lặp while thực lần  Vòng lặp for Vòng lặp for bao gồm ba phần chính:  Khởi tạo biến đếm vịng lặp  Kiểm tra điều kiện biến đếm, thực lệnh bên vòng for  Thay đổi bước lặp Cú pháp sử dụng vòng lặp for sau: for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp]) Vòng lặp for minh họa ví dụ sau:  Ví dụ 3.13: Sử dụng vòng lặp for using System; public class UsingFor { public static int Main() { for (int i = 0; i < 30; i++) Nền Tảng Ngôn Ngữ C# 63 Ngơn Ngữ Lập Trình C# { if (i %10 ==0) { Console.WriteLine(“{0} ”,i); } else { Console.Write(“{0} ”,i); } } return 0; } }  Kết quả: 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Trong đoạn chương trình có sử dụng tốn tử chia lấy dư modulo, toán tử đề cập đến phần sau Ý nghĩa lệnh i%10 == kiểm tra xem i có phải bội số 10 khơng, i bội số 10 sử dụng lệnh WriteLine để xuất giá trị i sau đưa cursor đầu dòng sau Còn ngược lại cần xuất giá trị i khơng xuống dịng Đầu tiên biến i khởi tạo giá trị ban đầu 0, sau chương trình kiểm tra điều kiện, nhỏ 30 nên điều kiện đúng, câu lệnh bên vịng lặp for thực Sau thực xong biến i tăng thêm đơn vị (i++) Có điều lưu ý biến i khai bao bên vịng lặp for nên có phạm vi hoạt động bên vịng lặp Ví dụ 3.14 sau khơng biên dịch xuất lỗi  Ví dụ 3.14: Phạm vi biến khai báo vòng lặp using System; public class UsingFor { public static int Main() { for (int i = 0; i < 30; i++) { Nền Tảng Ngôn Ngữ C# 64 Ngơn Ngữ Lập Trình C# if (i %10 ==0) { Console.WriteLine(“{0} ”,i); } else { Console.Write(“{0} ”,i); } } // Lệnh sau sai biến i khai báo bên vòng lặp Console.WriteLine(“ Ket qua cuoi cung cua i:{0}”,i); return 0; } }  Câu lệnh lặp foreach Vòng lặp foreach cho phép tạo vịng lặp thơng qua tập hợp hay mảng Đây câu lệnh lặp khơng có ngơn ngữ C/C++ Câu lệnh foreach có cú pháp chung sau: foreach ( in < tên tập hợp>) Do lặp dựa mảng hay tập hợp nên toàn vòng lặp duyệt qua tất thành phần tập hợp theo thứ tự Khi duyệt đến phần tử cuối tập hợp chương trình khỏi vịng lặp foreach  Ví dụ 3.15 minh họa việc sử dụng vòng lặp foreach using System; public class UsingForeach { public static int Main() { int[] intArray = {1,2,3,4,5,6,7,8,9,10}; foreach( int item in intArray) { Console.Write(“{0} ”, item); } return 0; } 65 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# }  Kết quả: 10  Câu lệnh nhảy break continue Khi thực lệnh vịng lặp, có u cầu sau: khơng thực lệnh cịn lại mà khỏi vịng lặp, hay khơng thực cơng việc lại vòng lặp mà nhảy qua vòng lặp Để đáp ứng yêu cầu C# cung cấp hai lệnh nhảy break continue để khỏi vịng lặp Break sử dụng đưa chương trình khỏi vịng lặp tiếp tục thực lệnh tiếp sau vòng lặp Continue ngừng thực cơng việc cịn lại vòng lặp thời quay đầu vòng lặp để thực bước lặp Hai lệnh break continue tạo nhiều điểm thoát làm cho chương trình khó hiểu khó trì Do phải cẩn trọng sử dụng lệnh nhảy Ví dụ 3.16 trình bày bên minh họa cách sử dụng lệnh continue break Đoạn chương trình mơ hệ thống xử lý tín hiệu giao thơng đơn giản Tín hiệu mơ ký tự chữ hoa hay số nhập vào từ bàn phím, sử dụng hàm ReadLine lớp Console để đọc chuỗi ký tự từ bàn phím Thuật tốn chương trình đơn giản: Khi nhận tín hiệu ‘0’ có nghĩa việc bình thường, khơng cần phải làm cơng việc cả, kể việc ghi lại kiện Trong chương trình đơn giản nên tín hiệu nhập từ bàn phím, cịn ứng dụng thật tín hiệu phát sinh theo mẫu tin thời gian sở liệu Khi nhận tín hiệu (mơ ký tự ‘T’) ghi lại tình trạng kết thúc xử lý Cuối cùng, tín hiệu khác phát thơng báo, thơng báo đến nhân viên cảnh sát chẳng hạn Trường hợp tín hiệu ‘X’ phát thơng báo sau vịng lặp xử lý kết thúc  Ví dụ 3.16: Sử dụng break continue using System; public class TrafficSignal { public static int Main() { string signal = “0”; // Khởi tạo tín hiệu // bắt đầu chu trình xử lý tín hiệu while ( signal != “X”) 66 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# { //nhập tín hiệu Console.Write(“Nhap vao mot tin hieu: ”); signal = Console.ReadLine(); // xuất tín hiệu thời Console.WriteLine(“Tin hieu nhan duoc: {0}”, signal); // phần xử lý tín hiệu if (signal == “T”) { // Tín hiệu thoát gởi // lưu lại kiện thoát Console.WriteLine(“Ngung xu ly! Thoat\n”); break; } if ( signal == “0”) { // Tín hiệu nhận bình thường // Lưu lại kiện tiếp tục Console.WriteLine(“Tat ca dieu tot!\n”); continue; } // Thực số hành động // tiếp tục Console.WriteLine(“ -bip bip bip\n”); } return 0; } }  Kết quả: sau nhập tín hiệu : “0”, “B”, “T” Nhap vao mot tin hieu: Tin hieu nhan duoc: Tat ca dieu tot! Nhap vao mot tin hieu: B Tin hieu nhan duoc: B -bip bip bip 67 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Nhap vao mot tin hieu: T Tin hieu nhan duoc: T Ngung xu ly! Thoat Điểm yếu đoạn chương trình nhập vào tín hiệu “T” sau thực số hành động cần thiết chương trình khỏi vịng lặp khơng xuất câu thông báo bip bip bip Ngược lại nhận tín hiệu sau xuất thơng báo chương trình quay đầu vịng lặp để thực tiếp tục không xuất câu thơng báo bip bip bip Tốn tử Tốn tử kí hiệu biểu tượng dùng để thực hành động Các kiểu liệu C# kiểu nguyên hỗ trợ nhiều toán tử toán tử gán, toán tử toán học, logic Toán tử gán Đến lúc toán tử gán quen thuộc với chúng ta, hầu hết chương trình minh họa từ đầu sách sử dụng phép gán Toán tử gán hay phép gán làm cho toán hạng bên trái thay đổi giá trị với giá trị toán hạng bên phải Toán tử gán tốn tử hai ngơi Đây tốn tử đơn giản thông dụng dễ sử dụng Tốn tử tốn học Ngơn ngữ C# cung cấp năm toán tử toán học, bao gồm bốn toán tử đầu phép toán Toán tử cuối toán tử chia nguyên lấy phần dư Chúng ta tìm hiểu chi tiết phép tốn phần tiếp sau  Các phép toán số học (+,-,*,/) Các phép tốn khơng thể thiếu ngơn ngữ lập trình nào, C# khơng ngoại lệ, phép toán số học đơn giản cần thiết bao gồm: phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/) nguyên không nguyên Khi chia hai số nguyên, C# bỏ phần phân số, hay bỏ phần dư, tức ta chia 8/3 kết bỏ phần dư 2, để lấy phần dư C# cung cấp thêm tốn tử lấy dư trình bày phần Tuy nhiên, chia cho số thực có kiểu float, double, hay decimal kết chia trả số thực  Phép toán chia lấy dư Để tìm phần dư phép chia nguyên, sử dụng toán tử chia lấy dư (%) Ví dụ, câu lệnh sau 8%3 kết trả (đây phần dư lại phép chia nguyên) Thật phép toán chia lấy dư hữu dụng cho người lập trình Khi thực phép chia dư n cho số khác, số bội số n kết phép chia dư Ví dụ 20 % = 20 bội số Điều cho phép ứng dụng 68 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# vịng lặp, muốn thực cơng việc cách khoảng n lần, ta cần kiểm tra phép chia dư n, kết thực cơng việc Cách sử dụng áp dụng ví dụ minh họa sử dụng vòng lặp for bên Ví dụ 3.17 sau minh họa sử dụng phép tốn chia số ngun, thực  Ví dụ 3.17: Phép chia phép chia lấy dư using System; class Tester { public static void Main() { int i1, i2; float f1, f2; double d1, d2; decimal dec1, dec2; i1 = 17; i2 = 4; f1 = 17f; f2 = 4f; d1 = 17; d2 = 4; dec1 = 17; dec2 = 4; Console.WriteLine(“Integer: \t{0}”, i1/i2); Console.WriteLine(“Float: \t{0}”, f1/f2); Console.WriteLine(“Double: \t{0}”, d1/d2); Console.WriteLine(“Decimal: \t{0}”, dec1/dec2); Console.WriteLine(“\nModulus: : \t{0}”, i1%i2); } }  Kết quả: Integer: float: 4.25 double: 4.25 decimal: 4.25 69 Nền Tảng Ngôn Ngữ C# Ngôn Ngữ Lập Trình C# Modulus: - Toán tử tăng giảm Khi sử dụng biến số ta thường có thao tác cộng giá trị vào biến, trừ giá trị từ biến đó, hay thực tính tốn thay đổi giá trị biến sau gán giá trị vừa tính tốn cho biến  Tính tốn gán trở lại Giả sử có biến tên Luong lưu giá trị lương người, biến Luong có giá trị thời 1.500.000, sau để tăng thêm 200.000 ta viết sau: Luong = Luong + 200.000; Trong câu lệnh phép cộng thực trước, kết vế phải 1.700.000 kết gán lại cho biến Luong, cuối Luong có giá trị 1.700.000 Chúng ta thực việc thay đổi giá trị gán lại cho biến với phép toán số học nào: Luong = Luong * 2; Luong = Luong – 100.000; Do việc tăng hay giảm giá trị biến thường xảy tính toán nên C# cung cấp phép toán tự gán (self- assignment) Bảng sau liệt kê phép toán tự gán Toán tử += -= *= /= %= Ý nghĩa Cộng thêm giá trị toán hạng bên phải vào giá trị toán hạng bên trái Toán hạng bên trái trừ bớt lượng giá trị toán hạng bên phải Toán hạng bên trái nhân với lượng giá trị toán hạng bên phải Toán hạng bên trái chia với lượng giá trị toán hạng bên phải Toán hạng bên trái chia lấy dư với lượng giá trị tốn hạng bên phải Bảng 3.4: Mơ tả phép toán tự gán Dựa phép toán tự gán bảng ta thay lệnh tăng giảm lương sau: 70 Nền Tảng Ngơn Ngữ C# Ngơn Ngữ Lập Trình C# Luong += 200.000; Luong *= 2; Luong -= 100.000; Kết lệnh thứ giá trị Luong tăng thêm 200.000, lệnh thứ hai làm cho giá trị Luong nhân đôi tức tăng gấp lần, lệnh cuối trừ bớt 100.000 Luong Do việc tăng hay giảm phổ biến lập trình nên C# cung cấp hai tốn tử đặc biệt tăng (++) hay giảm ( ) Khi muốn tăng giá trị biến đếm vịng lặp ta viết sau: bienDem++; Toán tử tăng giảm tiền tố tăng giảm hậu tố Giả sử muốn kết hợp phép toán gia tăng giá trị biến gán giá trị biến cho biến thứ hai, ta viết sau:  var1 = var2++; Câu hỏi đặt gán giá trị trước cộng hay gán giá trị sau cộng Hay nói cách khác giá trị ban đầu biến var2 10, sau thực ta muốn giá trị var1 10, var2 11, hay var1 11, var2 11? Để giải yêu cầu C# cung cấp thứ tự thực phép toán tăng/giảm với phép toán gán, thứ tự gọi tiền tố (prefix) hay hậu tố (postfix) Do ta viết: var1 = var2++; // Hậu tố Khi lệnh thực phép gán thực trước tiên, sau đến phép tốn tăng Kết var1 = 10 var2 = 11 Còn trường hợp tiền tố: var1 = ++var2; Khi phép tăng thực trước tức giá trị biến var2 11 cuối phép gán thực Kết hai biến var1 var2 điều có giá trị 11 Để hiểu rõ hai phép toán xem ví dụ minh họa 3.18 sau  Ví dụ 3.18: Minh hoạ sử dụng toán tử tăng trước tăng sau gán using System; class Tester { static int Main() { int valueOne = 10; int valueTwo; valueTwo = valueOne++; Console.WriteLine(“Thuc hien tang sau: {0}, {1}”, valueOne, valueTwo); valueOne = 20; 71 Nền Tảng Ngôn Ngữ C# Ngơn Ngữ Lập Trình C# valueTwo = ++valueOne; Console.WriteLine(“Thuc hien tang truoc: {0}, {1}”, valueOne, valueTwo); return 0; } }  Kết quả: Thuc hien tang sau: 11, 10 Thuc hien tang truoc: 21, 21 - Toán tử quan hệ Những toán tử quan hệ dùng để so sánh hai giá trị, sau trả kết giá trị logic kiểu bool (true hay false) Ví dụ tốn tử so sánh lớn (>) trả giá trị true giá trị bên trái toán tử lớn giá trị bên phải toán tử Do > trả giá trị true, > trả giá trị false Các tốn tử quan hệ ngơn ngữ C# trình bày bảng 3.4 bên Các tốn tử bảng minh họa với hai biến value1 value2, value1 có giá trị 100 value2 có giá trị 50 Tên tốn tử So sánh Không Lớn Lớn hay Nhỏ Kí hiệu == != > >= < Biểu thức so sánh Kết so sánh value1 == 100 true value1 == 50 false value2 != 100 false value2 != 90 true value1 > value2 true value2 > value1 false value2 >= 50 true value1 < value2 false value2 < value1 true Nhỏ hay

Ngày đăng: 20/05/2021, 03:53

Tài liệu cùng người dùng

Tài liệu liên quan