PDA

View Full Version : Giúp em bài về while- do với!



Zero51
14-12-2007, 20:00
Đề bài: Viết chương trình vào 1 dãy số nguyên cho đến khi gặp số 0. Đưa ra màn hình tổng các số dương, trung bình cộng các số âm.
*Đây là bài em đã làm:
program bt1;
uses crt;
var Sd,Sa,d,TB,N:real;
begin
write('Nhap so nguyen N ');
readln(N);
Sd:=0; Sa:=0; d:=0; TB:=0;
while not (N=0) do
if N>0 then Sd:=Sd+N
else
begin
Sa:=Sa+N;
d:=d+1;
TB:=Sa/d;
end;
writeln('Tong cac so duong la ',Sd:8:4,' va trung binh cac so am la ',Sa:8:4);
readln;
end.

Kiểm tra chương trình thì thấy ko có lỗi. Em chạy thử và nhập 1 dãy bất kỳ cho đến số cuối là 0 rồi enter thi chương trình đơ luôn ko hoạt động nữa. Em tìm mọi cách mà ko sửa được hay do pascal nhà em bị lỗi. Mong các anh trong forum giúp em!

thuonghcm
14-12-2007, 20:14
Đề bài: Viết chương trình vào 1 dãy số nguyên cho đến khi gặp số 0. Đưa ra màn hình tổng các số dương, trung bình cộng các số âm.
*Đây là bài em đã làm:
program bt1;
uses crt;
var Sd,Sa,d,TB,N:real;
begin
write('Nhap so nguyen N ');
readln(N);
Sd:=0; Sa:=0; d:=0; TB:=0;
while not (N=0) do
BEGIN
if N>0 then Sd:=Sd+N
else
begin
Sa:=Sa+N;
d:=d+1;
TB:=Sa/d;
end;
WRITE('NHAP SO NGUYEN N: ');
READLN(N);
END;writeln('Tong cac so duong la ',Sd:8:4,' va trung binh cac so am la ',Sa:8:4);
readln;
end.

Kiểm tra chương trình thì thấy ko có lỗi. Em chạy thử và nhập 1 dãy bất kỳ cho đến số cuối là 0 rồi enter thi chương trình đơ luôn ko hoạt động nữa. Em tìm mọi cách mà ko sửa được hay do pascal nhà em bị lỗi. Mong các anh trong forum giúp em!

Ban thử xem sao...................................

phuclun
14-12-2007, 20:19
bạn đang làm gì mình ko hiểu nhỉ,bạn nói nhập 1 dãy nhưng bạn chỉ nhập 1 số thì làm sao mà ra.
Còn while not(n=0)do thì bạn nên xài while n<>0 do cho dễ hiểu.
Nếu bạn muốn nhập nhiều số đến khi nhập 0 thì kết thúc thì bạn nên dùng Repeat..Until chứ bạn viết gì,muốn gì tui cũng ko hiểu.
Chúc bạn vui vẻ.

Zero51
14-12-2007, 20:24
Ban thử xem sao...................................
Em chưa hiểu ý anh lắm. Có phải chỉ viết đoạn tô đậm hay viết y hệt như thế. Nhưng nếu thế sẽ bị lặp 2 lần nhập số nguyên N. Em đã thử bỏ phân nhập số nguyên N ở đaọn đầu nhưng khi chạy chương trình, nhập số xong thì nó quay ngay trở về pascal chứ ko còn ở trong DOS.

Zero51
14-12-2007, 20:29
bạn đang làm gì mình ko hiểu nhỉ,bạn nói nhập 1 dãy nhưng bạn chỉ nhập 1 số thì làm sao mà ra.
Còn while not(n=0)do thì bạn nên xài while n<>0 do cho dễ hiểu.
Nếu bạn muốn nhập nhiều số đến khi nhập 0 thì kết thúc thì bạn nên dùng Repeat..Until chứ bạn viết gì,muốn gì tui cũng ko hiểu.
Chúc bạn vui vẻ.

Ý em muốn làm là mình nhập 1 dãy nhiều số cho tới khi nhập đến số 0 thì máy sẽ tính tổng các số dương và trung bình các số âm. Anh có thể chỉ giúp em ko9.
Đây là ý tưởng em nháp:
Bước 1: Gán Sd<--0, Sa<--0, d<--0, TB<--0.
Bước 2: Nhập số nguyên N
Bước 3: Nếu N =0 thì thông báo tổng số dương và trung bình số âm.
Bước 4: Nếu N>0 thì Sd<-- Sd+N rồi quay lại bước 2.
Bước 5: Nếu N<0 thì Sa<--Sa+N, d<-- d+1, TB<-- Sa/d rồi quay lại bước 2.

dmtmufc
14-12-2007, 20:52
ý tưởng của bạn thì dc rồi, còn đoạn trên cùng bạn viết thì thiếu mất bước 2 trong ý tưởng của bạn(thiếu bước nhập n trong vòng lặp)--> chạy đơ là phải(do điều kiện kết thúc vòng lặp luôn sai nên lặp mãi). bạn chỉ cần thêm bước 2 vào trong while..do như bạn thuonghcm đã làm là dc.

Zero51
14-12-2007, 21:05
ý tưởng của bạn thì dc rồi, còn đoạn trên cùng bạn viết thì thiếu mất bước 2 trong ý tưởng của bạn(thiếu bước nhập n trong vòng lặp)--> chạy đơ là phải(do điều kiện kết thúc vòng lặp luôn sai nên lặp mãi). bạn chỉ cần thêm bước 2 vào trong while..do như bạn thuonghcm đã làm là dc.

Như mình đã nói ở trên, mình đã theo làm theo bạn thuonghcm chỉ nhưng khi nhập số rồi enter thì bị bật về màn hình pascal luôn :((

phuclun
14-12-2007, 21:40
nếu ý của bạn là vậy thì bài nó sẽ thế này


readln(n)
dem:=0;
sd:=0;
sa:=0;
while n<>= 0 then
begin
if n>0 then sd:=sd+n
else
begin
sa:=sa+n;
dem:=dem+1;
end;
readln(n);
end;
tb:=sa/dem;
write('tong cac so duong la',sd);
write('TBC cac so am la',tb);

phuclun
14-12-2007, 21:51
Tôi cũng xin góp ý 1 tí về bài bạn.
1)Bạn chỉ nhập n có 1 lần ở đầu bài trong khi đề lại bảo nhập nhiều lần cho đến khi nó =0 mới thôi.
2)Trong đây chỉ cần TB là real,còn lại integer hết cho đỡ bộ nhớ.
3)Bạn nên tính TBC sau cùng chứ ko cần mỗi lần cộng là mỗi lần tính sẽ làm chậm bài toán.
Còn bài bạn thuonghcm thì chắc do vô tình nên phần nhập n sau dấu end;-->bài bạn cũng sẽ bị đơ giống bài bạn Zero
Taí bút:Chắc bạn học khá chắc phần viết các bước nhỉ,phần này đầu năm lớp 1 đã bắt học,tui thì chịu mấy cái đó,dù sao dùng cái đó cũng rất tốt nhưng nhìn vào tui cũng chẳng hiểu gì cả.
Chúc bạn vui vẻ

Zero51
14-12-2007, 22:07
nếu ý của bạn là vậy thì bài nó sẽ thế này


readln(n)
dem:=0;
sd:=0;
sa:=0;
while n<>= 0 then
begin
if n>0 then sd:=sd+n
else
begin
sa:=sa+n;
dem:=dem+1;
end;
readln(n);
end;
tb:=sa/dem;
write('tong cac so duong la',sd);
write('TBC cac so am la',tb);

program bt1;
uses crt;
var Sd,Sa,d,TB,N:real;
begin
write('Nhap so nguyen N ');
readln(n)
dem:=0;
sd:=0;
sa:=0;
while n<>= 0 then
begin
if n>0 then sd:=sd+n
else
begin
sa:=sa+n;
dem:=dem+1;
end;
readln(n);
end;
tb:=sa/dem;
write('tong cac so duong la',sd);
write('TBC cac so am la',tb);
end;
end.
Bạn có thể xem giúp đã chính xác chưa. Mình làm thế này và khi thử nhập 1 day 2 3 4 -5 -7 0 rồi enter thì nó xuống dòng và ko thực hiện gì cả. Khi về màn hình pascal thì nó báo "Error 106: Invalid numberic format" :(. Mong bạn giúp đỡ, phiền bạn quá >"<. Bạn thử test trên máy bạn xem được không ?

big_hieu
14-12-2007, 22:13
Đề bài: Viết chương trình vào 1 dãy số nguyên cho đến khi gặp số 0. Đưa ra màn hình tổng các số dương, trung bình cộng các số âm.
*Đây là bài em đã làm:
program bt1;
uses crt;
var Sd,Sa,d,TB,N:real;
begin
write('Nhap so nguyen N ');
readln(N);
Sd:=0; Sa:=0; d:=0; TB:=0;
while not (N=0) do
if N>0 then Sd:=Sd+N
else
begin
Sa:=Sa+N;
d:=d+1;
TB:=Sa/d;
end;
writeln('Tong cac so duong la ',Sd:8:4,' va trung binh cac so am la ',Sa:8:4);
readln;
end.

Kiểm tra chương trình thì thấy ko có lỗi. Em chạy thử và nhập 1 dãy bất kỳ cho đến số cuối là 0 rồi enter thi chương trình đơ luôn ko hoạt động nữa. Em tìm mọi cách mà ko sửa được hay do pascal nhà em bị lỗi. Mong các anh trong forum giúp em!
__________________________________________________ _____________________
Sửa lại là
program bt1;
uses crt;
var Sd,Sa,d,N:integer;
TB:real;
BEGIN (*CHUONG TRINH CHINH*)
n:=1;
Sd:=0; Sa:=0; d:=0; TB:=0;
while not(N=0) do
Begin
Writeln('Nhap mot so nguyen:');
Readln(N);
if N>0 then
Sd:=Sd+N
else
begin
Sa:=Sa+N;
d:=d+1;
end; (*Het End cua else*)
End; (* Het While *)
TB:=Sa/d;
writeln('Tong cac so duong la ',Sd);
writeln('Trung binh cac so am la ',TB:8:2);
readln;
end.

Bạn xem, khác nhiều đúng không.
+ thứ nhất người ta biểu nhập số nguyên thì bạn phải khai báo số nguyên.
+ thứ hai nếu đã dùng while do để nhập dãy số thì lệnh nhập (readln(N)) phải nằm trong while do
+ Thứ ba là việc tính trung bình phải thực hiện ngoài vòng lặp while do
+ Bạn thấy không?! việc khởi gán N:=1 chỉ là việc gán hình thức cho vòng lặp bắt đầu thực hiện lần đầu tiên.

gameonline
14-12-2007, 22:25
toan thay nhap mot so nguyen ko ha,co thay nhap mot day dau,em de nghi phan nhap ta dung mang di roi sd vong for duyet tu dau toi cuoi,neu phan tu nao < 0 thi dem cong lai roi tinh trung binh,con toan nhap moi so n ko thi khong hieu

phuclun
14-12-2007, 22:25
Mình nói là chỉ cần khai báo biến Tb là real thôi,còn lại integer hết nhưng mình nghĩ cái sai chính của bạn là ở đây.
Bạn nhập cũng phải nhập đúng ,cứ mỗi lần ghi 1 số bạn phải enter 1 cái cho máy hiểu chứ bạn ghi nguyên mảng như vậy thì làm sao mà nó hiểu.
VD:
nó ghi nhap n bạn ghi 2 rồi enter
Con trỏ xuống dòng,bạn ghi 3 rồi enter,cứ như vậy cho đến số 0.
P/s:đã test thử ,chắc chắn ko có lỗi nào.
Chúc bạn vui vẻ

Zero51
14-12-2007, 22:25
__________________________________________________ _____________________
Sửa lại là
program bt1;
uses crt;
var Sd,Sa,d,N:integer;
TB:real;
BEGIN (*CHUONG TRINH CHINH*)
n:=1;
Sd:=0; Sa:=0; d:=0; TB:=0;
while not(N=0) do
Begin
Writeln('Nhap mot so nguyen:');
Readln(N);
if N>0 then
Sd:=Sd+N
else
begin
Sa:=Sa+N;
d:=d+1;
end; (*Het End cua else*)
End; (* Het While *)
TB:=Sa/d;
writeln('Tong cac so duong la ',Sd);
writeln('Trung binh cac so am la ',TB:8:2);
readln;
end.

Bạn xem, khác nhiều đúng không.
+ thứ nhất người ta biểu nhập số nguyên thì bạn phải khai báo số nguyên.
+ thứ hai nếu đã dùng while do để nhập dãy số thì lệnh nhập (readln(N)) phải nằm trong while do
+ Thứ ba là việc tính trung bình phải thực hiện ngoài vòng lặp while do
+ Bạn thấy không?! việc khởi gán N:=1 chỉ là việc gán hình thức cho vòng lặp bắt đầu thực hiện lần đầu tiên.
Mình đã chạy thử và chạy tốt, cảm ơn bạn rât nhiều.

gameonline
14-12-2007, 22:27
dieu kien dung cua no la n = 0 ta co the thay doi dieu kien dung cua no,vi nguoi ko biet de bai khi chay chuong trinh se ko nam duoc dieu kien dung nay,vi the de nghi n se la gioi han so phan tu cua mang.ok
---------------------------------------
hoc hanh nong can,mong duoc chi giao

phuclun
14-12-2007, 22:27
Như bạn gameonline cũng đúng,ko sai nhưng mình phải phí thêm 1 mảng nữa ko cần thiết bạn ạ,mình chỉ cần 1 biến n là đủ.Mình nhập n rồi xoá n rồi nhập tiếp.Mảng ở đây dùng cũng đc,ko dùng cũng đc nhưng để có cách tối ưu thì nên ko dùng.
Chúc bạn vui vẻ.

Zero51
14-12-2007, 22:28
Mình nói là chỉ cần khai báo biến Tb là real thôi,còn lại integer hết nhưng mình nghĩ cái sai chính của bạn là ở đây.
Bạn nhập cũng phải nhập đúng ,cứ mỗi lần ghi 1 số bạn phải enter 1 cái cho máy hiểu chứ bạn ghi nguyên mảng như vậy thì làm sao mà nó hiểu.
VD:
nó ghi nhap n bạn ghi 2 rồi enter
Con trỏ xuống dòng,bạn ghi 3 rồi enter,cứ như vậy cho đến số 0.
P/s:đã test thử ,chắc chắn ko có lỗi nào.
Chúc bạn vui vẻ
Cảm ơn bạn rất nhiều, mình thật ngu quá, cái cơ bản vậy cũng ko biết. Mong bạn thông cảm vì đã làm phiền >"<
@ game online: Mình cũng cảm ơn bạn vì đã giúp mình. Thanks for all.

phuclun
14-12-2007, 22:32
Hì,chuyện thường ấy mà,mình lúc mới học mấy cái này cũng sai tùm lum hết.Ko sao đâu,làm nhiều thì quen thôi.

Zero51
14-12-2007, 22:52
XIn hỏi bạn một vấn đề cuối :D.
Đoạn code : ở phần gần cuối, đoạn " end;
readln(n);
end;"
Sao ở đây lại cần nhập dữ liệu n 1 lân nữa " readln(n)" mà thiếu nó chương trình ko chạy được. Mong bạn giải đáp. Mình thì mình hiểu, sau mỗi lần lặp thì lại có một biến mới và dòng này là để nhập biến mới đó, còn dòng readln(n) trên cùng là nhập biến n ban đâu ko bít là có đúng ko?
Thân

thuonghcm
14-12-2007, 23:02
làm sao lại không? do bạn nhập con số <>0 chứ gì??? vì trong while ..do
hong có câu thông báo mừ......

phuclun
15-12-2007, 19:35
ừ,đúng như bạn nói.Nó là như vậy đấy.

spy10b
02-01-2008, 14:01
Thử bài mình xem sao nhé:
Program bt1;
Uses Crt;
var N,Sd,Sa:Integer;
TBSa:real;
đemSa:byte;
BEGIN
clrscr;
Sd:=0;Sa:=0;
TBSa:=0;
demSa:=0;
Repeat
write('Nhap so nguyen:');readln(N);
if N>0 then Sd:=Sd+N
else
if N<0 then
begin
demSa:=demSa+1;
Sa:=Sa+N
end;
Until N=0;
if demSa>0 then TBSa:=Sa/demSa;
writeln('Tong cac so duong:',Sd);
writeln('Trung binh cong cac so am:',TBSa);
readln
END.

{Vui long gop y nha !}

okmen910
03-01-2008, 10:16
thế là thế nào nhỉ.Đề bài yêu cầu là nhập dãy số nguyên mà,sao không thấy ai dùng mãng hết, thấy toàn là nhập N không àh.Không hiểu nổi nữa

spy10b
03-01-2008, 10:22
Trời đất, đâu cần phải lập hẳn một mảng ra, nhập dãy số nguyên thì chỉ cần dùng một biến N, nhập đi nhập lại nhiều lần là xong
Nếu sử dụng mảng thì lại phải khai báo thêm một biến xác dịnh số phần tử mảng, mà đề bài đâu nói rõ nhập bao nhiêu số đâu chỉ biết nhập đến số 0 thôi mà !!!

spy10b
03-01-2008, 10:23
Đúng ko nhỉ ?? bạn okmen910 ?

okmen910
03-01-2008, 10:25
Không biết làm thế này có đúng không

readln(N);
i:=1;sd:=0;sa:=0;d:=0;
while a[i]<>0 do
begin
write('nhap a[',i,']:');
readln(a[i]);
if a[i]>0 then sd:=sd+a[i]
if a[i]<0 then
begin
sa:=sa+a[i];
d:=d+1;
end;
i:=i+1;
end;
tb:=sa/d;
... (xuất ra)

okmen910
03-01-2008, 10:26
nhưbài làm của tôi hơi có bị sai

okmen910
03-01-2008, 10:27
không nhất thiết phải nhập N

okmen910
03-01-2008, 10:29
tại do thấy chữ "dãy số nguyên" nên mới vậy

mr_invincible
03-01-2008, 21:10
nhưbài làm của tôi hơi có bị sai

không nhất thiết phải nhập N

tại do thấy chữ "dãy số nguyên" nên mới vậy

Bạn okmen này spam thật đấy, đặt 3 bài liền nhau? Nên dùng chức năng chỉnh sửa bài của mình trong diễn đàn để sửa bài của mình nếu cần chứ không nên viết quá nhiều bài liên tiếp như vậy

okmen910
05-01-2008, 21:56
tại mới biết chưa có kinh nghiệm

spy10b
09-01-2008, 13:19
viết càng nhiều càng dzui chứ sao

mr_invincible
09-01-2008, 20:03
viết càng nhiều càng dzui chứ sao

Bạn nói hay nhỉ, nếu ai cũng thích viết nhiều như vậy thì trang này có lẽ phải đổi thành diễn đàn trò chuyện?

gameonline
09-01-2008, 20:26
co' thấy chạy đâu,đề nghị ai thông minh làm lại hộ tui cái,

mr_invincible
09-01-2008, 21:22
co' thấy chạy đâu,đề nghị ai thông minh làm lại hộ tui cái,

Ở trên có 2 cách: của spy10b và okmen910, không hiểu bạn làm theo cách nào, Pascal báo lỗi như thế nào?

tranvanho
11-01-2008, 12:40
tại sao 1 bài toán trẻ con lại để cho các cao thủ cãi nhau thế nhỉ
:D
(hok phải em chảch đâu nha)

hpmhoang_1993
13-01-2008, 17:30
không biết bạn mr_invincible nói như thế nào ,bài của hai bạn đó đúng đấy chứ có sai gì đâu

okmen910
13-01-2008, 17:55
chắc bài của em có vấn đề. sửa lại là

i:=0;sd:=0;sa:=0;d:=0;
repeat
inc(i);
write('nhap a[',i,']:');
readln(a[i]);
if a[i]>0 then sd:=sd+a[i]
if a[i]<0 then
begin
sa:=sa+a[i];
d:=d+1;
end;
until a[i]=0;
if d<>0 then
tb:=sa/d;
... (xuất ra)

mr_invincible
13-01-2008, 17:59
không biết bạn mr_invincible nói như thế nào ,bài của hai bạn đó đúng đấy chứ có sai gì đâu

Tôi có nói bài của ai sai đâu nhỉ??? Tôi chỉ hỏi bạn gameonline làm theo cách nào mà không chạy được. Có lẽ tôi viết không rõ nên gây hiểu nhầm. Ở trên đã sửa lại, mong các bạn thông cảm