Được gửi bởi
davangmuitet
cách 1 : dùng label và goto
// mình không nhớ nguyên bản của turbo pascal (dùng delphi nha)
procedure DisplayRange;
label reout;
var N : Integer;
begin
N := 200;
reout :
N := N div 2;
if N mod 2 = 0 then Write('.....', N
if N > 0 then goto reout;
end;
cách 2 : dùng đệ quy
procedure DisplayRange;
procedure SubProc(var N : Integer);
begin
N := N div 2;
if N mod 2 = 0 then Write('.....', N
if N > 0 then SubProc(N);
end;
var N : Integer;
begin
N := 200;
SubProc(N);
end;
Bài này hình như có vấn đề, mình cùng giả lập nhấn F5 nha ( chạy từng dòng - ko bít đúng ko, lâu quá ko mó đến)
Code:
Giả sử N=200
Hàm được gọi lần 1:
procedure SubProc(var N : Integer); {N=200}
begin
N := N div 2; {N=100}
if N mod 2 = 0 then Write('.....', N); { In ra 100}
if N > 0 then SubProc(N); {N=100}
end;
Hàm được gọi lần 2:
procedure SubProc(var N : Integer); {N=100}
begin
N := N div 2; {N=50}
if N mod 2 = 0 then Write('.....', N); { In ra 50}
if N > 0 then SubProc(N); {N=50}
end;
Hàm được gọi lần 3:
procedure SubProc(var N : Integer); {N=50}
begin
N := N div 2; {N=25}
if N mod 2 = 0 then Write('.....', N); { không in}
if N > 0 then SubProc(N); {N=25}
end;
Hàm được gọi lần 4:
procedure SubProc(var N : Integer); {N=25}
begin
N := N div 2; {N=12}
if N mod 2 = 0 then Write('.....', N); { In ra 12}
if N > 0 then SubProc(N); {N=12}
end;
---- Cứ tiếp diễn tới khi N=0---
Dãy nhận được là: 100,50,12....,0
Vậy dãy này sai!
Bạn nhầm với bài nào rồi..??
Tôi nghĩ dùng goto label thì giống như viết bằng repeat until, nhưng thoát qua được cái "khó" thấy đưa ra.
Viết 1 đoạn thôi nha.
Code:
......
:label
If N>0 then
If (N mod 2) =0 then
Begin
Write(N,",");
Tong:=Tong+n;
N:=N-2;
Goto Label;
End
Else
Goto End_off;
:Enn_off
Write("Tong:",Tong);
Readln;
Bookmarks