Tin học Không hiểu câu lệnh While...Do

kimyen65

Học sinh
Thành viên
4 Tháng chín 2018
222
47
41
Bắc Ninh
Du học sinh

Lục Vân Tiên

Học sinh chăm học
Thành viên
4 Tháng tư 2017
340
231
131
Thanh Hóa
Minecraft Gamer
Mỗi lần bạn gọi thủ tục đọc dữ liệu, nó sẽ đọc dòng hiện tại, tức là nếu mở lần đầu tiên thì nó sẽ đọc nguyên dòng đầu tiên nếu dòng này chứa ký tự, còn nếu dòng này chỉ chứa các ký số thì nó sẽ đọc 1 ký số (mỗi ký số cách nhau bằng khoảng trống). Nếu dùng read thì sau khi đọc xong 1 ký số hay là một chuỗi ký tự thì con trỏ vẫn đặt ở dòng đó, cho nên nếu bạn gọi thủ tục read lần thứ hai, nó sẽ không đọc được dữ liệu hoặc là nếu còn dữ liệu trên dòng này thì nó sẽ đọc các dữ liệu đó. Vì vậy nếu bạn muốn đọc dữ liệu ở các dòng tiếp theo, bạn cần dùng thủ tục readln để sau khi đọc xong một dòng thì con trỏ sẽ chuyển xuống dòng dưới và khi đó nếu gọi thủ tục một lần nữa thì bạn có thể đọc được dữ liệu mới ở các dòng tiếp theo.
Ví dụ: Một tệp có nội dung như sau:
dong 1
dong 2
dong 3
dong 4

Dùng Pascal đọc dữ liệu:
read(f, st); // đây là lần đầu gọi nên st sẽ bằng 'dong 1'
read(f, st); // hông có dữ liệu vì con trỏ vẫn ở dòng đầu
Vì vậy cần sửa lại:
readln(f, st); // st = 'dong 1', sau đó con trỏ xuống dòng
readln(f, st); // sr = 'dong 2', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 3', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 4', sau đó con trỏ xuống dòng
Với cách dùng liên tiếp các thủ tục readln như thế sẽ giúp đọc hết dữ liệu tệp nhưng nếu số dòng tăng lên lớn thì ghi theo kiểu 'liệt kê' như vậy không khả thi, để giải quyết ta dùng vòng lặp While, lặp cho đến khi hết tệp, tức là hàm eof trả về true.
Mã lệnh:
While not(eof(f)) do
begin
readln(f, st);
// ghi các câu lệnh lưu trữ hay xử lý dữ liệu vừa lấy được
end;
Hàm eof(f) sẽ trả về true nếu con trỏ ở cuối tệp vì vậy đoạn lệnh trên có thể hiều là lặp cho đến khi con trỏ về cuối tệp.

Ví dụ: Đọc dữ liệu từ một tệp chứa các số, mỗi số cách nhau 1 khoảng trắng. Tệp nội dung như sau:
7 11 13 41 5 1
2 32 1 21 51 6 10
2 51 5
14 5 61 90 100
Mã lệnh:
WHILE not(EOF(f)) DO
begin
if not(EOLN(f)) then
read(f, x)
else
readln(f); // xuống dòng
end;
Với cấu trúc trên bạn có thể đọc được hết dữ liệu từ tệp.
* EOLN(f) trả về true nếu con trỏ ở cuối dòng.
 

Trâm Nguyễn Thị Ngọc

Giải Nhất event Thế giới Sinh học 2
Thành viên
13 Tháng mười 2018
1,523
1,339
216
18
Quảng Trị
Trường TH&THCS Hải Ba
Các bạn có thể giải thích giúp mình câu lệnh While...Do nó có chức năng gì được không ạ. Với giải thích giúp mình câu lệnh này với ạ: While not eof(f) do
Câu lệnh While do dùng để lặp với số lần không biết trước đó chị
Về chức năng thì em nghĩ nó cũng giống với for do thôi chị, nhưng về cấu trúc thì khác
 

kimyen65

Học sinh
Thành viên
4 Tháng chín 2018
222
47
41
Bắc Ninh
Du học sinh
Mỗi lần bạn gọi thủ tục đọc dữ liệu, nó sẽ đọc dòng hiện tại, tức là nếu mở lần đầu tiên thì nó sẽ đọc nguyên dòng đầu tiên nếu dòng này chứa ký tự, còn nếu dòng này chỉ chứa các ký số thì nó sẽ đọc 1 ký số (mỗi ký số cách nhau bằng khoảng trống). Nếu dùng read thì sau khi đọc xong 1 ký số hay là một chuỗi ký tự thì con trỏ vẫn đặt ở dòng đó, cho nên nếu bạn gọi thủ tục read lần thứ hai, nó sẽ không đọc được dữ liệu hoặc là nếu còn dữ liệu trên dòng này thì nó sẽ đọc các dữ liệu đó. Vì vậy nếu bạn muốn đọc dữ liệu ở các dòng tiếp theo, bạn cần dùng thủ tục readln để sau khi đọc xong một dòng thì con trỏ sẽ chuyển xuống dòng dưới và khi đó nếu gọi thủ tục một lần nữa thì bạn có thể đọc được dữ liệu mới ở các dòng tiếp theo.
Ví dụ: Một tệp có nội dung như sau:
dong 1
dong 2
dong 3
dong 4

Dùng Pascal đọc dữ liệu:
read(f, st); // đây là lần đầu gọi nên st sẽ bằng 'dong 1'
read(f, st); // hông có dữ liệu vì con trỏ vẫn ở dòng đầu
Vì vậy cần sửa lại:
readln(f, st); // st = 'dong 1', sau đó con trỏ xuống dòng
readln(f, st); // sr = 'dong 2', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 3', sau đó con trỏ xuống dòng
readln(f, st); //st = 'dong 4', sau đó con trỏ xuống dòng
Với cách dùng liên tiếp các thủ tục readln như thế sẽ giúp đọc hết dữ liệu tệp nhưng nếu số dòng tăng lên lớn thì ghi theo kiểu 'liệt kê' như vậy không khả thi, để giải quyết ta dùng vòng lặp While, lặp cho đến khi hết tệp, tức là hàm eof trả về true.
Mã lệnh:
While not(eof(f)) do
begin
readln(f, st);
// ghi các câu lệnh lưu trữ hay xử lý dữ liệu vừa lấy được
end;
Hàm eof(f) sẽ trả về true nếu con trỏ ở cuối tệp vì vậy đoạn lệnh trên có thể hiều là lặp cho đến khi con trỏ về cuối tệp.

Ví dụ: Đọc dữ liệu từ một tệp chứa các số, mỗi số cách nhau 1 khoảng trắng. Tệp nội dung như sau:
7 11 13 41 5 1
2 32 1 21 51 6 10
2 51 5
14 5 61 90 100
Mã lệnh:
WHILE not(EOF(f)) DO
begin
if not(EOLN(f)) then
read(f, x)
else
readln(f); // xuống dòng
end;
Với cấu trúc trên bạn có thể đọc được hết dữ liệu từ tệp.
* EOLN(f) trả về true nếu con trỏ ở cuối dòng.
Câu lệnh While do dùng để lặp với số lần không biết trước đó chị
Về chức năng thì em nghĩ nó cũng giống với for do thôi chị, nhưng về cấu trúc thì khác
Mình chân thành cảm ơn 2 bạn nhiều. Mình vẫn có 1 thắc mắc chữ lặp ở đây có nghĩa đơn giản là gì ạ, lặp lại hay lặp ở đây mang ý nghĩa sao ạ
 

Trâm Nguyễn Thị Ngọc

Giải Nhất event Thế giới Sinh học 2
Thành viên
13 Tháng mười 2018
1,523
1,339
216
18
Quảng Trị
Trường TH&THCS Hải Ba
Mình chân thành cảm ơn 2 bạn nhiều. Mình vẫn có 1 thắc mắc chữ lặp ở đây có nghĩa đơn giản là gì ạ, lặp lại hay lặp ở đây mang ý nghĩa sao ạ
Mình chân thành cảm ơn 2 bạn nhiều. Mình vẫn có 1 thắc mắc chữ lặp ở đây có nghĩa đơn giản là gì ạ, lặp lại hay lặp ở đây mang ý nghĩa sao ạ
Đúng như nghĩa rồi chị, lặp là lặp lại
 

Lục Vân Tiên

Học sinh chăm học
Thành viên
4 Tháng tư 2017
340
231
131
Thanh Hóa
Minecraft Gamer
Mình chân thành cảm ơn 2 bạn nhiều. Mình vẫn có 1 thắc mắc chữ lặp ở đây có nghĩa đơn giản là gì ạ, lặp lại hay lặp ở đây mang ý nghĩa sao ạ
nó lặp lại cái gì e ơi, nó vẫn trù tượng sao sao á
lặp có nghĩa là hành động đc lặp lại, ở câu lệnh While...do thì lặp là câu lệnh được lặp lại cho đến khi nào điều kiện sai.
 

Trâm Nguyễn Thị Ngọc

Giải Nhất event Thế giới Sinh học 2
Thành viên
13 Tháng mười 2018
1,523
1,339
216
18
Quảng Trị
Trường TH&THCS Hải Ba
nó lặp lại cái gì e ơi, nó vẫn trù tượng sao sao á
Vd em viết:
Readln(n);
I:=1;
While i<n do
Begin
T:=t+i;
I:=i+1;
End;
Thì nó sẽ kt điều kiện, nếu đúng thì nó thực hiện, mà sai thì dừng lại
Như VD trên nếu em cho n=3 thì kt lần 1 đúng, sau khi đúng nó thực hiện lệnh và cộng i=2, rồi tiếp tục kt đến khi sai mới thôi
Chị có thể tham khảo ảnh phía dưới
 

Attachments

  • 20190327_212300.jpg
    20190327_212300.jpg
    60.9 KB · Đọc: 257
Last edited:
  • Like
Reactions: kimyen65
Top Bottom