Trả về Pascal từ thủ tục
Xin chào. Rất vui được gặp lại bạn. Bài học như thế nào? . Tôi đã có một học kỳ rất bận rộn, vì vậy tôi thậm chí có thể không giữ lời hứa của mình trên Web. Xin lỗi. Nhưng tôi vẫn tiếp tục, đừng lo lắng Show nội dung
VÂNG. Hãy bắt đầu. Chúng ta biết rằng Pascal là một ngôn ngữ có cấu trúc. Nó có nghĩa là các vấn đề được chia thành các bước và các bài toán con và sau đó được mã hóa trong một cấu trúc. Việc phân chia này được thực hiện thông qua các thủ tục và hàm. Chà, thủ tục và hàm là cái quái gì vậy? . kết thúc. Nó rất hữu ích khi một phần của chương trình phải được thực hiện nhiều lần trong các phần rải rác của chương trình. Có thể nó hơi âm u, nhưng chúng ta hãy xem cú pháp của nó Procedure procname; begin : { commands } : : end; begin end. Đây là hình thức đơn giản nhất của thủ tục. (Các chức năng sẽ được thảo luận sau) Như chúng ta có thể thấy rằng các thủ tục luôn được đặt TRÊN phần bắt đầu chính. kết thúc. Thí dụ uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end. Chạy ví dụ trước. Nhìn vào ví dụ này uses crt; begin clrscr; writeln('ABC'); writeln('Press any key when ready ...'); readkey; writeln('Hey, let''s pause !'); writeln('Press any key when ready ...'); readkey; writeln('Pause again !'); writeln('Press any key when ready ...'); readkey; end. Nó mang lại hiệu quả tương tự như ví dụ đầu tiên, phải không? . Nếu bạn là một chàng trai bình thường, bạn sẽ thích ví dụ đầu tiên. Nó rõ ràng và sạch sẽ hơn. Dễ đọc. Đặc biệt là những dòng phải thay thủ tục rất lâu. Các thủ tục và chức năng cũng vậy, làm cho mã lành mạnh hơn và dễ đọc hơn. Nó cũng làm cho cuộc sống dễ dàng hơn trong việc gỡ lỗi chương trình Các thủ tục có thể có biến riêng của nó, được gọi là biến cục bộ. Biến chỉ được biết bên trong thủ tục. Ví dụ procedure foo; var a : byte; begin a:=10; writeln(a); end; begin { main begin...end block } foo; a:=15; { This will be an error, since a is only known inside foo } end. Biến toàn cục là một biến được biết đến trong toàn bộ chương trình và các thủ tục hoặc hàm của nó. Thí dụ var b : byte; procedure foo; var a : byte; begin a:=10; b:=15; { This is legal } end; begin { main begin...end block } foo; a:=15; { This is illegal } b:=5; { This is perfectly legal } end. Nếu một biến cục bộ được khai báo bên trong một thủ tục có cùng tên với biến toàn cục, biến toàn cục sẽ bị ghi đè. Ví dụ uses crt; var a : byte; { This is the global variable } procedure foo; var a : byte; begin a:=15; writeln('foo is ',a); end; begin a:=10; writeln(a); foo; writeln(a); end. Các chức năng khá giống nhau, ngoại trừ nó có giá trị trả về. Nó giống như các hàm toán học. cú pháp function funcname : returntype; begin : { commands } : : end; begin end. Các chức năng cũng được đặt trước khi bắt đầu chính. kết thúc. Thí dụ uses crt; function yesno : boolean; var c : char; begin write('Are you sure (Y/N) ? '); repeat c:=upcase(readkey); { Make it upcase letters } until (c='Y') or (c='N'); writeln(c); if c='Y' then yesno:=true else yesno:=false; end; var x : boolean; { Don't be tricked, this is a LOCAL variable of main block } begin clrscr; writeln('Discard all changes made'); x:=yesno; if x=true then writeln('Changes discarded !'); else writeln('Changes saved !'); writeln('Quitting'); x:=yesno; if x then begin writeln('Process terminated !'); halt; end; writeln('Quit cancelled !'); writeln('Continuing process ...'); end. Bạn có thể thấy sự khác biệt lớn giữa thủ tục và chức năng không? . Giả sử hàm yesno. Nó trả về true nếu người dùng nhấn y và trả về false nếu người dùng nhấn n. Vâng, vâng, nó khá phức tạp. Nhưng, hãy cố hiểu. Hoặc là. cố gắng hiểu đoạn trích đơn giản này. (Đây mới chỉ là bắt đầu. phần cuối. Tất cả ở trên giống như cái trước. ) ________số 8_______ VÂNG. Bất kỳ câu hỏi? . Tiếp tục đi Trong một chương trình có cấu trúc tốt, chúng tôi sử dụng các biến toàn cục ở mức tối thiểu nhất có thể và sử dụng số lượng biến cục bộ tối ưu. Chúng ta có thể làm thế nào ? . Đôi khi, chúng ta cần biết một số giá trị bên trong một thủ tục. Trong trường hợp đó, chúng ta cần tham số. Chúng ta có thể đặt các tham số ngay bên cạnh tên của thủ tục hoặc tên của hàm, giả sử procedure myproc (a:integer; b:real); begin : : end; function abc (a,b : integer; c:byte) : longint; begin : : end; Hãy xem nó trong 'cuộc sống thực' uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.0 Ví dụ đơn giản ở trên cho chúng ta biết về cách tạo cửa sổ theo tọa độ (x1, y1) đến (x2, y2). Với công cụ này, chúng tôi có thể tạo nhiều cửa sổ chỉ bằng cách nhập tọa độ và mã CÙNG. Các tham số giúp chúng ta tùy chỉnh các thủ tục và hàm dễ dàng hơn. Hãy xem ví dụ này uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.1 Những ví dụ trước đây được sử dụng rộng rãi trong cuộc sống lập trình. Hãy xem cái này uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.2 Nó xuất ra uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.3 Lúc đầu, x là 15, sau đó được chuyển đến thủ tục foo dưới dạng truyền tham số a. Mặc dù việc sửa đổi một bên trong foo là hợp pháp, giá trị của x vẫn không bị ảnh hưởng. Loại phương thức truyền này được gọi là PASS BY VALUE. Còn cái này thì sao uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.4 Nó xuất ra uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.5 Nếu chúng ta thêm var trước a làm tham số truyền, giá trị của x sẽ thay đổi bất cứ khi nào a thay đổi. Loại phương thức truyền này được gọi là PASS BY REFERENCE Ta phải truyền giá trị nếu không nhất thiết phải thay đổi tham số trong thủ tục. Nếu các tham số cần thay đổi và thay đổi đó quan trọng đối với người gọi, hãy sử dụng chuyển qua tham chiếu Trong Borland Pascal 7. 0, chúng ta có thể bỏ qua các giá trị trả về của hàm. Trong các ví dụ của chúng tôi cho đến nay, chúng tôi sử dụng readkey, phải không? . Trước phiên bản 7. 0, chúng ta phải lấy giá trị trả về của nó (readkey), như thế này. c. = phím đọc;. Tuy nhiên, từ phiên bản 7. 0, chúng ta có thể bỏ qua nó bằng cách gọi readkey như thế này. đọc khóa; Bạn CÓ THỂ gọi một thủ tục khác bên trong một thủ tục hoặc hàm miễn là thủ tục/hàm gọi nằm bên dưới nó. Thí dụ uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.6 Thủ tục b gọi thủ tục a là hợp lệ. Nhưng thủ tục a KHÔNG BAO GIỜ được gọi thủ tục b. Không hợp pháp. Hàm có thể gọi các thủ tục, các thủ tục có thể gọi các hàm, các hàm cũng có thể gọi các hàm khác miễn là người gọi ở dưới mục tiêu (cái được gọi). Vì vậy, tốt hơn bạn nên sắp xếp các thủ tục và chức năng mà bạn có thể có Nếu cấu trúc if và cấu trúc vòng lặp có thể lồng vào nhau, thì các thủ tục và hàm có thể lồng vào nhau không? . Thí dụ uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.7 Thủ tục c có thể gọi thủ tục b vì c ở dưới b, nhưng thủ tục b không thể gọi thủ tục c. Thủ tục a, người bắt đầu. khối kết thúc bên dưới thủ tục b và thủ tục c, có thể gọi thủ tục b và c. Thủ tục b và c không thể được truy cập ed bởi thủ tục d và khối chính. Vì vậy, thủ tục lồng nhau chỉ có thể được truy cập bởi anh/chị/em của chúng (trong cùng một cấp độ của thủ tục lồng nhau) và cha mẹ của chúng (thủ tục cấp cho chúng). Truy cập giữa các anh em tuân theo quy tắc gọi thủ tục thông thường Tập luyện nhiềuLàm thế nào về việc gọi cho chính mình? . Thí dụ uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.8 Nhưng nó sẽ báo lỗi vì nó tự gọi mình là BẤT NGỜ. Phương pháp gọi chính nó được gọi là CUỘC GỌI RECURSIVE. Trong các cuộc gọi đệ quy, chúng ta phải
Hãy xem một ví dụ rất hay về các cuộc gọi đệ quy. nó là giai thừa. Xem phương pháp không đệ quy của hàm giai thừa ở trên, sau đó xem phiên bản đệ quy này uses crt; procedure pause; begin writeln('Press any key when ready ...'); readkey; end; begin clrscr; writeln('ABC'); pause; { Make a call to procedure pause } writeln('Hey, let''s pause !'); pause; { Make a call to procedure pause } writeln('Pause again !'); pause; { Make a call to procedure pause } end.9 uses crt; begin clrscr; writeln('ABC'); writeln('Press any key when ready ...'); readkey; writeln('Hey, let''s pause !'); writeln('Press any key when ready ...'); readkey; writeln('Pause again !'); writeln('Press any key when ready ...'); readkey; end.0 Như bạn có thể thấy giai thừa trong phương pháp đệ quy đơn giản hơn bao giờ hết. Giả sử bạn viết nhầm n-1 thành n, điều kiện kết thúc sẽ không bao giờ hoạt động. Vì vậy, nó sẽ lặp lại mãi mãi. Hãy cẩn thận Chà, chúng ta đến với một vấn đề khá nâng cao. Nó đôi khi được sử dụng mặc dù. Các cuộc gọi liên tham chiếu. Có nghĩa là 2 thủ tục hoặc hàm có thể gọi lẫn nhau uses crt; begin clrscr; writeln('ABC'); writeln('Press any key when ready ...'); readkey; writeln('Hey, let''s pause !'); writeln('Press any key when ready ...'); readkey; writeln('Pause again !'); writeln('Press any key when ready ...'); readkey; end.1 Như bạn có thể thấy, gọi a từ b là hợp pháp, nhưng gọi b từ a là bất hợp pháp. Đôi khi cần a gọi b và b gọi a. Vấn đề thực tế giống như trợ giúp theo ngữ cảnh. Đôi khi mô tả, khi nó được trỏ hoặc nhấp, nó gọi chỉ mục. Ngoài ra, chỉ mục phải gọi mô tả của nó sau khi một chủ đề được chọn. Giải pháp là. CHUYỂN ĐI CUỘC GỌI. Thí dụ uses crt; begin clrscr; writeln('ABC'); writeln('Press any key when ready ...'); readkey; writeln('Hey, let''s pause !'); writeln('Press any key when ready ...'); readkey; writeln('Pause again !'); writeln('Press any key when ready ...'); readkey; end.2 Sử dụng câu lệnh chuyển tiếp để làm cho b hiển thị với a, vì vậy a có thể gọi b. Nó nguy hiểm hơn cuộc gọi đệ quy. Nếu bạn không cẩn thận, bạn có thể thấy các triệu chứng giống như cuộc gọi đệ quy đã làm. Những gì bạn phải làm cũng giống như trong cuộc gọi đệ quy. chỉ cần cẩn thận. Các thủ tục gọi sử dụng một phần của bộ nhớ được gọi là ngăn xếp. Các cuộc gọi đối ứng chất thải được xếp chồng lên nhau nhanh hơn nhiều so với các cuộc gọi đệ quy. Nếu bạn hết ngăn xếp, chương trình của bạn sẽ bị kẹt Làm thế nào tôi có thể phá vỡ các vấn đề phức tạp? . Nhưng, tôi chỉ có thể nói với bạn điều này
Chà, đó là một trong những vấn đề phức tạp. Bạn có thể làm theo hướng dẫn. OK, đó là tất cả cho ngày hôm nay. có một bài kiểm tra tốt. =) Thủ tục so với hàm Pascal là gì?Trong pascal, các thủ tục không có câu lệnh trả về, chỉ có các hàm có . Phải là một lỗi trong văn bản. Tuy nhiên, một thủ tục có thể có câu lệnh "thoát", có thể đóng vai trò là câu lệnh "trả về" mà không có đối số, nghĩa là không có giá trị trả về. hàm có thể nhận đầu vào và chỉ trả về một đầu ra.
Thủ tục trong Pascal là gì?PASCAL - THỦ TỤC. Các thủ tục là chương trình con, thay vì trả về một giá trị đơn lẻ, cho phép thu được một nhóm kết quả . Xác định một thủ tục. Trong Pascal, một thủ tục được định nghĩa bằng từ khóa thủ tục.
Khai báo hàm trong Pascal là gì?Khai báo hàm cho trình biên dịch biết về tên hàm và cách gọi hàm . Phần thân thực tế của hàm có thể được định nghĩa riêng. hàm tối đa (num1, num2. số nguyên). số nguyên; .
3 phần chính của một chương trình Pascal là gì?Chương trình PASCAL có ba phần. . Phần đặc tả chương trình và biến; tờ khai thủ tục cấp dưới; Mã thực thi chương trình chính |