Pascal - Tin học trẻ không chuyên(Cực hay)

M

marik

Viết chương trình tính số hạng thứ n của dãy Fibonaci mà không cần dùng đến mảng số. Số n được nhập từ bàn phím'

Đề cực hay. Mọi người dzô làm nhé. Làm xong mình post tiếp.

bài này anh có 2 cách giải:

1- dùng hàm đệ quy

var n: integer;
function fibo(m:integer):integer;
var k:integer;
begin
if (m =1) then k = 0 else
if (m =2) then k = 1 else k= fibo(m-1) + fibo(m-2);
fibo:=k;
end;
begin
write('Nhap n: '); readln(n);
write('So fibo thu n la: ',fibo(n));
readln;
end.

2 - dùng công thức toán học trực tiếp

var n:integer;
function mu(k,h: integer);
var m:integer;
begin
for i:=1 to h do m:=m*k;
mu:=m;
end;
begin
write('Nhap n: ');readln(n);
write('So fibo thu n la: ',round(1/sqrt(5)*(mu((1+sqrt(5))/2,n) - mu((1-sqrt(5))/2,n)));
readln;
end.
 
Last edited by a moderator:
N

ngtung2

Ma trận 10x10

Nhập ma trận vuông A[10x10]. Sau đó
a. Đếm các phần tử lớn hơn 0.
b. Đếm các phần tử nhỏ hơn 0.
c. Đếm các phần tử =0.
Đưa kết quả ra màn hình.


Riêng phần mảng 2 chiều thì mình chịu luôn. Ghét nhất là làm ma trận.
 
Last edited by a moderator:
M

marik

Nhập ma trận vuông A[10x10]. Sau đó
a. Đếm các phần tử lớn hơn 0.
b. Đếm các phần tử nhỏ hơn 0.
c. Đếm các phần tử =0.
Đưa kết quả ra màn hình.


Riêng phần mảng 2 chiều thì mình chịu luôn. Ghét nhất là làm ma trận.

bài này cơ bản mà em @@

var a:array[1..10,1..10] of integer;
i,j,k,am,duong:integer;
begin

for i:=1 to 10 do
for j:=1 to 10 do
begin
write('Nhap phan tu A[,i,',',j,']: '); readln(a[i,j]);
end;
k:=0;
am:=0;
duong:=0;
for i:=1 to 10 do
for j:=1 to 10 do
begin
if a[i,j]=0 then k:=k+1
else if a[i,j]<0 then am:=am+1
else duong:=duong+1;
end;
writeln('So so 0 la: ',k);
writeln('So so am la: ',am);
writeln('So so duong la: ',duong);
readln;
end.
 
N

ngtung2

Anh oi, anh co the noi lai cho em phan mang 2 chieu duoc ko anh. Em chua hieu lam ve phan nay.
 
N

ngtung2

Anh ơi, đệ quy là gì hả anh? Giải thích giúp em với,thứ 3 em đi thi rồi
 
M

marik

Đệ quy sẽ lâu, CT sẽ sai số :D

a:=1;
b:=1;
i:=2;
While i<n-1 do
Begin
a:=a+b;
b:=b+a;
i:=i+2;
End;
If i=n-1 then Write(a+b) else write(b);

CT không hề có sai số em nhé ;)). Còn cái đệ quy không hiểu sao trong đầu anh luôn mặc định thuật toán này tốt chỉ sau quy hoạch động 8-}, sẽ nghiên cứu lại sau!!!

@ngtung: hàm đệ quy là một hàm gọi chính nó trong chương trình, nhìn ct kia em sẽ hiểu! Còn cái mảng 2 chiều em vướng mắc chỗ nào thì anh giúp đc thì giúp chứ anh ko thể trình bày như sách đc :|
 
N

ngtung2

Anh biết tính giai thừa ko anh? Đề bài là: Cho nhập một số n từ bàn phím, tinh N!.
Em viết thế này
Var n,i,p:integer;
begin
write('nhap n=');
readln(n);
p:=1;
for i:=1 to n do p:=p*i;
write('n!=',p);
readln;
end.
Anh em có sai xót chỗ nào ko chỉnh lại cho em. Nhà em ko vào được tpx nên ko kiểm tra được toàn phải chạy bằng đầu
 
D

duynhan1

p nên khai báo kiểu int64 chứ khai báo integer thì chỉ tính được đến 9! :D
 
O

ochuotqb

bài này tìm dãy số fibonaci

Var a,b,c,i:integer;
begin
write('nhap so hang thu n'); readln(n);
if (n=1) or (n=2) then c:=1;
else
begin
a:=1; b:=1;
for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
end;
writeln('giá trị của n là',c');
readln
end.

Nếu sai mong các anh nương tay ;))
 
Last edited by a moderator:
P

phuongthanh31

doan nay co nghia la gi vay? giup minh vs , mai thi roi:
bai tap:vỉt chuong trinh nhan biet so tu nhien n duoc nhap tu ban phim co phai la so nguyen to khong?
?????????
...............
writeln('n='); readln(n);
if n<=1 then writeln('n khong la so nguyen to');
else
begin
i:=2; {tai sao lai gan gia tri cua i????????????i de lam gi??}
while(n mod i<>0) do i:=i+1;{n khong chia het cho i sao la so nguyen to****************************/}
if i=n then writeln ('n khong la so nguyen to');
else('n la so nguyen to');
.................
 
A

auauau97

doan nay co nghia la gi vay? giup minh vs , mai thi roi:
bai tap:vỉt chuong trinh nhan biet so tu nhien n duoc nhap tu ban phim co phai la so nguyen to khong?
?????????
...............
writeln('n='); readln(n);
if n<=1 then writeln('n khong la so nguyen to');
else
begin
i:=2; {tai sao lai gan gia tri cua i????????????i de lam gi??}
while(n mod i<>0) do i:=i+1;{n khong chia het cho i sao la so nguyen to****************************/}
if i=n then writeln ('n khong la so nguyen to');
else('n la so nguyen to');
.................
Hình như đoạn của bạn không chạy được hay sao ý.
Đoạn của bạn chắc chắn sai rồi:
writeln('n='); readln(n);
if n<=1 then writeln('n khong la so nguyen to');
else
begin
i:=2; {tai sao lai gan gia tri cua i????????????i de lam gi??}
while(n mod i<>0) do i:=i+1;{n khong chia het cho i sao la so nguyen to****************************/}
if i=n then writeln ('n khong la so nguyen to');{Trước else không có dấu ';'}
else('n la so nguyen to');{thế else cái gì, sau else là câu lệnh cơ}
đáng nhẽ i=n thì n là nguyên tố và ngược lại.
 
A

auauau97

Mình nghĩ bạn nên làm như sau, sẽ đơn giản và dễ hiểu hơn nếu dùng vòng for:
Mã:
Uses crt;
Var
  i,n:longint;
BEGIN
  Clrscr;
  Write('nhap so n:');
  Readln(n);
  For i:=2 to round(sqrt(n)) do
  If n mod i=0 then
    Begin
      Write(n,' khong la so nguyen to');
      Readln;
      Exit;
    End;
  Write(n,' la so nguyen to');
  Readln;
END.
Mình nghĩ cách này sẽ tốn ít thời gian hơn cách dùng while do của bạn.
Thanks nếu thấy có ích bạn nhé.
 
A

auauau97

bài này tìm dãy số fibonaci

Var a,b,c,i:integer;
begin
write('nhap so hang thu n'); readln(n);
if (n=1) or (n=2) then c:=1;
else
begin
a:=1; b:=1;
for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
end;
writeln('giá trị của n là',c');
readln
end.

Nếu sai mong các anh nương tay ;))

Đầu tiên, trương trình, bạn không khai báo số n mà lại có câu lệnh:
readln(n);----------> 100% máy báo lỗi.
Thứ hai:
Var a,b,c,i:integer;
begin
write('nhap so hang thu n'); readln(n);
if (n=1) or (n=2) then c:=1;{Sau else không được có ';'}
else
begin
a:=1; b:=1;
for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
end;
writeln('giá trị của n là',c');{Thứ 3: chỗ sau c không có dâu nháy " ' "}
readln
end.
Kể cả khi sửa các lỗi đó, thì chương trình bạn chạy sẽ luôn hiện ra số fibonaci là số 2, bất kì bạn nhập n là bao nhiêu.
 
A

auauau97

Đoạn for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
Luôn cho c=2 vì :
c:=a+b mà a=1, b=1 do bạn đã gán nên c=1+1=2
a=b nên a=1
b=c nên b=2
Các phép toán không liên quan tới i cả nên bạn cho vòng for i:=1 to n do thì nó cũng chẳng làm gì cả.
 
N

nvtan256

CT không hề có sai số em nhé ;)). Còn cái đệ quy không hiểu sao trong đầu anh luôn mặc định thuật toán này tốt chỉ sau quy hoạch động 8-}, sẽ nghiên cứu lại sau!!!

@ngtung: hàm đệ quy là một hàm gọi chính nó trong chương trình, nhìn ct kia em sẽ hiểu! Còn cái mảng 2 chiều em vướng mắc chỗ nào thì anh giúp đc thì giúp chứ anh ko thể trình bày như sách đc :|
-tính theo ct sẽ ra kiểu số thực. đệ quy kỉu này sẽ có nhiều hàm đc tính nhiều lần làm tăng thời gian chạy chương trình.

- đệ quy sẽ tốn khá nhiều bộ nhớ. ko cái thuật toán nào tốt hưn cái nào đâu, biết dùng đúng lúc đúng chỗ mới tốt.
 
H

hoangha8394

Theo mình được biết thì đệ quy không tốn bộ nhớ vì các biến dùng đệ quy là biến cục bộ Đệ quy chỉ có nhược điểm là chậm thôi

Khi dùng đệ quy thì sẽ tốn stack trong bộ nhớ của pascal,nếu đệ quy gọi lồng nhau quá nhiều lần sẽ gây tràn stack.
Để tăng stack của pascal các bạn có thể dùng cú pháp
{$M+ 64000000,0,64000000}
lên đầu chương trình


 
N

nghiahung2000

Đoạn for i:=1 to n do
c:=a+b;
a:=b;
b:=c;
Luôn cho c=2 vì :
c:=a+b mà a=1, b=1 do bạn đã gán nên c=1+1=2
a=b nên a=1
b=c nên b=2
Các phép toán không liên quan tới i cả nên bạn cho vòng for i:=1 to n do thì nó cũng chẳng làm gì cả.
mình nghĩ bạn ấy làm thuật toán sắp xếp đấy.
Đúng nè:
for i:= 1 to (n-1) do
for j:= (i+1) to n do
if a<a[j] then
begin
tam:=a+a[j];
a[j]:=a;
a:=tam-a[j];
end;
 
Top Bottom