Instructiuni ale limbajului C

Instrucţiunile C implementează structurile de bază ale programării structurate:
• structura secvenţială (instrucţiunea compusă)
• structura alternativă (instrucţiunea if)
• structura repetitivă condiţionată anterior (instrucţiunea while) şi condiţionată posterior (instrucţiunea do while)

Toate instrucţiunile limbajului C se termină cu ‘;’ excepţie făcând instrucţiunile care se termină cu } (instrucţiunea compusă şi instrucţiunea switch) după care nu se pune ‘;’

Instrucţiunea vidă
Instrucţiunea vidă se reduce la caracterul; şi se foloseşte în acele construcţii în care este necesară prezenţa unei instrucţiuni fără a fi nevoie să se realizeze anumite operaţii.

Instrucţiunea de atribuire
Instrucţiunea de atribuire se obţine punând ; după o expresie de atribuire. Deci o expresie devine o instrucţiune dacă este urmată de ; (punct şi virgulă).

Instrucţiunea compusă
Instrucţiunea compusă este o succesiune de declaraţii urmate de instrucţiuni, succesiune care se include între acolade. Dacă există declaraţii atunci ele definesc variabile care sunt valabile numai în cadrul instrucţiunii compuse respective.

Instrucţiunea if
în limbajul C, instrucţiunea condiţională de bază este instrucţiunea if. Formatul general al instrucţiunii if este:

if (expresie) instrucţiune1;
else instrucţiune2;

Efectul acestei instrucţiuni este următorul: se evaluează expresia din paranteze. Dacă valoarea este adevărat (diferită de o) atunci se execută instrucţiunei altfel se execută instrucţiune2, apoi în ambele situaţii se trece la instrucţiunea următoare instrucţiunii if.

Deoarece instrucţiunea if testează valoarea numerică a unei expresii, următoarele construcţii sunt echivalente:

if(expresie!=0)...
if(expresie)...

Exemplu:

if(x)
  if(y)
    printf("1");
  else
    printf("2");

În acest caz, ramura else care tipăreşte valoarea 2 este legată de instrucţiunea if(y).

if(x)
{
  if (y) printf("1");
}
else
  printf("2");

În acest caz, datorită instrucţiunii compuse, ramura else care tipăreşte valoarea 2 aparţine instrucţiunii if(x).
Orice instrucţiune de atribuire închisă între parantezele expresiei din cadrul instrucţiunii if este de fapt o expresie, a cărei valoare de adevăr este egală cu valoarea atribuită.

Exemplul:

if(i=0) printf("Variabila i are valoarea 0");
else printf("Variabila i are o valoare diferită de 0");

este greşit deoarece în loc să se folosească operatorul == se foloseşte operatorul de atribuire iar în acest caz valoarea de adevăr a expresiei de atribuire este 0 (fals), deci întotdeauna se va afişa mesajul “variabila i are o valoare diferită de 0” indiferent de valoarea iniţială a lui i.

Instrucţiunea while
Instrucţiunea while implementează structura repetitivă condiţionată anterior şi are următorul format general:

while(expresie) instrucţiune;

Efectul acestei instrucţiuni este următorul: Se evaluează valoarea expresiei din paranteză. Dacă valoarea expresiei este diferită de o, atunci se execută instrucţiunea şi se revine la evaluarea expresiei. Dacă valoarea expresiei este fals (o) atunci se trece la instrucţiunea următoare instrucţiunii while.

Cel mai mare divizor comun
Să se scrie programul C care implementează algoritmul lui Euclid de determinare a celui mai mare divizor comun a două numere naturale.

#include "stdio.h"
void main(void)
{
  int a=18, b=12, r;
  while (r=a%b) a=b,b=r;
  //putem folosi operatorul virgulă
  //în locul unei instrucţiuni compuse
  printf("cmmdc este %d\n",b);
}

Instrucţiunea do while
Instrucţiunea do while implementează structura repetitivă condiţionată posterior. Formatul general al instrucţiunii este:

do
  instrucţiune;
while(expresie);

Efectul acestei instrucţiuni este următorul: Se execută instrucţiune după care se evaluează expresia. Dacă expresia este evaluată ca adevărat, se execută se revine la execuţia instrucţiunii. Ciclarea continuă până când valoarea expresiei va fi fals (o), caz în care se trece la următoarea instrucţiune de după instrucţiunea do while.

Instrucțiunea for
În cazul în care se cunoaşte numărul de iteraţii ale unui ciclu repetitiv, se poate uşor utiliza instrucţiunea for. Formatul general al acestei instrucţiuni este următorul:

for(expi;exp2;exp3) instrucţiune;

Efectul acestei instrucţiuni este următorul: se evaluează expi după care se testează valoarea de adevăr a exp2. Dacă exp2 are valoarea fals, se termină execuţia instrucţiunii for, şi se continuă cu următoarea instrucţiune de după instrucţiunea for. Dacă exp2 are valoarea adevărat, se execută instrucţiune după care se evaluează exp3. Se revine la evaluarea lui exp2 şi se continuă ciclic până când exp2 va fi falsă (0), caz în care se continuă cu următoarea instrucţiune de după instrucţiunea for.

Instrucţiunea for este echivalentă cu următoarea secvenţă de instrucţiuni:

exp1;
while(exp2)
{
  instrucţiune;
  exp3;
}

Programul C care calculează n!
Să se scrie programul C care calculează n!. n!=n*(n-1)! iar 0!=1.

#include "stdio.h"
void main(void)
{
  int n=5, fact=1, i;
  for(i=1;i <=n ;i++) fact*=i;   printf("%d! = %d\n",n,fact); }

Instrucţiunea return
Instrucţiunea return este utilizată pentru ieşirea rapidă dintr-o funcţie. Dacă o funcţie returnează o valoare, instrucţiunea return trebuie folosită pentru transmiterea acestei valori rutinei apelante. Controlul este transmis apelantului funcţiei.
Instrucţiunea return permite utilizarea a 2 formate:

return;
return expresie;

Expresia se poate include între paranteze.
În primul caz, funcţia nu va returna nici o valoare, cauzând doar transferul controlul funcţiei apelante fără a-i furniza acesteia vreo valoare utilă.
în cel de al doilea caz, funcţia returnează valoarea expresiei funcţiei apelante. Tipul valorii returnate va fi cel specificat la tipul funcţiei care returnează valoarea (tipul int în cazul în care nu s-a specificat un tip pentru această funcţie). Funcţia apelantă poate ignora valoarea returnată.

O funcţie care returnează maximul a 2 numere
Să se scrie o funcţie care returnează maximul a 2 numere primite ca parametru.
int max(int x, int y)
{
  if(x>y)
    return (x);
  else
    return(y);
}

Numărul de elemente ale unui şir
Să se expliciteze o funcţie C care primind ca şi parametru un şir de caractere returnează numărul de elemente.

#include "stdio.h"
void main(void)
{
  int n;
  char a[10]= "abcd";
  //iniţializăm şirul
  int strlen(char a[]);
  //declarăm prototipul funcţiei strlen ce va fi explicitată mai jos
  n=strlen(a);
  printf("Lungimea şirului este %d\n",n);
}
int strlen(char a[])
{
  int n;
  for(n=0;a[n];n++)
  //ciclul for se opreşte în momentul întâlnirii octetului nul care termină orice şir de caractere
  return(n);
}

Comparaţia celor 2 şiruri
Să se expliciteze o funcţie C care primind ca şi parametru 2 şiruri de caractere, returnează un număr negativ dacă primul şir este mai mic, o dacă sunt egale şi un număr pozitiv dacă primul şir e mai mare. Comparaţia celor 2 şiruri este lexicografică.

int strcmp(char a[], char b[])
{
  int i,j;
  for(i=0;a[i]&&b[i]&&a[i]==b[i]);i++);
  //ieşim din ciclu dacă unul din cele 2 şiruri a ajuns la sfârşit prin întâlnirea
  //octetului nul sau când elementele corespunzătoare din cele 2 şiruri diferă
  return(a[i]-b[i]);
}

Concateneare
Să se expliciteze o funcţie C care primind ca şi parametru 2 şiruri de caractere le concatenează, cu obţinerea noului şir în primul şir.

void strcat(char a[], char b[])
{
  int i,j;
  //ajungem cu i la sfârşitul şirului a
  for(i=00;a[i];i++);
  //ieşim din acest ciclul for când ajungem la sfârşitul
  //şirului b adică vom atribui lui a[i] valoarea 0
  for(j=0;a[i]=b[j];i++,j++);
}

Instrucţiunea break
Instrucţiunea break este utilizată pentru ieşirea forţată dintr-o buclă, înainte de sfârşitul acesteia. în general, aceste instrucţiuni de ieşire forţată se aplică unor algoritmi nestructuraţi. Se recomandă evitarea acestora, ştiind fiind faptul că orice algoritm nestructurat poate fi transformat într-un algoritm structurat.
Dacă este necesar, corpul unei instrucţiuni de ciclare poate să conţină mai multe instrucţiuni break, corespunzătoare mai multor condiţii de ieşire forţată. Bineînţeles, pot exista şi ieşiri normale din aceste bucle, chiar dacă au fost prevăzute mai multe instrucţiuni break.

Exemplu:
Se consideră o sumă de bani şi existenţa următoarelor tipuri de monede şi bancnote: i>3>5dO,20,25,50,100,500 şi 1000. Să se scrie programul C care determină modul în care poate fi exprimată suma de bani utilizând un număr minim de monede şi bancnote.

#include "stdio.h"
void main(void)
{
  int s=5724, i, k, m[10]={1,3,5,10,20,25,50,100,500,1000};
  for(i=9;i>=0;i--)
  {
    k=s/a[i];
    //vom avea k monezi/bancnote cu diviziunea a[i]
    if(k) printf("Diviziunea: %d cu numărul de apariţii: %d\n",a[i],k);
    //afişăm doar dacă koo pentru a nu avea mesaje cu o apariţii
    s%=a[i];
    //suma de repartizat este restul rămas după utilizarea diviziunii a[i]
    if(!s) break;
    //în cazul în care suma rămasă devine o putem părăsi ciclul for
  }
}

Funcţia exit
Funcţia exit este o funcţie (deci nu este o instrucţiune) din biblioteca standard a cărui prototip se găseşte în process.h şi în stdlib.h. Ea permite încheierea imediată a unui întreg program, forţând reîntoarcerea la sistemul de operare.

Formatul general al funcţiei este:

void exit(int cod_de_intoareere);

Valoarea cod_de_intoarcere este returnată procesului care a apelat programul, care este de obicei sistemul de operare. Această valoare poate fi prelucrată (de exemplu într-un fişier batch), permiţând prelucrarea valorii codului de eroare returnat de această funcţie. Valoarea o este utilizată în general pentru a specifica terminarea normală a programului.

Instrucţiunea continue
Instrucţiunea continue se utilizează în interiorul ciclurilor şi permite saltul la începutul secvenţei de instrucţiuni care formează corpul ciclului respectiv continuând

cu următoarea iteraţie a ciclului, deci nu se părăseşte bucla. Ea se aseamănă cu instrucţiunea break, dar în loc să forţeze încheierea buclării, instrucţiunea continue forţează trecerea la următoarea iteraţie a buclei.
Pentru bucla for, instrucţiunea continue determină execuţia secvenţei de incrementare şi a testului de condiţionare, iar pentru buclele while şi do-while controlul programului este trecut testului de condiţionare.

Numerarea cifrelor existente într-un şir
Să se scrie un program C care numără cifrele existente într-un şir de caractere citit de la tastatură până la întâlnirea caracterului sfârşit de rând.

#include "stdio.h"
#include "ctype.h"
//pentru funcţia isdigit()

void main(void)
{
  char sir[80],nr_cifre=0,*p;
  printf("Introduceţi şirul:");
  gets(sir);
  p=sir;
  //pointerul p primeşte adresa şirului de caractere sir
  while(*p!=NULL)
  //atât timp cât nu am ajuns la octetul nul
  {
    if (!isdigit(*p)) continue;
    //dacă nu e cifră continuăm ciclul for cu următoarea poziţie din şir
    nr_cifre++;
    //incrementăm numărul de cifre
  }
  printf("Numărul de cifre din sir este %d\n",nr_cifre);
}

Instrucţiunea goto
Instrucţiunea de salt goto permite saltul la o anumită instrucţiune din cadrul funcţiei, instrucţiune precedată de o etichetă. Formal, instrucţiunea goto nu este necesară niciodată, în cazul programării structurate.
Formatul instrucţiunii goto este:

goto etichetă;

Unde etichetă este un nume care identifică, sub forma:

etichetă: instrucţiune;

Instrucţiunea cu care se continuă execuţia programului.
Aceeaşi etichetă poate fi referită de mai multe instrucţiuni goto, dar o etichetă nu poate identifica decât o singură instrucţiune. Unicul scop pentru care se defineşte o etichetă este de a fi referită de o instrucţiune goto.

Instrucţiunea switch
în cazul în care este necesară ramificarea programului pe mai multe ramuri în funcţie de valoarea unei variabile, este greoaie utilizarea mai multor instrucţiuni if.. else..în cascadă. în acest caz se poate utiliza instrucţiunea switch. Această instrucţiune determină transferul controlului unei instrucţiuni sau unui bloc de instrucţiuni în funcţie de valoarea unei expresii şi are următorul format general:

switch (expresie)
{
  case c1: instr1;
  [case c2: instr2;]
  ...
  [default: instr_default;]
}

Efectul acestei instrucţiuni este următorul: se evaluează expresia dintre paranteze. Dacă valoarea expresiei este egală cu Ci atunci se execută instrucţiunea corespunzătoare constantei Ci. Dacă valoarea expresiei este diferită de orice Ci indicat, atunci se execută instrucţiunea corespunzătoare clauzei default, dacă există această clauză după care se trece la următoarea instrucţiune de după instrucţiunea switch. După ce se execută instrucţiunea corespunzătoare unei constante indicate, dacă nu există instrucţiunea break atunci necondiţionat se execută toate instrucţiunile de mai jos celei corespunzătoare constantei Ci, eventual până la prima instrucţiune break întâlnită.

Leave a Reply