Đặt máy WABAC , Sherman. Câu hỏi này là về BASIC nói chung và BASIC-80 của Microsoft nói riêng. Trường cũ cơ bản. Với số dòng.
Làm thế nào (hoặc, đúng hơn, đã làm) các thông dịch viên BASIC trường học cũ xử lý các vòng lặp TIẾP THEO khi thân vòng lặp không được thực thi và câu lệnh NEXT xuất hiện không theo thứ tự?
Một tuyên bố NEXT không theo thứ tự từ trước đó:
Đây là một chương trình con từ trò chơi Awari trong "101 trò chơi máy tính cơ bản" của David H. Ahl :
200 K=M:GOSUB 600
205 E=0:IF K>6 THEN K=K-7
210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K
215 FOR I=0 TO 5:IF B(I)<>0 THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN
235 GOTO 220
và đây là với tất cả mọi thứ trừ điều khiển luồng được điều chỉnh lại:
200 GOSUB 600
215 FOR I=0 TO 5:IF ... THEN 230
220 NEXT I
225 RETURN
230 FOR I=7 TO 12:IF ... THEN RETURN
235 GOTO 220
Điều đó có mang lại những kỷ niệm không đẹp? Bạn có thể nghe thấy Dijkstra lăn lộn trong mộ của mình không?
Đây là phần thú vị của những gì xảy ra trong đoạn này:
- Vòng lặp FOR thứ hai, vì nó sử dụng cùng một biến vòng lặp, thay thế vòng lặp FOR đầu tiên
- Hai vòng lặp FOR chia sẻ cùng một câu lệnh TIẾP THEO
- Câu lệnh NEXT của vòng lặp FOR thứ hai xuất hiện trước nó, theo thứ tự nguồn, nhưng sau nó, theo thứ tự thực hiện
Sau đó, bạn có thể cho rằng trình thông dịch, đã bắt đầu một vòng lặp FOR, chỉ cần chạy các câu lệnh cho đến khi nó xảy ra trên vòng lặp NEXT. Thứ tự của câu lệnh trong nguồn không quan trọng trong trường hợp này. Nhưng hãy xem hướng dẫn cơ bản80 nói gì về các vòng lặp FOR:
Hướng dẫn cơ bản-80 nói "moo ..."
Phần thân của vòng lặp được bỏ qua nếu giá trị ban đầu của vòng lặp nhân với dấu của bước vượt quá giá trị cuối cùng nhân với dấu của bước.
Vì vậy, cơ thể vòng lặp có thể được bỏ qua hoàn toàn.
Chúng tôi có bằng chứng, dưới dạng các chương trình được xuất bản, rằng ít nhất một số phiên bản BASIC đã tự động định vị các tuyên bố NEXT của họ. Điều này đủ dễ thực hiện khi thân vòng lặp đang được thực thi. Tuy nhiên, trong trường hợp phần thân của câu lệnh FOR bị bỏ qua, vì BASIC-80 cho phép, BASIC đã định vị câu lệnh NEXT như thế nào, cho rằng nó có thể nằm trước câu lệnh FOR theo thứ tự nguồn?
- Có phải phiên bản BASIC được sử dụng trong "101 trò chơi máy tính cơ bản" luôn thực thi thân vòng lặp ít nhất một lần không?
- BASIC-80 có yêu cầu câu lệnh NEXT của vòng lặp FOR xảy ra sau câu lệnh FOR, theo thứ tự nguồn không?
PS: Vâng, tôi đang viết một thông dịch viên BASIC cho BASIC trường học cũ. Đó là một căn bệnh.
NEXT
câu lệnh bắt đầu từ $ DCF9.