RAPORT
la lucrarea de laborator nr. 4
la Programarea Calculatoarelor
Varianta I
Chişinău – 2019
Scopul lucrării:
1. de studiat şi însuşit materialul teoretic pentru evidenţierea esenţialului proiectarii structuri
pentru reprezentarea etapelor prelucrării structurilor de date cu liste în elaborarea modelelor
soluţiei, analizând exemplele din text;
2. să se selecteze problemele din compartimentul “3 şi Anexe” şi să se elaboreze
organigramele (pentru funcţiile principale) şi programele cu liste (declarări, parcurgeri, etc.),
pentru aprofundare şi rularea programelor în limbajul C să se elaboreze scenariile succinte de
soluţionare prin respectiva tehnică de prelucrare cu calculele de verificare şi explicaţii.
3. să se analizeze tehnica modelării şi programării eficiente pentru diverse
compartimente ale diferitor situaţii cu diverse argumentări şi modele de structuri abstracte,
incluzând fişiere cu teste de verificare şi vizualizări. Prezentarea succinta a utilizarii listelor, stivelor
si cozilor, explicand prin organigrame cum are loc apelul prin referință și parcurgerea nodurilor.
ÎNTREBĂRI ŞI EXERCIŢII
1. Definiţi noţiunea – tip abstract de date.
Tipul de date abstract este o entitate manipulata doar prin operatiile ce definesc acel tip. Avantajele utilizarii
tipurilor de date abstracte sunt:
- Programele devin independente de modul de reprezentare a datelor. Modul de reprezentare poate fi modificat,
fara însa a afecta restul programului (de exemplu, o multime poate fi implementata printr-un tablou sau printr-o
lista ordonata, dar partea de program ce foloseste operatorii tipului abstract rămâne neschimbata).
- Se previne violarea accidentala a datelor. Utilizatorul tipului abstract este forţat sa manipuleze datele doar prin
intermediul operatorilor ce compun tipul abstract, astfel reducându-se riscul unei distrugeri a datelor.
2. Cum se defineşte o structură?
O structură este o colecţie de valori eterogene ca tip, stocate într-o zonă compactă de memorie. Cu alte cuvinte,
o structură este un tip de date care permite gruparea unor date de tipuri diferite sub un singur nume.
Componentele unei structuri, denumite câmpuri, sunt identificate prin nume simbolice, denumite selectori.
Câmpurile unei structuri pot fi de orice tip, simplu sau derivat, dar nu void sau funcţie. Printr-o declaraţie struct
se defineşte un nou tip de date de tip structură, de către programator.
– in c typedef struct<nume>{ . . }. " , in c## struct<nume >{ . . . }
In structura este obligator sa fie indicat cel putin un element. Determinarea structurii are forma :
<tipul de date > descrierea.
Unde <tipul de date> indica tipul structurii pentru obiecte , determinate in descriere. In cel mai
simplu caz descrierile prezinta din sine identificatori sau massivului
Exemplu: struct {double x,y} s1,s2,sm[9];
Exerciţiul 1. Să se analizeze programul pentru crearea unei liste simplu înlănţuite cu preluarea
datelor de la tastatură. Sfârşitul introducerii datelor este marcat standard (CTRL+Z). După creare, se va
afişa conţinutul listei apoi se va elibera memoria ocupată.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define NEW (NOD*)malloc(sizeof(NOD));
struct lista { int info; lista *next; };
typedef struct lista NOD;
NOD* creare() { NOD *prim,*ultim,*q; int nr;
printf(" primul nr="); scanf("%i",&nr); // se cite?te primul num?r
prim=(NOD*)malloc(sizeof(NOD)); prim->info=nr; // se creeaz? primul nod
prim->next=NULL; ultim=prim; // se creeaz? ultimul nod
printf("\n urmatorul nr sau tastati CTRL+Z pentru iesire) = "); scanf("%i",&nr); // se cite?te al doilea num?r
while(!feof(stdin)) // at?ta timp c?t nu introducem CTRL+Z
{ q=(NOD*)malloc(sizeof(NOD)); q->info=nr; // se creeaz? nodul urm?tor
q->next=NULL; ultim->next=q; ultim=q; // se creeaz? ultimul nod
printf("\n urmatorul nr sau tastati CTRL+Z pentru iesire)= "); scanf("%i",&nr); // se cite?te num?rul
urm?tor
} return prim; }
void afis(NOD* prim) { printf("\n"); printf("\n Lista este");
while(prim!=NULL) // at?ta timp c?t p este diferit de NULL
{ printf("\t \n%i",prim->info); // se afi?eaz? nodul curent
prim=prim->next; // se trece la urm?torul nod
} }
void stergere (NOD* prim) { NOD *p;
while(prim) // at?ta timp c?t prim este diferit de NULL
{ p=prim; // p devine primul nod
prim=prim->next; // prim devine urm?torul nod
free(p); // se elibereaz? nodul curent
} }
main() { NOD *prim; int a,b,c,d,e,f,g;
// Creare
prim=creare(); afis(prim);
// Eliberare memorie
stergere(prim); getch();
}
Probleme la compilare obținute:
struct Node
{
int data;
struct Node* next;
};
// Funcție pentru a insera un nod dat într-o listă tridimensionată
void sortedInsert(struct Node**, struct Node*);
// Actualizati
current = next;
}
new_node->data = new_data;
insertionSort(&a);
printf("\n Lista simplu inlantuita dupa sortare \n");
printList(a);
return 0;
}
// în cazul în care capul -> următorul punct pentru NULL, atunci începeți să
atribuiți capului -> următorul nod.
head->next = start;
return start;
}
return 0;
}
Folosind functiile de mai sus sa se realizeze un program care citeste doua secvente
consecutive de text, care se termina fiecare cu caracterul `.`. Dupa citirea textelor se
cere sa se tipareasca, în ordine alfabetica, identificatorii prezenti doar în primul text,
apoi cei doar în al doilea text. În continuare se vor tipari în ordine alfabetica
identificatorii care sunt prezenti atât în primul cât si în al doilea text. În final se
afiseaza identificatorii care apar în cel putin unul din cele doua texte.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define Max 100 /* lungimea maxima a unei linii */
/*---------------------------------------------------------*/
/* */
/* Functia caut cauta sirul s in lista al carei inceput */
/* e indicat de parametrul lista. Daca sirul apare in lista*/
/* atunci functia returneaza pointerul la nodul respectiv, */
/* in caz contrar returneaza NULL */
/* */
/*---------------------------------------------------------*/
nod *caut(nod *lista, char *s)
{
nod *q1;
return NULL;
}
/*---------------------------------------------------------*/
/* */
/* Functia listez parcurge lista si pentru fiecare nod */
/*afiseaza identificatorul memorat si valoarea atasata lui.*/
/*Deoarece lista este ordonata, afisarea identificatorilor*/
/* este in ordine alfabetica */
/* */
/*---------------------------------------------------------*/
void listez(void)
{
nod *q;
/*---------------------------------------------------------*/
/* Functia sterg elimina din lista indicata de pointerul */
/* lista, nodul ce are campul id egal cu argumentul s */
/* */
/*---------------------------------------------------------*/
nod *sterg(nod *lista, char *s)
{
nod *q1, *q2;
free(q1->id);
/* se elibereaza memoria ocupata de nodul eliminat */
free(q1);
return lista;
/*returneaza pointerul catre inceputul listei modificate*/
}
else
{
printf("Eroare: identificatorul %s nu apare in lista\n", s);
return lista;
}
}
/*---------------------------------------------------------*/
/* */
/* Functia introduc insereaza un nod in lista ordonata, */
/* indicata de parametrul lista. Lista ramine ordonata si */
/* dupa inserare. Nodul nou are campul id egal cu sirul */
/* indicat de parametrul s, iar campul valoare egal cu */
/* parametrul v. Functia returneaza pointerul catre */
/* inceputul listei modificate */
/* */
/*---------------------------------------------------------*/
nod *introduc(nod *lista, char *s, int v)
{
nod *q1, *q2, *aux;
if ((aux=(nod *)malloc(sizeof(nod)))==NULL ||
(aux->id=(char *)malloc(strlen(s)+1))==NULL)
/* introduc 1 */
{
/* daca nu e memorie suficienta pentru a crea un nod nou,
respectiv pentru a memora sirul s, se da un mesaj de eroare
dupa care executia e incheiata */
/* memoreaza identificatorul in s */
while (isalnum(temp[i]))
s[j++]=temp[i++]; /* citesc_linie 4 */
void comanda_s(void)
{
char s[Max];
int val;
while(1) /* meniu 1 */
{
clrscr();
/* se afiseaza meniul programului */
puts("a : adauga un identificator si valoarea asociata");
puts("t : tipareste valoarea asociata unui identificator");
puts("s : sterge un identificator");
puts("l : listeaza identificatorii si valorile asociate");
puts("+ : calculeaza suma pentru 2 identificatori");
puts("- : calculeaza diferenta pentru 2 identificatori");
puts("* : calculeaza produsul pentru 2 identificatori");
puts("/ : calculeaza impartirea pentru 2 identificatori");
puts("f : termina programul");
printf("\nOptiunea: ");
o=getche(); /* meniu 2 */
printf("\n\n");
switch (tolower(o)) /* meniu 3 */
{
case 'a':
comanda_a(); break;
case 't':
comanda_t(); break;
case 's':
comanda_s(); break;
case 'l':
listez(); break;
case '+': case '-': case '*': case '/':
comanda_oper(o);
break;
case 'f':
return;
default:
printf("Eroare : Comanda inexistenta\n");
}
printf("\nApasa orice tasta...");
getch();
}
}
/* Functia main apeleaza functia meniu */
main()
{
meniu();
}
Concluzie
In urma efectuarii lucrarii de laborator nr.4 am însușit materialul teoretic,am aflat
multe lucruri curioase privitor la lucrul cu listele și fișierele,noi
funcții,organigramele pentru diferite liste,ce reprezină o structură și care sunt
variabilele ei,deasemenea utilizînd aceste cunoștințe în practică.
Bibliografia
1. ."Limbajul de programare C". Brian W.Kernighan. Dennis M.Ritchie.
2. Liviu Negrescu. ”Limbajul de programare C şi C++” V.1-4. Buc. 1999
3. Knuth, D. E. - "Arta programarii calculatoarelor, vol. 1: Algoritmi fundamentali", Ed.
Teora, 1999.
4.Indicații teoretice la lucrarea de laborator