Sunteți pe pagina 1din 34

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică


Departamentul Ingineria Software și Automatică

RAPORT
la lucrarea de laborator nr. 1

la SDA

Tema: Implementarea tipului de date abstract “Tablou de structuri” în limbajul C.

A efectuat: st.grupa Dombrovschi Iulia , TI-224

A verificat: Birnaz Adrian

Chişinău 2023
Scopul lucrării

Scopul lucrării este de a familiariza studentul cu mecanismul de creare a tablourilor statice și


dinamice de structuri și operații elementare asupra acestuia, utilizînd pentru aceasta limbajul C.

Obiectivele temei

1. Să se elaboreze un program ce va aloca static un tablou unidimensional de structuri


și va realiza următoarele funcții:
- citirea de la tastatură a elementelor tabloului;
- afișarea la consolă a elementelor tabloului;
- căutarea unui element după o valoare a unui cîmp din structură și returnarea poziției unde
se află primul element găsit.

#include <stdio.h>
#define n 10 // marimea tabloului
struct Element {
int value;
};

struct Element array[n];

void read_elements() {
for (int i = 0; i < n; i++) {
printf("Dati valoarea elementului %d: ", i+1);
scanf("%d", &array[i].value);
}
}

void display_elements() {
printf("Elementele: \n");
for (int i = 0; i < n; i++) {
printf("Elementul %d: valoarea = %d\n", i+1, array[i].value);
}
}

int search_element(int nr) {


for (int i = 0; i < n; i++) {
if (array[i].value == nr) {
return i;
}
}
return -666;
}

int main() {
read_elements();
display_elements();
int pos, nr;
printf("Dati voaloarea pe care o cautati: ");
scanf("%d", &nr);
pos = search_element(nr);
if (pos == -666) {
printf("Elementul nu a fost gasit\n");
} else {
printf("Elementul a fost gasit pe pozitia %d\n", pos + 1);
}
return 0;
}
2. Să se elaboreze un program ce va aloca dinamic un tablou unidimensional de
structuri și va realiza următoarele funcții, unde funcțiile date reprezintă opțiuni
organizate într-un meniu în cadrul programului:
- citirea de la tastatură a elementelor tabloului;
- afișarea la consolă a elementelor tabloului;
- căutarea unui element după o valoarea a unui cîmp din structură și returnarea poziției
unde se află primul element găsit;
- eliberarea memoriei tabloului;
- sortarea elementelor după un cîmp a structurii;
- inserarea unui element nou la capătul tabloului;
- inserarea unui element nou la începutul tabloului;
- insearea unui element la o poziție X (introdusă de la tastatură) în cadrul tabloului;
- ștergerea unui element de pe o poziție X ( introdusă de la tastatură) din cadrul tabloului.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct element {
int nota;
int grupa;
char name[20];
char sex[10];
char specialitatea[40];
};

void Print_array(struct element *arr, int size) {


int i;
for (i = 0; i < size; i++) {
printf("\nElevul %d: \nNumele: %s \nNota: %d \nSpecialitatea: %s \nGrupa:
%d \nSex: %s \n---------------------",
i+1, arr[i].name, arr[i].nota, arr[i].specialitatea, arr[i].grupa, arr[i].sex);
}
}

int Search_element(struct element *arr, int size, int nota) {


int i;
for (i = 0; i < size; i++) {
if (arr[i].nota == nota) {
return i;
}
}
return -666;
}

void Sort_array(struct element *arr, int size, int sort) {


int i, j;
struct element temp;
for (i = 0; i < size - 1; i++) {
for (j = 0; j < size - i - 1; j++) {
//După Notă
if (sort == 2) {
if (arr[j].nota < arr[j+1].nota) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După nume
else if (sort == 1) {
if (strcmp(arr[j].name, arr[j+1].name) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După Specialitate
else if (sort == 3){
if (strcmp(arr[j].specialitatea, arr[j+1].specialitatea) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;

}
}
//După Grupă
else if (sort == 4){
if (arr[j].grupa > arr[j+1].grupa) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După Sex
else if (sort == 5){
if (strcmp(arr[j].sex, arr[j+1].sex) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
} }
}

void Insert_element(struct element **arr, int *size, struct element elem, int pos) {
(*size)++;
*arr = (struct element *) realloc(*arr, (*size) * sizeof(struct element));
int i;
for (i = (*size) - 1; i > pos; i--) {
(*arr)[i] = (*arr)[i-1];
}
(*arr)[pos] = elem;
}

void Delete_element(struct element **arr, int *size, int pos) {


int i;
for (i = pos; i < (*size) - 1; i++) {
(*arr)[i] = (*arr)[i+1];
}
(*size)--;
*arr = (struct element *) realloc(*arr, (*size) * sizeof(struct element));
}

int main() {
int choice, size, i, pos, nota, sort;
struct element *arr = NULL;
while (1) {

printf("\n====================================================
=");
printf("\nMeniul:\n");
printf("1. Dati studentii si notele lor\n");
printf("2. Arata informatia studentului\n");
printf("3. Cauta studentii dupa note\n");
printf("4. Aranjeaza studentii\n");
printf("5. Adaugati un student la sfirsit\n");
printf("6. Adaugati un student la inceput\n");
printf("7. Adaugati studenti de la pozitia preselectata\n");
printf("8. Scoate studentuls de la pozitia oferita\n");
printf("9. Exit\n");
printf("Dati un numar de la 1 la 9: ");
scanf("%d", &choice);
printf("=====================================================\
n");
switch (choice) {
case 1:
printf("Dati nr de studenti: ");
scanf("%d", &size);
arr = (struct element *) malloc(size * sizeof(struct element));
for (i = 0; i < size; i++) {
printf("Dati numele, nota, specialitatea, grupa si sexul elevului %d: ",
i+1);
scanf("%s%d%s%d%s", &arr[i].name, &arr[i].nota,
&arr[i].specialitatea, &arr[i].grupa, &arr[i].sex);
}
break;
case 2:
if (arr == NULL) {
printf("Masivul nu e initializat\n");
}
else {
Print_array(arr, size);
}
break;
case 3:
printf("Dati nota pe care o cautati: ");
scanf("%d", &nota);
pos = Search_element(arr, size, nota);
if (pos == -666) {
printf("Nu a fost gasit nici un elev cu aceasta nota\n");
}
else {
printf("Nota cautata a fost gasita la elevul cu id-ul %d\n", pos+1);
}
break;
case 4:
printf("Sorteaza:\n1. Name\n2. Nota\n3. Specialitatea \n4. Grupa \n5.
Sex\nAlege: ");
scanf("%d", &sort);
Sort_array(arr, size, sort);
break;
case 5:
printf("Dati informatii despre studentul nou: ");
struct element elem;
scanf("%s%d%s%d%s", &elem.name, &elem.nota, &elem.specialitatea,
&elem.grupa, &elem.sex);
Insert_element(&arr, &size, elem, size);
break;
case 6:
printf("Dati informatii despre studentul nou: ");
struct element elem2;
scanf("%s%d%s%d%s", &elem2.name, &elem2.nota,
&elem2.specialitatea, &elem2.grupa, &elem2.sex);
Insert_element(&arr, &size, elem2, 0);
break;
case 7:
printf("Dati pozitia si informatii despre studentul nou: ");
struct element elem3;
scanf("%d%s%d%s%d%s", &pos, &elem3.name ,&elem3.nota,
&elem3.specialitatea, &elem3.grupa, &elem3.sex);
Insert_element(&arr, &size, elem3, pos-1);
break;
case 8:
printf("Dati nr elevului pentru al da afara din grupa: ");
scanf("%d", &pos);
Delete_element(&arr, &size, pos-1);
break;
case 9:
free(arr);
return 0;
default:
printf("Nu era presupus sa ajungeti aici )\n");
break;
}
}
return 0;
} #include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct element {
int nota;
int grupa;
char name[20];
char sex[10];
char specialitatea[40];
};

void Print_array(struct element *arr, int size) {


int i;
for (i = 0; i < size; i++) {
printf("\nElevul %d: \nNumele: %s \nNota: %d \nSpecialitatea: %s \nGrupa:
%d \nSex: %s \n---------------------",
i+1, arr[i].name, arr[i].nota, arr[i].specialitatea, arr[i].grupa, arr[i].sex);
}
}

int Search_element(struct element *arr, int size, int nota) {


int i;
for (i = 0; i < size; i++) {
if (arr[i].nota == nota) {
return i;
}
}
return -666;
}
void Sort_array(struct element *arr, int size, int sort) {
int i, j;
struct element temp;
for (i = 0; i < size - 1; i++) {
for (j = 0; j < size - i - 1; j++) {
//După Notă
if (sort == 2) {
if (arr[j].nota < arr[j+1].nota) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După nume
else if (sort == 1) {
if (strcmp(arr[j].name, arr[j+1].name) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După Specialitate
else if (sort == 3){
if (strcmp(arr[j].specialitatea, arr[j+1].specialitatea) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;

}
}
//După Grupă
else if (sort == 4){
if (arr[j].grupa > arr[j+1].grupa) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
//După Sex
else if (sort == 5){
if (strcmp(arr[j].sex, arr[j+1].sex) > 0) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
} }
}
void Insert_element(struct element **arr, int *size, struct element elem, int pos) {
(*size)++;
*arr = (struct element *) realloc(*arr, (*size) * sizeof(struct element));
int i;
for (i = (*size) - 1; i > pos; i--) {
(*arr)[i] = (*arr)[i-1];
}
(*arr)[pos] = elem;
}

void Delete_element(struct element **arr, int *size, int pos) {


int i;
for (i = pos; i < (*size) - 1; i++) {
(*arr)[i] = (*arr)[i+1];
}
(*size)--;
*arr = (struct element *) realloc(*arr, (*size) * sizeof(struct element));
}

int main() {
int choice, size, i, pos, nota, sort;
struct element *arr = NULL;
while (1) {

printf("\n====================================================
=");
printf("\nMeniul:\n");
printf("1. Dati studentii si notele lor\n");
printf("2. Arata informatia studentului\n");
printf("3. Cauta studentii dupa note\n");
printf("4. Aranjeaza studentii\n");
printf("5. Adaugati un student la sfirsit\n");
printf("6. Adaugati un student la inceput\n");
printf("7. Adaugati studenti de la pozitia preselectata\n");
printf("8. Scoate studentuls de la pozitia oferita\n");
printf("9. Exit\n");
printf("Dati un numar de la 1 la 9: ");
scanf("%d", &choice);

printf("=====================================================\
n");
switch (choice) {
case 1:
printf("Dati nr de studenti: ");
scanf("%d", &size);
arr = (struct element *) malloc(size * sizeof(struct element));
for (i = 0; i < size; i++) {
printf("Dati numele, nota, specialitatea, grupa si sexul elevului %d: ",
i+1);
scanf("%s%d%s%d%s", &arr[i].name, &arr[i].nota,
&arr[i].specialitatea, &arr[i].grupa, &arr[i].sex);
}
break;
case 2:
if (arr == NULL) {
printf("Masivul nu e initializat\n");
}
else {
Print_array(arr, size);
}
break;
case 3:
printf("Dati nota pe care o cautati: ");
scanf("%d", &nota);
pos = Search_element(arr, size, nota);
if (pos == -666) {
printf("Nu a fost gasit nici un elev cu aceasta nota\n");
}
else {
printf("Nota cautata a fost gasita la elevul cu id-ul %d\n", pos+1);
}
break;
case 4:
printf("Sorteaza:\n1. Name\n2. Nota\n3. Specialitatea \n4. Grupa \n5.
Sex\nAlege: ");
scanf("%d", &sort);
Sort_array(arr, size, sort);
break;
case 5:
printf("Dati informatii despre studentul nou: ");
struct element elem;
scanf("%s%d%s%d%s", &elem.name, &elem.nota, &elem.specialitatea,
&elem.grupa, &elem.sex);
Insert_element(&arr, &size, elem, size);
break;
case 6:
printf("Dati informatii despre studentul nou: ");
struct element elem2;
scanf("%s%d%s%d%s", &elem2.name, &elem2.nota,
&elem2.specialitatea, &elem2.grupa, &elem2.sex);
Insert_element(&arr, &size, elem2, 0);
break;
case 7:
printf("Dati pozitia si informatii despre studentul nou: ");
struct element elem3;
scanf("%d%s%d%s%d%s", &pos, &elem3.name ,&elem3.nota,
&elem3.specialitatea, &elem3.grupa, &elem3.sex);
Insert_element(&arr, &size, elem3, pos-1);
break;
case 8:
printf("Dati nr elevului pentru al da afara din grupa: ");
scanf("%d", &pos);
Delete_element(&arr, &size, pos-1);
break;
case 9:
free(arr);
return 0;
default:
printf("Nu era presupus sa ajungeti aici )\n");
break;
}
}
return 0;
}

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