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í.
| Pojem | Vysvětlení |
|---|---|
| REM / ' | Komentář – QBasic tento řádek ignoruje |
| CLS | Vymaže obrazovku (CLear Screen) |
| END | Ukončí program |
| STOP | Pozastaví program (ladění) |
| SYSTEM | Zavře QBasic a vrátí se do DOS |
| LINE NUMBERS | Čísla řádků jsou volitelná (10, 20, 30...) |
' ============================================ ' 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řípona | Typ | Rozsah / Popis | Příklad |
|---|---|---|---|
| % | INTEGER | −32 768 až 32 767 | pocet% = 10 |
| & | LONG | −2 147 483 648 až 2 147 483 647 | velke& = 100000 |
| ! | SINGLE | Desetinné číslo (7 platných číslic) | cena! = 3.14 |
| # | DOUBLE | Desetinné číslo (15 platných číslic) | pi# = 3.14159265 |
| $ | STRING | Textový řetězec (max 32 767 znaků) | jmeno$ = "Karel" |
' 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
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
Č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$
Přečte celý řádek včetně čárek (na rozdíl od INPUT).
LINE INPUT "Adresa: ", adresa$ ' Uloží "Praha, Dlouhá 5" celé
Vrátí stisknutou klávesu bez čekání (neblokující).
DO k$ = INKEY$ IF k$ = "q" THEN EXIT DO PRINT "Pracuji..." SLEEP 1 LOOP
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
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
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
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
' 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)
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
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
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)
' 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")
' 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)
Vrátí délku řetězce (počet znaků).
s$ = "Dobrý den" PRINT LEN(s$) ' Vypíše: 9
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)
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"
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"
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")
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
| Funkce | Popis | Příklad | Výsledek |
|---|---|---|---|
| ABS(x) | Absolutní hodnota | ABS(-5) | 5 |
| INT(x) | Zaokrouhlení dolů | INT(3.9) | 3 |
| CINT(x) | Zaokrouhlení na celé číslo | CINT(3.5) | 4 |
| FIX(x) | Oříznutí desetinné části | FIX(-3.9) | -3 |
| SQR(x) | Druhá odmocnina | SQR(16) | 4 |
| LOG(x) | Přirozený logaritmus | LOG(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) | Kosinus | COS(0) | 1 |
| TAN(x) | Tangens | TAN(0.785) | ≈1 |
| ATN(x) | Arkus tangens | ATN(1)*4 | ≈PI |
| RND | Náhodné číslo 0.0–1.0 | INT(RND*6)+1 | kostka |
| RANDOMIZE | Inicializace náhody | RANDOMIZE TIMER | – |
| MOD | Zbytek po dělení | 10 MOD 3 | 1 |
| \ | Celočíselné dělení | 10 \ 3 | 3 |
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)
' 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
' ── 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
SCREEN. Nejběžnější je SCREEN 12 (640×480, 16 barev) nebo SCREEN 13 (320×200, 256 barev).
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
Vydá krátký pípací zvuk PC.
BEEP ' jednoduchý pípák
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.
' ================================================ ' 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