⌨ QBasic

Referenční příručka s příklady a českými komentáři

MS-DOS · QuickBASIC · QB64
📖

Základy jazyka QBasic

QBasic je interpretovaný jazyk vyvinutý firmou Microsoft. Byl součástí MS-DOS od verze 5.0. Programy se píší v textovém editoru a spouštějí řádek po řádku. QB64 je moderní open-source náhrada kompatibilní se starou syntaxí.

PojemVysvětlení
REM / 'Komentář – QBasic tento řádek ignoruje
CLSVymaže obrazovku (CLear Screen)
ENDUkončí program
STOPPozastaví program (ladění)
SYSTEMZavře QBasic a vrátí se do DOS
LINE NUMBERSČísla řádků jsou volitelná (10, 20, 30...)
▶ Příklad – struktura prvního programu
' ============================================
' Můj první QBasic program
' Autor: Jana Nováková, 1995
' ============================================

CLS                        ' Vymaž obrazovku
PRINT "Ahoj světe!"         ' Vypiš text
PRINT "Vítej v QBasicu"
PRINT                      ' Prázdný řádek
PRINT "Zmáčkni libovolnou klávesu..."
SLEEP                      ' Čekej na stisk klávesy
END                        ' Konec programu
📦

Proměnné a datové typy

PříponaTypRozsah / PopisPříklad
%INTEGER−32 768 až 32 767pocet% = 10
&LONG−2 147 483 648 až 2 147 483 647velke& = 100000
!SINGLEDesetinné číslo (7 platných číslic)cena! = 3.14
#DOUBLEDesetinné číslo (15 platných číslic)pi# = 3.14159265
$STRINGTextový řetězec (max 32 767 znaků)jmeno$ = "Karel"
▶ Příklad – deklarace a použití proměnných
' Explicitní deklarace typů (doporučeno)
DIM vek AS INTEGER
DIM jmeno AS STRING
DIM vyska AS SINGLE
DIM plat AS LONG

' Přiřazení hodnot
vek = 25
jmeno = "Petr Novák"
vyska = 182.5
plat = 45000

' Výpis hodnot
PRINT "Jméno: "; jmeno
PRINT "Věk: "; vek; " let"
PRINT "Výška: "; vyska; " cm"

' OPTION EXPLICIT – nutí deklarovat všechny proměnné
' (zabrání překlepům v názvech)
OPTION EXPLICIT

' Konstanty – hodnoty nelze změnit
CONST PI = 3.14159265
CONST MAX_ZAKU = 30
CONST NAZEV_SKOLY = "ZŠ Mánesova"
💬

Vstup a výstup

PRINT příkaz

Vypíše text nebo hodnotu proměnné na obrazovku. Středník (;) pokračuje na stejném řádku, čárka (,) skočí na další tabulátor.

PRINT "Ahoj"          ' nový řádek
PRINT "A"; "B"        ' AB (bez mezery)
PRINT "A", "B"        ' A       B (tab)
PRINT 42; 3.14        ' čísla
INPUT příkaz

Čeká na vstup od uživatele a uloží ho do proměnné.

INPUT "Zadej jméno: ", jmeno$
INPUT "Zadej věk: ", vek%
PRINT "Ahoj, "; jmeno$
LINE INPUT příkaz

Přečte celý řádek včetně čárek (na rozdíl od INPUT).

LINE INPUT "Adresa: ", adresa$
' Uloží "Praha, Dlouhá 5" celé
INKEY$ funkce

Vrátí stisknutou klávesu bez čekání (neblokující).

DO
  k$ = INKEY$
  IF k$ = "q" THEN EXIT DO
  PRINT "Pracuji..."
  SLEEP 1
LOOP
LOCATE příkaz

Přesune kurzor na zadaný řádek a sloupec (1,1 je levý horní roh).

LOCATE 10, 20        ' řádek 10, sloupec 20
PRINT "Jsem uprostřed!"
LOCATE 25, 1         ' poslední řádek
COLOR příkaz

Nastaví barvu textu (popředí) a pozadí (0–15).

COLOR 14, 1  ' žlutý text, modré pozadí
PRINT "Barevný text!"
COLOR 7, 0   ' obnovit výchozí barvy
' 0=černá 1=modrá 2=zelená 3=azurová
' 4=červená 7=šedá 14=žlutá 15=bílá
🔀

Podmíněné příkazy

IF ... THEN ... ELSE příkaz

Základní větvení programu. Pokud je podmínka pravdivá, provede se THEN část, jinak ELSE část.

INPUT "Věk: ", vek%

' Jednořádková forma
IF vek% >= 18 THEN PRINT "Dospělý" ELSE PRINT "Mladistvý"

' Blokovaná forma (přehlednější)
IF vek% < 0 THEN
  PRINT "Chybný věk!"
ELSEIF vek% < 18 THEN
  PRINT "Dítě nebo teenager"
ELSEIF vek% < 65 THEN
  PRINT "Dospělý"
ELSE
  PRINT "Senior"
END IF
SELECT CASE příkaz

Větví program podle hodnoty výrazu. Přehlednější než mnoho ELSEIF.

INPUT "Den (1-7): ", den%

SELECT CASE den%
  CASE 1
    PRINT "Pondělí – začátek týdne"
  CASE 2, 3, 4
    PRINT "Všední den"
  CASE 5
    PRINT "Pátek!"
  CASE 6 TO 7
    PRINT "Víkend"
  CASE ELSE
    PRINT "Neplatný den"
END SELECT
Logické operátory operátor
' AND – obě podmínky musí být pravda
IF vek% > 18 AND vek% < 60 THEN
  PRINT "Produktivní věk"
END IF

' OR – alespoň jedna podmínka
IF den% = 6 OR den% = 7 THEN
  PRINT "Víkend"
END IF

' NOT – negace
IF NOT (hotovo = 1) THEN
  PRINT "Ještě není hotovo"
END IF
🔁

Cykly (smyčky)

FOR ... NEXT příkaz

Opakuje blok kódu s čítačem od počáteční do koncové hodnoty.

' Základní cyklus
FOR i = 1 TO 5
  PRINT "Řádek číslo"; i
NEXT i

' Krok STEP (může být záporný)
FOR i = 10 TO 1 STEP -1
  PRINT i
NEXT i

' Vnořené cykly – násobilka
FOR a = 1 TO 3
  FOR b = 1 TO 3
    PRINT a; "x"; b; "="; a*b
  NEXT b
NEXT a
WHILE ... WEND příkaz

Opakuje blok dokud je podmínka pravdivá.

DIM cislo AS INTEGER
cislo = 1

WHILE cislo <= 10
  PRINT cislo
  cislo = cislo + 1
WEND

' Příklad: čtení dokud není "konec"
WHILE vstup$ <> "konec"
  INPUT "Slovo (nebo 'konec'): ", vstup$
  PRINT "Zadal jsi: "; vstup$
WEND
DO ... LOOP příkaz

Flexibilnější cyklus – podmínka může být na začátku nebo na konci.

' DO WHILE – zkontroluje na začátku
DO WHILE x < 100
  x = x * 2
LOOP

' DO UNTIL – opakuj dokud není splněno
DO UNTIL hotovo = 1
  PRINT "Stále pracuji..."
LOOP

' Podmínka na konci (proběhne alespoň 1x)
DO
  INPUT "Heslo: ", heslo$
LOOP UNTIL heslo$ = "qbasic"

' EXIT DO – vyskočí z cyklu
DO
  INPUT "Číslo: ", n
  IF n = 0 THEN EXIT DO
LOOP
⚙️

Funkce a procedury (SUB / FUNCTION)

▶ Příklad – SUB (procedura bez návratové hodnoty)
' Definice procedury
SUB VypisPozdravi(jmeno$, vek%)
  COLOR 14, 0
  PRINT "Ahoj, "; jmeno$; "! Je ti "; vek%; "let."
  COLOR 7, 0
END SUB

' Procedura pro nakreslení rámečku
SUB Ramecek(text$)
  PRINT "+-" + STRING$(LEN(text$), "-") + "-+"
  PRINT "| " + text$ + " |"
  PRINT "+-" + STRING$(LEN(text$), "-") + "-+"
END SUB

' Hlavní program
CALL VypisPozdravi("Karel", 20)
CALL Ramecek("Vítej v QBasicu")
▶ Příklad – FUNCTION (funkce s návratovou hodnotou)
' Funkce pro výpočet faktoriálu
FUNCTION Faktorial(n%) AS LONG
  IF n% <= 1 THEN
    Faktorial = 1
  ELSE
    Faktorial = n% * Faktorial(n% - 1)  ' rekurze!
  END IF
END FUNCTION

' Funkce pro maximum dvou čísel
FUNCTION Maximum(a, b)
  IF a > b THEN
    Maximum = a
  ELSE
    Maximum = b
  END IF
END FUNCTION

' Použití funkcí
PRINT "5! ="; Faktorial(5)       ' Vypíše: 120
PRINT "Max(7,3) ="; Maximum(7, 3) ' Vypíše: 7
🔤

Práce s řetězci (textem)

LEN funkce

Vrátí délku řetězce (počet znaků).

s$ = "Dobrý den"
PRINT LEN(s$)    ' Vypíše: 9
LEFT$ / RIGHT$ / MID$ funkce

Vyjme část řetězce zleva, zprava nebo ze středu.

s$ = "Programování"
PRINT LEFT$(s$, 7)    ' "Program"
PRINT RIGHT$(s$, 4)   ' "ování"
PRINT MID$(s$, 8, 4)  ' "ování" (od poz.8, 4 znaky)
UCASE$ / LCASE$ funkce

Převede řetězec na velká / malá písmena.

s$ = "Ahoj Světe"
PRINT UCASE$(s$)  ' "AHOJ SVĚTE"
PRINT LCASE$(s$)  ' "ahoj světe"
LTRIM$ / RTRIM$ funkce

Odstraní mezery ze začátku nebo konce řetězce.

s$ = "  text  "
PRINT LTRIM$(s$)  ' "text  "
PRINT RTRIM$(s$)  ' "  text"
' Oboje najednou:
PRINT LTRIM$(RTRIM$(s$))  ' "text"
INSTR funkce

Hledá podřetězec v řetězci. Vrátí pozici nebo 0.

s$ = "Karel a Jana"
PRINT INSTR(s$, "Jana")  ' Vrátí 9
PRINT INSTR(s$, "Petr")  ' Vrátí 0 (nenalezeno)
' Hledání od pozice 5:
PRINT INSTR(5, s$, "a")
STR$ / VAL / CHR$ / ASC funkce

Převody mezi čísly a textem nebo ASCII kódy.

PRINT STR$(42)      ' číslo → text " 42"
PRINT VAL("3.14")   ' text → číslo 3.14
PRINT CHR$(65)     ' ASCII 65 → "A"
PRINT ASC("A")     ' "A" → ASCII 65
PRINT CHR$(13)     ' Enter (odřádkování)
🔢

Matematické funkce

FunkcePopisPříkladVýsledek
ABS(x)Absolutní hodnotaABS(-5)5
INT(x)Zaokrouhlení dolůINT(3.9)3
CINT(x)Zaokrouhlení na celé čísloCINT(3.5)4
FIX(x)Oříznutí desetinné částiFIX(-3.9)-3
SQR(x)Druhá odmocninaSQR(16)4
LOG(x)Přirozený logaritmusLOG(2.718)≈1
EXP(x)Exponenciální funkce (e^x)EXP(1)2.718...
SIN(x)Sinus (argument v radiánech)SIN(3.14159/2)≈1
COS(x)KosinusCOS(0)1
TAN(x)TangensTAN(0.785)≈1
ATN(x)Arkus tangensATN(1)*4≈PI
RNDNáhodné číslo 0.0–1.0INT(RND*6)+1kostka
RANDOMIZEInicializace náhodyRANDOMIZE TIMER–
MODZbytek po dělení10 MOD 31
\ Celočíselné dělení10 \ 33
▶ Příklad – hod kostkou a výpočty
RANDOMIZE TIMER           ' inicializuj náhodný generátor

' Simulace hodu kostkou 5×
FOR i = 1 TO 5
  hod = INT(RND * 6) + 1   ' náhodné číslo 1–6
  PRINT "Hod č."; i; ":"; hod
NEXT i

' Převod stupňů na radiány
CONST PI = 3.14159265
stupne = 90
radiany = stupne * PI / 180
PRINT "sin(90°) ="; SIN(radiany)   ' = 1
📊

Pole (Arrays)

▶ Příklad – jednorozměrné a dvourozměrné pole
' Jednorozměrné pole – 5 čísel
DIM cisla(5) AS INTEGER

' Naplnění pole
FOR i = 1 TO 5
  cisla(i) = i * 10     ' 10, 20, 30, 40, 50
NEXT i

' Výpis pole
FOR i = 1 TO 5
  PRINT "cisla("; i; ") ="; cisla(i)
NEXT i

' Pole řetězců
DIM mesice(12) AS STRING
DATA "Leden","Únor","Březen","Duben","Květen","Červen"
DATA "Červenec","Srpen","Září","Říjen","Listopad","Prosinec"
FOR i = 1 TO 12
  READ mesice(i)
NEXT i
PRINT "Třetí měsíc: "; mesice(3)   ' Březen

' Dvourozměrné pole – matice 3x3
DIM matice(3, 3) AS INTEGER
FOR r = 1 TO 3
  FOR s = 1 TO 3
    matice(r, s) = r * 10 + s
    PRINT matice(r, s);
  NEXT s
  PRINT                     ' nový řádek
NEXT r

' Dynamické pole (velikost za běhu)
DIM dynamicke() AS INTEGER
INPUT "Kolik prvků? ", n%
REDIM dynamicke(n%)
REDIM PRESERVE dynamicke(n% + 5) ' zvětší a zachová data
💾

Práce se soubory

▶ Příklad – zápis a čtení textového souboru
' ── ZÁPIS DO SOUBORU ──────────────────────
OPEN "data.txt" FOR OUTPUT AS #1   ' otevři pro zápis

PRINT #1, "Karel Novák"              ' zapiš řádek
PRINT #1, 25
PRINT #1, "Praha"
CLOSE #1                            ' zavři soubor!

' ── ČTENÍ ZE SOUBORU ──────────────────────
OPEN "data.txt" FOR INPUT AS #2    ' otevři pro čtení

DO WHILE NOT EOF(2)                 ' dokud není konec souboru
  LINE INPUT #2, radek$
  PRINT radek$
LOOP
CLOSE #2

' ── PŘIDÁNÍ NA KONEC SOUBORU ──────────────
OPEN "data.txt" FOR APPEND AS #3   ' přidej na konec
PRINT #3, "Nový záznam"
CLOSE #3

' ── ZJISTIT, ZDA SOUBOR EXISTUJE ──────────
IF LEN(DIR$("data.txt")) > 0 THEN
  PRINT "Soubor existuje"
ELSE
  PRINT "Soubor neexistuje"
END IF

' ── SMAZÁNÍ SOUBORU ───────────────────────
KILL "data.txt"    ' smaže soubor
🎨

Grafické příkazy

💡 Tip: Grafika funguje jen po přepnutí do grafického režimu příkazem SCREEN. Nejběžnější je SCREEN 12 (640×480, 16 barev) nebo SCREEN 13 (320×200, 256 barev).
▶ Příklad – základní grafické příkazy
SCREEN 12           ' 640×480 px, 16 barev

' ── ČÁRA ────────────────────────────────
LINE (10, 10)-(200, 100), 14     ' žlutá čára

' ── OBDÉLNÍK ────────────────────────────
LINE (50, 50)-(200, 150), 4, B   ' B = Box (obdélník)
LINE (50, 50)-(200, 150), 2, BF  ' BF = Box Filled

' ── KRUH / ELIPSA ───────────────────────
CIRCLE (320, 240), 100, 15        ' střed, poloměr, barva
CIRCLE (320, 240), 50, 4, , , 0.5' elipsa (poměr stran)

' ── BOD ─────────────────────────────────
PSET (100, 100), 12               ' bod na pozici, červeně

' ── VÝPLŇ ───────────────────────────────
PAINT (320, 240), 2, 15           ' vyplň zeleně (hranice=bílá)

' ── VYKRESLENÍ HVĚZDIČKY pomocí cyklu ──
CONST PI = 3.14159265
FOR uhel = 0 TO 2 * PI STEP 0.1
  x = 320 + COS(uhel) * 150
  y = 240 + SIN(uhel) * 150
  PSET (x, y), 14
NEXT uhel

SLEEP               ' počkej na klávesu
SCREEN 0            ' vrať se do textového režimu
🔊

Zvuk

BEEP příkaz

Vydá krátký pípací zvuk PC.

BEEP     ' jednoduchý pípák
SOUND příkaz

Přehraje tón o zadané frekvenci (Hz) a délce (clocky; 18.2/s).

SOUND 440, 18   ' nota A, 1 sekunda
SOUND 523, 9    ' nota C, půl sekundy

' Malá stupnice C-dur
DATA 262, 294, 330, 349, 392, 440, 494, 523
FOR i = 1 TO 8
  READ nota
  SOUND nota, 9   ' každá nota půl sekundy
NEXT i
🎮

Celý program – Hádání čísla

Kompletní program demonstrující použití proměnných, cyklů, podmínek, procedur a funkce RND.

▶ hadej.bas – hra "Uhodni číslo 1–100"
' ================================================
' HÁDÁNÍ ČÍSLA – kompletní QBasic program
' Hráč hádá náhodné číslo mezi 1 a 100
' ================================================

DECLARE SUB Hlavicka()
DECLARE SUB VypisPokus(pokus%, tip%, tajne%)

'--- Hlavní program ---
CLS
RANDOMIZE TIMER

hratZnovu$ = "a"

DO WHILE UCASE$(hratZnovu$) = "A"
  CALL Hlavicka()

  tajneCislo% = INT(RND * 100) + 1  ' číslo 1–100
  pocetPokusu% = 0
  uhodl% = 0

  DO WHILE uhodl% = 0
    pocetPokusu% = pocetPokusu% + 1

    ' Validace vstupu
    DO
      INPUT "Tvůj tip (1-100): ", tip%
    LOOP WHILE tip% < 1 OR tip% > 100

    CALL VypisPokus(pocetPokusu%, tip%, tajneCislo%)

    IF tip% = tajneCislo% THEN
      uhodl% = 1
    END IF
  LOOP

  ' Gratulace
  COLOR 10, 0        ' světle zelená
  PRINT
  PRINT "*** SPRÁVNĚ! Uhodl jsi za"; pocetPokusu%; "pokusů! ***"
  COLOR 7, 0

  ' Hodnocení
  SELECT CASE pocetPokusu%
    CASE 1:        PRINT "Neuvěřitelné! Telepatické schopnosti!"
    CASE 2 TO 5:  PRINT "Výborně! Jsi génius!"
    CASE 6 TO 10: PRINT "Dobře! Průměrný výkon."
    CASE ELSE:     PRINT "Příště to zvládneš lépe!"
  END SELECT

  PRINT
  INPUT "Chceš hrát znovu? (A/N): ", hratZnovu$
  CLS
LOOP

PRINT "Díky za hru! Nashledanou."
END

'--- Procedury ---

SUB Hlavicka()
  COLOR 14, 0
  PRINT "=================================="
  PRINT "     HRA: UHODNI ČÍSLO 1-100    "
  PRINT "=================================="
  COLOR 7, 0
  PRINT
END SUB

SUB VypisPokus(pokus%, tip%, tajne%)
  PRINT "Pokus č."; pokus%; ": Hádáš"; tip%; "–";

  IF tip% < tajne% THEN
    COLOR 12, 0
    PRINT "příliš MALÉ!"
  ELSEIF tip% > tajne% THEN
    COLOR 9, 0
    PRINT "příliš VELKÉ!"
  ELSE
    COLOR 10, 0
    PRINT "SPRÁVNĚ!"
  END IF
  COLOR 7, 0
END SUB