APLICATII FUNCTII VOID FARA PARAMETRI, TABLOURI




1. Sa se ruleze  pas cu pas primul program exemplu de la Functii - note de curs.
Dupa rulare, sa se introduca in comentariu cele trei linii de prototipuri. Ce se observa la o noua compilare ?
Sa se modifice programul pentru a se mai afisa o prima si o ultima linie de '~', la fel ca liniile interioare .

2. Sa se ruleze al doilea programul exemplu de la Functii - note de curs.
Sa se modifice programul, astfel incat sa se poata calcula expresia pentru triplete diferite, pana in momentul cand m si n sunt simultan 0.

3. Sa se defineasca functia calcul, void fara parametri, care calculeaza si afiseaza valoarea expresiei xm+n/(x+m+n)m-n, x, m, n fiind variabile globale. Folosind functia calcul sa se scrie programul care afiseaza valoarea expresiei de mai sus pentru x luand toate valorile intregilor dintre n si m, inclusiv. Intregii m,n se citesc de la tastatura, astfel incat sa fie pozitivi si m>n.

4. Sa se ruleze programul exemplu de la Tablouri - note de curs. Sa se adauge prelucrarile:
-modificarea elementelor tabloului initial la patratul lor
-afisarea tabloului dupa modificare.
Sa se tranforme programul intr-unul interactiv, fiecare prelucrare executandu-se la o comanda corespunzatoare ( citirea la comanda 'C' sau 'c', s.a.m.d. ). Vezi instructiunea switch si rezolvarea problemei urmatoare.

5. Sa se scrie un program interactiv care prelucreaza un tablou de max N intregi ( N - cta predefinita ), prin urmatoarele comenzi - optiunile marcate cu ? trebuie adaugate:
  I - initializeaza tabloul, prin citirea dimensiunii sale si apoi a elementelor
  V ? initializeaza tabloul, prin citirea elementelor pana la introducerea lui CTRL/Z sau a numarului maxim de elemente
  A ? initializeaza tabloul, fiecare element fiind egal cu indicele sau
  B ? initializeaza tabloul astfel: primele doua elemente cu 0, 1, iar urmatoarele ca suma anterioarelor doua ( numerele Fibonacci )
  L - listeaza elementele tabloului
  O - listeaza elementele tabloului ordonate crescator ( in tablou elementele trebuie sa ramana in ordinea introducerii )
  D ? analog cu O, dar in ordine descrescatoare
  C - cauta o valoare in tablou, afisand indicele in cazul gasirii
  M ? cauta o valoare in tablou, pe care o sterge in cazul gasirii - dimensiunea tabloului va scadea astfel cu o unitate ( nr_elem, nu N!!!); stergerea se realizeaza prin mutarea cu o pozitie inspre indicii mici, a tuturor elementelor de tablou urmatoare celui care se sterge; o alta varianta este de a copia ultimul element peste cel care se sterge
  P - afiseaza maximul, suma, produsul, media aritmetica si cea geometrica
  X - terminare.
 

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <math.h> //pentru functia pow

#define N 10
#define NL '\n'
#define MIN -32768

int tablou[N], copie[N], nr_elem;  /* tablou va contine nr_elem de prelucrat, copie salveaza tablou inainte de ordonare */
char optiune;  /* caracterul ce indica operatia */

void citire_optiune(void){  /* fara validare */
  printf("Optiunea(I,L,O,C,P,X)=");optiune=getche();
  putchar(NL);
}

void citire_numar_elem(void){  /* cu validare */
  do{
    printf("numar elem(1..%d)=",N);scanf("%d",&nr_elem);
  }while(nr_elem<1 || nr_elem>N);
}

void citire_elem(void){
  int i;
  puts("Introduceti elementele tabloului");
  for(i=0;i<nr_elem;i++){
    printf("elem[%d]=",i);scanf("%d",&tablou[i]);  /* se afiseaza indicele 
            elem ce se citeste */
  }
}

void init(void){
  citire_numar_elem();
  citire_elem();
}

void list(void){  /* se listeaza elem din tablou */
  int i;
  puts("Elementele tabloului:");
  for(i=0;i<nr_elem;i++)
    printf("elem[%d]=%d%c",i,tablou[i],NL);
}

void salv(void){  /* se salveaza tablou in copie */
  int i;
  for(i=0;i<nr_elem;i++)
    copie[i]=tablou[i];
}

void refac(void){  /* se reface tablou din copie */
  int i;
  for(i=0;i<nr_elem;i++)
    tablou[i]=copie[i];
}

void ordonare(void){  /* se ordoneaza elem din tablou prin metoda bubblesort*/
  int i,ordonat,aux;
  do{ 
    ordonat=1;
    for(i=0;i<nr_elem-1;i++)
      if(tablou[i]>tablou[i+1]){  /* interschimbare */
         aux=tablou[i+1];
         tablou[i+1]=tablou[i];
         tablou[i]=aux;
         ordonat=0;
      }
  }while(!ordonat);
}

void list_ord(void){  /* se face ordonarea elem din tablou, dupa listare, 
    tablou revine la configuratia de la citire */
  salv();
  ordonare();
  list();
  refac();
}

void prel(void){
  int max=MIN, suma=0, i;
  float produs=1, media_aritm, media_geom;
  for(i=0;i<nr_elem;i++){
    if(tablou[i]>max) max=tablou[i];
    suma+=tablou[i];
    produs*=tablou[i];
  } 
  media_aritm=(float)suma/nr_elem;
  media_geom=pow(produs, 1/(float)nr_elem);
  printf("max=%d, suma=%d, produs=%0.0f, media aritm=%f, media geom=%f%c", 
   max,suma,produs,media_aritm,media_geom,NL);
}

void cauta(void){
  int pe_cine,i;
  printf("valoare cautata:");
  scanf("%d",&pe_cine);
  for(i=0;i<nr_elem;i++)
    if(tablou[i]==pe_cine)break;
  if(i==nr_elem)puts("***Nu exista***");
  else printf("gasita la indicele %d\n",i);
}

void main(void){
  clrscr();
  do{
    citire_optiune();
    switch(toupper(optiune)){
      case 'I':init();break;
      case 'L':list();break;
      case 'O':list_ord();break;
      case 'C':cauta();break;
      case 'P':prel();break;
      case 'X':puts("La revedere");break;
      default:puts("*** Optiune eronata ***");
    }
  }while(toupper(optiune)!='X');
  getch();
}

6. Sa se scrie un program care citeste coeficientii unui polinom de x, cu gradul maxim N ( N este o constanta predefinita), calculand apoi valoarea sa in puncte x citite, pana la introducerea pentru x a valorii 0. Sa se afiseze si valoarea obtinuta prin apelarea functiei de biblioteca poly. Sa  se modifice programul astfel incat sa citeasca ciclic polinoame, pe care sa le evalueze.
 

#include <stdio.h>
#include <conio.h>
#include <math.h>

#define N 10

double coeficient[N+1],x,val;//numarul de coeficienti e cu 1 mai mare decat gradul
int grad; //grad variabil <=N

void citire_grad(void){  /* cu validare */
  do{
    printf("grad maxim(0..%d)=",N);scanf("%d",&grad);
  }while(grad<0 || grad>N);
}

void citire_coef(void){
  int i;
  citire_grad();
  puts("Introduceti coeficientii:");
  for(i=0;i<=grad;i++){
    printf("coef[%d]=",i);scanf("%lf",&coeficient[i]);  /* se afiseaza indicele 
            elem ce se citeste */
  }
}

void list_polin(void){  /* se listeaza polinomul */
  int i;
  printf("P(x)=");
  for(i=grad;i>0;i--)
    if(coeficient[i])
      printf("%lf*x^%d+",coeficient[i],i);
  if(coeficient[0])
    printf("%lf\n",coeficient[0]);  /* termenul liber */
}

void eval(void){
  int i;
  val=coeficient[grad];
  for(i=grad-1;i>=0;i--){
    val*=x;
    val+=coeficient[i];
  }
}

void main(void){
  clrscr();
  citire_coef();
  list_polin();  
  while(printf("x="),scanf("%lf",&x),x){
     /* while(printf("x="),scanf("%lf",&x) != EOF )//daca oprire la CTRL/Z */
    eval();
    printf("P(%lf)=%lf\n",x,val);
    printf("poly(%lf)=%lf\n",x,poly(x,grad,coeficient)); /* evaluare cu functia de
                             biblioteca poly */
  }
  getch();
}