PDA

View Full Version : Cứu mình với.........,sắp mặc cạn đến nơi rồi



ThangA3
13-11-2011, 11:47
ông thầy trên lớp ra bài này, tuy là cực kì dễ, nhưng lại kèm 1 yêu cầu quái đản nên mình nghĩ mãi ko ra. giúp mình nha cac bạn.
nhập từ bàn phím sô N (<=100), in ra tất cả các sô chẵn <= N.
( ko đc dùng vòng lặp như while..do.. hay for ..to..do hoặc repeat...until...).
chỉ đc dùng if...then....
thế đấy. dùng vòng lặp thỳ coi như ko có điểm,

nhok_LTK
13-11-2011, 12:11
Mình nghĩ là thế này : Bạn công dồn vào biến x và in ra , đồng thời so sánh với n, khi x=n thì thoát chương trình . Bn nào có cách hay hơn thì chỉ giáo thêm nhá ;))


var
n,x:integer;
begin
x:=-2;
readln(n);
x:=x+2;
writeln(x);
if x=n then halt;
x:=x+2;
writeln(x);
if x=n then halt;
.
.
.
(copy khoảng 50 lần)
end.

kraken
13-11-2011, 12:29
Thử xài goto dán mác label vào xem @-)
Goto: lệnh nhảy không điều kiện.
Tham khảo cụ thể google bạn nhé :)

azurelonely
13-11-2011, 17:24
Có nhiều cách, bạn cũng có thể sài switch case cũng đc...nhưng mà hơi dài thôi
Nếu có thể viết ctrinh con thì sài đệ quy

Em Chán Gà
14-11-2011, 03:37
Vấn đề là thuật toán thôi!
Cứu bạn nè:
Dùng công thức tính TỔng của cấp số cộng.
http://sanchoinho.com/images/capsocong.png

Sn là tổng của N số.
a1 số đầu (trong bài này luôn = 2)
d= công sai ( trong bài này cũng luôn là 2)

- Nếu N chẵn thì nó là tổng của 2,4,6.... N ==> Tổng S với a1=2, d=2, n=N
- Nếu N lẻ thì nó là tổng của 2,4,6.... N-1 ==> Tổng S với a1=2, d=2, n=N-1


Đến đây thì quá dễ rồi, bạn tự viết nha!

PS: Làm Pascal thì cần Kiến thức Toán Học + Tư Duy, đừng vội nghĩ nó cao siêu quá.

Một bài cũng thuộc dạng kinh điển: "Cho 2 biến a,b là integer. Không dùng biến trung gian thứ 3 (trong var chỉ khai báo 2 biến), hãy đổi chỗ giá trị của hai biến."

ThangA3
14-11-2011, 07:37
Vấn đề là thuật toán thôi!
Cứu bạn nè:
Dùng công thức tính TỔng của cấp số cộng.
http://sanchoinho.com/images/capsocong.png

Sn là tổng của N số.
a1 số đầu (trong bài này luôn = 2)
d= công sai ( trong bài này cũng luôn là 2)

- Nếu N chẵn thì nó là tổng của 2,4,6.... N ==> Tổng S với a1=2, d=2, n=N
- Nếu N lẻ thì nó là tổng của 2,4,6.... N-1 ==> Tổng S với a1=2, d=2, n=N-1


Đến đây thì quá dễ rồi, bạn tự viết nha!

PS: Làm Pascal thì cần Kiến thức Toán Học + Tư Duy, đừng vội nghĩ nó cao siêu quá.

Một bài cũng thuộc dạng kinh điển: "Cho 2 biến a,b là integer. Không dùng biến trung gian thứ 3 (trong var chỉ khai báo 2 biến), hãy đổi chỗ giá trị của hai biến."
mình vẫn chưa hiểu, có công thức, rồi làm sao in ra tât cả các số đc

Em Chán Gà
15-11-2011, 04:58
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)


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.

......
: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;

davangmuitet
15-11-2011, 13:14
// xin lỗi vì cao hứng hơi ngớ ngẩn


// 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 := 100;
reout :
Write('.....', N
N := N - 2;
if N >= 0 then goto reout;
end;

// cách 2 : dùng đệ quy

procedure DisplayRange;
procedure SubProc(var N : Integer);
begin
Write('.....', N
N := N - 2;
if N >= 0 then SubProc(N);
end;
var N : Integer;
begin
N := 100;
SubProc(N);
end;

// Mình không dùng turbo pascal nên không có trình biên dịch để kiểm tra kết quả, nhưng kiến
// trúc như vậy là không sai, đây là dạng tiêu biểu khi mấy ông viết sách đến phần đệ quy.
// Thường thì mấy ông viết sách sẽ cho rằng dùng label và goto là hạ sách nhưng thực tế nórất
// hữu dụng ở một số trường hợp, không những thế khi dịch ra ngôn ngữ máy nó sẽ có thế
// mạnh tương đồng với assembly

lonelynight2804
15-11-2011, 14:04
Không biết viết Pascal. Viết C# rùi bạn tự chuyển nhá. Dùng đệ quy.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Vui long nhap 1 so: ");
try
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Ban vua nhap vao so: {0}",n);
Console.WriteLine("Danh sach cac so chan trong khoang tu 0 den {0} la:",n);
DeQuy(n);
Console.Read();
}
catch
{
Console.WriteLine("Thong tin ban vua nhap khong hop le");
}
}

private static void DeQuy(int n)
{
if (n < 0)
{
return;
}
else
{
if (n % 2 == 0)
{
Console.WriteLine(n);
DeQuy(n - 2);
}
else
{
Console.WriteLine(n-1);
DeQuy(n - 2);
}
}
}
}
}

timata
15-11-2011, 14:37
Tình hình là Đọc code rất khó với những người không biết gì (chẳng hạn mình biết về C mà lại bắt đọc code Java thì rất mệt, tốn thời gian học).
Nên chúng ta cần Mã giả:
Begin // Bắt đầu chương trình
Nhập số N;
i = 0;
InSo (i; N); //Ý tưởng chính là Đệ qui hàm

Function InSo (i , N)
Begin
if i nhỏ hơn hoặc bằng N
then
if i chia het 2
then Xuat ra i;
Inso (i + 1, N);
endif
endif
End

End // Kết thúc chương trình

wuanwu
15-11-2011, 21:58
ông thầy trên lớp ra bài này, tuy là cực kì dễ, nhưng lại kèm 1 yêu cầu quái đản nên mình nghĩ mãi ko ra. giúp mình nha cac bạn.
nhập từ bàn phím sô N (<=100), in ra tất cả các sô chẵn <= N.
( ko đc dùng vòng lặp như while..do.. hay for ..to..do hoặc repeat...until...).
chỉ đc dùng if...then....
thế đấy. dùng vòng lặp thỳ coi như ko có điểm,

Lâu không code bằng Pascal, nhưng có lẽ đúng.


procedure even(k, n: word);
begin
if k <= n then
begin
write(k:8);
even(k+2,n)
end
end;
var n: word;
BRGIN
write('n = '); readln(n);
even(2,n);
readln
END.

haplinhavxt
17-11-2011, 22:50
Tại sao ko dùng đệ quy nhỉ :)))))