Console.ReadLine();
}
}
}
2.7. Câu lệnh nhảy
2.7.1. Câu lệnh break và continue
Câu lệnh break và continue thường được dùng trong thân các câu lệnh lặp for, while, do ... while. Câu lệnh break dùng để thoát khỏi vòng lặp trong cùng chứa câu lệnh này. Câu lệnh continue dùng để quay ngược lại về đầu vòng lặp để thực hiện lần lặp tiếp theo.
Ví dụ 2.18:Lập trình nhập vào một dãy số dương, quá trình nhập kết thúc khi nhập vào số 0. Đưa ra màn hình tổng các số dương đã nhập vào.
namespace Vidu2_18
{
class Program
{
static void Main(string[] args)
{
float x, s; s = 0;
while (true)
{
Console.Write("Nhap x =");
x = float.Parse(Console.ReadLine()); if (x < 0) continue;
if (x > 0) s += x; else break;
}
Console.WriteLine("Tong cac so vua nhap = "+s.ToString()); Console.ReadLine();
}
}
}
Kết quả chương trình:
Hình 2.18: Kết quả chương trình ví dụ 2.18.
2.7.2. Câu lệnh goto
Câu lệnh goto được sử dụng để chuyển điều khiển tới một nhãn trong chương trình và có thể được dùng để thoát khỏi một vòng lặp lồng nhau. Mỗi nhãn được đặt tên như tên biến và kết thúc bằng dấu hai chấm ―:‖. Nhãn có thể được gán cho bất kỳ câu lệnh nào trong chương trình. Tuy nhiên, câu lệnh goto làm phá vỡ tính cấu trúc của chương trình, khuyến cáo là nên tránh sử dụng.
Ví dụ:
goto.
ts: s=s++;
thì ở đây ts là nhãn của câu lệnh gán s=s++.
Câu lệnh goto có dạng:
goto nhãn;
Khi gặp câu lệnh này, chuyển điều khiển tới câu lệnh có nhãn viết sau từ khoá
Ví dụ 2.19: Sử dụng câu lệnh goto để thoát khỏi vòng lặp lồng nhau.
namespace Vidu2_19
{
class Program
{
static void Main(string[] args)
{
int i = 0;
for (int a = 0; a < 10; a++) // Vòng lặp thứ nhất
{
for (int y = 0; y < 10; y++) // Vòng lặp thứ 2
{
for (int x = 0; x < 10; x++) // Vòng lặp thứ 3
{
if (x == 5 &&y == 5)
{
goto Nhan;
}
}
i++;
}
Nhan:continue;
}
Console.WriteLine("Gia tri i = {0}", i); Console.ReadLine();
}
}
}
Kết quả chương trình
Hình 2.19: Kết quả chương trình 2.19
2.7.3. Câu lệnh return
Lệnh return được sử dụng để thoát khỏi phương thức của một lớp, chuyển điều khiển về ngay sau nơi gọi phương thức. Tùy theo kiểu dữ liệu trả về của phương thức là void hoặc có một kiểu dữ liệu cụ thể, lệnh return phải tương ứng không trả về kiểu dữ liệu gì, hoặc là trả về một giá trị có kiểu dữ liệu thích hợp.
2.8. Xử lý ngoại lệ
Ngôn ngữ C# cũng giống như các ngôn ngữ hướng đối tượng khác, cho phép xử lý những lỗi và những ngoại lệ. Ngoại lệ là một đối tượng đóng gói những thông tin về sự cố của một chương trình không bình thường.Một điều quan trọng là cần phân biệt giữa bug, lỗi và ngoại lệ. Một bug là một lỗi lập trìnhcó thể được sửa chữa trước khi mã nguồn được thực thi. Một lỗi có nguyên nhân do hành động của người sử dụng. Ví dụ, chương trình yêu cầu nhập vào một số nhưng lại nhập vào ký tự chữ cái. Trong trường hợp như vậy, lỗi có thể làm xuất hiện ngoại lệ, nhưng có thể ngăn ngừa điều này bằng cách bắt giữ lỗi nhờ kiểm tra điều kiện. Thậm chí nếu xóa tất cả những bug và dự đoán tất cả các lỗi của người dùng, cũng có thể gặp phải những vấn đề không mong đợi, như là xuất hiện trạng thái thiếu bộ nhớ (out of memory), thiếu tài nguyên hệ thống, ... những nguyên nhân này có thể do các chương trành khác cùng hoạt động ảnh hưởng đến. Tuy không thể ngăn ngừa các ngoại lệ này, nhưng có thể xử lý chúng để chúng không thể làm ảnh hưởng đến chương trình.
Khi một chương trình gặp một tình huống ngoại lệ, như là thiếu bộ nhớ thì nó sẽ tạo một ngoại lệ. Khi một ngoại lệ được tạo ra, việc thực thi của các chức năng hiện hành sẽ bị treo cho đến khi nào việc xử lý ngoại lệ tương ứng được tìm thấy. Nếu không thực hiện việc xử lý ngoại lệ, ngoại lệ sẽ được xử lý sớm bởi CLR, điều này dẫn đến chương trình sẽ kết thúc. Xử lý ngoại lệ trong C# được xây dựng dựa trên 4 từ khóa là: try, catch, finally và throw.
- try: Một khối try nhận diện một khối code mà ở đó các exception cụ thể được kích hoạt. Nó được theo sau bởi một hoặc nhiều khối catch.
- catch: Một chương trình bắt một Exception với một Exception Handler tại vị trí trong một chương trình nơi muốn xử lý vấn đề đó. Từ khóa catch trong C# chỉ dẫn việc bắt một exception.
- finally: Một khối finally được sử dụng để thực thi một tập hợp lệnh đã cho, có hay không một exception đươc ném hoặc không được ném. Ví dụ, nếu mở một file, nó phải được đóng, nếu không sẽ có một exception được tạo ra.
- throw: Một chương trình ném một exception khi có một vấn đề xuất hiện. Điều này được thực hiện bởi sử dụng từ khóa throw trong C#.
Cú pháp để sử dụng try/catch trong C# như sau:
try
{
// Câu lệnh có thể phát sinh ra ngoại lệ
}
catch( ExceptionName e1 )
{
// Xử lý ngoại lệ 1
}
catch( ExceptionName e2 )
{
// Xử lý ngoại lệ 2
}
…
catch( ExceptionName eN )
{
// Xử lý ngoại lệ N
}
finally
{
// Các câu lệnh sẽ được thực thi
}
Có thể liệt kê nhiều lệnh catch để bắt các kiểu exception khác nhau trong trường hợp khối try xuất hiện nhiều hơn một exception trong các tình huống khác nhau.
Ví dụ 2.20: Lập chương trìnhxuất hiện một exception khi chia một số cho số 0.
namespace Vidu2_20
{
class Program
{
static void Main(string[] args)
{
so1 = 10;
so2 = 0;
ketqua = 0;
try
{
int so1, so2;
int ketqua;
ketqua = so1 / so2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Exception caught: {0}", e);
}
finally
{
Console.WriteLine("Ketqua: {0}", ketqua);
}
Console.ReadLine();
}
}
}
Kết quả chương trình:
Hình 2.20: Kết quả chương trình ví dụ 2.20
Ở trong ví dụ 2.20, chương trình thực hiện một phép chia một số cho 0, do vậy sẽ phát sinh ngoại lệ, ở đây là ngoại lệ của lớp DivideByZeroException và sẽ xuất hiện thông báo lỗi như trong hình 2.20. Trong chương trình có sử dùng câu lệnh finally, nên sau khi xuất hiện lỗi sẽ thực hiện in ra giá trị của biến ketqua với giá trị ban đầu bằng
4. Nếu thay giá trị biến so2 bằng 2 thì ngoại lệ sẽ không xuất hiện và sẽ in ra giá trị của biến ketqua bằng 5 (do ketqua = so1/so2).
Lớp Exception trong C#
Các Exception trong C# được biểu diễn bởi các lớp. Các lớp Exception trong C# chủ yếu được kế thừa một cách trực tiếp hoặc không trực tiếp từ lớp System.Exception. Một số lớp Exception kế thừa từ lớp System.Exception là các lớp System.ApplicationException và System.SystemException.
Lớp System.ApplicationException hỗ trợ các exception được tạo bởi các chương trình ứng dụng. Vì thế, các exception được định nghĩa bởi lập trình viên nên kế thừa từ lớp này.
Lớp System.SystemException là lớp cơ sở cho tất cả system exception đã được định nghĩa. Bảng sau cung cấp một số lớp Exception được kế thừa từ lớp Sytem.SystemException trong C#:
Miêu tả | |
System.IO.IOException | Xử lý các ngoại lệ I/O |
System.IndexOutOfRangeException | Xử lý các ngoại lệ được tạo ra khi tham chiếu tới phân từ có một chỉ mục bên ngoài mảng |
System.ArrayTypeMismatchException | Xử lý ngoại lệ được tạo khi kiểu là không phù hợp với kiểu mảng |
System.NullReferenceException | Xử lý các ngoại lệ được tạo từ việc tham chiếu một đối tượng null |
System.DivideByZeroException | Xử lý ngoại lệ được tạo khi chia cho số 0 |
System.InvalidCastException | Xử lý ngoại lệ được tạo trong khi ép kiểu |
System.OutOfMemoryException | Xử lý ngoại lệ được tạo từ việc thiếu bộ nhớ |
System.StackOverflowException | Xử lý ngoại lệ được tạo từ việc tràn ngăn xếp (stack) |
Có thể bạn quan tâm!
- Các Phép Toán Quan Hệ Và Logic Các Phép Toán Quan Hệ
- Kết Quả Chương Trình Ví Dụ 2.9
- Kết Quả Chương Trình Ví Dụ2.12.
- Các Phương Thức Và Thuộc Tính Của System.array.
- Kết Quả Chương Trình Ví Dụ 3.2.
- Phương Thức Và Thuộc Tính Của Lớp String
Xem toàn bộ 212 trang tài liệu này.
Bảng 2.10: Một số lớp ngoại lệ
Tạo User-Defined Exception trong C#
Có thể tự định nghĩa một exception để xử lý cho một ngoại lệ nào đó. Các lớp User-Defined Exception được kế thừa từ lớp ApplicationException trong C#. Ví dụ
2.21 sau minh họa điều này:
Ví dụ 2.21: Tự định nghĩa exception.
namespace Vidu2_21
{
class Program
{
static void Main(string[] args)
{
Nhietdo nhietdo = new Nhietdo(); try
{
nhietdo.hienthinhietdo();
}
catch (Ngoailekhongdo e)
{
Console.WriteLine("Ngoailekhongdo: {0}", e.Message);
}
Console.ReadKey();
}
}
public class Ngoailekhongdo : ApplicationException
{
public Ngoailekhongdo(string message)
: base(message)
{
}
}
public class Nhietdo
{
int nhietdo = 0;
public void hienthinhietdo()
{
if (nhietdo == 0)
{
}
else
{
}
}
}
}
throw (new Ngoailekhongdo("Nhiet do la khong do"));
Console.WriteLine("Nhietdo: {0}", nhietdo);
Kết quả chương trình:
Bài 2.1
Hình 2.21: Kết quả chương trình ví dụ 2.21
Bài tập
Lập chương trình thực hiện các công việc sau:
1. Nhập số thực x từ bàn phím. Nếu dữ liệu nhập vào không đúng, chương trình yêu cầu nhập lại.
2. Tính giá trị hàm số sau rồi in kết quả ra màn hình:
𝑓𝑥= 𝑥 + 1 𝑛ế𝑢 𝑥 ≥ −1
𝑥 + 𝑠𝑖𝑛𝑥 𝑛ế𝑢 𝑥 < −1
Hướng dẫn thực hiện:
- Bước 1: Tạo ứng dụng Console đặt tên là Bai2_1.
- Bước 2: Trong phương thức Main() thêm đoạn mã lệnh thực hiện việc kiểm tra nhập x đúng theo yêu cầu.
Boolean kt; float x;
do
{
Console.Write("Nhap x = ");
kt = float.TryParse(Console.ReadLine(), out x); if (!kt) Console.WriteLine("Hay nhap so!");
} while (!kt);
- Bước 3: Viết mã lệnh tính giá trị hàm số và in kết quả
if (x <= -1) f = x + (float)Math.Sin(x);//Sử dụng lớp Math else f = (float)Math.Sqrt(x+1);
Console.WriteLine(" f({0}) = {1}", x, f); Console.ReadLine();
Kết quả chương trình:
Hình 2.22: Kết quả chương trình bài 2.1.
Bài 2.2
Lập chương trình thực hiện các công việc sau:
1. Nhập số thực x từ bàn phím. Nếu dữ liệu nhập vào không đúng, chương trình yêu cầu nhập lại.
2. Tính giá trị hàm số sau rồi in kết quả ra màn hình:
2𝑥2 + 3 𝑛ế𝑢 𝑥 ≤ 1
𝐹 𝑥 =
2𝑐𝑜𝑠𝑥 − 𝑒𝑥 𝑛ế𝑢 1 < 𝑥 < 2
5𝑥 + 1 𝑛ế𝑢 𝑥 ≥ 2
Gợi ý: Viết mã lệnh tính giá trị hàm số và in kết quả
if (x <= 1) f = 2*x*x + 3;
else if (x < 2) f = 2*(float)Math.Cos(x) - (float)Math.Exp(x); else f = 5*x+1;
Console.WriteLine(" f({0}) = {1}", x, f); Console.ReadLine();
Bài 2.3