Programarea in limbajul C++ / Structura – mecanism de abstractizare

Scopul si sarcina lucrarii:
Studierea programării prin abstractizarea datelor;
      Studierea regulilor de definire şi utilizare a structurilor de date;
      Crearea variabilelor de tip structură, accesarea componentelor unei structuri.

a)       Să se creeze tipul abstract de date (structura) – cîine, care se compune din rasă, nume şi vîrstă. Să se definească funcţiile de setare şi modificare a datelor şi de eliberare a memoriei alocate. Pentru iniţializarea componentelor textuale să se utilizeze operatorul de alocare dinamică a memoriei new. Să se definească funcţia pentru sortarea tabloului de tip cîine conform vîrstei şi numelui. Adică cîinii de aceeaşi vîrstă se sortează în ordine alfabetică.
b)      Să se creeze tipul abstract de date (structura) – vector, care se compune dintr-un pointer spre int şi din numărul de elemente. Să se definească funcţiile de iniţializare, de eliminare a unui vector; de setare/ modificare a dimensiunii vectorului; de acces la elementele vectorului; de calcul a modulului unui vector. În funcţia main să se realizeze adunarea a doi vectori.


Indicatii teoretice:
Structura reprezinta o variabila care ne permite sa lucram eficient si fara erori cu elementele care sunt de tip diferit. Aceasta ne permite sa reducem complexitatea programului si sa oformam datele necesare intr-un mod cit mai eficient.
De exemplu formam o structura de tip vector:
struct vector{
short int *elemente;
int numar;};                              astfel urmatoarele variabile care vor fi  declarate pe baza structurii date vor fi de tip   <vector>
Definirea structurii- prin declararea unui structuri nu se subintelege declararea unei variabile de tip structura. Structura declarata va deveni drept sablon pentru urmatoarele variabile de tip structura.
Cuvintul cheie ce caracterizeaza o structura este struct iar elementele structurii trebuie de le indicat tipul de date.
Limbajul ne permite sa declaram variabilele de un tip structura  fie la inceput declarind structura apoi variabilele.
struct vector{
short int *elemente;
          int numar;};                             

vector   v_1,v_2;

fie imediat dupa declararea structurii:
struct vector{
short int *elemente;
int numar;};     v_1,v_2;           
Structurile de alte tipuri de date se diferentiaza prin modul sau de pastrare si       introducere.  De exemplu lista: se caracterizeaza printr-un tip  liniar de introducere a datelor, operatiile de baza sunt de includere si excludere si fiecare element e caracterizat de vecini si lista are cap si indicator de sfirsit; arborele  ne permite sa executam calculele si cautarile intrun mod rapid .
Vom utiliza punctul cind  vom face acces la elementele unui structuri precizind numele variabilei de tip structura si cimpurile ce ne intereseaza separate prin acest punct
Vom utiliza sageata cind   accesam un element dintr-o structura printr-un pointer
Structurile din mediul de programare C si C++, se deosebesc prin cuvintul cheie
typedef  care la C++ lipseste
O structura poate contine in sine o alta structura aceasta din urma fiind o structura     imbricata
Este ilegal a declara o structura care face apel la ea insasi insa ea poate contine un pointer la ea insasi
O structura poate fi initializata prin alocare de memorie, aceasta ne permite sa utilizam atita memorie cit este suficienta pentru informatia existenta.
Referintele, ca si pointerii, sunt variabile care contin adresa unei zone de memorie.
Semantic, ele reprezinta aliasuri ale unor variabile existente. Referintele sunt legate de variabile la declaratie si nu pot fi modificate pentru a referi alte zone de memorie. Sintaxa folosita pentru declararea unei referinte este:
Tip & referinta = valoare;

Realizarea sarcinii  a)
Introducerea datelor:
Meniul principal se realizeaza in functia „main()”
Codul sursa:

 void main(void){
char com;
sus:clrscr();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
cout<<"1 - Creare\n";
cout<<"2 - Afisare\n";
cout<<"3 - Sortare\n";
cout<<"4 - Eliberarea memoriei alocate\n";
cout<<"5 - Modificare\n";
cout<<"0 - Iesire\n";
com=getch();
switch (com) {
   case '1': {creare(); break;}
   case '2': {afisare(); break;}
   case '3': {menu_sort(); break;}
   case '4': {delete p; p=NULL; cout<<"Succes !"; Sleep(500);break;}
   case '0': { delete p; exit(1); break;}
   case '5': {modificare(); break;}
   default: goto sus;
}
goto sus;
getch();

}


Pentru introducera informatiei trebuie de accesat meniul “Creare” tastind butonul ‘1’
creare(){
char c=178;
clrscr();
cout<<"Introdu numarul de ciini:\t";
cin>>n;
for (int i = 0; i < 42; i++)    cout<<c; cout<<"\n";
p=new ciine[n];
cout<<c<<"Nr. "<<c<<" Numele  \t"<<c<<"     Rasa   \t"<<c<<" Virsta "<<c<<"\n";
for (int i = 0; i < 42; i++)   cout<<c; cout<<"\n";
for (int i = 0; i < n; i++) {
cout<<c;
cout<<" "<<i+1<<"  "<<c;
gotoxy(17,i+5);     cout<<c;
gotoxy(33,i+5);     cout<<c;
gotoxy(42,i+5);     cout<<c;
gotoxy(8,i+5);
cin>>p[i].nume;
gotoxy(19,i+5);
cin>>p[i].rasa;
gotoxy(36,i+5);
cin>>p[i].virsta;
}
for (int i = 0; i < 42; i++)
  cout<<c; cout<<"\n"; cout<<"Tastati tasta Enter...";
getch(); }


După ce am introdu numărul necesar se afisează un tabel in care se va efectua inscrierea informatiei, şi la finele acestei functii va trebui de apăsat tasta ENTER pentru revenire in functia main().



Modificarea datelor se face în toate cimpurile (nume, rasa,vîrstă ) se efectuează in funcţia modificare(), mai intii se afiseaza pe ecran toti „cîinii” inregistrati dupa care se alege numarul de rind pe care dorim să efectuam modificări (” N – numele, R – rasa, V – virsta).
 Codul :
modificare(){
int nn;char com;
afisare();
cout<<"Introdu numarul de rind:";  cin>>nn;
cout<<"Ce doriti sa modificati : \n";
cout<<"N - Numele\n";
cout<<"R - Rasa\n";
cout<<"V - Virsta\n";
sus:com=getch();
 switch (com) {
             case 'N': case 'n':{
                        cout<<"Introdu numele nou: ";
                        cin>>p[nn-1].nume;
               break;}
             case 'R': case 'r':{
                        cout<<"Introdu rasa: ";
                        cin>>p[nn-1].rasa;
               break;}
             case 'V': case 'v':{
                        cout<<"Intodu virsta: ";
                        cin>>p[nn-1].virsta;
               break;}
 default: goto sus;

 }
 getch();
 afisare();
}


Dupa care se afiseaza automat informatia modificata:  


Meniul de sortare include doua functi de sortare dupa vîrstă si dupa nume(in ordine crescatoare, alfabetică)


Sortarea după vîrstă:
 Codul:
sortare_virst(){
ciine *p1; int i,j;
 p1=new ciine;
for (i = 0; i < n; i++)
 for (j = i; j < n; j++) {
   if (p[i].virsta > p[j].virsta) {

             *p1=p[i];
             p[i]=p[j];
             p[j]=*p1;
  }
   }
  delete p1;
cout<<"\nSortare cu succes !\n";
Sleep(500);
}

Sortare dupa nume:
 Codul:
sortare_nume(){
ciine *p1;  int i,j;
 p1=new ciine;
for (i = 0; i < n; i++)
 for (j = i; j < n; j++)
if (strcmp(p[i].nume,p[j].nume)==1) {
 *p1=p[i];
 p[i]=p[j];
 p[j]=*p1;  }
 delete p1;
 cout<<"\nSortare cu succes !\n";Sleep(500);  }


Funcţia de afisare se efectuează in forma de tabel
Codul:
afisare(){
char c=178;
clrscr();
if (p!=NULL) {
if (n!=0) {
cout<<"Nr. "<<c<<" Numele  \t"<<c<<" Rasa   \t"<<c<<" Virsta "<<c<<"\n";
for (int i = 0; i < 42; i++)    cout<<c; cout<<"\n";
for (int i = 0; i < n; i++) {
cout<<i+1<<"   "<<c;
cout<<p[i].nume<<" \t  ";
cout<<p[i].rasa<<" \t";
cout<<p[i].virsta<<"  \t\n";
}  }
}
else cout<<"Nu exista informatie !";
getch();
}

Eliberarea de memorie se efectuează in funcţia main cu ajutorul functiei delete
 Codul:
 case '4': {delete p; p=NULL; cout<<"Succes !"; Sleep(500);break;}


Meniul principal:
Codul:
 main (){
vector v;
int i,prod=1,dim=0;
char com;
short int s=0,s1=0;
sus:clrscr();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout<<"[1]-Crearea vectorului\n";
cout<<"[2]-Afisare\n";
cout<<"[3]-Crearea vectorului secundar\n";
cout<<"[4]-Eliminarea vectorului\n";
cout<<"[5]-Modificarea dimensiunii vectorului\n";
cout<<"[6]-Accesare la un element\n";
cout<<"[7]-Suma elementilor vectorului\n";
cout<<"[8]-Inmultirea a doi vectori\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8);
cout<<"Esc - Iesire\n";
com=getch();
Beep(900,100);
switch(com){
case '1':{creare(&v),constr(&v); cout<<"\n";
cout<<"\n Enter - Inapoi\n";
prob:com=getch();
if (com==13) goto sus;
else goto prob;
} break;

case '2':{afisare(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob2:com=getch();
if (com==13) goto sus;
else goto prob2;  } break;

case '3':{construire(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob3:com=getch();
if (com==13) goto sus;
 goto prob3;
} break;

case '4' :{eliminare(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob4:com=getch();
if (com==13) goto sus;
else goto prob4;
}break;

case '5' :{modificare(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob5:com=getch();
if (com==13) goto sus;
else goto prob5;
}break;

case '6' :{accesare(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob6:com=getch();
if (com==13) goto sus;
else goto prob6;
}break;

case '7' :{suma(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob7:com=getch();
if (com==13) goto sus;
else goto prob7;
 }break;
//*************INMULTIREA A 2 VECTORI   *********************
case '8':{
clrscr();
if ((ve[0]==NULL) || (v.numar==0)) {
cout<<"\nInmultirea nu este posibila !\n   Nu exista un vector.\n";
getch();
goto sus;
}
else if (x==v.numar){
cout<<"Inmultirea vectorilor:\n";
for (i = 0; i < v.numar; i++) {
            prod=ve[i]*v.elem[i];
            cout<<prod<<"  ";
}
   }
   getch();
   goto sus;
}break;


case 27: exit(1); break;

default : goto sus;
 }
}


Crearea vectorului se efectuiază in funcţia creare
Codul:
 void creare(vector *a){
   clrscr();
   cout<<"Introdu dimensiunea vectorului ";
  cin>>a->numar;
  a->elem=new float[a->numar];
  n=a->numar;}


Modificarea lungimii vectorului program se face numai pentru dimensiuni mai mici decit cele initiale. Introducind cifra mai mica se elimina din sir acele elemente care intrec pozitia data.
Modificarea dimensiunii:
 Codul:
  modificare(vector *a){
int i,nn;
clrscr();
cout<<"Introdu dimensiunea noua mai mica decit initiala";
cin>>nn;
if(a->numar>nn){
for(i=nn+1;i<a->numar;i++){
delete[] a->elem;
a->elem = NULL;}
a->numar=nn;}
}


In meniu are loc analiza vectorilor daca sunt de aceiasi lungime se poate de inmultit acesti doi vectori:
Codul:
  {
clrscr();
if ((ve[0]==NULL) || (v.numar==0)) {
cout<<"\nInmultirea nu este posibila !\n   Nu exista un vector.\n";
getch();
goto sus;
}
else if (x==v.numar){
cout<<"Inmultirea vectorilor:\n";
for (i = 0; i < v.numar; i++) {
            prod=ve[i]*v.elem[i];
            cout<<prod<<"  ";
}
   }
  


getch();
   goto sus;
}


Concluzie:
In urma efectuarii lucrarii date am determinat ca mediul de prgramare C++   
este cu mult flexibil ca C, care ne permite sa manipulam cu informatia intr-un mod rapid si eficient fara a induce erori grosolane.


Bibliografie
1 TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN C SI C++)[RO][Kris Jamsa][Lars Kland]  
2 PROGRAMARE IN C_C++ CULEGERE DE PROBLEME Valiriu Iorga
3 Initiere in C++, Programarea orientata pe obiecte (Editie Prevazuta) Cluj-Napoca 1993


Anexa A
Codul sursa program numarul 1:
#include <iostream.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>

using namespace std;

typedef struct _ciine{
char nume[15];
char rasa[15];
int virsta;
}ciine;
ciine *p;
int n=0;

creare(){
char c=178;
clrscr();
cout<<"Introdu numarul de ciini:\t";
cin>>n;
for (int i = 0; i < 42; i++)    cout<<c; cout<<"\n";
p=new ciine[n];
cout<<c<<"Nr. "<<c<<" Numele  \t"<<c<<"     Rasa   \t"<<c<<" Virsta "<<c<<"\n";
for (int i = 0; i < 42; i++)   cout<<c; cout<<"\n";
for (int i = 0; i < n; i++) {
cout<<c;
cout<<" "<<i+1<<"  "<<c;
gotoxy(17,i+5);     cout<<c;
gotoxy(33,i+5);     cout<<c;
gotoxy(42,i+5);     cout<<c;
gotoxy(8,i+5);
cin>>p[i].nume;
gotoxy(19,i+5);
cin>>p[i].rasa;
gotoxy(36,i+5);
cin>>p[i].virsta;
}
for (int i = 0; i < 42; i++)
  cout<<c; cout<<"\n"; cout<<"Tastati tasta Enter...";
getch(); }

afisare(){
char c=178;
clrscr();
if (p!=NULL) {
if (n!=0) {
cout<<"Nr. "<<c<<" Numele  \t"<<c<<" Rasa   \t"<<c<<" Virsta "<<c<<"\n";
for (int i = 0; i < 42; i++)    cout<<c; cout<<"\n";
for (int i = 0; i < n; i++) {
cout<<i+1<<"   "<<c;
cout<<p[i].nume<<" \t  ";
cout<<p[i].rasa<<" \t";
cout<<p[i].virsta<<"  \t\n";
}  }
}
else cout<<"Nu exista informatie !";
getch();
}

sortare_virst(){
ciine *p1; int i,j;
 p1=new ciine;
for (i = 0; i < n; i++)
 for (j = i; j < n; j++) {
   if (p[i].virsta > p[j].virsta) {

        *p1=p[i];
        p[i]=p[j];
        p[j]=*p1;
  }
   }
  delete p1;
cout<<"\nSortare cu succes !\n";
Sleep(500);
}

sortare_nume(){
ciine *p1;  int i,j;
 p1=new ciine;
for (i = 0; i < n; i++)
 for (j = i; j < n; j++)
if (strcmp(p[i].nume,p[j].nume)==1) {
 *p1=p[i];
 p[i]=p[j];
 p[j]=*p1;
}
 delete p1;
 cout<<"\nSortare cu succes !\n";
Sleep(500);
}

menu_sort(){
char com;
sus:clrscr();
cout<<"1 - Sortare dupa virsta\n";
cout<<"2 - Sortare dupa nume\n";
cout<<"0 - Inapoi\n";
com=getch();
switch (com) {
       case '1': {sortare_virst(); break;}
       case '2': {sortare_nume(); break;}
       case '0': {void main(); break;}
goto sus;
}
}

modificare(){
int nn;char com;
afisare();
cout<<"Introdu numarul de rind:";  cin>>nn;
cout<<"Ce doriti sa modificati : \n";
cout<<"N - Numele\n";
cout<<"R - Rasa\n";
cout<<"V - Virsta\n";
sus:com=getch();
 switch (com) {
        case 'N': case 'n':{
                                                                        cout<<"Introdu numele nou: ";
                                                                        cin>>p[nn-1].nume;
          break;}
        case 'R': case 'r':{
                                                                        cout<<"Introdu rasa: ";
                                                                        cin>>p[nn-1].rasa;
          break;}
        case 'V': case 'v':{
                                                                        cout<<"Intodu virsta: ";
                                                                        cin>>p[nn-1].virsta;
          break;}
 default: goto sus;

 }
 getch();
 afisare();
}

void main(void){
char com;
sus:clrscr();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
cout<<"1 - Creare\n";
cout<<"2 - Afisare\n";
cout<<"3 - Sortare\n";
cout<<"4 - Eliberarea memoriei alocate\n";
cout<<"5 - Modificare\n";
cout<<"0 - Iesire\n";
com=getch();
switch (com) {
   case '1': {creare(); break;}
   case '2': {afisare(); break;}
   case '3': {menu_sort(); break;}
   case '4': {delete p; p=NULL; cout<<"Succes !"; Sleep(500);break;}
   case '0': { delete p; exit(1); break;}
   case '5': {modificare(); break;}
   default: goto sus;} goto sus;  getch(); }



Anexa B
Codul sursa program numarul 2:

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;

struct vector{
float *elem;
int numar;};

int ve[100],x;
void creare(vector *a){
clrscr();
cout<<"Introdu dimensiunea vectorului ";
cin>>a->numar;
a->elem=new float[a->numar];

void constr(vector *a){
int i;
clrscr();
cout<<"Introdu elementelele vectorului:\n";
for(i=0;i<a->numar;i++){
cout<<"E["<<i+1<<"]= ";
cin>>a->elem[i];
}}

void construire(vector *a){
int i;
clrscr();
cout<<"Introdu dimensiunea= ";
cin>>x;
clrscr();
cout<<"Introdu elementele =\n";
for(i=0;i<x;i++){
cout<<"x["<<i+1<<"]= ";
cin>>ve[i];
}}



void afisare(vector *a){
int i;
clrscr();
if(a->numar!=0){
cout<<"Vectorul:\n";
for(i=0;i<a->numar;i++)
cout<<a->elem[i]<<" ";
cout<<"\n\nSunt "<<a->numar<<" numere";
} else
cout<<"Mai intii creaza vectorul !";}

eliminare(vector *a){
clrscr();
delete[] a->elem;
a->elem=NULL;
a->numar=0;
cout<<"\nSucces !\n";
}

accesare(vector *a){
int i,m;
clrscr();
cout<<"Introdu pozitia elementului= ";
cin>>m;
if (m>a->numar)
   cout<<"\nAceasta pozitie este libera !\n";
else {
clrscr();
cout<<"Elementul accesat= ";
for(i=0;i<a->numar;i++){
if(i==m)
cout<<a->elem[i-1];   }
}}
//***********************************************************************
suma(vector *a){
int i,s=0;
clrscr();
for(i=0;i<a->numar;i++)
s=s+a->elem[i];
cout<<"Suma elemetilor vectorului este = "<<s;}

//***********************************************************************
modificare(vector *a){
int i,nn;
clrscr();
cout<<"Introdu dimensiunea noua mai mica decit initiala";
cin>>nn;
if(a->numar>nn){
for(i=nn+1;i<a->numar;i++){
delete[] a->elem;
a->elem = NULL;}
a->numar=nn;}}


main (){
vector v;
int i,prod=1,dim=0;
char com;
short int s=0,s1=0;
sus:clrscr();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout<<"[1]-Crearea vectorului\n";
cout<<"[2]-Afisare\n";
cout<<"[3]-Crearea vectorului secundar\n";
cout<<"[4]-Eliminarea vectorului\n";
cout<<"[5]-Modificarea dimensiunii vectorului\n";
cout<<"[6]-Accesare la un element\n";
cout<<"[7]-Suma elementilor vectorului\n";
cout<<"[8]-Inmultirea a doi vectori\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8);
cout<<"Esc - Iesire\n";
com=getch();
Beep(900,100);
switch(com){
case '1':{creare(&v),constr(&v); cout<<"\n";
cout<<"\n Enter - Inapoi\n";
prob:com=getch();
if (com==13) goto sus;
else goto prob;
} break;

case '2':{afisare(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob2:com=getch();
if (com==13) goto sus;
else goto prob2;  } break;

case '3':{construire(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob3:com=getch();
if (com==13) goto sus;
 goto prob3;
} break;

case '4' :{eliminare(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob4:com=getch();
if (com==13) goto sus;
else goto prob4;
}break;

case '5' :{modificare(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob5:com=getch();
if (com==13) goto sus;
else goto prob5;
}break;

case '6' :{accesare(&v); cout<<"\n"; cout<<"\n Enter  - Inapoi\n";
prob6:com=getch();
if (com==13) goto sus;
else goto prob6;
}break;

case '7' :{suma(&v); cout<<"\n"; cout<<"\n Enter - Inapoi\n";
prob7:com=getch();
if (com==13) goto sus;
else goto prob7;
 }break;
//*************INMULTIREA A 2 VECTORI   *********************
case '8':{
clrscr();
if ((ve[0]==NULL) || (v.numar==0)) {
cout<<"\nInmultirea nu este posibila !\n   Nu exista un vector.\n";
getch();
goto sus;
}
else if (x==v.numar){
cout<<"Inmultirea vectorilor:\n";
for (i = 0; i < v.numar; i++) {
            prod=ve[i]*v.elem[i];
            cout<<prod<<"  ";
}
   }
   getch();
   goto sus;
}break;


case 27: exit(1); break;

default : goto sus;
 }

}