X11-Basic Windows v1.27

Referenční příručka se syntaxí, příklady a známými omezeními Windows verze

📦 Instalace a stažení

ZdrojURL
Windows instalátorsourceforge.net/projects/x11-basic/files/X11-Basic-WIN/
Domovská stránkax11-basic.sourceforge.net
Příklady (ZIP)codeberg.org/kollo/X11-Basic_examples
GitHubgithub.com/kollokollo/X11Basic

Po instalaci je interpreter dostupný jako xbasic.exe v instalační složce. Přidej ji do PATH pro spouštění odkudkoli.

▶ Spuštění programu

' PowerShell / CMD
xbasic.exe program.bas

' Interaktivní režim (bez souboru)
xbasic.exe

' Kompilace do bytekódu
xbbc.exe program.bas -o program.xbc
xbvm.exe program.xbc

Po skončení programu se otevře interaktivní prompt >. Ukončení: napiš quit nebo stiskni Ctrl+C.

⚠️ Záludnosti Windows verze

Kritické rozdíly oproti jiným BASICům – pokud přicházíš z QB64 nebo FreeBASIC, toto tě překvapí.
Co nefungujeCo místo toho použít
Jednořádkový IF THEN Blokový IF … ENDIF (viz sekce IF)
END IF (dvě slova) ENDIF (jedno slovo)
DO … LOOP WHILE WHILE … WEND nebo REPEAT … UNTIL
GOSUB label: PROCEDURE name … END PROC
COLOR r, g, b COLOR RGB(r, g, b)
OPENW šířka, výška OPENW čísloOkna (pak SIZEWIN)
TITLE "text" TITLEW číslo, "text"
SETFONT velikost, "bold" SETFONT velikost
Podtržítka v identif. (SP_ZAM) Bez podtržítek (SPZAM) – může způsobit chyby
UTF-8 / české znaky v kódu Pouze ASCII – diakritika v řetězcích může selhat

🔤 Proměnné a typy

TypPříponaPříkladPopis
Celé číslo(žádná)x = 42Integer (32-bit)
Desetinné(žádná)pi = 3.14Float (64-bit)
Řetězec$jmeno$ = "Pavel"String
Pole čísel(žádná)DIM a(10)1D pole
Pole řetězců$DIM s$(5)Pole stringů
Proměnné se inicializují na 0 resp. "" automaticky. Není nutné explicitní DIM pro skaláry.
' Deklarace pole
DIM hodnoty(100)
DIM jmena$(20)

' Přiřazení
hodnoty(1) = 42
jmena$(0) = "Alice"

' 2D pole
DIM mat(10, 10)
mat(2, 3) = 99

➕ Operátory

AritmetikaPopis
+ - * /Základní operace
^Mocnina
MODZbytek po dělení
DIVCeločíselné dělení
PorovnáníPopis
= <> < >Rovnost / nerovnost
<= >=Menší/větší nebo rovno
AND OR NOTLogické operátory
x = 10 ^ 2         ' = 100
r = 17 MOD 5       ' = 2
q = 17 DIV 5       ' = 3
b = (x > 5) AND (x < 200)  ' = -1 (true)

📝 Řetězce

' Spojení řetězců operátorem +
pozdrav$ = "Ahoj" + " " + "svete"

' Délka
n = LEN(pozdrav$)          ' = 10

' Podřetězec
zac$ = LEFT$(pozdrav$, 4)   ' = "Ahoj"
kon$ = RIGHT$(pozdrav$, 5)  ' = "svete"
mid$ = MID$(pozdrav$, 6, 5) ' = "svete"

' Konverze
s$ = STR$(42)              ' číslo → řetězec
n  = VAL("3.14")          ' řetězec → číslo
u$ = UPPER$(s$)           ' na velká
l$ = LOWER$(s$)           ' na malá
STR$ vrací číslo s případnou mezerou na začátku. Pro zobrazení bez mezery použij LTRIM$(STR$(x)) nebo STR$(INT(x)).

🔀 IF / ELSE / ENDIF

Kritické pravidlo: X11-Basic Windows neakceptuje jednořádkový IF podmínka THEN příkaz. Vždy použij blokovou formu s ENDIF.
❌ NEFUNGUJE
IF x > 0 THEN PRINT "kladne"
IF x < 0 THEN x = 0
✅ FUNGUJE
IF x > 0
  PRINT "kladne"
ENDIF

IF x < 0
  x = 0
ENDIF
' IF s ELSE
IF skore >= 50
  PRINT "Prospel"
ELSE
  PRINT "Neprospel"
ENDIF

' Vnořené IF
IF a > 0
  IF a < 100
    PRINT "V rozsahu 1-99"
  ENDIF
ENDIF
Obě varianty IF podmínka (bez THEN) i IF podmínka THEN (s THEN na konci řádku) fungují pro blokový IF. THEN na konci řádku bez příkazu je v pořádku.

🔁 Smyčky

FOR … NEXT

FOR i = 1 TO 10
  PRINT i
NEXT i

FOR i = 10 TO 1 STEP -1
  PRINT i
NEXT i

WHILE … WEND

' Podmínka se testuje NA ZAČÁTKU – tělo se nemusí provést vůbec
x = 1
WHILE x <= 5
  PRINT x
  x = x + 1
WEND

REPEAT … UNTIL

' Tělo se provede VŽDY ALESPOŇ JEDNOU
REPEAT
  PRINT "Zadej kladne cislo: ";
  INPUT n
UNTIL n > 0

DO … LOOP (nekonečná smyčka)

DO
  INPUT cmd$
  IF cmd$ = "quit"
    EXIT
  ENDIF
  PRINT "Prikaz: " + cmd$
LOOP
DO … LOOP WHILE podmínka není v Windows verzi podporováno. Použij REPEAT…UNTIL nebo nastav flag proměnnou a WHILE flag = 1 … WEND.

📦 PROCEDURE / END PROC

GOSUB label: nefunguje. X11-Basic Windows vyžaduje pro podprogramy klíčové slovo PROCEDURE.
❌ NEFUNGUJE
GOSUB mojefunkce
...
mojefunkce:
  PRINT "ahoj"
RETURN
✅ FUNGUJE
' Volání – jménem bez GOSUB
mojefunkce

' Definice
PROCEDURE mojefunkce
  PRINT "ahoj"
END PROC
' Lokální proměnné – globální scope, ale konvence: krátká jména uvnitř procedury
PROCEDURE vypocet
  tmp = 0
  FOR i = 1 TO ndeti
    tmp = tmp + 1000
  NEXT i
  vysl = tmp
END PROC

' Předčasné ukončení procedury
PROCEDURE zkontroluj
  IF x < 0
    RETURN     ' EXIT z procedure
  ENDIF
  PRINT "OK: " + STR$(x)
END PROC
Všechny proměnné jsou v X11-Basic globální. Procedury sdílejí namespace s hlavním programem.

⌨️ INPUT / PRINT

' Základní INPUT
INPUT x                     ' čte číslo
INPUT jmeno$                ' čte řetězec

' INPUT s promptem
PRINT "Zadejte mzdu (Kc): ";  ' ; = bez odřádkování
INPUT mzda

' PRINT varianty
PRINT "Ahoj"               ' s odřádkováním
PRINT "Ahoj";             ' bez odřádkování
PRINT                     ' prázdný řádek
PRINT "x =", x            ' , = tabulátor

🪟 Grafické okno

' Otevření okna
OPENW 1                         ' okno č. 1
TITLEW 1, "Moje aplikace"
SIZEWIN 800, 600               ' nastavení velikosti

' Smazání obsahu
CLEARW 1

' Zavření
CLOSEW 1
OPENW šířka, výška nefunguje. Parametr je číslo okna (celé číslo). Velikost nastav přes SIZEWIN.

🎨 Barvy

' Nastavení barvy kreslení
COLOR RGB(255, 0, 0)        ' červená
COLOR RGB(0, 128, 0)        ' zelená
COLOR RGB(255, 255, 255)    ' bílá
COLOR RGB(0, 0, 0)          ' černá
COLOR r, g, b (tři parametry) nefunguje. Vždy použij COLOR RGB(r, g, b).

Předdefinované konstanty barev:

KonstantaHodnotaBarva
WHITERGB(255,255,255)Bílá
BLACKRGB(0,0,0)Černá
REDRGB(255,0,0)Červená
GREENRGB(0,255,0)Zelená
BLUERGB(0,0,255)Modrá
YELLOWRGB(255,255,0)Žlutá

✏️ Kreslení

PříkazPopisPříklad
PLOT x, yBodPLOT 100, 200
DRAW x1,y1 TO x2,y2ČáraDRAW 0,0 TO 200,100
BOX x1,y1,x2,y2Obdélník (obrys)BOX 10,10,200,100
PBOX x1,y1,x2,y2Obdélník (výplň)PBOX 10,10,200,100
CIRCLE x,y,rKružnice (obrys)CIRCLE 100,100,50
PCIRCLE x,y,rKruh (výplň)PCIRCLE 100,100,50
ELLIPSE x,y,rx,ryElipsaELLIPSE 100,100,60,30
' Příklad: barevné obdélníky
OPENW 1
TITLEW 1, "Bary"

COLOR RGB(200, 50, 50)
PBOX 20, 20, 120, 120

COLOR RGB(50, 200, 50)
PBOX 140, 20, 240, 120

COLOR RGB(50, 50, 200)
PBOX 260, 20, 360, 120

INPUT a$
CLOSEW 1
END

🔠 TEXT a SETFONT

' Nastavení fontu
SETFONT 14         ' velikost v bodech
SETFONT 18

' Vykreslení textu na souřadnice (x, y = levý dolní roh)
COLOR RGB(0, 0, 0)
TEXT 20, 40, "Ahoj svete"

' Text s proměnnou (přes pomocný řetězec)
t$ = "Vysledek: " + STR$(vysl) + " Kc"
TEXT 20, 60, t$
SETFONT velikost, "bold" nefunguje. X11-Basic Windows přijímá pouze číslo velikosti.
Souřadnice Y u TEXT jsou dolní okraj textu (baseline), nikoli horní roh.

🔢 Matematické funkce

FunkcePopisPříklad
ABS(x)Absolutní hodnotaABS(-5) = 5
INT(x)Zaokrouhlení dolůINT(3.9) = 3
ROUND(x)ZaokrouhleníROUND(3.5) = 4
SQR(x)OdmocninaSQR(9) = 3
SIN(x)Sinus (radiány)SIN(3.14159/2)
COS(x)KosinusCOS(0) = 1
TAN(x)TangensTAN(0.785)
LOG(x)Přirozený logaritmusLOG(2.718)
EXP(x)e^xEXP(1) = 2.718
MAX(a,b)MaximumMAX(3,7) = 7
MIN(a,b)MinimumMIN(3,7) = 3
SGN(x)Znaménko (-1/0/1)SGN(-5) = -1
RND(x)Náhodné číslo 0..xRND(100)

🧵 Řetězcové funkce

FunkcePopisPříklad
LEN(s$)Délka řetězceLEN("ahoj") = 4
LEFT$(s$,n)Levých n znakůLEFT$("abcde",3) = "abc"
RIGHT$(s$,n)Pravých n znakůRIGHT$("abcde",2) = "de"
MID$(s$,p,n)n znaků od pozice pMID$("abcde",2,3) = "bcd"
UPPER$(s$)Na velká písmenaUPPER$("ahoj") = "AHOJ"
LOWER$(s$)Na malá písmenaLOWER$("AHOJ") = "ahoj"
LTRIM$(s$)Odstraní mezery vlevoLTRIM$(" x") = "x"
RTRIM$(s$)Odstraní mezery vpravo
TRIM$(s$)Odstraní mezery na obou stranách
INSTR(s$,h$)Pozice podřetězce (0=nenalezen)INSTR("ahoj","ho") = 2
SPACE$(n)n mezerSPACE$(3) = " "
STRING$(n,s$)Opakování řetězceSTRING$(3,"ab") = "ababab"
CHR$(n)Znak dle ASCII kóduCHR$(65) = "A"
ASC(s$)ASCII kód prvního znakuASC("A") = 65

🔄 Konverze typů

' Číslo na řetězec
s$ = STR$(42)              ' " 42" (s mezerou)
s$ = LTRIM$(STR$(42))     ' "42" (bez mezery)
s$ = STR$(INT(x))         ' celé číslo jako text

' Řetězec na číslo
n = VAL("3.14")
n = VAL("  42  ")         ' mezery jsou OK

' Formátované číslo (pevný počet des. míst)
s$ = FORMAT$("%.2f", 3.14159)   ' "3.14"
s$ = FORMAT$("%d", 42)          ' "42"

👋 Příklad: Hello World s grafikou

OPENW 1
TITLEW 1, "Hello World"

COLOR RGB(30, 30, 80)
PBOX 0, 0, 400, 200

COLOR RGB(255, 255, 100)
SETFONT 24
TEXT 80, 110, "Hello, X11-Basic!"

COLOR RGB(200, 200, 200)
SETFONT 12
TEXT 140, 140, "Stiskni Enter..."

INPUT a$
CLOSEW 1
END

🧮 Příklad: Konzolová kalkulačka

novy = 1
WHILE novy = 1
  PRINT
  PRINT "=== KALKULACKA ==="
  PRINT "Prvni cislo: ";
  INPUT a
  PRINT "Operator (+,-,*,/): ";
  INPUT op$
  PRINT "Druhe cislo: ";
  INPUT b

  vysl = 0
  chyba = 0

  IF op$ = "+"
    vysl = a + b
  ENDIF
  IF op$ = "-"
    vysl = a - b
  ENDIF
  IF op$ = "*"
    vysl = a * b
  ENDIF
  IF op$ = "/"
    IF b = 0
      PRINT "Chyba: deleni nulou!"
      chyba = 1
    ELSE
      vysl = a / b
    ENDIF
  ENDIF

  IF chyba = 0
    t$ = STR$(a) + " " + op$ + " " + STR$(b) + " = " + STR$(vysl)
    PRINT t$
  ENDIF

  PRINT
  PRINT "Dalsi vypocet? (1=ano / 0=konec): ";
  INPUT novy
WEND

PRINT "Nashledanou."
END

📊 Příklad: Sloupcový graf

OPENW 1
TITLEW 1, "Sloupcovy graf"
SIZEWIN 640, 400

' Data
DIM data(5)
DIM popisy$(5)
data(1) = 80  : popisy$(1) = "Leden"
data(2) = 120 : popisy$(2) = "Unor"
data(3) = 95  : popisy$(3) = "Brezen"
data(4) = 150 : popisy$(4) = "Duben"
data(5) = 110 : popisy$(5) = "Kveten"

' Pozadi
COLOR RGB(240, 245, 255)
PBOX 0, 0, 640, 400

' Nadpis
COLOR RGB(20, 40, 120)
SETFONT 16
TEXT 220, 30, "Mesicni trzby"

' Sloupce
maxval = 200
barw   = 70
gbase  = 350

FOR i = 1 TO 5
  xpos = 60 + (i - 1) * 110
  bh   = INT(data(i) / maxval * 280)
  COLOR RGB(60 + i * 30, 100, 220)
  PBOX xpos, gbase - bh, xpos + barw, gbase
  COLOR RGB(30, 30, 30)
  SETFONT 10
  TEXT xpos + 5, gbase + 16, popisy$(i)
  t$ = STR$(data(i))
  TEXT xpos + 15, gbase - bh - 5, t$
NEXT i

COLOR RGB(80, 80, 80)
DRAW 50, gbase TO 610, gbase

INPUT a$
CLOSEW 1
END