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

nội dung

  1. cú pháp đơn giản
  2. Phạm vi
  3. Biến cục bộ và biến toàn cục
  4. Tham số (truyền theo giá trị và truyền theo tham chiếu)
  5. Các giá trị trả về bị bỏ qua
  6. Cuộc gọi liên thủ tục và/hoặc chức năng
  7. Cú pháp lồng nhau
  8. cuộc gọi đệ quy
  9. Các thủ tục/hàm liên tham chiếu
  10. Chia nhỏ vấn đề

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ều

Là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

  1. Cung cấp điều kiện chấm dứt
  2. Hãy cực kỳ cẩn thận trong mã hóa
  3. Không sử dụng quá nhiều cuộc gọi đệ quy, nói 50.000 lần
Nếu không, bạn có thể tìm thấy những triệu chứng này
  1. Treo / ngừng trả lời
  2. Máy tính "tự động lẩm bẩm"
  3. Tiếng bíp thất thường
  4. Tự động khởi động lại
  5. Tự động định dạng (không. không. Đùa thôi. )
  6. Kết quả bất ngờ khác

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

  1. Xác định chính xác vấn đề của bạn
    Giả sử bạn phải làm một chương trình ghi dữ liệu nhân viên cho một ngân hàng. Nó dùng để làm gì?
  2. Tách một quy trình khỏi quy trình khác
    Giả sử bạn làm dữ liệu nhân viên để lấy thông tin. Các quy trình là ghi dữ liệu vào đĩa, chỉnh sửa dữ liệu, xóa dữ liệu, sắp xếp dữ liệu hoặc in và hiển thị dữ liệu hoặc tìm kiếm dữ liệu
  3. Liệt kê các bước giải quyết của từng quy trình
    Giả sử trước tiên bạn ghi dữ liệu. Bạn lấy đầu vào từ bàn phím và ghi nó vào đĩa. Bạn hỏi người dùng có muốn nhập lại hay không
  4. Liệt kê các yêu cầu dữ liệu
    Dữ liệu của nhân viên có thể yêu cầu tên, chức vụ, nơi cư trú, địa điểm văn phòng, hộ tịch, tuổi, giới tính, số năm phục vụ, v.v.
  5. Xác định yêu cầu đầu ra
    Bạn có thể thiết kế đầu ra dưới dạng danh sách dữ liệu nhân viên. Nó rất hữu ích cho lý do so sánh. Hoặc có thể bạn muốn biến nó thành một biểu mẫu lưu trữ cho tài liệu hoàn chỉnh. Hoặc bạn hỏi người dùng và họ có thể chọn
  6. Xây dựng thuật toán để thực hiện quá trình
    Giả sử lấy dữ liệu từ bàn phím, nghe có vẻ. tên đầu vào, tuổi đầu vào, vị trí đầu vào, v.v. Sau đó chuẩn bị tệp, ghi dữ liệu vào đĩa, đóng tệp. Hỏi người dùng nếu họ muốn nhập thêm. Nếu họ làm, hãy lặp lại toàn bộ quá trình, nếu không thì thoát
  7. Sử dụng khả năng sáng tạo của bạn để mở rộng đầu vào, quy trình và đầu ra
    Đừng dính mô hình từ đầu vào đến đầu ra. Bạn có thể thêm sự sáng tạo của bạn. Khách hàng có thể muốn định dạng đầu ra giống hệt như họ muốn. Có lẽ bạn có thể đưa ra gợi ý trong việc sắp xếp chúng, hoặc có lẽ nếu bạn nghĩ rằng một số dữ liệu quan trọng để hiển thị hoặc in, hãy nói với khách hàng
  8. Nghĩ về tất cả những thứ hữu ích khác để thêm vào chương trình
    Giả sử bạn muốn thêm tính năng Auto-Correct, để giảm thiểu lỗi do con người gây ra. Bạn có thể ghi lại một số tên thông thường, như Jim, Dave, v.v. Ví dụ: nếu người dùng nhập Dabe, chương trình của bạn có thể đưa ra đề xuất thay đổi nó thành Dave. Vâng, một cái gì đó như thế
  9. Thực hiện nó, từng bước một
    Đừng để mọi ước mơ chỉ là ước mơ. Hãy để nó trở thành sự thật
  10. Kết hợp tất cả các chương trình để giải quyết vấn đề
    Tất cả các mô-đun của mỗi quy trình nên được tập hợp. Bạn có thể muốn khái quát hóa quy trình nhập của mình để phù hợp với từng mô-đun để tiết kiệm năng lượng và thời gian. Kết hợp chúng bằng menu. Và đừng quên thực hiện các bước hoàn thiện, để làm cho phần mềm trông thật tuyệt

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