Sunteți pe pagina 1din 5

Universitatea de Stat din Moldova

Facultatea de Matematică și Informatică

Departamentul de Informatică

Dare de seamă privind Practica de inițiere

A elaborat:Moșneag Gheorghe, Gr:I1901

Verificat:Carolina Opincă, lector universitar

Chișinău, 2020
1.Sarcina

Se citește un șir care conține doar paranteze rotunde și paranteze drepte. Parantezele se împerechează
corect dacă toate parantezele formează perechi de paranteză deschisă – paranteză închisă, iar în
interiorul unei perechi pot fi zero sau mai multe perechi. Să se testeze dacă șirul dat are paranteze
împerecheate corect.

Exemple: ()([()]()) => correct ((()[[])]) => greșit

2.Codul programului

#include<stdio.h>
#include<stdlib.h>
#define bool int
struct paranteze
{
char data;
struct paranteze *k;
};
void a(struct paranteze** sus, int dt_nou);
int b(struct paranteze** sus);

/* Întoarce 1 dacă caracterul1 și caracterul2 se potrivesc cu parentezele stânga și dreapta */


bool parPereche(char caracter1, char caracter2)
{
if (caracter1 == '(' && caracter2 == ')')
return 1;
else if (caracter1 == '[' && caracter2 == ']')
return 1;
else
return 0;
}

/*Intoarce 1 daca parantezele se imperecheaza*/


bool suntParPereche(char exp[])
{
int i = 0;

/* Declar o stivă de caractere goale */


struct paranteze *stiva = NULL;

/* Traversez expresia dată pentru a verifica daca parantezele se imperecheaza */


while (exp[i])
{
if (exp[i] == '(' || exp[i] == '[')
a(&stiva, exp[i]);

if (exp[i] == ')' || exp[i] == ']')


{

/*Dacă exista paranteze neimperecheate, atunci se returneaza fals*/


if (stiva == NULL)
return 0;

/* Se extrage elementul de sus din stivă,


dacă nu este o paranteză imperecheata, atunci există o nepotrivire.*/
else if ( !parPereche(b(&stiva), exp[i]) )
return 0;
}
i++;
}

if (stiva == NULL)
return 1; /*Corect*/
else
return 0; /*Gresit*/
}

/* Declararea functiilor*/
/*testarea functiilor declarare mai sus*/
int main()
{
char exp[100];
printf("Introduceti parantezele:");
gets(exp);
if (suntParPereche(exp))
printf("Corect\n");
else
printf("Gresit \n");
return 0;
}

/* Funcție pentru a împinge un element in stivă*/


void a(struct paranteze** sus, int dt_nou)
{
struct paranteze* nd =
(struct paranteze*) malloc(sizeof(struct paranteze));

if (nd == NULL)
{
getchar();
exit(0);
}

nd->data = dt_nou;

nd->k = (*sus);

(*sus) = nd;
}

/* Funcție pentru a deschide un articol din stivă*/


int b(struct paranteze** sus)
{
char res;
struct paranteze *t;

/*Dacă stiva este goală, atunci este eroare */


if (*sus == NULL)
{
getchar();
exit(0);
}
else
{
t = *sus;
res = t->data;
*sus = t->k;
free(t);
return res;
}
}

3.Screenshot
4.Repere teoretice
Algoritm:
 Se declara o structura de care include o stiva de caractere .
 Se traversează șirul de expresie exp.
1. Dacă caracterul curent este o paranteză de pornire ( '(' sau '[' ), atunci se împinge la stivă.
2. Dacă caracterul curent este o paranteză de închidere ( ')' sau '}' sau ']' ), atunci pop-ul din stivă
și dacă caracterul popped este paranteza de pornire potrivită, atunci alte paranteze nu sunt
imperechiate.
 După traversarea completă, dacă mai rămâne un pachet de pornire în stivă atunci se afiseaza
„Gresit”
Reper teoretic : http://andrei.clubcisco.ro/cursuri/1pc/curs/1/Curs%209%20Doc.pdf
5.Concluzie
In urma efectuarii lucrarii date am analizat si elaborat algoritmul necesar efecuarii problemei
date.Am studiat reperele teoretice precum: strucuri de date, siruri, declararea functiilor care m-au ajutat
in elaboararea solutiei problemei date.Mi-a oferit posibilitatea sa imi consolidez si intares cunostintele
in domeniul programarii prin gindirea algoritmica si logica.

S-ar putea să vă placă și