Suceava, mai 2020 ADMINISTRARE PRIMĂRIE [630267]

ADPRIM 1
Suceava, mai 2020 ADMINISTRARE PRIMĂRIE
Spiță Miha i
Anul I, grupa 3122a
Facultatea de Inginerie Electrică și Știința Calculatoarelor, USV

Proiect de semestru realizat la disciplina PCLP II

ADPRIM 2
Abstract
În acest proiect am realizat implementarea unei baze de date a unei primării cu ajutorul
TDA -urilor și al listelor. Am avut in vedere cum arată o bază de date și am încercat să obțin un
rezultat cât mai apropiat de realitate.
Pentru a realiza acest proiect m -am folosit de notiunea de structură și pointer. De
asemenea pentru a facilita interactiunea utilizatorului cu metodele proiectului am implementat și
un meniu pentru inițializarea, inserarea și prelucrarea datelor structurii entității in cauză.
Acest meniu este format din 8 opțiun i principale, iar doua dintre ele au cate un submeniu
corespunzător. Structura meniului este urmatoarea: inițializare, citire date de la tastatură, citire
date din fișier, afișare în consolă, salvare tabel în fișier, cautare dupa diverși parametri i,
actual izare tabel , infomații autor și terminare program. Cele doua opț iuni care conțin câte un
submeniu sunt: cautare dupa diverși parametri i (submeniu cu 6 opțiuni de căutare și una de
întoarcere la meniul principal) si actualizează tabelul (submeniu cu 5 opțiu ni pentru modificarea
conținutului intr -un element din lista “primarie”, o optiune de inserare element nou, o opțiune de
ștergere element, o opțiune de sortare tabel după nume în ordine lexicografică si o opț iune de
întoarcere la meniul principal.
Struc tura “primarie” conține campurile; cod (int), nume (char *) , prenume (char *) ,
functia (char *) , camera (int) , etaj (int)
Keywords : structură, metodele, initializarea, inserarea, prelucrarea, meniu, opțiuni
principale, submeniu, citire date de la tastatură, citire date din fișier, afișare în consol ă, salvare
tabel în fișier, căutare, actualizare, parametrii, listă, sortare tabel, cod, nume, prenume, funcția,
camera, etaj .

ADPRIM 3
ADMINISTRARE PRIMĂRIE
Problema principala in rezolvarea problemei este creeare a unei stucturi si creearea unor
funcții care acoperă toate necesitațile utilitzatorului care va folosi această aplicație pe viitor.
O problema majora nu este reprezentată de creearea stucturii, ci de formarea unei structuri
dinamice care poate manevra cu usurință toate problemele si metodele predestinate.
O alta problema interesantă va apărea la afișarea elementelor stuctu rii (listei) deoarece mi –
am propus sa afișe z toate datele primariei in format de tabel (elementele vor fi centrate in campurile
tabelului).
Inca o problemă majoră o reprezintă memoria alocată, așa că va trebui impusă o limită
strict ă de elemente in structura “p rimarie”.
Ultima problema este dată de interfațarea programului.
Proiectarea solu ției
Am proiectat solutia printr -un TDA implementat cu ajutorul unei structuri de tip “primarie”,
fișierele folosite sunt:
• Un header numit “proiect.h” care conține structura “primarie” și metodele
programului (Figura 1.1).
• Un fișier proiect de tip .c numit “proiect.c” în care sunt implementate metodele
header -ului;
• Un fișier de tip intrare numit “spreadsheet.in”;
• Un fisier de tip ieșire numit “spr eadsheet.out”;
• Fisierul surs a main în care se realizează interfațarea TDA -ului;

ADPRIM 4

Figura 1.1 (proiect.h)

ADPRIM 5

Considera ții de implementare
Se va incepe cu o scurta descriere a modului in care s -a abordat rezolvarea temei propuse.
De la ce s -a pornit si modul in care s -a dorit rezolvarea.
S-a încercat implementarea într -un mod cât mai simplu posibil prin utilizarea conceptelor
de structura și de alocare dinamică.
Structura TDA “primarie” a fost implementata cu ajutorul instrucțiunii “struct” ( Figura
1.2) și redenumită cu ajutor ul instrucțiunii “typedef” ( Figura 1.3) . S-a folosit “typedef “ deoarece
această instrucțiune facilitează declararea pe viitor al elementelor . Structura conține 6 elemente
(cod de tip int, pointer la nume de tip char, pointer la prenume de tip char, pointe r la funcție de tip
char, camera de tip int și etaj de tip int).

Figura 1.2

Figura 1.3
Interfațarea s -a făcut cu o aplicație de tip meniu afișat în consol ă după complilarea
proiectului. Meniul a fost realizat in “main.c”, iar în el se ap elează metodele din “proiect.h”
împreună cu diverse operații de prelucrare al acestor metode.

ADPRIM 6
Pentru rezol varea problemelor menționate mai sus, am decis sa aloc dinamic un pointer de
tip “PRIMARIE *s”, dar impunând o limită de 100 de elemente maxime.
Baza proiectului este data de operatia de inițializare a listei( Figura 1.4) și de operația de
adăugare ( Figura 1.5).

Figura 1.4
Operația de inițializare creează un element nou de tip “PRIMARIE” și îi alocă memorie cu
ajutorul funcției calloc (primul parametru îl reprezintă dimensiunea alocata, iar al doilea parametru
este reprezentat de tipul alocat adica tipul structurii “primarie”.
Acesta este ap elul si prelucrarea in meniu al metodei “newP()” :

Figura 1.3

ADPRIM 7
Operația de adaugare este numita “membru nou” si are ca parametrii niste buffere de tipul
corespunzător elementelor din structua “primarie”. Pentru a popula campurile structurii se va creea
un element nou de tip “PRIMARIE p” și va fi inițializat cu ajutorul metodei “newP()”. Pentru
atribuirea va lorilor se va folosi numele elementului ,adică “p” , și campurile structurii vor fi accesate
prin operatorul “ ->”. Exemplu: p ->cod =bufferpentrucod. Stuctura metodei precum apelul și
prelucrarea ei in meniu se găsesc in Figura 1.5 , respectiv Figura 1.6 .

Figura 1.5

Figura 1.6

ADPRIM 8

La inițializarea meni ului va ap ărea un mesaj care roagă utilizatorul să introduc ă numărul
de angaja ți pe care î l va citi la apelarea pentru prima dată a opțiunii de citire de la tastatură .
Se poate observa că in o pțiunea de citire exista un if cu 2 ramuri, iar in prima ramură
elemental 0 al listei “s” este inițializat cu 0 în toate campurile. Am făcut acest lucru deoarece am
dorit să incep numerotarea câmpurilor de la 1 și nu de la 0.
Ok-ul din citire este in stran să legatura cu citirea din fișier deoarece trebuie să știu daca s –
a apelat prima data aceasta opțiune. Daca această opțiune va fi apelata macar o data, in optiunea
de citire din fișier se va transmite valoarea lui ok ca parametru, iar in functie de aceasta se vor citi
din fisier informațiile respective. Am făcut această operație din cauza faptului ca numerotarea ar
fi fost compromisă daca in metoda de citire din fisier nu s -ar fi știut daca s -a citit din fisier sau nu,
astfel, cu “ok” si cu transmiterea dimensiunii cu rente a listei ca parametru s -a reușit citirea corectă
a datelor din fișier și actualizarea corespunzatoare a dimensiunii listei cu angajati. Aceste lucruri
se pot vedea in Figurile 1.7 si 1.8 .

Figura 1.7

ADPRIM 9

Figura 1.8
Structura fisierului de intrare este urmatoarea:
• Pe primul rând numarul de perso ane care vor fi inserate;

ADPRIM 10
• Pe urmatoarele randuri se in troduc date in ordinea următoare (câte un element
precizat pe fiecare linie):
o Nume angajat:
o Prenume angajat;
o Funcție angajat;
o Numărul camerei în care are angajatul biroul( numarul va avea 3 cifre):
o Etajul corespunzător camerei angajatului:
Menționez că sunt deja introdu se date in fișierul “spreadsheet.in”. Atasez in Figura 1.9
conținutul.

Figura 1.9

ADPRIM 11

Citirea de la tastatura s -a facut intr -un mod standard ( Figura 1. 10) citind variabile globale
si folosind “fflush(stdin)” inainte de fiecare citire pentru a împiedica apariția erorilor.

Figura 1. 10
Functiile de cautare au fost facute in asa fel incat să caute într-un singur element al listei
“PRIMAR IE” și să returneze “true” sau “false” în funcție de ce s -a căutat. Folosirea acestei funcții
s-a realizat în meniu. Un exemplu de funcție se poate vedea in Figura 1.1 1, iar în Figura 1.1 2 se
poate vedea folosirea ei in meniu.

Figura 1.1 1

ADPRIM 12

Figura 1.1 2
Modificarea campurilor se realizează prin înlocuirea câmpului corespunzător codului
specificat de utilizator cu un camp nou introdus de la tastatu raă. Câmpul modificat va fi returnat
în lista “s”. În meniu se parcurge lista și se caută codul corespuzător, în caz că este găsit, va fi
apelata metoda corespunzătoare opțiunii. Se pot vedea exemple în Figurile 1.1 3 si 1.1 4.

Figura 1.1 3

ADPRIM 13

Figura 1.1 4

Metoda cea mai dificilă de realizat a fost cea de afișare care a fost împărțită în 3 metode
diferite: desenare antet tabel (“drawH()”), desenare subsol tabel (“drawB()”) ș i cea de afișare
propriu -zisă.
Aceste metode folosesc un algoritm de afișare bazat pe lungimea cuvantului pe care ar
trebui să îl afiseze plus centrarea element elor în campu rile tabelul ui. Atașez codul metodelor
(Figura 1.15, Figura 1.16, Figura 1.17), dar si apelul lor in meniu împreună cu un
exemplu( Figura 1.18, Figura 1.19) .

Figura 1.15

ADPRIM 14

ADPRIM 15

Figura 1.16

Figura 1.17

Figura 1.18

ADPRIM 16

Figura 1.1 9
Pentru salvarea în fișier s -a folosit algoritmul de afișare adaptat functiei “fprintf”(exemplu în
Figura 1.20 pentru rezultatul salvării in “spreadsheet.out”.

Figura 1.20
Mentionez ca rularea programului se va face în mod fullscreen cu ajutorul functiei “AltEnter()”
(Figura 1.21) care simulează apasarea tastelor Alt+Enter (combinație de taste pentru modul
fullscreen).

ADPRIM 17

Figura 1.21

Manualul de utilizare al aplicației

Interfața este formată dint -un meniu afișat în consola care conține urmatoarele opțiuni:
I – Inițializare bază de date
C – Citire date de la tastatură
F – Citire date din fișier
A – Afișare în consol ă
S – Salvare tabel în fișier
H – Căutare dupa diverși parametrii
U – Actualizează tabelul
R – Informații Autor
T – Terminare program

ADPRIM 18

Figura 1.2 2
Modul de folosire al instrucțiunilor:
I – Inițializare bază de date
Pentru functionarea corectă a programului, această opțiune trebuie apelata prima dată.
Întâi i se va ce re utilizatorului s ă introduc ă numărul de angaja ți dorit ca apoi s ă poată citi
de la tastatur ă folosind opțiunea de “citire date de la tastat ura”
Pe lângă introducerea numarului initial de angaja ți, utilizatorul va putea vedea și un
mesaj de confirmare (Figura 1.23) .

Figura 1.23
C – Ctitire date de la tastatură
Dacă utilizatorul încă nu a citit date din fi șier, acesta va putea citi de la tastatură num ărul
de angaja ți introdus în optiunea anteri oară. Daca utili zatorul a citit deja date din fi șier, acestuia i
se va cere să introduc ă numărul de an gajați pe care ar vrea sa îi introduc ă în tabel (Figura 1.24 a.
si Figura 1 .24b).

ADPRIM 19

Figura 1.24 a.

Figura 1.24b.
F – Citire date din fișier
Daca se va apasa tasta “F”, utilitatorului i se va cere să introduca numele fișierului din
care vrea sa extraga date (Figura 1.25 ). Dupa introducerea numelui, datele vor fi extrase și se va
afișa un mesaj de confirmare (Figura 1.26 ).

Figura 1.25

Figura 1.26

ADPRIM 20
A – Afișare în consol ă
Această opțtiune afișează un tabel cu toți membrii primăriei (Figura 1.27) .

Figura 1.27
S – Salvare tabel în fișier
Această opțiune salvează tabelul obținut într -un fișier introdus de la tastatură
(Figura 1.28) si va afișa un mesaj de confirmare ( Figura 1.29) . Conținutul din fișierul salvat va
putea fi văzut dupa apelarea opțiunii de iesir e si prin bifarea cu “yes” a prompt -ului care va
aparea pe ecran ( Figura 1.30 ).

Figura 1.28

Figura 1.29

ADPRIM 21

Figura 1.30
Conținutul se va putea vizualiza selectand fișierul “spreadsheet.out” ( Figura 1.31 ).

Figura 1.31
H – Căutare dupa diverși parame trii
Această opțiune va afișa un submeniu cu diferite opțiuni de cautare ( Figura 1.32 ).

Figura 1.32

ADPRIM 22
Când utilizatorul va apela una dintre opțiuni in afară de cea de întoarcere la meniul principal va
fi întrebat “ce cauta?” (ex. Figura 1.33 ), în caz că datele introdu se de u tilizator cor espund cu
măcar un element din tabel, acesta va putea vedea pe ecran rezul tatele c ăutarii (ex Figura 1.34 ).

Figura 1.33

Figura 1.34
U – Actualizează tabelul
Această opțiune va afișa un submeniu cu diferite opțiuni de modificare ( Figura 1.35 ).

Figura 1.35
La selectarea uneia dintre opțiunile de schimbare, utilizatorul va fi pus sa introduca codul
corespunzător membrului căruia v rea sa îi schimbe datele, apoi, în caz că acel cod există,
utilizatorul va trebui sa introduca parametrul actualizat ( Figura 1.36 ).

ADPRIM 23

Figura 1.36
D – Stergere element din tabel
La apelarea acestei opțiuni utilizatorului i se va cere sa introduc ă de la tastatură codul
perosoanei pe care ar vrea să o șteargă ( Figura 1.37 ). După introducerea codului, pe rsoana (daca
exista ), va fi stears ă din tabel( Figura 1.38 ).

Figura 1.37

Figura 1.38

ADPRIM 24
S – Sortare tabel după nume
Dacă această opțiune va fi apelat ă, membrii din tabel vor fi aranjați în ordine
lexicografică (Figura 1.39 ). Pentru a vedea tabelul ordonat, va trebui reapelată opțiunea de
afișare în consolă ( Figura 1.40 ).

Figura 1.39

Figura 1.40
R – Informații autor
Dacă utilizatorul va apela această opțiune, va putea să vizualizeze cine a realizat
programul ( Figura 1.41 ).

Figura 1.41
T – Terminare program
Daca utilizatorul va apela această opțiune, va putea ieși din program ( Figura 1.42 ).

Figura 1.42

ADPRIM 25
Referințe bibliografice
Ionela Rusu , F. M. ( 2020 ).Laboratoare , Laboratorul 1 – 5
GeeksforGeeks , F. M. ( 2020 ).GeeksforGeeks/Tutorials/Data Stuctures .
GeeksforGeeks, F. M. (2020).GeeksforGeeks/Tutorials/Algorithms.
https://www.gee ksforgeeks.org

Similar Posts