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;
}
}