PDA

View Full Version : Tại sao?



'OR''='
15-01-2008, 02:38
Các bác cho em hỏi tại sao lại bị lỗi chia 0 ở dòng in đậm nhỉ? Dạo này đầu óc mụ mẫm nên phải cầu cứu các bác.

Program PHUONG_LINH;

Uses Crt;
Var
a, i, j, m, n: Integer;
d, v, l: char;
dx, f, sigma1, sigma2, sigma, sohang1, sohang2, sohang3: Real;
x, x1, x2, xx, h, hh, k, dgtp, dg, slv: Array[1..255] of real;
ten1, ten2: String;
vao, ra: Text;

Begin
Clrscr;

{Nhap so lieu}
Write('Ban hay nhap ten cua file so lieu vao:');
ReadLn(ten1);
Assign (vao, ten1);
Reset(vao);
a:=0;
While not eof(vao) do
Begin inc(a);
read(vao, slv[a]);
End;
Close(vao);

m:=a-1;

For i:=1 to m div 2 do Begin xx[i]:=slv[2*i-1]; hh[i]:=slv[2*i]; End;


Write('Ban hay nhap so diem tinh n =');ReadLn(n);
Write('Ban hay nhap khoang cach giua cac diem tinh dx=');ReadLn(dx);
Write('Ban hay nhap mat do sigma1='); ReadLn(sigma1);
Write('Ban hay nhap mat do sigma2='); ReadLn(sigma2);
sigma:=sigma1-sigma2;
f:=2/3*10e-7;

{Gan do sau cho cac diem do}

For j:=1 to m div 2 do
Begin
For i:=1 to n do
Begin
If i*dx=xx[j] then h[i]:=hh[j];
If (i*dx > xx[j]) and (i*dx < xx[j+1] ) then
h[i]:=(i*dx-xx[j])*(hh[j+1]-hh[j])/(xx[j+1]-xx[j]);
End;

End;

For i:=1 to n do Write(h[i]:9:3);

{Tinh delta g tai cac diem do}

For i:=1 to n do x[i]:=i*dx;
For j:=1 to n do dg[j]:=0;
For j:=1 to n do
Begin

For i:=1 to n do Begin x[i]:=x[i]-j*dx;Write(x[i]:4:2,' ');End;Writeln;
For i:=1 to n do
Begin
x1[i]:=x[i];
x2[i]:=x[i+1];

If (x1[i]=0) then dgtp[i]:=f*sigma*(-x2[i]*ln((sqr(x2[i])+sqr(h[i]))/(sqr(x2[i]))))+
2*h[i]*(arctan(x2[i]/h[i])-arctan(x2[i]/h[i]));
If (x2[i]=0) then dgtp[i]:=f*sigma*(x1[i]*ln((sqr(x1[i])+sqr(h[i]))/(sqr(x1[i]))))
Else dgtp[i]:=f*sigma*(x1[i]*ln((sqr(x1[i])+sqr(h[i]))/(sqr(x1[i])))-
x2[i]*ln((sqr(x2[i])+sqr(h[i]))/(sqr(x2[i]))))+
2*h[i]*(arctan(x2[i]/h[i])-arctan(x2[i]/h[i]));
dg[j]:=dg[j]+dgtp[i];
End;

End;

{Xuat so lieu}
Write('Ban hay nhap ten cua file so lieu ra:');
ReadLn(ten2);
Assign(ra, ten2);
Rewrite(ra);
For j:=1 to n do WriteLn(ra,j*dx:5:2,' ',dg[j]:17:7);
Close(ra);

ReadLn;

End.

m2mpro
15-01-2008, 11:40
Bạn định làm gì? đề bài ra sao ?
Chứ nhìn thế này thì CHOÁNG....

thuonghcm
15-01-2008, 19:25
đúng là hỏng biết đề , đọc códe mệt quá....póchan.pótay

mr_invincible
15-01-2008, 19:27
Chắc là tại x2[i]=0 thì khi chia cho nó thì có lỗi chứ sao

'OR''='
17-01-2008, 19:29
Biết ngay là các bác sẽ hỏi đề nhưng mà cái đề bài này nó rất là khó diễn giải bằng lời được. Bây giờ mới thấy vai trò của kỹ sư cầu nối. Thôi thì em cứ viết ra ở đây, nếu các bác không hiểu chỗ nào em sẽ giải thích tiếp.

Đề bài cho địa hình 1 móng (thông qua các tọa độ xx[i] có độ sâu hh[i])
Yêu cầu tính trường trọng lực tại các điểm có tọa độ x[i]
Các điểm x[i] có thể trùng hoặc không trùng với xx[i]
x[i+1]-x[i]=dx (thường lấy dx=1 đơn vị) nên lúc đầu x[i]:=i*dx;

http://i20.photobucket.com/albums/b203/alfa_romeo/untitled-1.jpg

Để tính delta g tại điểm x[1]. quá trình tính như thế này
Lấy x[1] làm gốc tọa độ
Tính tọa độ các điểm x[i] theo gốc tọa độ x[1] (x[i]:=x[i]-x[1])
Tính các giá trị delta g thành phần trong các khoảng x[i] đến x[i+1] theo 1 công thức

http://i20.photobucket.com/albums/b203/alfa_romeo/untitled2.jpg

f với sigma là các hằng số
x1, x2 trong công thức này chính là x[i] và x[i+1] đã được tính tọa độ theo gốc tọa độ x[1]
h2 là h[i]; h[i] được nội suy từ 2 độ sâu hh[j] và hh[j+1]

Thế này sẽ có TH x1=0 và x2=0 nhưng nếu x1 đã=0 thì chắc chắn x2<>0 và ngược lại
TH x1=0, công thức trên sẽ bỏ bớt số hạng có x1 ở mẫu đi
TH x2=0, tương tự
Cộng các delta g thành phần này vào với nhau ta mới được delta g tại x[1]
Lặp lại quá trình này cho x[2], x[3], x[4]...

Cũng hơi loằng ngoằng 1 chút.

mr_invincible
17-01-2008, 21:36
Đọc đề nghe sợ quá. Tốt nhất là trước khi chia cho x2[i] bạn thử viết x2[i] ra màn hình xem nó có bằng 0 hay không?

phuclun
17-01-2008, 23:50
SHOCK,hok hiểu gì hết.

'OR''='
20-01-2008, 03:51
Đọc đề nghe sợ quá. Tốt nhất là trước khi chia cho x2[i] bạn thử viết x2[i] ra màn hình xem nó có bằng 0 hay không?

Em cũng đã kiểm tra bằng cách của bác rồi ,x2[i] không hề =0.
Em chuyển sang thử theo cách: Cứ chỗ nào máy báo chia cho 0 là em đem mẫu cộng thêm 10e-9 (cộng thế này thì kết quả cũng chẳng thay đổi mấy) nhưng cái Pascal củ chuối vẫn báo division by zero mới sợ chứ. Bài này làm matlab thì có khi đã xong từ lâu, chỉ tại ông thầy cứ bắt làm bằng Pascal.
À quên, em thấy những chỗ bị báo chia cho 0 toàn là những chỗ em phải ngắt dòng vì line too long. Có khi nào mình ngắt dòng lại gây ra lỗi chia cho 0 không nhỉ??? Hic hic lập trình mà cứ như mò cua bắt ốc í.

Master_Baby
21-01-2008, 10:29
Cẩn thận pascal của bác bị lỗi ko chừng... Xem topic "Nếu gặp division by zero..." thử coi có sửa được ko nào? :)

grenadier1991
21-01-2008, 17:47
Có đoạn x2[i]/h[i] đó, kiểm tra lại cả h[i] xem sao? h[i] có thể có độ sâu =0 mà.

mr_invincible
21-01-2008, 21:44
Theo ý kiến của em trước khi chia cho bất kì số nào thì viết ra màn hình số đó xem nó có <>0 không, nếu bằng 0 thì biết ngay