Table of Contents

Tema de casă 2

Termen de predare: 12.01.2014, ora 23:55

Trimitere temă

Tema de casă se trimit sub forma unei arhive ZIP.

Arhiva va fi uploadă folosind un serviciu public de sharing (Google Drive, Dropbox etc.). Trebuie să trimiteți link-ul către locația de unde putem downloada tema de casă.

Trimiterea temei de casă se face prin completarea acestui formular.

Atenție! Nu faceți link-ul public! Dacă ajunge link-ul public, colegii ar putea să se inspire din tema voastră.

Dacă două teme seamănă suficient de mult vor fi considerate copiate.

Toate întrebările despre temă se vor purta public pe grupul acesta. Toți cei care au trimis tema de casă nr. 1 au fost înscriși cu adresa de e-mail de pe care au trimis tema.

Arhiva trebuie să conțină:

Enunț

Realizati arborele sintactic pentru limbajul ATM Basic descris mai jos:

Declaratii de variabile

Declaratiile de variabile pot aparea doar la inceputul programului sau ai functiilor. Ele incep cu cuvantul VAR.

VAR @sir - variabila string
VAR #ni, %nf - variabila intreaga, respectiv fractionara

Expresii

Expresiile folosite pot fi:

If

If arata in felul urmator: (atentie ELSEIF si ELSE pot lipsi)

IF conditie THEN
  instructiuni
ELSEIF conditie THEN
  instructiuni
ELSE
  instructiuni
ENDIF

WHILE

While arata in felul urmator:

WHILE conditie DO
  instructiuni
ENDWHILE

FOR

FOR arata in felul urmator: (atentie STEP poate lipsi, dupa step urmeaza un numar intreg pasul de incrementare)

FOR #variabila FROM numar TO numar STEP numar DO
  instructiuni
ENDFOR

Functii

Functiile se declara in felul urmator.

SUB nume lista_parametrii
  instructiuni
ENDSUB

Functiile nu intorc valori.

Apel de functie

Apelul de functie arata in felul urmator:

CALL nume_functie lista_parametrii

Bonus

(1p) Implementati ridicarea la putere in expresii (1p) Implementati restrangeti expresiile constante (1p) Implementati valoare de intoarcere a functiilor

Exemple

Aici sunt cateva exemple de programe care ar trebui sa functioneze

VAR #nr

SUB prim #n
	VAR #i, #divizori
	#divizori = 0
	IF #n <> 0 AND #n <> 1 THEN
		FOR #i FROM 2 TO #n/2 STEP 1 DO
			IF #n MOD #i = 0 THEN
				#divizori=#divizori+1
			ENDIF
		ENDFOR
	ELSE
		#divizori = 1
	ENDIF
	IF #divizori = 0 THEN
		PRINT #n, " este prim"
	ELSE
		PRINT #n, " nu este prim"
	ENDIF
ENDSUB

FOR #nr FROM 1 TO 10 STEP 1 DO
	CALL prim #nr
ENDFOR
VAR #nr

SUB perfect #n
	VAR #i, #s
	#s = 0
	FOR #i FROM 1 TO #n/2 STEP 1 DO
		IF #n MOD #i = 0 THEN
			#s=#s+#i
		ENDIF
	ENDFOR
	IF #s = #n THEN
		PRINT #n, " este perfect"
	ELSE
		PRINT #n, " nu este perfect"
	ENDIF
ENDSUB

FOR #nr FROM 1 TO 10 STEP 1 DO
	CALL perfect #nr
ENDFOR

Testare

Fisirele pentru corectare se afla pe GitHub la acesta adresa https://github.com/alexandruradovici/atm-basic/blob/master/README.md.