1
Fork 0

Exercici 2: Entrada de dades [40%]

This commit is contained in:
Guillem 2021-10-24 13:38:09 +02:00
parent c43a99dca8
commit 19613287e6
48 changed files with 364 additions and 102 deletions

View File

@ -1,12 +1,8 @@
.PHONY: clean All
All:
@echo "----------Building project:[ UOCContacts - Release ]----------"
@cd "UOCContacts" && "$(MAKE)" -f "UOCContacts.mk"
@echo "----------Building project:[ UOC20211 - Release ]----------"
@"$(MAKE)" -f "UOC20211.mk"
clean:
@echo "----------Cleaning project:[ UOCContacts - Release ]----------"
@cd "UOCContacts" && "$(MAKE)" -f "UOCContacts.mk" clean
@echo "----------Cleaning project:[ UOC20211 - Release ]----------"
@"$(MAKE)" -f "UOC20211.mk" clean

View File

@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=Guillem
Date :=19/10/21
Date :=24/10/21
CodeLitePath :=/home/guillem/.codelite
LinkerName :=/usr/bin/g++
SharedObjectLinkerName :=/usr/bin/g++ -shared -fPIC
@ -72,19 +72,12 @@ Objects=$(Objects0)
.PHONY: all clean PreBuild PrePreBuild PostBuild MakeIntermediateDirs
all: $(OutputFile)
$(OutputFile): $(IntermediateDirectory)/.d ".build-release/UOCContacts" $(Objects)
$(OutputFile): $(IntermediateDirectory)/.d $(Objects)
@$(MakeDirCommand) $(@D)
@echo "" > $(IntermediateDirectory)/.d
@echo $(Objects0) > $(ObjectsFileList)
$(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions)
".build-release/UOCContacts":
@$(MakeDirCommand) ".build-release"
@echo stam > ".build-release/UOCContacts"
MakeIntermediateDirs:
@test -d ./bin/Release || $(MakeDirCommand) ./bin/Release

View File

@ -1 +1 @@
./bin/Release/test_src_test.c.o ./bin/Release/test_src_test_suite.c.o ./bin/Release/test_src_test_pr1.c.o ./bin/Release/src_main.c.o
./bin/Debug/test_src_test.c.o ./bin/Debug/test_src_test_suite.c.o ./bin/Debug/test_src_test_pr1.c.o ./bin/Debug/src_main.c.o

View File

@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=Guillem
Date :=19/10/21
Date :=24/10/21
CodeLitePath :=/home/guillem/.codelite
LinkerName :=/usr/bin/g++
SharedObjectLinkerName :=/usr/bin/g++ -shared -fPIC
@ -60,7 +60,7 @@ AS := /usr/bin/as
## User defined environment variables
##
CodeLiteDir:=/usr/share/codelite
Objects0=$(IntermediateDirectory)/src_api.c$(ObjectSuffix) $(IntermediateDirectory)/src_person.c$(ObjectSuffix) $(IntermediateDirectory)/src_csv.c$(ObjectSuffix) $(IntermediateDirectory)/src_date.c$(ObjectSuffix)
Objects0=$(IntermediateDirectory)/src_contact.c$(ObjectSuffix) $(IntermediateDirectory)/src_api.c$(ObjectSuffix) $(IntermediateDirectory)/src_person.c$(ObjectSuffix) $(IntermediateDirectory)/src_csv.c$(ObjectSuffix) $(IntermediateDirectory)/src_date.c$(ObjectSuffix)
@ -93,6 +93,12 @@ PreBuild:
##
## Objects
##
$(IntermediateDirectory)/src_contact.c$(ObjectSuffix): src/contact.c
@$(CC) $(CFLAGS) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/src_contact.c$(ObjectSuffix) -MF$(IntermediateDirectory)/src_contact.c$(DependSuffix) -MM src/contact.c
$(CC) $(SourceSwitch) "/dades/git/UOC/PP/PR1/UOC20211/UOCContacts/src/contact.c" $(CFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/src_contact.c$(ObjectSuffix) $(IncludePath)
$(IntermediateDirectory)/src_contact.c$(PreprocessSuffix): src/contact.c
$(CC) $(CFLAGS) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/src_contact.c$(PreprocessSuffix) src/contact.c
$(IntermediateDirectory)/src_api.c$(ObjectSuffix): src/api.c
@$(CC) $(CFLAGS) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/src_api.c$(ObjectSuffix) -MF$(IntermediateDirectory)/src_api.c$(DependSuffix) -MM src/api.c
$(CC) $(SourceSwitch) "/dades/git/UOC/PP/PR1/UOC20211/UOCContacts/src/api.c" $(CFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/src_api.c$(ObjectSuffix) $(IncludePath)

View File

@ -17,12 +17,14 @@
<Description/>
<Dependencies/>
<VirtualDirectory Name="src">
<File Name="src/contact.c"/>
<File Name="src/date.c"/>
<File Name="src/person.c"/>
<File Name="src/csv.c"/>
<File Name="src/api.c"/>
</VirtualDirectory>
<VirtualDirectory Name="include">
<File Name="include/contact.h"/>
<File Name="include/date.h"/>
<File Name="include/person.h"/>
<File Name="include/csv.h"/>

View File

@ -1 +1 @@
../bin/Release/src_api.c.o ../bin/Release/src_person.c.o ../bin/Release/src_csv.c.o ../bin/Release/src_date.c.o
../bin/Debug/src_contact.c.o ../bin/Debug/src_api.c.o ../bin/Debug/src_person.c.o ../bin/Debug/src_csv.c.o ../bin/Debug/src_date.c.o

View File

@ -3,12 +3,17 @@
#include <stdbool.h>
#include "error.h"
#include "csv.h"
#include "contact.h"
#include "person.h"
// Type that stores all the application data
typedef struct _ApiData {
//////////////////////////////////
// Ex PR1 2:
/////////////////////////////////
tPopulation population;
tGeolocationData geolocationData;
} tApiData;

89
UOCContacts/include/contact.h Executable file
View File

@ -0,0 +1,89 @@
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include "csv.h"
#include "date.h"
// Maximum length of an identity document
#define MAX_PERSON_DOCUMENT_LEN 15
/*typedef struct _tDate {
int day;
int month;
int year;
} tDate;*/
/*typedef struct _tTime {
int hour;
int minutes;
} tTime;*/
/*typedef struct _tDateTime {
tDate date;
tTime time;
} tDateTime;*/
// Parse a tDateTime from string information
void dateTime_parse(tDateTime* dateTime, const char* date, const char* time);
// Compare two tDateTime structures and return true if they contain the same value or false otherwise.
bool dateTime_cmp(tDateTime dateTime1, tDateTime dateTime2);
// Ex 1: Define data types here...
///////////////////////////
// #define MAX_POSITIONS 100
typedef struct _tCoordinate {
float latitude;
float longitude;
} tCoordinate;
typedef struct _tTimePosition {
tCoordinate coordinate;
tDateTime timestamp;
char person[MAX_PERSON_DOCUMENT_LEN];
} tTimePosition;
typedef struct _tGeolocationData {
tTimePosition* elems;
int count;
} tGeolocationData;
//////////////////////////////////
// Ex 2: Define your methods here ....
////////////////////////////////////////
// Initialize the geopositon data
void geoData_init(tGeolocationData* data);
// Parse input from CSVEntry
void contact_parse(tTimePosition* data, tCSVEntry entry);
// Add a new position
void geoData_add(tGeolocationData* data, tTimePosition position);
// Remove the data from a person in a certain time moment
void geoData_del(tGeolocationData* data, const char* document, tDateTime time);
// Print the geoposition data
void geoData_print(tGeolocationData data);
// [AUX METHOD] Return the position of a geoposition entry with provided information. -1 if it does not exist
int geoData_find(tGeolocationData data, const char* document, tDateTime time);
// [AUX METHOD] Copy the data from the source to destination
void timePos_cpy(tTimePosition* destination, tTimePosition source);
////////////////////////////////////////////
// PAC2
// Clear tGeopositionData structure
void geoData_free(tGeolocationData* geoData);
////////////////////////////////////////////
#endif

View File

@ -69,7 +69,64 @@ tApiError api_addDataEntry(tApiData* data, tCSVEntry entry) {
//////////////////////////////////
// Ex PR1 2
/////////////////////////////////
return E_NOT_IMPLEMENTED;
if (data == NULL) {
api_initData(data);
}
// Managing PERSON type
if (strcmp(csv_getType(&entry), "PERSON") == 0) {
// Check if numFields is the expected; return INVALID_ENTRY_FORMAT otherwise
if (csv_numFields(entry) == 7) {
tPerson newPerson;
person_parse(&newPerson,entry);
// Check if person already exists; return DUPLICATED_ENTRY otherwise
if (population_find(data->population, newPerson.document) == -1) {
// Add person to population variable inside ApiData
population_add(&data->population, newPerson);
return E_SUCCESS;
} else {
return E_DUPLICATED_ENTRY;
}
} else {
return E_INVALID_ENTRY_FORMAT;
}
} else if (strcmp(csv_getType(&entry), "GEOLOCATION") == 0) {
// Check if numFields is the expected; return INVALID_ENTRY_FORMAT otherwise
if (csv_numFields(entry) == 5) {
//tGeolocationData newGeolocationData;
tTimePosition newTimePosition;
contact_parse(&newTimePosition, entry);
// Check if record does not exist yet; return DUPLICATED_ENTRY otherwise
if(geoData_find(data->geolocationData, newTimePosition.person, newTimePosition.timestamp) == -1) {
// Add geolocation info for variable inside ApiData
geoData_add(&data->geolocationData, newTimePosition);
} else {
return E_DUPLICATED_ENTRY;
}
} else {
return E_INVALID_ENTRY_FORMAT;
}
} else {
return E_INVALID_ENTRY_TYPE;
}
//return E_NOT_IMPLEMENTED;
return E_SUCCESS;
}
// Free all used memory
@ -77,7 +134,14 @@ tApiError api_freeData(tApiData* data) {
//////////////////////////////////
// Ex PR1 2:
/////////////////////////////////
return E_NOT_IMPLEMENTED;
assert(data != NULL);
population_free(&data->population);
geoData_free(&data->geolocationData);
//return E_NOT_IMPLEMENTED;
return E_SUCCESS;
}
// Initialize the data structure
@ -86,7 +150,14 @@ tApiError api_initData(tApiData* data) {
//////////////////////////////////
// Ex PR1 2:
/////////////////////////////////
return E_NOT_IMPLEMENTED;
assert(data != NULL);
geoData_init(&data->geolocationData);
population_init(&data->population);
//return E_NOT_IMPLEMENTED;
return E_SUCCESS;
}
// Get person data

182
UOCContacts/src/contact.c Executable file
View File

@ -0,0 +1,182 @@
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "contact.h"
// Parse a tDateTime from string information
void dateTime_parse(tDateTime* dateTime, const char* date, const char* time) {
// Check output data
assert(dateTime != NULL);
// Check input date
assert(date != NULL);
assert(strlen(date) == 10);
// Check input time
assert(time != NULL);
assert(strlen(time) == 5);
// Parse the input date
sscanf(date, "%d/%d/%d", &(dateTime->date.day), &(dateTime->date.month), &(dateTime->date.year));
// Parse the input time
sscanf(time, "%d:%d", &(dateTime->time.hour), &(dateTime->time.minutes));
}
// Compare two tDateTime structures and return true if they contain the same value or false otherwise.
bool dateTime_cmp(tDateTime dateTime1, tDateTime dateTime2) {
if (dateTime1.date.day != dateTime2.date.day || dateTime1.date.month != dateTime2.date.month || dateTime1.date.year != dateTime2.date.year) {
return false;
}
return dateTime1.time.hour == dateTime2.time.hour && dateTime1.time.minutes == dateTime2.time.minutes;
}
// EX2: Implement your methods here....
////////////////////////////////////////////
// Initialize the geopositon data
void geoData_init(tGeolocationData* data) {
// Set the initial number of elements to zero.
data->count = 0;
data->elems = NULL;
}
// Parse input from CSVEntry
void contact_parse(tTimePosition* data, tCSVEntry entry) {
char date[11];
char time[6];
// Check input data (Pre-conditions)
assert(data != NULL);
assert(csv_numFields(entry) == 5);
// Get the identity document
csv_getAsString(entry, 0, data->person, 15);
// Get the date and time
csv_getAsString(entry, 1, date, 11);
csv_getAsString(entry, 2, time, 6);
dateTime_parse(&(data->timestamp), date, time);
// Assign the coordinates
data->coordinate.latitude = csv_getAsReal(entry, 3);
data->coordinate.longitude = csv_getAsReal(entry, 4);
}
// Add a new position
void geoData_add(tGeolocationData* data, tTimePosition position) {
// Check input data (Pre-conditions)
assert(data != NULL);
// PAC2 No limit on max positions
//assert(data->count < MAX_POSITIONS);
// Check if an entry with this data already exists
if (geoData_find(data[0], position.person, position.timestamp) < 0) {
// Need to allocate new memory space for new item to be inserted
if (data->count == 0) {
// Allocate new position if structure is still empty
data->elems=(tTimePosition*)malloc(sizeof(tTimePosition));
} else {
// Resize vector to allocate new position
data->elems = (tTimePosition*)realloc(data->elems, (data->count+1) * sizeof(tTimePosition));
}
// Check that returned pointer to elems is not NULL
if(data->elems == NULL) {
printf("Error: Not enough space to allocate tTimePosition entry.");
return;
}
timePos_cpy(&(data->elems[data->count]), position);
data->count ++;
}
}
// Remove the data from a person in a certain time moment
void geoData_del(tGeolocationData* data, const char* document, tDateTime time) {
int pos;
int i;
// Find if it exists
pos = geoData_find(data[0], document, time);
if (pos >= 0) {
// Shift elements to remove selected
for(i = pos; i < data->count-1; i++) {
// Copy element on position i+1 to position i
timePos_cpy(&(data->elems[i]), data->elems[i+1]);
}
// Update the number of elements
data->count--;
if (data->count==0) {
free(data->elems);
data->elems == NULL;
} else {
data->elems=(tTimePosition*)realloc(data->elems, data->count * sizeof(tTimePosition));
if (data->elems == NULL) {
printf("Error: resize when deleting failed.\n");
}
}
}
}
// Print the geoposition data
void geoData_print(tGeolocationData data) {
int i;
for(i = 0; i < data.count; i++) {
// Print position and document
printf("%d;%s;", i, data.elems[i].person);
// Print date and time
printf("%02d/%02d/%04d;%02d:%02d;", data.elems[i].timestamp.date.day, data.elems[i].timestamp.date.month, data.elems[i].timestamp.date.year, data.elems[i].timestamp.time.hour, data.elems[i].timestamp.time.minutes);
// Print position
printf("%.4f;%.4f\n", data.elems[i].coordinate.latitude, data.elems[i].coordinate.longitude);
}
}
// [AUX METHOD] Return the position of a geoposition entry with provided information. -1 if it does not exist
int geoData_find(tGeolocationData data, const char* document, tDateTime time) {
int i;
for(i = 0; i < data.count; i++) {
if(strcmp(data.elems[i].person, document) == 0 && dateTime_cmp(data.elems[i].timestamp, time)) {
return i;
}
}
return -1;
}
// [AUX METHOD] Copy the data from the source to destination
void timePos_cpy(tTimePosition* destination, tTimePosition source) {
strcpy(destination->person, source.person);
destination->coordinate = source.coordinate;
destination->timestamp = source.timestamp;
}
///////////////////////////////////////////
// PAC3
void geoData_free(tGeolocationData* data) {
// Check input data
assert(data != NULL);
// Release memory
if (data->count > 0) {
free(data->elems);
data->elems = NULL;
data->count = 0;
}
}
///////////////////////////////////////////

View File

@ -1 +0,0 @@

Binary file not shown.

View File

@ -1,6 +0,0 @@
../bin/Debug/src_api.c.o: src/api.c include/csv.h include/api.h \
include/error.h include/csv.h
include/csv.h:
include/api.h:
include/error.h:
include/csv.h:

Binary file not shown.

View File

@ -1,2 +0,0 @@
../bin/Debug/src_csv.c.o: src/csv.c include/csv.h
include/csv.h:

Binary file not shown.

View File

@ -1,2 +0,0 @@
../bin/Debug/src_date.c.o: src/date.c include/date.h
include/date.h:

Binary file not shown.

View File

@ -1,8 +0,0 @@
bin/Debug/src_main.c.o: src/main.c test/include/test.h \
test/include/test_suite.h UOCContacts/include/api.h \
UOCContacts/include/error.h UOCContacts/include/csv.h
test/include/test.h:
test/include/test_suite.h:
UOCContacts/include/api.h:
UOCContacts/include/error.h:
UOCContacts/include/csv.h:

Binary file not shown.

View File

@ -1,5 +0,0 @@
../bin/Debug/src_person.c.o: src/person.c include/person.h include/csv.h \
include/date.h
include/person.h:
include/csv.h:
include/date.h:

Binary file not shown.

View File

@ -1,5 +0,0 @@
bin/Debug/test_src_test.c.o: test/src/test.c test/include/test.h \
test/include/test_suite.h test/include/test_pr1.h
test/include/test.h:
test/include/test_suite.h:
test/include/test_pr1.h:

Binary file not shown.

View File

@ -1,9 +0,0 @@
bin/Debug/test_src_test_pr1.c.o: test/src/test_pr1.c \
test/include/test_pr1.h test/include/test_suite.h \
UOCContacts/include/api.h UOCContacts/include/error.h \
UOCContacts/include/csv.h
test/include/test_pr1.h:
test/include/test_suite.h:
UOCContacts/include/api.h:
UOCContacts/include/error.h:
UOCContacts/include/csv.h:

Binary file not shown.

View File

@ -1,3 +0,0 @@
bin/Debug/test_src_test_suite.c.o: test/src/test_suite.c \
test/include/test_suite.h
test/include/test_suite.h:

View File

@ -1 +0,0 @@

Binary file not shown.

View File

@ -1,6 +0,0 @@
../bin/Release/src_api.c.o: src/api.c include/csv.h include/api.h \
include/error.h include/csv.h
include/csv.h:
include/api.h:
include/error.h:
include/csv.h:

Binary file not shown.

View File

@ -1,2 +0,0 @@
../bin/Release/src_csv.c.o: src/csv.c include/csv.h
include/csv.h:

Binary file not shown.

View File

@ -1,2 +0,0 @@
../bin/Release/src_date.c.o: src/date.c include/date.h
include/date.h:

Binary file not shown.

View File

@ -1,8 +0,0 @@
bin/Release/src_main.c.o: src/main.c test/include/test.h \
test/include/test_suite.h UOCContacts/include/api.h \
UOCContacts/include/error.h UOCContacts/include/csv.h
test/include/test.h:
test/include/test_suite.h:
UOCContacts/include/api.h:
UOCContacts/include/error.h:
UOCContacts/include/csv.h:

Binary file not shown.

View File

@ -1,5 +0,0 @@
../bin/Release/src_person.c.o: src/person.c include/person.h \
include/csv.h include/date.h
include/person.h:
include/csv.h:
include/date.h:

Binary file not shown.

View File

@ -1,5 +0,0 @@
bin/Release/test_src_test.c.o: test/src/test.c test/include/test.h \
test/include/test_suite.h test/include/test_pr1.h
test/include/test.h:
test/include/test_suite.h:
test/include/test_pr1.h:

Binary file not shown.

View File

@ -1,9 +0,0 @@
bin/Release/test_src_test_pr1.c.o: test/src/test_pr1.c \
test/include/test_pr1.h test/include/test_suite.h \
UOCContacts/include/api.h UOCContacts/include/error.h \
UOCContacts/include/csv.h
test/include/test_pr1.h:
test/include/test_suite.h:
UOCContacts/include/api.h:
UOCContacts/include/error.h:
UOCContacts/include/csv.h:

Binary file not shown.

View File

@ -1,3 +0,0 @@
bin/Release/test_src_test_suite.c.o: test/src/test_suite.c \
test/include/test_suite.h
test/include/test_suite.h:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.