Bazele MiniScript+
Învață sintaxa de bază a limbajului folosit pe ScripticX.
Rulează fiecare exemplu în editorul ScripticX, apoi schimbă o singură valoare și încearcă să prezici rezultatul înainte de a-l rula din nou. Fiecare program de pe această pagină a fost executat cu interpretorul MiniScript+, iar rezultatele afișate sunt cele reale.
MiniScript+ (.msp) este limbajul de învățare integrat în ScripticX. Sintaxa
lui este intenționat compactă, ca începătorii să se poată concentra pe
raționament și pe rezolvarea problemelor, nu pe punctuație.
Tot limbajul înseamnă șapte instrucțiuni: PRINT, INPUT, atribuirea, IF,
ELSE, END, WHILE, plus expresii. Nu există tablouri și nici funcții
definite de tine (în curând :>).
Cum rulează un program
Un program este o listă de linii, citită de sus în jos. O linie de cod înseamnă întotdeauna exact o instrucțiune, inclusiv liniile goale și cele de comentariu. Interpretorul ține un pointer către linia curentă, o execută și trece mai departe. Buclele și condițiile funcționează mutând acel pointer în altă parte.
1total = 02total = total + 53PRINT total15Atribuirea nu afișează nimic de una singură. Doar PRINT scrie în consolă.
Editorul îți dă două moduri de a rula asta:
| Acțiune | Ce face |
|---|---|
| Rulează | Execută până la finalul programului, până la o eroare sau până când INPUT cere o valoare |
| Pas | Execută exact o instrucțiune, apoi se oprește ca să poți inspecta panoul Variabile |
Rularea pas cu pas este cel mai rapid mod de a înțelege o buclă: urmărește cum
sare pointerul de la END înapoi la WHILE și cum se schimbă contorul pe drum.
Există un singur set de variabile pentru tot programul. O variabilă creată în corpul unei bucle rămâne citibilă și după ce bucla se termină.
Reguli de sintaxă
O singură instrucțiune pe linie. Nu există separator de instrucțiuni.
x = 1 PRINT x nu înseamnă două instrucțiuni, ci este o eroare.
Cuvintele cheie se scriu cu MAJUSCULE. PRINT, INPUT, IF, THEN,
ELSE, END, WHILE, AND, OR, NOT, DIV, MOD. Dacă scrii print x,
programul se oprește cu Unknown instruction "print x". Două lucruri nu țin
cont de majuscule: literalii TRUE/FALSE și numele funcțiilor predefinite,
abs(-4) funcționează. Numele variabilelor țin cont de majuscule, așa că
total, Total și TOTAL sunt trei variabile diferite.
END se scrie mereu singur. END IF și END WHILE nu sunt valide.
Comentariile încep cu #, fie pe o linie separată, fie după cod. // nu
este comentariu (x = 5 // 2 dă eroare).
1# Calculează scorul final2baza = 803bonus = 10 # acordat pentru viteză4PRINT baza + bonus190Interpretorul elimină comentariile și un eventual două puncte înainte să se
uite la ghilimele, așa că ambele caractere strică textele care le conțin:
PRINT "a#b" afișează a, iar PRINT "a:b" afișează ab. Ține # și :
în afara valorilor tale de tip text.
Valori și variabile
Există trei tipuri și niciun mod de a declara unul: o variabilă apare la prima atribuire și preia tipul valorii pe care o ține.
| Tip | Exemple | Observații |
|---|---|---|
| Număr | 42, 3.14, -7 | Un singur tip numeric; / poate da zecimale |
| Text | "salut" | Doar ghilimele duble drepte |
| Boolean | TRUE, FALSE | Rezultă și din orice comparație |
1nume = "Ana"2scor = 103promovat = scor >= 545PRINT nume6PRINT scor7PRINT promovat1Ana2103trueValorile boolean se afișează cu litere mici, ca true și false, de aceea
arată altfel decât TRUE pe care îl scrii tu.
Numele trebuie să înceapă cu o literă sau cu _ și pot conține apoi litere,
cifre și _. Dacă citești o variabilă căreia nu i-ai atribuit nimic, programul
se oprește cu Variable "x" is not defined.
O variabilă își poate schimba tipul oricând. Partea din dreapta se evaluează prima, iar rezultatul înlocuiește valoarea veche, exact mecanismul care face contoarele să funcționeze:
1contor = 12contor = contor + 13contor = "gata"4PRINT contor1gataExpresii și operatori
Operatorii sunt listați de la cei mai slabi la cei mai puternici. Ce se află mai sus în tabel se evaluează după ce se află mai jos.
| Nivel | Operatori | Observații |
|---|---|---|
| 1 | OR | |
| 2 | AND | |
| 3 | < > <= >= == != | |
| 4 | + - | |
| 5 | * / % DIV MOD | |
| 6 | NOT - + (unari) |
Parantezele au prioritate peste tot, așa că 2 + 3 * 4 dă 14, dar
(2 + 3) * 4 dă 20.
Aritmetică. / este împărțirea obișnuită și poate da zecimale. DIV este
împărțirea întreagă, care trunchiază spre zero, iar MOD (sau %) dă restul.
1PRINT 7 / 22PRINT 7 DIV 23PRINT 7 MOD 24PRINT -7 DIV 213.523314-3Împărțirea sau restul la zero opresc programul cu
Division by zero is not allowed, respectiv Modulo by zero is not allowed.
+ are două roluri. Dacă una dintre părți este text, ambele devin text și
se lipesc. Altfel este adunare. Toți ceilalți operatori aritmetici merg doar cu
numere și raportează Operator - can only be used with numbers.
1PRINT "Scor " + 102PRINT 3 + 41Scor 1027Comparații. <, >, <= și >= merg doar cu numere! Comparând text cu
ele obții eroare. == și != merg cu orice două valori și compară și valoarea,
și tipul, așa că 1 == "1" este false.
Logică. AND, OR și NOT își tratează operanzii ca adevărat sau fals și
întorc mereu un boolean. Textul gol și 0 contează ca fals.
Într-o condiție IF sau WHILE, un = cu spații în jur este citit ca ==,
deci IF x = 5 THEN se comportă ca IF x == 5 THEN. Obiceiul mai clar rămâne
să scrii == peste tot, fiindcă în orice altă poziție = înseamnă atribuire.
Funcții predefinite
Există cinci funcții. Argumentele trebuie să fie numere, iar numele nu țin cont de majuscule.
| Apel | Rezultat | Exemplu |
|---|---|---|
INT(x) | Trunchiază spre zero | INT(-2.7) → -2 |
TRUNC(x) | Identic cu INT | TRUNC(2.7) → 2 |
FLOOR(x) | Rotunjește în jos | FLOOR(-2.7) → -3 |
ROUND(x) | Cel mai apropiat întreg, jumătățile urcă | ROUND(2.5) → 3 |
ROUND(x, d) | Rotunjește la d zecimale | ROUND(2 / 3, 2) → 0.67 |
ABS(x) | Valoarea absolută | ABS(-4) → 4 |
Apelurile se pot imbrica și se combină cu operatori ca orice altă expresie, așa
că PRINT ABS(INT(-9.7) + 2) afișează 7.
Editorul colorează SQRT, CEIL, MIN și MAX ca funcții, însă
interpretorul nu le definește. Un apel eșuează cu Unknown function "SQRT".
Calculează-le singur: MAX cu un IF, iar radicalul întreg cu o buclă
WHILE.
Input și output
PRINT primește exact o expresie și scrie câte o linie la fiecare apel. Ca să
etichetezi o valoare, lipește-o cu +.
1total = 122PRINT "Total " + total1Total 12INPUT nume oprește programul și reține ce tastezi. Editorul transformă în
număr ceea ce arată a număr și în boolean valorile true/false; orice
altceva rămâne text. Dacă trimiți căsuța goală, primești 0.
1INPUT varsta2IF varsta >= 18 THEN3PRINT "Adult"4ELSE5PRINT "Minor"6ENDCu 20 tastat, programul afișează Adult.
Problemele evaluate trimit datele într-o ordine fixă, câte una pentru fiecare
INPUT. Dacă ceri mai puține valori decât trimite testul, restul rămân
necitite; dacă ceri mai multe, rularea se oprește. Respectă exact numărul din
enunț.
Condiții
Un bloc IF își execută corpul doar când condiția este adevărată și se închide
mereu cu END. THEN este obligatoriu, dacă îl uiți primești
Missing THEN in IF statement.
1scor = 8023IF scor >= 50 THEN4PRINT "Admis"5ELSE6PRINT "Mai încearcă"7END1AdmisELSE este opțional, iar un bloc poate conține cel mult unul. Indentarea este
doar pentru lizibilitate. Interpretorul potrivește IF cu END numărând
blocurile, nu uitându-se la spații.
Condițiile se pot imbrica oricât, și așa construiești o alegere cu mai multe ramuri:
1nota = 723IF nota >= 9 THEN4PRINT "Excelent"5ELSE6IF nota >= 5 THEN7 PRINT "Promovat"8ELSE9 PRINT "Respins"10END11END1PromovatELSE IF x == 1 THEN nu este recunoscut ca ramură. Și nici nu raportează vreo
eroare. Interpretorul îl citește în tăcere ca altceva, iar ramura pur și
simplu nu rulează niciodată, ceea ce face greșeala greu de observat. Imbrică
un al doilea IF în ELSE, ca mai sus.
Bucle
WHILE verifică condiția înainte de fiecare trecere. Când condiția este falsă,
pointerul sare dincolo de END-ul pereche; când corpul se termină, END trimite
pointerul înapoi sus, la reverificare.
1numar = 123WHILE numar <= 54PRINT numar5numar = numar + 16END1122334455Trei lucruri trebuie să se potrivească pentru ca o buclă să se termine: un contor care pornește de undeva, o condiție care poate deveni falsă și un corp care chiar schimbă contorul. Uitarea celui de-al treilea este cauza obișnuită a unei bucle care nu se mai oprește.
Buclele se pot imbrica, iar bucla interioară rulează complet la fiecare trecere a celei exterioare:
1rand = 123WHILE rand <= 34coloana = 15WHILE coloana <= 36 PRINT rand * coloana7 coloana = coloana + 18END9rand = rand + 110ENDO buclă poate și să citească până întâlnește o valoare-santinelă, în loc să numere:
1total = 02INPUT valoare34WHILE valoare != 05total = total + valoare6INPUT valoare7END89PRINT "Suma " + totalObservă forma: citești o dată înainte de buclă, apoi citești din nou la finalul corpului. Așa condiția are mereu o valoare proaspătă de testat.
Erori și limite
Un program poate executa cel mult 1000 de instrucțiuni. Peste această
limită, rularea se oprește cu Possible infinite loop detected. O buclă simplă
de numărare consumă aproximativ trei instrucțiuni per trecere, deci plafonul
este pe la 330 de repetări.
Erorile indică linia care a eșuat. Cele mai frecvente:
| Mesaj | Cauză |
|---|---|
Unknown instruction "…" | Un cuvânt cheie scris cu litere mici, END IF sau două instrucțiuni pe o linie |
Variable "x" is not defined | Citită înainte să primească vreo valoare / verifică scrierea și majusculele |
Missing THEN in IF statement | Lipsește THEN de pe linia IF |
Missing END for IF statement | Un bloc a fost deschis și niciodată închis |
END without matching block | Un END în plus |
ELSE without matching IF | ELSE în afara unui bloc sau după END-ul care l-a închis |
Operator < can only be used with numbers | Text comparat cu <, >, <= sau >= |
Division by zero is not allowed | Un împărțitor a ajuns 0! Protejează-l cu un IF |
Possible infinite loop detected | Condiția nu a devenit niciodată falsă |
Unknown function "SQRT" | Există doar INT, TRUNC, FLOOR, ROUND și ABS |
Când rezultatul este greșit, dar nu apare nicio eroare, treci de la Rulează la Pas și urmărește panoul Variabile. Aproape orice eroare de logică apare ca o variabilă care ține o valoare neașteptată, cu o trecere mai devreme decât locul în care te uitai.
Referință rapidă
| Instrucțiune | Formă |
|---|---|
| Afișare | PRINT expresie |
| Citire | INPUT variabila |
| Atribuire | variabila = expresie |
| Condiție | IF conditie THEN … ELSE … END |
| Buclă | WHILE conditie … END |
| Comentariu | # text |
| În loc de | Scrie |
|---|---|
ELSE IF | Un IF imbricat în ELSE |
END IF, ENDWHILE | END simplu |
Comentarii // | # |
FUNCTION, RETURN | Codul scris direct în loc |
Tablouri, bucle FOR | O buclă WHILE peste un contor |
SQRT, CEIL, MIN, MAX | Un IF sau un WHILE scris de tine |