Lời khuyên cho việc chơi golf trong QBasic


13

Bạn có lời khuyên chung nào cho việc chơi golf trong QBasic? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với QBasic (ví dụ: "xóa bình luận" không phải là một câu trả lời).

Lời khuyên liên quan đến trình giả lập QB64 cũng được hoan nghênh. Nó có một số tính năng bổ sung không có trong Microsoft QBasic.


Tôi tò mò về động lực của bạn. Tôi đã không sử dụng QBASIC kể từ lớp lập trình lớp 10 của tôi. Thật ngạc nhiên khi tôi đã lưu trực tiếp vào 1,44 đĩa mềm mà không có bất kỳ hình thức kiểm soát phiên bản nào và (thường) tránh được các lỗi nghiêm trọng.
Andrew Brēza

5
@ AndrewBrēza Động lực? Giống như động lực của tôi để chơi golf trong bất kỳ ngôn ngữ nào: cho vui! Tôi thích viết các chương trình nhỏ bằng QBasic (mặc dù tôi không muốn sử dụng nó cho bất kỳ điều gì nghiêm trọng). Ngoài ra còn có phần thưởng bổ sung mà nó có âm thanh và đồ họa (cả văn bản và pixel) được tích hợp, ngôn ngữ "thực" ưa thích của tôi, Python, không có.
DLosc

Viết các trò chơi đồ họa trong QBasic dễ dàng hơn nhiều so với python.
Anush

Nếu bất cứ ai muốn thử các ứng dụng QBasic đồ họa trực tiếp trong trình duyệt, họ có thể sử dụng ứng dụng này: github.com/nfriend/origins-host
mbomb007

Câu trả lời:


10

Biết các cấu trúc lặp của bạn

QBasic có một số cấu trúc vòng lặp: FOR ... NEXT, WHILE ... WEND, và DO ... LOOP. Bạn cũng có thể sử dụng GOTOhoặc (trong một số tình huống) RUNđể lặp.

  • FOR ... NEXTlà khá tốt ở những gì nó làm. Không giống như trong Python, nó hầu như luôn luôn ngắn hơn vòng lặp tương đương WHILEhoặc GOTOvòng lặp, ngay cả khi nó trở nên lạ hơn một chút:

    FOR i=1TO 19STEP 2:?i:NEXT
    i=1:WHILE i<20:?i:i=i+2:WEND
    i=1:9?i:i=i+2:IF i<20GOTO 9
    

    Lưu ý rằng bạn không cần lặp lại tên biến sau NEXTvà bạn có thể loại bỏ khoảng trắng giữa các số và hầu hết các từ khóa sau.

  • WHILE ... WENDlà tốt khi bạn có một vòng lặp có thể cần phải thực hiện 0 lần. Nhưng nếu bạn biết vòng lặp sẽ thực thi ít nhất một lần, GOTOcó thể ngắn hơn một byte:

    WHILE n>1:n=n\2:WEND
    1n=n\2:IF n>1GOTO 1
    
  • Tôi chỉ sử dụng DO ... LOOPcho các vòng lặp vô hạn (trừ nơi RUNcó thể được sử dụng thay thế). Mặc dù nó có cùng số lượng ký tự như một điều kiện vô điều kiện GOTO, nhưng nó trực quan hơn một chút để đọc. (Lưu ý rằng "vòng lặp vô hạn" có thể bao gồm các vòng lặp mà bạn thoát ra khỏi của việc sử dụng một GOTO.) Các DO WHILE/ DO UNTIL/ LOOP WHILE/ LOOP UNTILcú pháp là quá dài dòng; bạn nên sử dụng WHILEhoặc GOTOkhi thích hợp.
  • GOTOlà, như đã đề cập ở trên, cách chung nhất ngắn nhất để viết một vòng lặp do / while. Sử dụng số dòng một chữ số thay vì nhãn. Lưu ý rằng khi a GOTOlà điều duy nhất trong THENphần của IFcâu lệnh, có hai cú pháp phím tắt ngắn gọn như nhau có sẵn:

    IF x>y GOTO 1
    IF x>y THEN 1
    

    GOTOcũng có thể được sử dụng để tạo ra các luồng điều khiển phức tạp hơn . Những người không tán thành gọi đây là "mã spaghetti", nhưng đây là mã golf: không đọc được gần như là một ưu điểm! GOTOtự hào!

  • RUNrất hữu ích khi bạn cần chuyển đến một vị trí cố định trong chương trình và bạn không cần giữ bất kỳ giá trị nào của biến. RUNtự nó sẽ khởi động lại chương trình từ đầu; với nhãn hoặc số dòng, nó sẽ khởi động lại ở dòng đó. Tôi chủ yếu sử dụng nó để tạo ra các vòng lặp vô hạn không trạng thái .

5

Sử dụng phím tắt cho PRINTREM

Bạn có thể sử dụng ?thay vì PRINT'thay vì REM(bình luận).

'cũng có thể hữu ích khi đa âm với các ngôn ngữ hỗ trợ 'như một phần của cú pháp char hoặc chuỗi.


5

Kiểm tra chia hết

Trong các chương trình yêu cầu bạn kiểm tra xem một số nguyên có chia hết cho một số khác hay không, cách rõ ràng là sử dụng MOD:

x MOD 3=0

Nhưng một cách ngắn hơn là sử dụng phép chia số nguyên:

x\3=x/3

Đó là, xint-div 3bằng xfloat-div 3.

Lưu ý rằng cả hai cách tiếp cận này sẽ trở lại 0cho falsey và -1cho sự thật, vì vậy bạn có thể cần phải phủ nhận kết quả hoặc trừ nó thay vì thêm.


Nếu bạn cần điều kiện ngược lại (nghĩa xkhông chia hết cho 3), cách tiếp cận rõ ràng là sử dụng toán tử không bằng:

x\3<>x/3

Nhưng nếu xđược đảm bảo là không âm, chúng ta có thể lưu một byte. Phân chia số nguyên cắt ngắn kết quả, do đó, nó sẽ luôn luôn nhỏ hơn hoặc bằng phân chia float. Do đó, chúng ta có thể viết điều kiện như:

x\3<x/3

Tương tự, nếu xđược đảm bảo là âm, cắt ngắn làm tăng kết quả và chúng ta có thể viết x\3>x/3. Nếu bạn không biết dấu hiệu của x, bạn sẽ phải bám vào <>.


5

Lạm dụng máy quét

Như trong nhiều ngôn ngữ, việc biết những ký tự nào có thể và không thể xóa được là điều quan trọng.

  • Bất kỳ không gian bên cạnh một biểu tượng có thể được loại bỏ: IF""=a$THEN?0
  • Không gian thường có thể được loại bỏ giữa một chữ số và một chữ cái xảy ra theo thứ tự đó : FOR i=1TO 10STEP 2. Có một số khác biệt giữa QBasic 1.1 (có sẵn tại archive.org ) và QB64 :
    • QBasic 1.1 cho phép loại bỏ khoảng trắng giữa bất kỳ chữ số nào và một chữ cái sau. Hơn nữa, trong các câu lệnh in, nó sẽ suy ra một dấu chấm phẩy giữa các giá trị liên tiếp: ?123xtrở thành PRINT 123; x. Các ngoại lệ ở trên là các chuỗi như 1e21d+3, được coi là ký hiệu khoa học và được mở rộng thành 100!1000#(chính xác đơn và kép, tương ứng).
    • QB64 nói chung là như nhau, nhưng con số không thể được theo sau bởi d, ehoặc fở tất cả, trừ khi họ là một phần của một chữ ký hiệu khoa học well-formed. (Ví dụ: bạn không thể bỏ qua khoảng trắng sau số dòng trong 1 FORhoặc 9 END, giống như bạn có thể trong QBasic thích hợp.) Nó chỉ tạo dấu chấm phẩy trong câu lệnh in nếu một trong các biểu thức là một chuỗi: ?123"abc"hoạt động, nhưng không ?TAB(5)123hoặc ?123x.
  • Nói về dấu chấm phẩy, QBasic 1.1 thêm dấu chấm phẩy vào PRINTcâu lệnh kết thúc bằng một cuộc gọi đến TABhoặc SPC. (QB64 thì không.)
  • 0có thể được bỏ qua trước hoặc sau dấu thập phân ( .1hoặc 1.), nhưng không thể cả hai ( .).
  • ENDIFtương đương với END IF.
  • Báo giá kép của chuỗi có thể được bỏ qua ở cuối dòng.

endifthực sự hoạt động trong QB64, xem câu trả lời này
Wastel

@wastl Vậy là có. Khi tôi lần đầu tiên thử nghiệm nó trong QB64, tôi đã sử dụng một phiên bản cũ hơn trong đó là lỗi cú pháp. Cảm ơn đã đề cập!
DLosc

4

NextBáo cáo kết hợp

Next:Next:Next

Có thể ngưng tụ xuống

Next k,j,i

nơi lặp cho Forvòng là i, jk- theo thứ tự đó.

Ví dụ như dưới đây (69 byte)

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next
Next
Next

Có thể ngưng tụ xuống 65 byte

Input n,m,o
For i=0To n
For j=0To m
For k=0To o
?i;j;k
Next k,j,i

Và theo như cách mà điều này tác động đến định dạng và thụt lề, tôi nghĩ rằng cách tiếp cận tốt nhất để xử lý việc này là trái với câu lệnh tiếp theo với phần lớn nhất cho câu lệnh. Ví dụ.

Input n,m,o
For i=0To n
    For j=0To m
        For k=0To o
            ?i;j;k
Next k,j,i

4

Biết phương thức nhập của bạn

QBasic có một số cách để có được đầu vào người sử dụng bàn phím: INPUT, LINE INPUT, INPUT$, và INKEY$.

  • INPUTlà tuyên bố đầu vào đa mục tiêu chuẩn của bạn. Chương trình dừng những gì nó đang làm, hiển thị một con trỏ và cho phép người dùng nhập một số đầu vào, kết thúc bằng Enter. INPUTcó thể đọc số hoặc chuỗi và nó có thể đọc nhiều giá trị được phân tách bằng dấu phẩy. Bạn có thể chỉ định một chuỗi dưới dạng một dấu nhắc, bạn có thể đi với dấu nhắc dấu hỏi mặc định và thậm chí bạn có thể (tôi vừa học tối nay) loại bỏ hoàn toàn dấu nhắc đó. Một số lời mời mẫu:
    • INPUT x$,y
      Sử dụng ? dấu nhắc mặc định và đọc một chuỗi và một số, được phân tách bằng dấu phẩy.
    • INPUT"Name";n$
      Nhắc Name? và đọc một chuỗi.
    • INPUT"x=",x
      Nhắc với x=(không có dấu hỏi! Lưu ý dấu phẩy trong cú pháp) và đọc một số.
    • INPUT;"",s$
      Loại bỏ lời nhắc (sử dụng cú pháp dấu phẩy ở trên với chuỗi dấu nhắc trống), đọc một chuỗi và không di chuyển đến dòng tiếp theo khi người dùng nhấn enter (đó là dấu chấm phẩy sau INPUTđó). Ví dụ, nếu bạn PRINT s$ngay sau đó, màn hình của bạn sẽ trông như thế User_inputUser_input.
  • Một nhược điểm INPUTlà bạn không thể đọc một chuỗi có dấu phẩy trong đó, vì INPUTsử dụng dấu phẩy làm dấu tách trường. Để đọc một dòng ký tự tùy ý (có thể in ASCII), sử dụng LINE INPUT. Nó có các tùy chọn cú pháp giống như INPUT, ngoại trừ nó có chính xác một biến phải là biến chuỗi. Sự khác biệt khác là LINE INPUTkhông hiển thị lời nhắc theo mặc định; nếu bạn muốn, bạn sẽ phải xác định rõ ràng.
  • INPUT$(n)hiển thị không có dấu nhắc hoặc con trỏ mà chỉ cần đợi cho đến khi người dùng nhập các nký tự và sau đó trả về một chuỗi chứa các ký tự đó. Không giống INPUThoặc LINE INPUT, người dùng không cần nhấn Entersau đó và trên thực tế Entercó thể là một trong các ký tự (nó sẽ cung cấp cho ký tự ASCII 13, được biết đến với các ngôn ngữ giống như C \r).

    Thông thường, điều này là hữu ích như INPUT$(1), thường là trong một vòng lặp. INPUT$là tốt trong các chương trình tương tác, nơi nhấn phím duy nhất làm việc . Thật không may, nó chỉ hoạt động với các khóa có mã ASCII; bao gồm những thứ như EscBackspace, nhưng không phải là các phím mũi tên, InsertDelete, và những thứ khác.

  • Đó là nơi INKEY$xuất hiện. Nó tương tự như INPUT$(1)ở chỗ nó trả về kết quả của một lần nhấn phím 1 , nhưng khác ở chỗ:

    • INKEY$ không tranh luận
    • Trong khi INPUT$(n)tạm dừng thực thi cho đến khi người dùng nhập các nký tự, INKEY$không dừng thực thi. Nếu người dùng hiện đang nhấn một phím, INKEY$trả về một chuỗi đại diện cho khóa đó; nếu không, nó trở lại "". Điều này có nghĩa là nếu bạn muốn sử dụng INKEY$để có được lần nhấn phím tiếp theo, bạn phải bọc nó trong một vòng lặp chờ bận : 2

      k$=""
      WHILE""=k$
      k$=INKEY$
      WEND
      
    • Cả hai INPUT$INKEY$trả về các ký tự ASCII cho các khóa tương ứng với các ký tự ASCII (bao gồm các ký tự điều khiển như thoát, tab và backspace). Tuy nhiên,INKEY$ cũng có thể xử lý một số khóa không có mã ASCII. Đối với những điều này (với tệp trợ giúp), "INKEY $ trả về chuỗi 2 byte được tạo thành từ ký tự null (ASCII 0) và mã quét bàn phím."

      Rõ như bùn? Dưới đây là một số ví dụ. Nếu bạn sử dụng INKEY$vòng lặp ở trên để chụp phím nhấn của phím mũi tên trái, k$sẽ chứa chuỗi "␀K"(với Kmã quét đại diện 75). Đối với mũi tên phải, nó "␀M"(77). Trang xuống là "␀Q"(81). F5 là "␀?"(63).

      Vẫn rõ như bùn? Vâng. Đó không phải là điều trực quan nhất trên thế giới. Tệp trợ giúp có một bảng mã quét, nhưng tôi luôn chỉ viết một chương trình nhỏ để in kết quả INKEY$và nhấn một loạt các phím để tìm ra giá trị đúng là gì. Khi bạn biết ký tự nào tương ứng với phím nào, bạn có thể sử dụng RIGHT$(k$,1)LEN(k$)để phân biệt giữa tất cả các trường hợp khác nhau mà bạn có thể gặp phải.

    Dòng dưới cùng? INKEY$là lạ, nhưng đó là cách duy nhất để đi nếu chương trình của bạn yêu cầu đầu vào không chặn hoặc cần sử dụng các phím mũi tên .


1 Không bao gồm Shift, Ctrl, Alt, PrntScr, Caps Lock, và tương tự. Những người không được tính. : ^ P

2 Thành WHILE ... WENDngữ ở đây là những gì tôi học được trong các cuốn sách QBasic của mình. Đối với mục đích chơi gôn, tuy nhiên, một GOTOvòng lặp ngắn hơn .


3

VỊ TRÍ có thể thực sự mạnh mẽ

Câu LOCATElệnh cho phép bạn đặt con trỏ ở bất cứ đâu trên màn hình (trong giới hạn không gian ký tự 80x40 thông thường) và in một cái gì đó tại vị trí đó. Câu trả lời này cho một thử thách thực sự cho thấy điều này (và cũng được kết hợp với rất nhiều lời khuyên khác từ chủ đề này).

Thử thách yêu cầu chúng tôi xuất ra mọi ký tự mà người dùng đã nhấn trong lưới 16x6. Với LOCATEđiều này chỉ đơn giản là vấn đề của div và mod đối với mã ASCII ( atrong mã này):

LOCATE a\16-1,1+2*(a MOD 16)

Và sau đó in ký tự:

?CHR$(a)

3

Trong QBasic, người ta thường sử dụng DIMcâu lệnh để tạo các biến, đặt cho chúng một tên và một loại. Tuy nhiên, điều này không bắt buộc, QBasic cũng có thể lấy được một loại bằng hậu tố của tên biến. Vì bạn không thể khai báo và khởi tạo một biến cùng một lúc, nên thường bỏ qua DIMcodegolf. Hai đoạn mã giống nhau về chức năng *:

DIM a AS STRING: a = "example"
a$ = "example"

* Lưu ý rằng điều này không tạo ra hai tên biến khác nhau.

Chúng ta có thể chỉ định loại biến bằng cách thêm $ vào cuối tên biến cho chuỗi, !cho các số chính xác đơn và nhân %đôi. Người độc thân được giả định khi không có loại được chỉ định.

a$ = "Definitely a string"
b! = "Error!"

Lưu ý rằng điều này cũng giữ cho mảng. Thông thường, một mảng được định nghĩa là:

DIM a(20) AS STRING

Nhưng mảng cũng không cần phải DIM med:

a$(2) = "QBasic 4 FUN!"

a$hiện là một mảng cho các chuỗi có 11 vị trí: từ chỉ số 0 đến và bao gồm cả chỉ số 10. Điều này được thực hiện vì QBasic có một tùy chọn cho phép lập chỉ mục dựa trên 0 và dựa trên 1 cho các mảng. Một loại mảng mặc định hỗ trợ cả hai cách này.

Hãy nhớ mảng hai mươi khe chúng ta DIMmed ở trên? Điều đó thực sự có 21 vị trí, bởi vì cùng một nguyên tắc áp dụng cho cả mảng mờ và không mờ.


Tôi không bao giờ nhận ra điều này áp dụng cho mảng quá. Hấp dẫn.
trichoplax

3

Sự làm ngắn lại IF báo cáo

IF báo cáo là khá tốn kém, và chơi golf xuống có thể tiết kiệm rất nhiều byte.

Hãy xem xét những điều sau đây (được điều chỉnh từ câu trả lời của Erik the Outgolfer):

IF RND<.5THEN
x=x-1
a(i)=1
ELSE
y=y-1
a(i)=0
ENDIF

Điều đầu tiên chúng ta có thể làm là lưu lại ENDIFbằng cách sử dụng IFcâu lệnh một dòng :

IF RND<.5THEN x=x-1:a(i)=1ELSE y=y-1:a(i)=0

Điều này hoạt động miễn là bạn không cố gắng đặt nó trên cùng một dòng như bất cứ điều gì khác. Đặc biệt, nếu bạn đã lồngIF câu lệnh , chỉ có một câu lệnh trong cùng có thể được xếp thành một dòng.

Nhưng trong trường hợp này, chúng ta có thể loại bỏ IFhoàn toàn bằng toán học. Hãy xem xét những gì chúng ta thực sự muốn:

  • Nếu RND<.5là true ( -1), chúng tôi muốn:
    • x giảm 1
    • y giữ nguyên
    • a(i) để trở thành 1
  • Mặt khác, nếu RND<.5là false ( 0), chúng tôi muốn:
    • x giữ nguyên
    • y giảm 1
    • a(i) trở thành 0

Bây giờ nếu chúng ta lưu kết quả của điều kiện trong một biến ( r=RND<.5), chúng ta có thể tính toán các giá trị mới của x, ya(i):

  • Khi r-1, x=x-1; khi r0, x=x+0.
  • Khi r-1, y=y+0; khi r0, y=y-1.
  • Khi r-1, a(i)=1; khi r0, a(i)=0.

Vì vậy, mã cuối cùng của chúng tôi trông giống như:

r=RND<.5
x=x+r
y=y-1-r
a(i)=-r

tiết kiệm được 20 byte (40%) so với phiên bản gốc.


Phương pháp toán học có thể được áp dụng một cách đáng ngạc nhiên thường xuyên, nhưng khi có sự khác biệt về logic giữa hai trường hợp (ví dụ: khi bạn cần nhập một cái gì đó trong một trường hợp nhưng không phải trong trường hợp khác), bạn vẫn sẽ cần sử dụng IF.


3

Đôi khi, bạn nên tránh mảng

Mảng trong QBasic, khi được khởi tạo mà không DIMcó 11 vị trí. Nếu một thử thách yêu cầu nhiều hơn 11 vị trí (hoặc N vị trí, trong đó N có thể lớn hơn 11), bạn nên DIMmảng. Ngoài ra, giả sử chúng ta muốn điền dữ liệu vào mảng này:

DIM a$(12)
a$(0) = "Value 1"
a$(1) = "Value 2"
...

Ngay cả khi chơi golf, điều này có thể chiếm rất nhiều không gian. Trong những dịp như vậy, có thể rẻ hơn bằng byte để làm điều này:

a$ = "value 1value 2"

Ở đây, chúng tôi đặt mọi thứ trong 1 chuỗi nối. Sau đó, chúng tôi truy cập nó như vậy:

?MID$(a$,i*7,7)

Đối với phương pháp này, điều quan trọng là tất cả các giá trị có độ dài bằng nhau. Lấy giá trị dài nhất và loại bỏ tất cả những thứ khác:

a$="one  two  threefour "

Bạn không cần phải điền giá trị cuối cùng và thậm chí bạn có thể bỏ qua dấu ngoặc kép! Nếu thử thách chỉ định rằng không gian trắng không được phép trong câu trả lời, hãy sử dụng RTRIM$()để khắc phục điều đó.

Bạn có thể thấy kỹ thuật này trong hành động ở đây .


3

PRINT( ?) có một số quirks

Các số được in với một không gian hàng đầu và dấu.

In ấn thêm một dòng. Hành vi này có thể được thay đổi bằng cách thêm dấu phẩy vào cuối câu lệnh để chèn một tab thay vào đó hoặc dấu chấm phẩy để tránh bất kỳ dấu chèn nào:

Không cần thiết phải sử dụng &hoặc ;giữa các hoạt động riêng biệt khi in, ví dụ. ?1"x"s$sẽ in số 1, với khoảng trắng ở mỗi bên, chữ cái xvà nội dung củas$

?"foo"
?"bar"
?10
?"foo",
?"bar"
?"foo"; 
?"bar"
?1CHR$(65)
?1" "CHR$(65)
?"A","B

Đầu ra

foo
bar
 10
foo           bar
foobar
 1 A
 1  A
A             B

In một ngắt dòng có thể được thực hiện chỉ với ?


Cụ thể về số in: một khoảng trắng được in trước số iff là không âm; mặt khác, một dấu trừ -được in ở đó. Một khoảng trắng cũng được in sau số. Cách tốt nhất mà tôi đã khám phá để loại bỏ các khoảng trắng này là PRINT USING--dunno nếu bạn muốn thêm nó vào câu trả lời này hoặc nếu đó là một câu trả lời riêng biệt.
DLosc

2

WRITE có thể hữu ích thay cho PRINT

PRINTthường là cách bạn muốn làm đầu ra, vì nó khá linh hoạt và có ?phím tắt. Tuy nhiên, WRITElệnh có thể giúp bạn tiết kiệm byte trong các tình huống cụ thể:

  • Khi xuất ra một chuỗi, WRITEbọc nó trong dấu ngoặc kép ( "). Nếu bạn cần đầu ra với dấu ngoặc kép, WRITE s$thì ngắn hơn nhiều ?CHR$(34);s$;CHR$(34). Xem, ví dụ, quine QBasic ngắn nhất được biết đến .
  • Khi xuất một số, WRITEkhông thêm khoảng trắng trước và sau khi nó thích PRINT. WRITE nngắn hơn nhiều so với ?MID$(STR$(n),2). Xem, ví dụ, FizzBuzz trong QB64 .
  • Khi xuất nhiều giá trị, WRITEphân tách chúng bằng dấu phẩy: WRITE 123,"abc"đầu ra 123,"abc". Tôi không thể nghĩ ra một kịch bản mà điều này sẽ hữu ích, nhưng điều đó không có nghĩa là không có kịch bản.

Hạn chế của WRITE:

  • Không có cách nào để xuất nhiều giá trị mà không có dấu phân cách như với PRINT a;b.
  • Không có cách nào để ngăn chặn dòng mới ở cuối đầu ra. (Bạn có thể giải quyết vấn đề này LOCATE, nhưng chi phí rất nhiều byte.)

1

Đôi khi, QBasic mangles đầu vào chức năng. Lạm dụng mà!

Có một vài hàm hoạt động trên các ký tự thay vì chuỗi, nhưng không có charkiểu dữ liệu trong QBasic, chỉ có string ($)kiểu. Ví dụ, ASC()hàm trả về mã khóa ASCII cho một ký tự. Nếu chúng ta sẽ vào

PRINT ASC("lala")

chỉ người đầu tiên lsẽ được xem xét bởi QBasic. Theo cách này, chúng ta không phải bận tâm đến việc cắt một chuỗi xuống độ dài 1.

Một ví dụ khác xuất phát từ câu hỏi này trong đó STRING$()hàm được sử dụng trong một trong các câu trả lời.

Hàm STRING $ có hai đối số, một số n và một chuỗi s $ và xây dựng một chuỗi bao gồm n bản sao của ký tự đầu tiên của s $

@DLosc, đây

Lưu ý rằng QBasic, khi được cung cấp một chuỗi nhiều char và chỉ cần một char, sẽ tự động lấy char đầu tiên và bỏ qua phần còn lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.