Chương trình con
Chương trình con là một phần riêng biệt của chương trình có tên và giải quyết nhiệm vụ riêng của nó. Chương trình con nằm ở đầu chương trình chính và có thể được khởi chạy (được gọi) từ chương trình chính bằng cách chỉ định tên.
Việc sử dụng chương trình con cho phép bạn tránh trùng mã, nếu bạn cần viết cùng một mã ở những vị trí khác nhau trong chương trình.
Các thư viện được nhập vào chương trình (ví dụ: thư viện toán học сmath.h ) bao gồm các chương trình con đã được ai đó biên dịch. Các lập trình viên không cần phải suy nghĩ về những thuật toán mà họ thực hiện, mà chỉ cần áp dụng chúng, chỉ nghĩ về chính xác những gì họ đang làm. Đây là một tiết kiệm thời gian lớn. Không cần phải viết một thuật toán đã được viết bởi người khác.
Mỗi quy trình chỉ nên thực hiện một nhiệm vụ, hoặc chỉ tính toán điều gì đó hoặc xuất ra một số dữ liệu hoặc làm điều gì đó khác.
Chương trình con có hai loại - thủ tục và hàm.
Chương trình con thực hiện một số hành động, ví dụ: hiển thị kết quả trên màn hình ở một dạng nhất định (ví dụ đơn giản, toán tử printf() là chương trình con chuẩn in thông tin ra màn hình)
Các chương trình con hàm trả về kết quả (số, chuỗi ký tự, v.v.) mà chúng ta có thể sử dụng trong chương trình chính.
Hãy thử viết một thủ tục đơn giản:
Giả sử chúng ta muốn hiển thị chuỗi " Lỗi" mỗi khi mã xảy ra lỗi có thể do lỗi của người dùng (ví dụ: khi anh ta nhập dữ liệu không chính xác)
Điều này có thể được thực hiện bằng cách viết tuyên bố
cout << "Lỗi";
Và bây giờ hãy tưởng tượng rằng một dòng như vậy cần được chèn vào nhiều chỗ trong chương trình. Tất nhiên, bạn chỉ có thể viết nó ở khắp mọi nơi. Nhưng giải pháp này có hai nhược điểm.
1) chuỗi này sẽ được lưu trong bộ nhớ nhiều lần
2) nếu chúng ta muốn thay đổi đầu ra do lỗi, chúng ta sẽ phải thay đổi dòng này trong suốt chương trình, điều này khá bất tiện
Đối với những trường hợp như vậy, các thủ tục là cần thiết.
Một chương trình với một thủ tục có thể trông như thế này:
#include<iostream>
sử dụng không gian tên std;
void printError() // mô tả thủ tục
{
cout << "Lỗi"; // thân thủ tục - các lệnh mà thủ tục sẽ thực hiện
}
chủ yếu()
{
...
printError() // bắt đầu thủ tục thực thi. Chúng tôi chỉ chỉ định tên của thủ tục mà chúng tôi muốn thực hiện.
...
lỗi in()
...
}
Quy trình bắt đầu bằng từ void . Có dấu ngoặc trống sau tên quy trình.
Tất cả các câu lệnh được thực thi trong một thủ tục đều được thụt vào.
Các thủ tục được viết trước hàm chính main()
Để thực hiện một thủ tục, trong chương trình chính, bạn cần gọi thủ tục đó bằng tên và nhớ viết dấu ngoặc đơn!
Bạn có thể gọi một thủ tục trong một chương trình nhiều lần.
|
Bây giờ, hãy tưởng tượng rằng chúng ta cần hiển thị các thông báo khác nhau để phản hồi lỗi của người dùng, tùy thuộc vào loại lỗi mà anh ta mắc phải.
Trong trường hợp này, bạn có thể viết quy trình của riêng mình cho mỗi lỗi:
vô hiệu printErrorZero()
{
cout << "Lỗi. Chia cho số không!";
}
vô hiệu printErrorInput()
{
cout << "Lỗi nhập liệu!";
}
Điều gì xảy ra nếu có nhiều lỗi hơn có thể xảy ra? Giải pháp này sẽ không phù hợp với chúng tôi!
Chúng ta cần học cách kiểm soát quy trình bằng cách cho nó biết thông báo lỗi nào sẽ hiển thị.
Để làm điều này, chúng ta cần các tham số mà chúng ta sẽ viết trong ngoặc đơn sau tên thủ tục
void printError(chuỗi)
{
cout << S;
}
Trong thủ tục này, s là một tham số - một biến đặc biệt cho phép bạn kiểm soát thủ tục.
Tham số là một biến xác định cách hoạt động của chương trình con. Tên tham số được liệt kê cách nhau bằng dấu phẩy trong tiêu đề chương trình con. Loại tham số được viết trước tham số.
Bây giờ, khi gọi thủ tục, bạn cần chỉ ra trong ngoặc đơn giá trị thực sẽ được gán cho tham số (biến s) bên trong thủ tục của chúng ta
printError("Lỗi! Chia hết cho 0!");
Giá trị này được gọi là một đối số.
Đối số là giá trị tham số được truyền cho chương trình con khi nó được gọi.
Một đối số có thể không chỉ là một giá trị hằng số mà còn có thể là một biến hoặc một biểu thức số học.
|
Biến cục bộ và biến toàn cục
Thường cần phải sử dụng các biến bổ sung sẽ chỉ được sử dụng trong chương trình con. Các biến như vậy được gọi là cục bộ (hoặc cục bộ) và chỉ có thể được thao tác trong chương trình con nơi chúng được tạo.
Phạm vi biến cục bộ là khối được khai báo trong dấu ngoặc nhọn
Chương trình chính trong C++ cũng là chương trình con nên tất cả các biến được khai báo bên trong main() đều là biến cục bộ.
Các chương trình con khác không "biết" gì về các biến cục bộ của các chương trình con khác.
Như vậy, có thể giới hạn phạm vi (scope) của một biến chỉ cho chương trình con ở những nơi thực sự cần thiết. Trong lập trình, kỹ thuật này được gọi là đóng gói - ẩn một biến khỏi bị thay đổi từ bên ngoài.
Nếu cần khai báo một biến có thể nhìn thấy ở bất kỳ đâu trong chương trình (trong bất kỳ chương trình con nào), thì các biến đó được khai báo bên ngoài tất cả các chương trình con (xem chương trình 3 trong bảng bên dưới).
Các biến như vậy được gọi là toàn cục.
Trong C++, khi chương trình bắt đầu, tất cả các biến toàn cục sẽ tự động được đặt thành 0 (các biến boolean nhận giá trị false ).
Phân tích ba chương trình:
1) Trong chương trình này, biến i là cục bộ. Biến cục bộ được khai báo bên trong chương trình con |
2) Ở đây, ngay cả khi có một biến i trong chương trình chính (với giá trị 7), một biến cục bộ mới i với giá trị 5 sẽ được tạo.
Khi chạy chương trình này, màn hình sẽ hiển thị giá trị 75 |
3) Chương trình này có biến toàn cục i. Giá trị của nó có thể được thay đổi bên trong chương trình con và bên trong chương trình chính
Thủ tục sẽ làm việc với biến toàn cục i và nó sẽ được gán giá trị mới bằng 2. Giá trị 2 | được hiển thị trên màn hình
kiểm tra khoảng trống()
{
int tôi = 5;
cout << Tôi;
}
|
kiểm tra khoảng trống()
{
int tôi = 5;
cout << Tôi;
}
chủ yếu()
{
int tôi = 7;
cout << Tôi;
Bài kiểm tra();
}
|
#include <iostream>
sử dụng không gian tên std;
int tôi;
kiểm tra khoảng trống()
{
tôi = 2;
}
chủ yếu()
{
Bài kiểm tra();
cout << Tôi;
}
|
Nhiệm vụ
Viết thủ tục hoán đổi giá trị của hai biến.
Điểm đặc biệt của tác vụ này là chúng ta cần những thay đổi được thực hiện trong quy trình để chương trình gọi được biết đến.
Hãy thử viết thủ tục như thế này:
void Swap ( int a, int b ) // với mô tả các tham số thủ tục như vậy,
{ // giá trị của các đối số (x và y) sẽ được sao chép,
int c; // biến a và b là biến độc lập không liên quan đến x và y
c = a; a = b; b=c;
}
chủ yếu()
{
int x=1, y=2;
Hoán đổi (x, y); // giá trị của biến x và y (đối số) được sao chép vào tham số a và b
cout << "x=" << x<< ", y=" << y; // x=1, y=2
}
Nếu bạn chạy chương trình này, bạn có thể thấy rằng giá trị của các biến x và y không thay đổi. Để các tham số thay đổi giá trị của đối số, bạn phải sử dụng truyền dữ liệu theo tham chiếu. Để làm điều này, sau tên của loại dữ liệu trong tiêu đề của chương trình con, bạn phải đặt dấu & code> ("ampersand").
hoán đổi vô hiệu ( int & a, int & b ) // bây giờ biến a và b lấy địa chỉ của biến x và y trong bộ nhớ
{
int c;
c = a; a = b; b=c;
}
Cách sử dụng: Nếu bạn truyền đối số bằng tham chiếu, thì chỉ có tên biến (KHÔNG phải số và KHÔNG phải biểu thức số học) có thể ở vị trí này khi gọi thủ tục!< br />
KHÔNG gọi thủ tục như thế này:
Hoán đổi(x, 4 );
Hoán đổi(5+x, y);
|
|