Lucrarea de laborator nr. 3

 

 

 

INSTRUCŢIUNI

 

 

 

    1 Conţinutul lucrării

 

În lucrare sunt prezentate principalele instrucţiuni simple şi structurate din limbajul C/C++: instrucţiunea expresie, instrucţiunea vidă, instrucţiunea compusă, instrucţiunea if, instrucţiunea switch şi instrucţiunile repetitive.

 

2.   Consideraţii   teoretice

 

Programul structurat este un program care are o structură de control realizată numai cu:

-          structura secvenţială;

-          structura alternativă şi selectivă;

-          structura repetitivă.

În limbajul C/C++ mai există instrucţiunile return, break, continue şi goto, care asigură o flexibilitate mare în scrierea de programe.

 

2.1. Instrucţiunea expresie

 

Instrucţiunea expresie are formatul:

 

                  expresie;

 

adică după expresie se scrie “;”.

 

Ea se utilizează ca instrucţiune de atribuire sau ca instrucţiune de apel a unei funcţii.

 

Exemplu de utilizare:

 

      /* Programul L3Ex1.cpp  */

 

      /* Programul afiseaza maximul dintre 2 intregi */

      #include <conio.h>

      #include <stdio.h>

            main()

      {

        int a,b,c;

        printf("\nIntroduceti doi intregi a si b\n");

        scanf("%d %d",&a,&b);

        c=a>b?a:b;

        printf("\nMaximul dintre a=%d si b=%d este c=%d\n",a,b,c);

        getch();

      }

 

2.2.Instrucţiunea vidă

 

Instrucţiunea vidă se reduce la punct şi virgulă, fără a avea vreun efect. Ea se utilizează acolo unde se cere prezenţa unei instrucţiuni, dar de fapt nu trebuie să se execute ceva (de exemplu în instrucţiunile repetitive).

Exemplu de utilizare:

 

for(i = 0, s = 0; i < n; s = s + a[i], ++i);

 

2.3.Instrucţiunea compusă

 

Instrucţiunea compusă este o succesiune de instrucţiuni incluse între acolade, eventual precedate de declaraţii (valabile numai în acest loc):

 

     {

          declaraţii;

          instrucţiuni;

     }

 

Instrucţiunea compusă se utilizează acolo unde este nevoie conform sintaxei de o singură instrucţiune, dar procesul de calcul necesită mai multe instrucţiuni.

Exemplu de utilizare este dat în programul L3Ex2.cpp :

 

/*   Programul L3Ex2.cpp  */

 

/*  Calculul radacinilor ecuatiei a*x^2 +b*x +c =0   */

  #include <stdio.h>

  #include <conio.h>

  #include <math.h

  main()

  {

       float a,b,c,delta,x1,x2;

       printf("\nIntroduceti a,b,c\n");

       scanf("%f %f %f",&a,&b,&c);

       if (a!=0)

            {

               delta=b*b-4*a*c;

               if (delta >= 0) {

                                           x1=(-b-sqrt(delta))/(2*a);

                                           x2=(-b+sqrt(delta))/(2*a);

                                            printf("\nEcuatia are radacinile x1=%g  si

                                                            x2=%g\n",x1,x2);

                                        }

                else  { 

                          x1=-b/(2*a);

                          x2=sqrt(-delta)/(2*a);

                          printf("\nEcuatia are radacinile complex conjugate:\                          x1=%g - j*%g  si  x2= %g+ j*%g\n",x1,x2,x1,x2);

 

                         }

               }

         else printf("\nEcuatia nu este de ordinul 2 (a=0)\n");

         getch();

  }

 

 

2.4  Instrucţiunea if

 

Instrucţiunea if are două formate:

 

a)                  if ( expresie )

                        instrucţiune

 

b)                  if ( expresie )

                        instrucţiune_1

else instrucţiune_2

 

Efectul ei este următorul:

Se evaluează expresia “expresie”.

Dacă rezultatul expresiei este true se execută în cazul a) instrucţiunea “instrucţiune” şi în cazul b) “instrucţiune_1” şi apoi se trece la instrucţiunea imediat următoare instrucţiunii if.

Dacă rezultatul expresiei este false se trece în cazul a) la instrucţiunea imediat următoare instrucţiunii if, iar în cazul b) se trece la execuţia “instrucţiune_2” şi apoi se trece la instrucţiunea imediat următoare instrucţiunii structurate if.

Observaţii:

a)                   instrucţiunile “instrucţiune”, “instrucţiune_1”, “instrucţiune_2” pot conţine instrucţiuni de salt la alte instrucţiuni decât cea următoare instrucţiunii if.

b)                  instrucţiunea if poate conţine alte instrucţiuni if. Trebuie atenţie la îmbinarea lui else, în sensul de a şti la care if  aparţine.

Exemplu de utilizare: Programul L3Ex2.cpp (a se vedea punctul 2.3).

 

2.5  Instrucţiunea switch

 

Instrucţiunea switch are următoarea sintaxă:

 

switch ( expresie )

{

  case C1:  sir_instrucţiuni_1;

                   break;

  case C2:  sir_instrucţiuni_2;

                   break;

  …...........................................

  case Cn:  sir_instrucţiuni_n;

                   break; 

  default:   sir_instrucţiuni

}

 

Efectul instrucţiunii switch este următorul:

                  a)         se evaluează “expresie”;

 b)    se compară pe rând rezultatul evaluării cu constantele C1, C2, …, Cn. Dacă rezultatul evaluării coincide cu constanta Ci se executa instrucţiunile “sir_instrucţiuni_i” şi apoi se trece la instrucţiunea imediat următoare switch-ului. Daca rezultatul evaluării nu coincide cu nici una din constantele C1, C2, …, Cn se execută instrucţiunile “sir_instrucţiuni” aflate după “default”.

Observaţii:

a)                   Alternativa default este opţională. Dacă nu este prezentă, în cazul în care rezultatul expresiei “expresie” nu coincide cu nici o constantă Ci, instrucţiunea switch nu are nici un efect.

b)                  Dacă break nu este prezentă, atunci se execută şi şirurile de instrucţiuni imediat următoare, până la întâlnirea unei instrucţiuni break sau până la terminarea instrucţiunii switch.

c)                   Instrucţiunea structurata switch poate fi înlocuită prin instrucţiuni if imbricate.

 

Exemplu de utilizare:

 

      /*  Programul L3Ex3.cpp  */

 

      /* Operatii cu numere intregi de forma

                                          OPERAND1operatorOPERAND2           */

        #include <stdio.h>

        #include  <conio.h>

        #include  <stdlib.h>

        #define INFINIT  0x7fff

        main()

        {

                   int operand1,operand2,rezultat;

                   char operatie;

                   printf("\nScrieti expresia fara spatii intre operanzi şi\

                                  operator\n");

                   scanf("%d%c%d",&operand1,&operatie,&operand2);

                   switch(operatie)

                              {

                                case '+': rezultat=operand1+operand2;

                                               break;

 

                                case '-': rezultat=operand1-operand2;

                                              break;

                                case '*': rezultat=operand1*operand2;

                                               break;

  case '/':  if (operand2!=0) rezultat =

operand1/operand2;

                                                             else if (operand1 >0) rezultat=INFINIT;

                                                      else rezultat=-INFINIT;

                                              break;

                                default: exit(1);

                               };

printf("\n%d %c %d = %d\n", operand1, operatie,

                    operand2, rezultat);

                    getch();

           }

 

 

2.6  Instrucţiunea while

 

Formatul instrucţiunii while este următorul:

 

while ( expresie )

  instrucţiune

 

Efectul instrucţiunii while este următorul:

a)      se evaluează “expresie”;

b)      dacă rezultatul este true se execută corpul său (“instrucţiune”) şi se revine la pasul a). Daca rezultatul este false se trece la execuţia instrucţiunii imediat următoare instrucţiunii while.

Observaţii:

a)      În cazul în care expresie este false de la început, atunci “instrucţiune” nu se execută niciodată.

b)      În cadrul corpului instrucţiunii while este nevoie de existenţa unor instrucţiuni de modificare a variabilelor care intră în “expresie”.

 

Exemplu de utilizare:

 

/*  Programul L3Ex4.cpp  */

 

/* Calculul c.m.m.d.c. si a c.m.m.m.c

       a doua numere naturale a si b   */

#include <conio.h>

#include <stdio.h>

main()

{

      int a,b,a1,b1,cmmdc,cmmmc,rest;

      printf("Introduceti a=");

      scanf("%d",&a);

      printf("Introduceti b=");

      scanf("%d",&b);

      /* Aflarea c.m.m.d.c. */

      a1=a;b1=b;

      while ((rest=a1%b1)!=0)

       {            a1=b1;

                    b1=rest;

       };

       cmmdc=b1;

       cmmmc=a*b/cmmdc;

       clrscr();

       printf("a=%d  b=%d  cmmdc(a,b)=%d  cmmmc=%d", a, b,

                       cmmdc, cmmmc);

       getch();

   }

 

2.7  Instrucţiunea for

 

Formatul instrucţiunii for este următorul:

 

for ( expr1; expr2; expr3 )

  instrucţiune

 

unde:

-         expr1, expr2, expr3 sunt expresii;

-         instrucţiune este corpul instrucţiunii.

Descrierea efectului instrucţiunii for, cu ajutorul instrucţiunii while este următorul:

 

expr1;

while ( expr2 ) {

                             instrucţiune;

                             expr3;

                           }

 

Observaţie: expr1, expr2, expr3 pot fi vide, însă caracterele “;” nu pot lipsi.

 

Exemplu de utilizare:

 

/*  Programul L3Ex5.cpp   */

 

/* Calculul mediei aritmetice a n numere reale */

#include <conio.h>

#include <stdio.h>

main()

{

  float a[100],media,suma;

  int i,n;

  printf("\nIntroduceti nr.de elemente n=");

  scanf("%d",&n);

  printf("\nIntroduceti elementele sirului\n");

  for(i=0,suma=0;i<n;++i)

       {

                  printf("a[%2d]=",i);

                  scanf( "%f",&a[i]);

                  suma+=a[i];

       };

  media=suma/n;

  printf("\nMEDIA=%g\n",media);

  getch();

}

 

2.8  Instrucţiunea do-while

 

Instrucţiunea do-while este instrucţiunea ciclică cu test final. Formatul ei este următorul:

 

do

  instrucţiune

while ( expresie );

 

Efectul ei este descris cu instrucţiunea while astfel:

 

instrucţiune;

while( expresie )

  instrucţiune;

 

Se observă că corpul ciclului se execută cel puţin o dată.

 

Exemplu de utilizare:

 

/*  Programul L3Ex6.cpp  */

 

/* Calculul c.m.m.d.c. si a c.m.m.m.c

       a doua numere naturale a si b   */

#include <conio.h>

#include <stdio.h>

main()

{

      int a,b,a1,b1,cmmdc,cmmmc,rest;

      printf("Introduceti a=");

      scanf("%d",&a);

      printf("Introduceti b=");

      scanf("%d",&b);

      /* Aflarea c.m.m.d.c. */

      a1=a;b1=b;

      do{

                  rest=a1%b1;

                  a1=b1;

                  b1=rest;

           }

       while (rest!=0);

       cmmdc=a1;   

       cmmmc=a*b/cmmdc;

       clrscr();

       printf("a=%d  b=%d  cmmdc(a,b)=%d

                                 cmmmc=%d",a,b,cmmdc,cmmmc);

       getch();

 }

 

2.9  Instrucţiunile continue şi break

 

Instrucţiunile continue şi break se pot utiliza numai în corpul unui

 ciclu.

Instrucţiunea continue abandonează iteraţia curentă şi se trece la execuţia pasului de reiniţializare în cazul instrucţiunii for, respectiv la revalidarea expresiei care stabileşte continuarea sau terminarea ciclului în cazul instrucţiunilor while şi do-while.

Instrucţiunea break termină ciclul şi se trece la instrucţiunea imediat următoare celei repetitive (for, while, do-while).

 

2.10. Instrucţiunea goto

 

Instrucţiunea goto este utilizată pentru saltul dintr-un punct al unei funcţii (chiar şi dintr-un ciclu) în alt punct al aceleaşi funcţii, respectiv la o instrucţiune etichetată.

Eticheta este un nume urmat de caracterul “:”

            nume:

Formatul instrucţiunii goto este:

 

goto eticheta;

 

Exemplu:

           

            goto alfa;

            …

            alfa: if (  ) …

            …

 

 

2.11. Funcţia standard exit

 

Prototipul funcţiei standard exit este descris în fişierele stdlib.h şi process.h şi este:

 

void exit(int cod);

 

Funcţia exit are ca scop terminarea forţată a programului. Codul de ieşire folosit este zero pentru terminare normală şi alte valori pentru terminare datorată unor erori.

 

            3. Mersul lucrării

 

3.1. Se vor analiza şi executa programele date ca exemplu în lucrare.

 

3.2. De la tastatură se citesc 4 perechi de numere reale, care

reprezintă în coordonate rectangulare vârfurile unui patrulater. Să se stabilească natura acestui patrulater.

 

3.3. De pe mediul de intrare sunt citite elementele reale ale unui şir

de dimensiunea n. Să se găsească valoarea minimă şi valoarea maximă   dintre elementele şirului şi poziţia lor.

 

3.4. Să se scrie un program pentru generarea tuturor numerelor prime

 mai mici sau egale cu un număr natural n.

 

 3.5. Se citeşte un număr natural n. Să se găsească cel mai mare

 pătrat perfect mai mic sau egal cu n. Aceeaşi problemă, dar să se indice numărul prim cel mai mic, dar mai mare sau egal cu numărul citit.

 

3.6.    De pe mediul de intrare se citeşte un număr natural n. Să se

verifice dacă numărul respectiv este palindrom.

 

3.7.    De pe mediul de intrare se citesc cifrele hexazecimale ale unui

 număr întreg în baza 16. Sa se calculeze şi să se afişeze reprezentarea numărului în baza 10.

 

3.8.    Se citeşte gradul şi coeficienţii polinomului p(x)=a0

 +a1x1+......+ anxn  Să se calculeze valoarea polinomului în x= x0 (x0 se citeşte).

 

3.9.Să se scrie un program pentru efectuarea operaţiilor de

 adunare, scădere, înmulţire şi împărţire între două polinoame:

           A(x)=a0 +a1x1+......+ anxn

           B(x)=b0 +b1x1+......+ bmxm

          Gradele şi coeficienţii reali ai polinoamelor se citesc de pe

mediul de intrare.

 

3.11.Se dă un sistem de n ecuaţii liniare cu n necunoscute. Să se

scrie un program de rezolvare a sistemului, folosind o metoda numerică.

 

3.12 . Sa se calculeze polinoamele P(x) şi Q(x) din relaţia:


 

Valorile n, ai , bi , ci  se citesc de la tastatură.

 

3.13. Se dă un şir de n elemente reale ordonate crescător. Să se

 verifice dacă o valoare citită  x  se găseşte în şir şi să se indice poziţia sa.

 

3.14. Se dă un şir de n numere întregi. Să se extragă subşirul de

dimensiune maximă, ordonat crescător.

 

3.15. Pentru elaborarea unui test de aptitudini se dispune de un set de

n întrebări, fiecare întrebare i fiind cotată cu un număr de pi  puncte. Să se elaboreze toate chestionarele având q întrebări, fiecare chestionar totalizând între a şi b puncte. Întrebările sunt date prin număr şi punctaj.

 

3.16. Se dau 2 şiruri de n si respectiv m elemente de tip întreg. Să se

 calculeze:

        a) şirul ce conţine elementele comune ale celor două şiruri;

        b) şirul ce conţine toate elementele celor două şiruri luate o sin-

gura dată;

        c) şirul ce conţine elementele primului şir din care au fost

eliminate elementele comune.

 

3.17. Se dă un număr real a în baza 10. Să se scrie programul de

 conversie a lui în baza B, B <= 16.

 

3.18. Se dă un număr natural n.

a)      Să se găsească numărul obţinut prin eliminarea cifrelor care

apar de mai multe ori în număr.

            b)Să se găsească numărul obţinut prin interschimbarea între ele

 a primei cifre cu ultima , a celei de a doua cu penultima  ş.a.m.d.

            c)Să se găsească cel mai mare număr ce se poate obţine din

 cifrele sale.

 

3.19. Se dă o matrice de nxn elemente 0 şi 1. Să se stabilească dacă

 matricea respectivă este simetrică.

 

3.20. De pe mediul de intrare se citeşte o propoziţie. Să se indice

 numărul cuvintelor şi cuvântul cel mai lung din propoziţie.