[Pascal] Tại sao em chạy được rùi mà... đáp án là sai...

O

ochuotqb

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Đây là 1 bài... nhập vào từ bàn phím các số. rồi in ra màn hình có bao nhiêu số nguyên tố và trung bình cộng của các số nguyên tố đó bằng mấy. ( Thấy nhục cái mặt...)
program Help;
var i,n,s,m,j:integer;
a: array [1..100] of integer;
begin
write('nhap so phan tu cua day: ');
readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a);
end;
n:=0;
s:=0;
for i:=1 to n do
for j:=2 to a-1 do
if a mod 2=0 then
begin
m:=0;
m:=m+1;
if m=0 then
n:=n+1;
s:=s+a;
end;
s:= s div n;
write('Co',i,' so nguyen to. Trung binh cong la',s);
readln
end.

Ai giúp được giúp em....
Em thank liền
 
A

auauau97

program Help;
var i,n,s,m,j:integer;
a: array [1..100] of integer;
begin
write('nhap so phan tu cua day: ');
readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a);
end;
n:=0;:Thế này thì số phàn tử bằng 0 nên ở còng lặp:
for i:=1 to n do chương trình đã sai rồi nên đoạn trương trình ở phía sau coi như hỏng cả.
s:=0;
for i:=1 to n do
for j:=2 to a-1 do
if a mod 2=0 then
begin
m:=0;
m:=m+1;
if m=0 then
n:=n+1;
s:=s+a;
end;
s:= s div n;
write('Co',i,' so nguyen to. Trung binh cong la',s);
readln
end.


Còn đây là bài của mình, làm theo hai cách, cách 1 không dùng hàm, cách 2 dùng hàm
Cách 1:
Program Help;
Uses crt;
Var
a:array[1...100] of longint;
n,i,j,dem,tong:longint;
Nt:byte;
s:real;
BEGIN
Clrscr;
Write('NHap so phan tu cua mang');
Readln(n);
For i:=1 to n do
Begin
write('nhap a[',i,']:');
readln(a);
End;
For i:=1 to n do
For j:=1 to round(sqrt(a);
Begin
dem:=0;
tong:=0;
Nt:=1;
If i mod j=0 then
Begin
Nt:=0;
Break;
End;
If Nt=1 then
Begin
dem:=dem+1;
tong:=tong+a;
End;
End;
Writeln('So cac so nguyen to cua day:',dem);
Writeln('Trung binh cong cac so nguyen to cua mang:',tong/dem );
Readln;
END.
 
A

auauau97

Cách 2 sử dụng hàm kiểm tra số nguyên tố, cách này tối ưu hơn:
Program Help;
Uses crt;
{---------------------------------------------------------------------------------------------------------------}
Fuction NT(n:longint)boolean;
Var
i:longint;
Begin
For i:=2 to round(sqrt(n)) do
If i mod j=0 then
Begin
Nt:=False;
Exit;
End;
Nt:=True;
End;
{---------------------------------------------------------------------------------------------------------------}
Var
a:array[1...100] of longint;
n,i,dem,tong:longint;
Nt:byte;
s:real;
BEGIN
Clrscr;
Write('NHap so phan tu cua mang');
Readln(n);
For i:=1 to n do
Begin
write('nhap a[',i,']:');
readln(a);
End;
dem:=0;
tong:=0;
For i:=1 to n do
If NT(a) then
Begin
dem:=dem+1;
tong:=tong+a;
End;
Writeln('So cac so nguyen to cua day:',dem);
Writeln('Trung binh cong cac so nguyen to cua mang:',tong/dem );
Readln;
END.
 
O

ochuotqb

program Help;
var i,n,s,m,j:integer;
a: array [1..100] of integer;
begin
write('nhap so phan tu cua day: ');
readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a);
end;
n:=0;:Thế này thì số phàn tử bằng 0 nên ở còng lặp:
for i:=1 to n do chương trình đã sai rồi nên đoạn trương trình ở phía sau coi như hỏng cả.

s:=0;
for i:=1 to n do
for j:=2 to a-1 do
if a mod 2=0 then
begin
m:=0;
m:=m+1;
if m=0 then
n:=n+1;
s:=s+a;
end;
s:= s div n;
write('Co',i,' so nguyen to. Trung binh cong la',s);
readln
end.


Bác này bị lộn à... sao mà nói thế.. dòng đỏ ở trên tôi ghi đâu.
 
O

ochuotqb

Sao chỗ này buồn cười thế
m:=0; m:=m+1 thì làm sao m=0 được

Cái chổ này là vì cứ mổi khi a mod j=0 thì m=0, m:=m+1, nó cứ đổi mãi như thế nếu không gán m=0 thì dù a là 1 số nguyên tố nhưng câu lệnh dưới vẩn sẽ lớn hơn 0.
 
Last edited by a moderator:
O

ochuotqb

ờ... mình muốn các bạn chỉnh sửa giúp cái cách của mình.. cái bài đó mình thiếu cái gì. sai ở chổ nào... để mình biết cái sai mà sửa...
 
A

auauau97

Muốn nói ra chỗ sai thì khó nói cho hiểu được lắm.
Mình có 1 phương pháp có thể giúp bạn hiểu hơn về bài làm của bạn cũng như của mọi người:

Ở cửa sổ làm việc của turbo pascal.
Bạn mở 1 bài làm nhé.
Ấn Ctrl+F7 để mở cửa sổ Add Watch,
Cửa sổ này sẽ giúp bạn tính từng giá trị của các biến trong chương trình thay đổi qua từng câu lênh, điều này sẽ cho bạn biết chỗ sai cảu mình.
Nói cách khác, Add watch sẽ chạy từng câu lệnh 1 và ghi các giá trị biến (mà bạn cần theo dõi ) thay đổi như thế nào.
Sau khi bạn mở cửa sổ Add Watch.
Bạn đánh tên giá trị mà bạn cần theo dõi(theo dõi các giá trị của biến thay đổi sau mỗi câu lệnh).Ấn Enter.
Nếu bạn muốn thêm 1 giá trị nữa thì ấn phím Insert và tiếp tục nhập.
Cửa sổ Add Watch khá to, có thể nó sẽ làm cản trở quá trình đánh chương trình của bạn, nên chúng ta sẽ làm nó nhỏ lại bằng cách:

Ấn Crtl+F5,
Sau đó ta sẽ dùng phím mũi tên để di chuyển nó.
Nếu bạn muốn nó nhỏ lại thì giữa Shift và ấn các phím mũi tên tùy theo kích cỡ bạn muốn thay đổi , bây giờ mà mô tả thì khá khó, nhưng khi bạn làm thì sẽ hiểu ngay thôi.
Khi xong, bạn ấn Enter đề quay lại màn hình làm việc.
Bạn có thể ấn F6 để ẩn hoặc hiện cửa sổ Add Watch trước hoặc sau cửa sổ làm việc.
Khi chạy chương trình, bạn đừng ấn Crtl+F9 mà ấn
F7 để chạy chương trình từng bước 1 và ghi các giá trị vào cửa sổ Add Watch.


Chú ý:
Nếu bạn muốn Del giá trị nào tong Add Watch thì kích vào giá trị đó, ấn delete.
Sau khi bạn tắt cửa sổ Add Watch bằng chuột hoặc bàn phím thì trên màn hình sẽ hiện ra dòng màu xanh ở dòng mà chương trình đang chạy đến.Để làm mất dòng này, bạn ấn Ctrl+F2.



Nếu thấy hay thì thanks mình phát lấy tinh thần nhé.
 
Top Bottom