Toịn tỏ break vộ continue

Một phần của tài liệu Đề cương bài giảng cơ sở kỹ thuật lập trình ngôn ngữ c (Trang 56 - 135)

9.2.1. Câu lệnh break

Cho phép ra khỏi for, while, dọ.while và switch. Nếu có nhiều vòng lặp lồng nhau, câu lệnh break sẽ ra khỏi chu trình(hoặc switch bên trong nhất chứa nó)

Vắ dụ: Nhập vào một số nguyên dương bất ký. Sau ựó kiểm tra xem số nguyên ựó có phải là số nguyên tố hay không

using System; class VD8 {

static void Main() {

int n,i;

bool ok = true;

ConsolẹWrite("Nhap vao so nguyen n="); n = int.Parse(ConsolẹReadLine()); for(i=2;i<=n-1;++i) if (n % i == 0) { ok = false; break; } if (ok && n != 1)

ConsolẹWrite("day la so nguyen to"); else

ConsolẹWrite("Day khong phai la so nguyen to"); ConsolẹReadKey();

} }

9.2.2. Câu lệnh continue

Dùng ựể quay về ựầu vòng lặp mới của chu trình bên trong nhất chứa nó. Vắ dụ: Nhập vào n số nguyên kiểu sau ựó cho biết số nguyên dương lớn nhất trong số các số nguyên nhập vào

using System; class VD8 {

static void Main() {

int n,x,i,max;

max = int.MinValue;

for (i = 1; i <= n; ++i) {

ConsolẹWrite("Nhap vao so nguyen thu {0}:", i); x = int.Parse(ConsolẹReadLine()); if (x < 0) continue; if (x > max) max = x; } ConsolẹWrite("Max = {0}", max); ConsolẹReadKey(); } }

! x ... ! 3 x ! 2 x S n 3 2 n x + + + = BộI 11: CHẩầNG TRừNH CON 11.1. ậẳt vÊn ệÒ

Trong khi lập chương trình chúng ta thường gặp những ựoạn chương trình ựược lặp ựi lặp lại nhiều lần ở những chỗ khác nhaụ để tránh rườm rà, những ựoạn chương trình này ựược thay thế bằng chương trình con tương ứng và khi cần, ta chỉ việc làm thủ tục gọi chương trình ựó răvới các tham số tương ứng cần thiết) mà không phải viết lại cả khúc chương trình ựó. Thắ dụ khi làm toán lượng giác, thường xuyên ta cần tắnh sin của một giá trị hay một biến x nào ựó. Như vậy ta cần lập một chương trình con có tên Sin và tham số cần thiết là x. Những chương trình con thông dụng này ựã ựược lập sẵn và ựể trong Ộthư viênỢ Trong C#, các chương trình con chuẩn này ựược phân loại và chứa trong các lớp như: Lớp chứa các hàm toán học Math, lớp chứa các hàm xử lý thời gian Timer, Ầ

Lý do thứ hai ựể xây dựng chương trình con là: một vấn ựề lớn phức tạp sẽ tương ứng với một chương trình có thể rất lớn , rất dàị Do ựó việc nhìn tổng quan cả chương trình cũng như việc gỡ rối, hiệu chỉnh sẽ rất khó khăn. Ta có thể phân tác vấn ựề phức tạp ựó ra thành nhiều các vấn ựề nhỏ hơn(tương ứng với các chương trình con) ựể dễ kiểm tra, gỡ rối từng khối một và sau ựó ghép lại thành chương trình lớn.

Trong ngôn ngữ lập trình C# chương trình con chỉ tồn tại dưới dạng các hàm

11.2. VÝ dô mét ch−ểng trừnh cã sỏ dông hộm

Xây dựng chương trình tắnh giá trị của biểu thức sau:

using System; class VD {

static double x; static int n;

static void Nhap() {

ConsolẹWrite("Nhap n=");n=int.Parse(ConsolẹReadLine()); }

static double Mu(double x,int n) { double s; int i; for(s=1,i=1;i<=n;++i) s=s*x; return s; }

static int GiaiThuăint n) { int s,i; for(i=1,s=1;i<=n;++i) s=s*i; return s; }

static void Main() { double s=0; int i; Nhap(); for(i=1;i<=n;++i) s=s+Mu(x,i)/GiaiThuăi); ConsolẹWrite("S={0:N2}",s); ConsolẹReadKey(); } }

11.3. PhỰm vi hoỰt ệéng cựa biạn

Trong C# biến và hàm phải ựược khai báo bên trong một lớp. Những biến ựược khai báo bên trong một lớp và bên ngoài các hàm(trong lập trình hướng ựối tượng(OOP) các biến ựó gọi là dữ liệu của lớp, các hàm ựược gọi là các phương thức, tạm gọi các biến này là biến toàn cục trong một lớp) các biến

này có phạm vi tác ựộng trong toàn bộ lớp nghĩa là các hàm bên trong lớp có thể truy xuất ựược. Khi khai báo các biến này ta phải thêm từ khoá static vì:

+ Các hàm này ựược gọi trong hàm Main, mà hàm Main là một hàm tĩnh (vì có từ khóa static), trong hàm tĩnh chỉ truy xuất ựược ựến biến và hàm tĩnh(việc này sẽ ựược tìm hiểu kỹ trong lập trình hướng ựối tượng) và nó ựược cấp phát bộ nhớ ngay từ khi ta thực hiện chương trình

Vắ dụ: Các biến static double x; và static int n; trong vắ dụ trên có phạm vi tác ựộng trong toàn bộ lớp, nghĩa là tất cả các phương thức trong cùng lớp ựều có thể truy nhập.

Chú ý: Thông thường những biến dùng chung cho các hàm trong cùng một lớp thì ta hay khai báo toàn cục (bên ngoài lớp)

Những biến ựược khai báo bên trong một hàm ựược gọi là biến cục bộ, phạm vi hoạt ựộng của các biến này chỉ ở bên trong hàm mà nó ựược khai báo, các biến này chỉ ựược cấp phát bộ nhớ khi hàm mà có chứa các biến này ựược gọi ra thực hiện và khi thực hiên xong thì nó sẽ bị giải phóng khỏi bộ nhớ.

Vắ dụ: Các biến double s; và int i; trong vắ dụ trên

Chú ý: Những biến dùng ựể cài ựặt thuật toán cho một hàm thì ta nên khai báo biến này là biến cục bộ, nếu biến cục bộ và biến toàn cục mà trùng tên nhau thì máy sẽ ưu tiến biến cục bộ trước

Các biến ựược khai báo bên trong hai dấu Ộ(Ộ và Ợ )Ợ sau tên hàm ựược gọi là các ựối của hàm.

đối kiểu tham trị

đối số có kiểu dữ liệu là giá trị thì sẽ ựược truyền giá trị vào cho hàm. điều này có nghĩa rằng khi một ựối tượng có kiểu là giá trị ựược truyền vào cho một hàm, thì có một bản sao chép ựối tượng ựó ựược tạo ra bên trong hàm. Một khi hàm ựược thực hiện xong thì ựối tượng sao chép này sẽ ựược hủỵ

Kiểudữliệu TênHàm(Kiểudữ liệu Tênựối1,Kiểudữ liệu Tênựối2,Ầ) Vắ dụ: static double Mu(double x,int n)

+ Trong lời gọi hàm thì giá trị của tham số thực sự sẽ ựược chuyền vào cho ựối số kiểu tham trị. Vì chỉ truyền giá trị nên nếu bên trong hàm có thay ựổi giá trị của các ựối số thì sau khi thoát khỏi hàm giá trị của các tham số thực sự không bị thay ựổi

+ Ta có thể truyền vào một hằng số trong lời gọi hàm

Vắ dụ: Nhập vào hai số a, b tìm ước số chung của hai số. using Hue = System.Console;

{

class Program {

static void Main() {

HuẹWrite("Nhap vao so a: "); int a = int.Parse (HuẹReadLine()); HuẹWrite("Nhap vao so b: "); int b = int.Parse(HuẹReadLine());

HuẹWriteLine("Gia tri a và b vừa nhập là: a= {0},b={1}",a,b); HuẹWriteLine("Uoc so chung nho nhat cua a va b la:

{0}",UocChung(a,b));

HuẹWriteLine("Gia tri a và b sau khi goi ham là: a= {0},b={1}", a, b); HuẹRead();

}

static int UocChung(int a, int b) { while (a!=b ) { if (a > b) a = a - b; if (b > a) b = b - a; }

HuẹWriteLine("Gia tri a và b trong ham sau khi tinh toan là: a= {0},b={1}", a, b); return a; } } }

đối kiểu tham chiếu

Ngôn ngữ C# còn cung cấp khả năng cho phép ta truyền các ựối tượng có kiểu giá trị dưới hình thức là tham chiếụ Ngôn ngữ C# ựưa ra một bổ sung tham số là ref cho phép truyền các ựối tượng giá trị vào trong phương thức theo kiểu tham chiếụ

Kiểudữliệu TênHàm(ref Kiểudữ liệu Tênựối1, ref Kiểudữ liệu Tênựối1,Ầ) Vắ dụ: static void HoanVi(ref int x, ref int y)

+ Ta không thể chuyền vào một hằng số trong lời gọi hàm + Trước khi gọi hàm thì tham số thực sự phải ựược khởi gán + Khi gọi hàm thì phải có từ khóa ref phắa trước tham số thực sự

+ Trong lời gọi hàm thì ựịa chỉ của tham số thực sự sẽ ựược chuyền vào cho ựối số kiểu tham chiếu của hàm. Vì vậy sau khi thoát khỏi hàm thì giá trị của tham số thực sự bị thay ựổi nếu trong hàm ta thay ựổi giá trị của ựối số mà tham số thực sự truyền vàọ

Những hàm chỉ có thể trả về duy nhất một giá trị, mặc dù giá trị này có thể là một tập hợp các giá trị. Nếu chúng ta muốn hàm trả về nhiều hơn một giá trị thì cách thực hiện là tạo các tham số dưới hình thức tham chiếụ Khi ựó trong hàm ta sẽ xử lý và gán các giá trị mới cho các tham số tham chiếu này, kết quả là sau khi hàm thực hiện xong ta dùng các tham số truyền vào như là các kết quả trả về.

Vắ dụ: Nhập vào hai số a, b, tìm ước số chung bội số chung của hai số using Hue = System.Console;

namespace ViDuDoiSo {

class Program {

static void Main() {

HuẹWrite("Nhap vao so a: "); int a = int.Parse (HuẹReadLine()); HuẹWrite("Nhap vao so b: "); int b = int.Parse(HuẹReadLine());

HuẹWriteLine("Gia tri a và b vừa nhập là: a= {0},b={1}",a,b); // Nếu không khởi gán thì trình biên dịch sẽ thông báo lỗi int us=0, bs=0;

UocBoi(a, b, ref us, ref bc);

HuẹWriteLine("Uoc so chung lon nhat cua a va b la: {0}",us); HuẹWriteLine("Boi so chung nho nhat cua a va b la: {0}", bs); HuẹRead();

}

static void UocBoi(int a, int b, ref int uc, ref int bc) { int a1=a,b1=b; while (a!=b ) { if (a > b) a = a - b; if (b > a) b = b - a; } uc=a;

bc=(int)((a1*b1)/uc); }

} }

đối kiểu tham chiếu chỉ nhận giá trị

Ngôn ngữ C# bắt buộc phải thực hiện một phép gán cho biến trước khi sử dụng, do ựó khi khai báo một biến như kiểu cơ bản thì trước khi có lệnh nào sử dụng các biến này thì phải có lệnh thực hiện việc gán giá trị xác ựịnh cho biến

để mở rộng cho yêu cầu trong trường hợp này ngôn ngữ C# cung cấp thêm một bổ sung tham chiếu là out. Khi sử dụng tham chiếu out thì yêu cầu bắt buộc phải khởi tạo các tham số tham chiếu ựược bỏ quạ Các tham số này không cung cấp bất cứ thông tin nào cho phương thức mà chỉ ựơn giản là cơ chế nhận thông tin và ựưa ra bên ngoàị Do vậy ta có thể ựánh dấu tất cả các tham số tham chiếu này là out, khi ựó ta sẽ giảm ựược công việc phải khởi tạo các biến này trước khi ựưa vào phương thức.

Lưu ý là bên trong phương thức có các tham số tham chiếu out thì các tham số này phải ựược gán giá trị trước khi trả về

Kiểudữliệu TênHàm(out Kiểudữ liệu Tênựối1, out Kiểudữ liệu Tênựối1,Ầ)

Vắ dụ: static void Ham(int x,int y, out int phannguyenm, out int phandu) Các ựối của hàm có nguyên tắc hoạt ựộng giống như biến cục bộ. Khi xây dựng một hàm chúng ta phải biết ựược hàm của chúng ta cần bao nhiêu ựối, ựối ựó thuộc kiểu gì?

+ Ta không thể chuyền vào một hằng số trong lời gọi hàm

+ Trước khi gọi hàm thì tham số thực sự không cần phải khởi gán + Khi gọi hàm thì phải có từ khóa out phắa trước tham số thực sự + Trong lời gọi hàm thì ựịa chỉ của tham số thực sự sẽ ựược chuyền vào cho ựối số kiểu tham chiếu của hàm. Vì vậy sau khi thoát khỏi hàm thì giá trị của tham số thực sự bị thay ựổi nếu trong hàm ta thay ựổi giá trị của ựối số mà tham số thực sự truyền vàọ

Vắ dụ: Nhập vào hai số a, b, tìm ước số chung bội số chung của hai số using Hue = System.Console;

namespace ViDuDoiSo {

class Program {

static void Main() {

HuẹWrite("Nhap vao so a: "); int a = int.Parse (HuẹReadLine()); HuẹWrite("Nhap vao so b: "); int b = int.Parse(HuẹReadLine());

HuẹWriteLine("Gia tri a và b vừa nhập là: a= {0},b={1}",a,b); // không cần khởi gán nhưng trình biên dịch không thông báo lỗi int us,bs;

UocBoi(a, b, out us, out bc);

HuẹWriteLine("Uoc so chung lon nhat cua a va b la: {0}",us); HuẹWriteLine("Boi so chung nho nhat cua a va b la: {0}", bs); HuẹRead();

}

static void UocBoi(int a, int b, out int uc, out int bc) { int a1=a,b1=b; while (a!=b ) { if (a > b) a = a - b; if (b > a) b = b - a; } uc=a; bc=(int)((a1*b1)/uc); } } } 11.4. CÊu tróc mét hộm

Hàm là một ựơn vị ựộc lập của chương trình, do vậy khi ựịnh nghĩa một hàm chúng ta không ựược ựịnh nghĩa một hàm bên trong một hàm khác. Một hàm có dạng tổng quát như sau:

KiểuDữLiệu TênHam(Danh sách các ựối) {

Các câu lệnh trong thâm hàm [return [Biểu thức];]

} Trong ựó:

Kiểu dữ liệu của hàm có thể là các kiểu dữ liệu cơ sở, các kiểu dữ liệu do người dùng ựịnh nghĩạ Nếu hàm không có giá trị trả về thì ta khai báo hàm trả về kiểu void. Nếu hàm trả về một giá trị thuộc kiểu dữ liệu cụ thể nào ựó thì trước khi kết thúc hàm ta phải gán giá trị cho hàm bằng câu lệnh return BiểuThức. Khi máy gặp cấu lệnh này máy sẽ tắnh toán giá trị của biểu thức ựược bao nhiêu gán cho tên hàm và thoát khỏi hàm.

Tên hàm là một tên do người dùng ựịnh nghĩa và phải tuân thủ theo nguyên tắc ựặt tên và ựặt làm sao nó mang ý nghĩa phù hợp với công việc của hàm.

Danh sách các tham ựối có thể là các kiểu ựối như ựã nêu ở trên, nếu có nhiều ựối giữa các ựối ựặt cách nhau bởi dấu phẩỵ Nếu như hàm không có ựối thì chúng ta vấn phải viết hai dấu Ộ(Ộ vàỢ)Ợ sau tên hàm

Phần thân của hàm bắt ựầu bằng dấu { và kết thúc bằng dấu } và ở giữa là các cấu lệnh thực hiện yêu cầu của hàm

4.6 Nguyến tớc hoỰt ệéng cựa hộm vộ cịch truyÒn tham sè cho hộm

Như ở trên chúng ta ựã tìm hiểu mỗi hàm có thể có ựối hoặc không. Nếu như hàm có ựối thì sau khi xây dựng xong chúng ta có thể gọi chúng ra thực hiện. Mỗi một ựối ta phải truyền cho nó một tham số tương ứng tuỳ thuộc ựối ựó là kiểu gì.

Nếu ựối là kiểu tham trị trước tiên máy sẽ cấp phát bộ nhớ cho ựối kiểu tham trị ựó, sau ựó tiến hành sao chép giá trị của tham số thực thụ với nó ựưa vào ựối nàỵ Từ ựó ta thấy tham số thực thụ tương ứng với ựối có kiểu tham trị có thể là một hằng, một biến, một biểu thức... và có kiểu tương ứng. Bởi vì ựối kiểu tham trị khi mà hàm chứa ựối này ựược gọi ra thực hiện thì nó ựược cấp phát bộ nhớ riêng sau ựó sao chép giá trị của tham số thực thụ tương ứng với nó ựưa vào và sau ựó máy tiến hành các thao tác trên ựối này mà không làm ảnh hưởng tới tham số thực thụ tương ứng với nó và cũng bởi vì nó chỉ sao chép giá trị của tham số thực thụ tương ứng với nó do vậy tham số thực thụ tương ứng với nó cứ cho một giá trị là ựược. Vì vậy tham số thực thụ tương ứng với ựối kiểu tham trị có thể là hàng, biến, biểu thức...miễn là có cùng kiểụ

Ghi chú: Theo những phân tắch ở trên những ựối chỉ nhằm mục ựắch cung cấp dữ liệu ựầu vào cho hàm thì chúng ta khai báo ựối ựó là ựối kiểu tham trị

Nếu ựối là kiểu tham chiếu ựối này sẽ tham chiếu tới tham số tương ứng với nó. Nghĩa là trong thân hàm khi ta thao tác trên ựối tham chiều này thực

chất là thao tác trên tham số truyền vào tương ứng với ựối nàỵ Do vậy mọi thay ựổi giá trị của ựối tham chiếu cũng ựồng nghĩa với việc thay ựổi giá trị của tham số tương ứng truyền vàọ điều này chứng tỏ rằng tham số tương ứng với ựối là kiểu tham chiểu phải là một biến hay phần tử của mảng có kiểu tương ứng và khi hàm chứa ựối kiểu tham chiếu này kết thúc thì tham số tương ứng với nó lưu lại ựược sự thay ựổi khi ra khỏi hàm

Trong C# có hai loại ựối kiểu tham chiếu ựó là: ựối kiểu tham chiếu ref và ựối kiểu tham chiếu out. Nếu ựối là kiểu tham chiếu ref thì tham số tương ứng với nó phải ựược khởi gán giá trị trươc khi truyền vào và nó có thể tham gia tắnh toán trong các biểu thức. Nếu ựổi là kiểu tham chiếu out thì tham số tương ứng với nó không cần khởi tạo giá trị ban ựầu, chắnh vì lẽ ựó nó chỉ dùng ựể nhận giá trị và không ựược tham gia tắnh toán trong các biểu thức.

Ghi chú: Theo những phân tắch ở trên những ựối dùng ựể cung cấp dữ liệu ựầu vào cho hàm và ựồng thời lưu lại ựược sự thay ựổi khi chúng ta tác ựộng trên những ựối này, những ựối như vậy thì chúng ta khai báo ựối kiểu tham chiếu(ref). Những ựối chỉ nhằm mục ựắch nhận giá trị khi ra khỏi hàm thì những ựối này chúng ta khai báo ựối theo kiểu tham chiếu out.

Tham số truyền vào cho ựối tham chiếu phải kèm theo hai từ khoá ref hoặc out tượng ứng với ựối kiểu tham chiếu ref và ựối kiểu tham chiếu out

Vắ dụ: Nhâp vào ba số nguyên dương sau ựó tiến hành sắp xếp ba số nguyên ựó theo thứ tự tăng dần.

using System; class VD9 {

static void HoanVi(ref int x, ref int y) {

int tg = x; x = y; y = tg; }

static void Main() {

int a, b, c;

ConsolẹWrite("Nhap a="); a = int.Parse(ConsolẹReadLine()); ConsolẹWrite("Nhap b="); b = int.Parse(ConsolẹReadLine()); ConsolẹWrite("Nhap c="); c = int.Parse(ConsolẹReadLine()); if (a > b) HoanVi(ref a, ref b);

if (a > c) HoanVi(ref a, ref c); if (b > c) HoanVi(ref b, ref c); ConsolẹWrite("a={0}\tb={1}\tc={2}", a, b, c); ConsolẹReadKey(); } }

Vắ dụ: Xây dựng chương trình giải phương trình bậc hai ax2+bx+c=0(a<>0)

using System; class VD {

static double a,b,c; static void Nhap() {

ConsolẹWrite("Nhap a=");a=doublẹParse(ConsolẹReadLine()); ConsolẹWrite("Nhap b=");b=doublẹParse(ConsolẹReadLine()); ConsolẹWrite("Nhap c=");c=doublẹParse(ConsolẹReadLine()); }

static double Deltă) {

return b*b-4*a*c; }

static void Giai(out double x1,out double x2,out bool ok) { double d=Deltă);

Một phần của tài liệu Đề cương bài giảng cơ sở kỹ thuật lập trình ngôn ngữ c (Trang 56 - 135)

Tải bản đầy đủ (PDF)

(135 trang)