Documente Academic
Documente Profesional
Documente Cultură
Sintaxa:
expresie; // a se observa faptul ca orice instructiune expresie se termina cu ;
Expresia este evaluata cu efect lateral, deci de regula instructiunea expresie este
o atribuire ( expresie in care apare unul sau mai multi operatori de atribuire )
sau un apel de functie - vezi definitia expresiei.
Exemple:
int a,b,c,m,n,p=2;
// liniile de mai jos reprezinta instructiuni expresie
scanf("%d",&a); // apel de functie, valoarea returnata nu este folosita
b=5;
c=a>b?a:b;
n=printf("%d %d %d\n",a,b,c); //valoarea returnata este memorata in n
p=a*b/c;
p++;
m=p+=5;
a+b; // valoarea expresiei nu este folosita - apare un avertisment ( warning )
la compilare:
// Code has no effect
Instructiunea expresie are ca echivalent ( mai slab ) in Pascal instructiunea de
atribuire ( var:=expr ). In Pascal instructiunile se separa prin ; pe cand in C se
termina, lucru care se pare duce la un numar mai mic de erori in compilare. Un bloc
de atribuire dintr-o schema logica se codifica printr-o intructiune expresie.
Blocul:
{
a++;
c=a+ --b;
printf("%d\n",c);
}
este echivalent cu instructiunea expresie:
a++,c=a+ --b,printf("%d\n",c);
Instructiunea vida
Se utilizeaza cand sintaxa impune prezenta unei instructiuni, iar codificarea nu
cere nici una.
Sintaxa:
;
Instructiunea de decizie
Sintaxa:
if(expresie) sau if(expresie)
instructiune1 instructiune
else
instructiune2
Semantica:
Se evalueaza expresie; daca valoarea ei este adevarat ( diferita de 0 ) se executa
instructiune1, altfel, daca exista ramura else, se executa instructiune2.
Observatii:
Instructiunea corespunde structurii de control selectie din schemele logice;
Pentru ca programele scrise se fie cat mai clare este bine ca instructiunile
corespunzatoare lui if si else sa fie scrise decalat fata de cuvintele cheie;
Instructiunea corespunzatoare valorii adevarat sau fals, poate fi orice
instructiune C:
daca instructiunea corespunzatoare valorii adevarat este o instructiune expresie,
simbolul ; apare in fata cuvantului cheie else
instructiunea bloc ( atunci cand trebuie executate mai multe prelucrari )
o alta instructiune de decizie - deci instructiunile if-else pot fi incuibate;
fiecare else corespunde if-ului anterior cel mai apropiat, fara pereche.
Exemplu:
// urmatoarele trei secvente echivalente verifica daca trei valori pot reprezenta
lungimile laturilor unui triunghi
for(expresie1;expresie2;expresie3)
instructiune
expresie1;
while(expresie2){
instructiune
expresie3;
}
Semantica:
Se evalueaza expresie1 care are rol de initializare; se evalueaza apoi expresie2,
cu rol de conditie - daca valoarea ei este adevarat ( diferita de 0 ) se executa
instructiune - corpul ciclului, dupa care se evalueaza expresie3, cu rol de
actualizare, apoi din nou expresie2; daca valoarea este 0, se trece la
instructiunea urmatoare. Deci instructiune se executa atat timp cat expresie2 este
adevarata, deci de 0 sau mai multe ori.
Observatii:
Instructiunea for permite o scriere mult mai compacta decat celelalte doua
instructiuni de ciclare, fiind foarte des utilizata in scrierea programelor;
Oricare din cele expresii poate lipsi, dar separatorul ; ramane. Absenta expresie2
echivaleaza cu conditia adevarat, deci 1; in tabelul de mai jos sunt date
echivalentele cu instructiunea while, pentru cazuri cand expresii din sintaxa for
lipsesc:
for(;expresie;)
instructiune
while(expresie)
instructiune
for(;;)
instructiune
while(1)
instructiune
Instructiunea for are ca si caz particular instructiunea de ciclare cu contor - in
Pascal instructiunea for are doar aceasta semnificatie:
for(var_contor=val_initiala;var_contor<=val_finala;var_contor+=increment)
instructiune
#include <stdio.h>
#include <conio.h>
void main(void){
//var locale
int n,contor,suma,factorial,putere;
//citire n cu validare
while(printf("n="),scanf("%d",&n),n<=0);
//calcul expresii
for(suma=0,contor=factorial=putere=1;contor<=n;contor++){
suma+=contor;
factorial*=contor;
putere*=n;
}//for
//tiparire rezultate
printf("suma=%d,fact=%d,putere=%d\n",suma,factorial,putere);
getche();
}//main
#include <stdio.h>
#include <conio.h>
void main(void){
int nmax,rang;
float x,eps,suma,termen,termen_ant; /*double pentru precizie mai mare */
//initializari
rang=0;
suma=termen=0; //suma se initializeaza cu primul termen ( de rang 0 )
//citiri cu validari
while(printf("x="), scanf("%f",&x), x<=0 || x>=1);
while(printf("nmax="), scanf("%d",&nmax), nmax<2);
while(printf("eps="), scanf("%f",&eps), eps<=0 || eps>=1);
//calcul suma
do{
termen_ant=termen; //salvare termen in termen_ant
termen=x*termen_ant/++rang; //calcul cu relatia de recurenta
//val rang reprezinta numarul de termeni insumati-1
suma+=termen; //adunarea noului termen
}while(termen_ant-termen>eps && rang+1<nmax); //continuare daca nici
// una din conditiile de terminare nu s-a indeplinit
//tiparire rezultate
printf("Suma=%e a rezultat din insumarea a %d termeni,\n",
suma,rang+1);
/* rang+1 termeni pentru ca s-a adunat si cel de rang 0 */
printf("Diferenta ultimilor doi: %e-%e=%e\n",termen_ant,termen,
termen_ant-termen);
getche();
}
Instructiunea de selectie
Sintaxa:
switch(expresie){ //expresie - de tip intreg, numita expresie selectoare
case k1:prelucrare1 //k1,k2,...,kn - etichete de tip intreg, distincte
case k2:prelucrare2 //orice prelucrare consta din 0 sau mai multe
instructiuni
...
case kn:prelucraren
default:prelucrarex //optional, corespunde multimii de valori diferite de
etichete
}
Semantica:
Se evalueaza expresie; daca se gaseste o eticheta avand valoarea egala cu a
expresiei, se executa prelucrarea corespunzatoare acesteia si celelalte, pana la
sfarsitul lui switch; daca nici o eticheta nu are valoarea expresiei si exista
default, se executa prelucrarex; altfel, se trece la instructiunea urmatoare.
Observatie:
Pentru a se executa doar prelucrarea corespunzatoare unei etichete, nu si cele
urmatoare, fiecare prelucrare se termina cu instructiunea break:
switch(expresie){
case k1:prelucrare1 break;
case k2:prelucrare2 break;
...
case kn:prelucraren break;
default:prelucrarex
}
Gasiti secventa echivalenta instructiunii switch, in care sa se foloseasca doar
instructiunea de decizie if-else.
Exemplu:
Urmatorul program executa operatiile unui calculator de buzunar simplu : adunare,
scadere, inmultire si impartire a doua numere reale. Se preiau linii de forma :
numar operator numar
si se afiseaza rezultatul calculului matematic. Secventa calculelor se incheie cu
CTRL/Z.
#include <stdlib.h>
#include <stdio.h>
#define PROMPT ':'
void main(void){
float a,b,result;
char oper,eroare;
while (putchar(PROMPT),(scanf("%f%c%f",&a,&oper,&b)!=EOF)){
eroare=0;
switch(oper){
case '+': result=a+b; break;
case '-': result=a-b; break;
case '*': result=a*b; break;
case '/': if(b)result=a/b;
else {
puts("*** Impartire la 0 ***");
eroare=1;
}
break;
default : printf("*** Operator ilegal %c ***\n",
oper);
eroare=1;
}//switch
if(!eroare)
printf("rezultatul e %f\n", result);
}//while
}//main