RAPORT
Lucrarea de laborator nr.1
La Structuri de date si algoritmi
A efectuat:
st. gr. TI-15X Student Name
A verificat:
dr., conf.univ. M. Kulev
Chişinău -2016
0
Lucrarea de laborator nr.1
Noţiuni teoretice
Structura – este o mulţime de date grupate, conform unei ierarhii, de obicei de tipuri
diferite. Structura poate fi comparată cu tabloul, însă tabloul conţine date de un acelaşi tip,
iar elementele tabloului se accesează cu ajutorul indicilor, pe cînd accesarea componentelor
structurii are o formă specifică. Structura reprezintă un tip de date definit de utilizator prin
utilizarea tipurilor deja existente.
1
Ex.: Utilizind instructiunea typedef si specificator de structura struct putem defeni
structura si un nou tip de date student:
Elementele structurii pot fi de tip predefinit sau definit de utilizator, excepţie fiind tipul
structurii date. Pentru definirea variabilelor este suficientă utilizarea numelui de structură
la fel ca tipurile predefinite:
În acest caz s-au definit două variabile de tip carte, un tablou din 10 cărţi şi un pointer spre
student.
Referirea la componentele unei structuri se face utilizînd atît numele structurii cît şi a
componentei respective. Aceasta se realizează printr-o construcţie de forma:
s1.nm = 9.5;
s[i].nm = 8.5;
În cazul pointerilor:
p = &s1;
p->nm = 9.5;
La definirea tipului de strutură este bine de a preciza funcţiile care definesc operaţii cu
datele de tipul structurii. În acest scop variabilele se transmit funcţiilor prin parametri.
Pentru modificarea variabilei ea se transmite prin pointer.
Analiza datelor
Fisierul stat.h :
typedef struct {
char nume[MAX];
char capitala[MAX];
char presedinte[MAX];
int populatia;
int suprafata;
}stat;
stat - este tipul structurii
stat – variabila de tip structura
Câmpurile structurii
nume- acest cimp este destinat pentru denumirea statului, avind lungimea de 1000 caractere
capitala- acest cimp este destinat pentru denumirea capitalei statului , avind lungimea de 1000 caractere
2
presedinte- acest cimp este destinat pentru denumirea presedintelui statului, avind lungimea de 1000
caractere
populatia- acest cimp este destinat pentru numarul populatiei, si pastrarea datelor de tip int
suprafata- acest cimp este destinat pentru suprafata statului, si pastrarea datelor de tip int
stat data();
Această funcție este de tip stat, returneaza o variabila compusa de tip stat.
Ea nu primește parametri.
Variabile locale
data – variabila compusa de tip stat,reprezinta variabila returnabila.
int main();
s – pointer la inceputul tabloului de elemente de tip stat
a – variabila compusa de tip stat
f – pointer de tip fisier
i – variabila intermediara simpla de tip int
n – variabila de tip int care reprezinta numarul de elemente in tablou
poz – variabila simpla de tip int ce reprezinta pozitia elementului care urmeaza a fi sters
fname – pointer de tip char in care se pastreaza informatia despre locatia fisierului care urmeaza
a fi deschis si citit de functie
ch – variabila simpla de tip char
name – pointer de tip char in care este informatia despre denumirea statului de cautat
sdelete – variabila compusa , tablou de caractere cu marimea 1000 caractere
optiune – variabila simpla de tip integer , utilizata pentru a stoca decizia utilizatorului in privinta
optiunii
5
Fisierul stat.h
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
typedef struct {
char nume[MAX];
char capitala[MAX];
char presedinte[MAX];
int populatia;
int suprafata;
}stat;
stat data();
void freem(stat *s);
void read(stat *s,int n);
void show(stat *s,int n);
void sorts(stat *s, int n);
void modify(stat *s,int n);
int searchs(stat * s, int n, char *name);
void delfile(stat *s);
void writef(stat* s, int n,char *fname);
stat* readf(stat *s,int *n, char *fname);
stat *append(stat* s, stat a, int* n);
stat *prepend(stat * s, stat a, int* n);
void adauga(stat *s,char ch);
stat* del_stat(stat *s,int *n,int poz);
Fisierul functions.h
#include "stat.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX 1000
stat data(){
stat a;
printf(" Nume: ");
fflush(stdin);
scanf("%s",&a.nume);
printf(" Capitala: ");
scanf("%s",&a.capitala);
6
printf(" Presedinte: ");
scanf("%s",&a.presedinte);
printf(" Populatia: ");
scanf("%d",&a.populatia);
printf(" Suprafata: ");
scanf("%d",&a.suprafata);
return a;
}
void freem(stat *s){
free(s);
if(s) {
s = NULL;
puts("Memoria a fost eliberata"); }
else {
puts("Memoria a fost anterior eliberata");
}
}
void read(stat *s,int n){
int i;
for(i=0;i<n;i++){
printf(" STAT %i \n",i+1);
printf(" Nume: ");
fflush(stdin);
gets(s[i].nume);
printf(" Capitala: ");
gets(s[i].capitala);
printf(" Presedinte: ");
gets(s[i].presedinte);
printf(" Populatia: ");
scanf("%d",&s[i].populatia);
printf(" Suprafata: ");
scanf("%d",&s[i].suprafata);
}
return;
}
void show(stat *s,int n){
int i;
for(i=0;i<n;i++){
printf(" --- Info despre stat ---\n");
printf(" STAT %i \n",i+1);
printf(" Nume: ");
puts(s[i].nume);
printf(" Capitala: ");
puts(s[i].capitala);
printf(" Presedinte: ");
7
puts(s[i].presedinte);
printf(" Populatia: ");
printf("%d",s[i].populatia);
printf("\n Suprafata: ");
printf("%d\n",s[i].suprafata);
}
}
void sorts(stat *s, int n){
int i,k;
stat t;
for(i=0;i<n;i++){
for(k=0;k<n-1-i;k++){
if(stricmp(s[k].nume,s[k+1].nume)){
t=s[k];
s[k]=s[k+1];
s[k+1]=t;
}
}
}
printf(" In baza de date au avut loc sortari\n Selectati la optiune 2 pentru a
vedea\n");
return;
}
void modify(stat *s,int n){
int i;
char yes='n';
printf("\n Doriti sa modificati datele unui stat?\n Press (Y) for (Yes) or (N) for
(No): ");
int val=0;
scanf("%s",&yes);
while(yes=='Y' || yes=='y'){
val=1;
for(i=0;i<n;i++){
system("CLS");
printf(" STAT %i \n",i+1);
printf(" Nume: ");
puts(s[i].nume);
printf(" Capitala: ");
puts(s[i].capitala);
printf(" Presedinte: ");
puts(s[i].presedinte);
printf(" Populatia: ");
printf("%d",s[i].populatia);
printf("\n Suprafata: ");
printf("%d\n",s[i].suprafata);
8
printf("\n Doriti sa modificati datele?\n Press (Y) for (Yes) or (N) for (No): ");
int val=0;
scanf("%s",&yes);
if(yes=='Y' || yes=='y'){
printf("\n ****************************************\n\n");
printf(" Se modifica STAT %i:\n",i+1);
printf(" Nume: ");
scanf("%s",&s[i].nume);
printf(" Capitala: ");
scanf("%s",&s[i].capitala);
printf(" Presedinte: ");
scanf("%s",&s[i].presedinte);
printf(" Populatia: ");
scanf("%d",&s[i].populatia);
printf(" Suprafata: ");
scanf("%d",&s[i].suprafata);
}
}
}
}
int searchs(stat * s, int n, char name[]){
int i;
for(i=0;i<n;i++) {
if (stricmp(s[i].nume, name)==0){
return i;
}
}
return -1;
}
void delfile(stat *s){
if( remove( "stat.txt" ) != 0 ){
puts( " Eroare la stergere... fisierul nu exista." );}
else{
puts( " Stergere cu succes" );
}
return 0;
}
void writef(stat* s, int n,char *fname){
FILE *f;
int i;
f = fopen("stat.txt","w");
for (i=0;i<n;i++) {
9
fprintf(f,"STAT %i\n Nume: %s\n Capitala: %s\n Presedinte: %s\n Populatia:
%d\n Suprafata:
%d\n",i+1,s[i].nume,s[i].capitala,s[i].presedinte,s[i].populatia,s[i].suprafata);
}
fclose(f);
return;
}
stat* readf(stat *s,int *n,char *fname ){
FILE *f = NULL;
int i;
char k[MAX];
f = fopen("stat.txt","r");
if(f==NULL) {
puts(" Eroare, fisierul nu a fost gasit.");
exit(1);
}
puts( "Informatia citita din fisier\n");
while(fgets(k,"%s", f) != NULL) {
printf(" %s",k);
}
fclose(f);
}
}
puts(" Introduceti informatia: ");
a=data();
b[*n] = a;
*n = *n+1;
return b;
}
stat *prepend(stat * s, stat a, int* n) {
int i;
10
stat* b;
b = (stat*) realloc(s, (*n+1) * sizeof(stat));
if(!b) {
puts("Memoria nu a fost alocata");
return b; }
puts(" Introduceti informatia: ");
a=data();
for (i=*n;i>0;i--) {
b[i] = b[i-1]; }
b[0] = a;
*n = *n + 1;
return b;
}
void adauga(stat *s,char ch){
FILE *f;
f=fopen("stat.txt","a");
puts(" Scrieti un text. Cu caracterul '.' se incheie");
do{
ch = getchar();
putc(ch,f);}
while (ch !='.');
getchar();
fclose(f);
}
stat* del_stat(stat *s,int *n,int poz){
int i;
for (i = poz;i<*n;i++) {
s[i] = s[i+1]; }
*n=*n-1;
return;
Fisierul main.c
#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX 1000
int main(){
11
FILE *f;
stat *s,a;
int i,n,poz;
char *fname,ch;
char name[MAX];
char sdelete[MAX];
int optiune;
printf("\n >>> Dati numarul de state: ",n);
scanf("%d",&n);
for(i=0;i<n;i++){
s=(stat*)malloc(n*sizeof(stat));
if(!s){
puts("Memoria nu a fost alocata!");
exit(1);
}
}
do{
system("CLS");
puts("\n >>> MENU <<<");
puts(" 1. Introduce datele despre state.");
puts(" 2. Afisarea info despre state.");
puts(" 3. Pentru a sorta baza de date.");
puts(" 4. Pentru a modifica baza de date.");
puts(" 5. Pentru a cauta in baza de date.");
puts(" 6. Pentru a strege fisierul.");
puts(" 7. Sterge stat.");
puts(" 8. Scrierea informatiei despre stat in fisier.");
puts(" 9. Citirea informatiei despre stat din fisier.");
puts(" 10. Scrierea informatiaei la sfirsitul fisierului.");
puts(" 11. Eliberarea memoriei.");
puts(" 12. Adaugarea unui stat la inceput.");
puts(" 13. Adaugarea unui stat la sfirsit.");
puts(" 0. Iesire.");
printf("\n Alegeti optiunea: ");
scanf("%d", &optiune);
switch (optiune){
case 1: {read(s,n);
system("PAUSE");
break;
}
case 2:{show(s,n);
system("PAUSE");
break;
}
case 3:{sorts(s,n);
system("PAUSE");
12
break;
}
case 4:{modify(s,n);
system("PAUSE");
break;
}
case 5:{
printf(" Dati numele statului de cautat: ");
fflush(stdin);
gets(name);
i=searchs(s, n, name);
printf("\n");
printf(" STAT %i\n Nume: %s\n Capitala: %s\n Presedinte: %s\n Populatia:
%d\n Suprafata: %d\n",i+1, s[i].nume, s[i].capitala, s[i].presedinte, s[i].populatia,
s[i].suprafata );
system("PAUSE");
break;
}
case 6:{delfile(s);
system("PAUSE");
break;
}
case 7:{
if (s) {
printf(" Introduceti numele statului de sters: ");
getchar();
gets(sdelete);
del_stat(s, &n, poz);
puts(" Statul si toate caracteristicile lui au fost sterse");
}
system("PAUSE");
break;
}
case 8:{writef(s, n, fname);
puts(" Datele au fost introduse in fisier");
system("PAUSE");
break;
}
case 9:{readf(s, &n, fname);
system("PAUSE");
break;
}
case 10:{adauga(s,ch);
system("PAUSE");
break;
}
13
case 11:{freem(s);
system("PAUSE");
break;
}
case 12:{prepend(s,a,&n);
system("PAUSE");
break;
}
case 13:{append(s,a,&n);
system("PAUSE");
break;
}
case 0:{
printf(" Daca doriti sa iesiti tastati ENTER\n");
return 0;
}
default:{
printf(" Optiunea nu exista!\n");
break;
}
}
}
while(optiune!=14);
getch();
return 0;}
Rezultatele obtinute
1. Meniul programului
14
2. Introducerea datelor despre stat
15
4. Sortarea bazei de date
16
5. Modificarea bazei de date
17
6. Cautarea in baza de date
18
7. Stergerea fisierului stat.txt
Pe ecran a apurut eroare la stergere deoarece fisieurul stat.txt inca nu a fost creat
19
9. Scrierea datelor in fisierul stat.txt
20
11.Scrierea informatiei la sfirsitul fisierului
21
13.Adaugarea unui stat la sfirsit
22
14.Eliberarea memoriei
23
15. Iesire
Bibliografie:
1. http://curs.algoritmi.ro/2011/02/28/tp-02-structuri-uniuni/
2. http://devcentral.iftech.com/learning/tutorials/c-cpp/c/
24