diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/753045_binaria.txt b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/753045_binaria.txt new file mode 100644 index 0000000..5ef1740 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/753045_binaria.txt @@ -0,0 +1 @@ +753045 0ms 2228 \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player new file mode 100644 index 0000000..31797b7 Binary files /dev/null and b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player differ diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player.c b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player.c new file mode 100644 index 0000000..d193174 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/Player.c @@ -0,0 +1,439 @@ +/** + * @path TP02Q04 - Pesquisa Binária em C/Player.c + * @description C file that implements the Player class with binary search + * @author Pedro Lopes - github.com/httpspedroh + * @version 1.0 + * @update 2023-09-27 + */ + +// ---------------------------------------------------------------------------------------------------- // + +// Includes +#include +#include +#include +#include +#include + +// ---------------------------------------------------------------------------------------------------- // + +// Constants +#define MAX_PLAYERS 4000 +#define FILE_PATH "/tmp/players.csv" + +#define MAX_NAME_SIZE 40 +#define MAX_COLLEGE_SIZE 60 +#define MAX_BIRTH_CITY_SIZE 40 +#define MAX_BIRTH_STATE_SIZE 40 + +#define MAX_LINE_SIZE 300 +#define MAX_ATTRIBUTE_SIZE 100 + +// ---------------------------------------------------------------------------------------------------- // + +// Structs +typedef struct Player { + int id; + char *name; + int height; + int weight; + int birthYear; + char *birthCity; + char *birthState; + char *college; +} Player; + +// ---------------------------------------------------------------------------------------------------- // + +// Global variables +Player allPlayers[MAX_PLAYERS]; +int n = 0; + +// ---------------------------------------------------------------------------------------------------- // + +// Functions +bool isEnd(char* line) { return line[0] == 'F' && line[1] == 'I' && line[2] == 'M'; } + +void substring(char *string, char *stringStart, int length) { + + strncpy(string, stringStart, length); + string[length] = '\0'; +} + +void proccess_attribute(char *attribute, char **substringStart, char **substringEnd, bool isFirstAttribute) { + + // Skip first comma + if(!isFirstAttribute) { + + if(*substringEnd != NULL) *substringStart = *substringEnd + 1; + else *substringStart = *substringEnd; + } + + // Get next comma + *substringEnd = strchr(*substringStart, ','); + + // Get substring + if(*substringEnd) substring(attribute, *substringStart, *substringEnd - *substringStart); + else strcpy(attribute, *substringStart); + + // Set default value if attribute is empty + if(strcmp(attribute, "") == 0 || attribute[0] == '\n' || attribute[0] == '\r' || attribute[0] == '\0') strcpy(attribute, "nao informado"); + + // Clean \n from the end of the string + if(attribute[strlen(attribute) - 1] == '\n') attribute[strlen(attribute) - 1] = '\0'; +} + +// ---------------------------------------------------------------------------------------------------- // + +// Methods signatures + +// Class +Player player_newBlank(); +Player player_new(int id, char *name, int height, int weight, int birthYear, char *birthCity, char *birthState, char *college); +Player *player_clone(Player *player); +void player_print(Player *player); +Player player_read(char *line); +Player *player_searchById(int id); + +// Gets +int player_getId(Player *player); +char *player_getName(Player *player); +int player_getHeight(Player *player); +int player_getWeight(Player *player); +char *player_getCollege(Player *player); +int player_getBirthYear(Player *player); +char *player_getBirthCity(Player *player); +char *player_getBirthState(Player *player); + +// Sets +void player_setId(Player *player, int id); +void player_setName(Player *player, char *name); +void player_setHeight(Player *player, int height); +void player_setWeight(Player *player, int weight); +void player_setCollege(Player *player, char *college); +void player_setBirthYear(Player *player, int birthYear); +void player_setBirthCity(Player *player, char *birthCity); +void player_setBirthState(Player *player, char *birthState); + +// General +void startPlayers(); + +// ---------------------------------------------------------------------------------------------------- // + +// Methods implementations + +// Class +Player player_newBlank() { + + Player player; + + player.id = -1; + player.height = -1; + player.weight = -1; + player.birthYear = -1; + + player.name = (char *) calloc(MAX_NAME_SIZE, sizeof(char)); + strcpy(player.name, ""); + + player.birthCity = (char *) calloc(MAX_BIRTH_CITY_SIZE, sizeof(char)); + strcpy(player.birthCity, ""); + + player.birthState = (char *) calloc(MAX_BIRTH_STATE_SIZE, sizeof(char)); + strcpy(player.birthState, ""); + + player.college = (char *) calloc(MAX_COLLEGE_SIZE, sizeof(char)); + strcpy(player.college, ""); + + return player; +} + +Player player_new(int id, char *name, int height, int weight, int birthYear, char *birthCity, char *birthState, char *college) { + + Player player; + + player.id = id; + player.height = height; + player.weight = weight; + player.birthYear = birthYear; + + player.name = (char *) calloc(MAX_NAME_SIZE, sizeof(char)); + strcpy(player.name, name); + + player.birthCity = (char *) calloc(MAX_BIRTH_CITY_SIZE, sizeof(char)); + strcpy(player.birthCity, birthCity); + + player.birthState = (char *) calloc(MAX_BIRTH_STATE_SIZE, sizeof(char)); + strcpy(player.birthState, birthState); + + player.college = (char *) calloc(MAX_COLLEGE_SIZE, sizeof(char)); + strcpy(player.college, college); + + return player; +} + +Player *player_clone(Player *player) { + + Player *clone = (Player *) malloc(sizeof(Player)); + + clone -> id = player -> id; + clone -> height = player -> height; + clone -> weight = player -> weight; + + clone -> name = (char *) calloc(MAX_NAME_SIZE, sizeof(char)); + strcpy(clone -> name, player -> name); + + clone -> birthCity = (char *) calloc(MAX_BIRTH_CITY_SIZE, sizeof(char)); + strcpy(clone -> birthCity, player -> birthCity); + + clone -> birthState = (char *) calloc(MAX_BIRTH_STATE_SIZE, sizeof(char)); + strcpy(clone -> birthState, player -> birthState); + + clone -> college = (char *) calloc(MAX_COLLEGE_SIZE, sizeof(char)); + strcpy(clone -> college, player -> college); + + return clone; +} + +void player_print(Player *player) { + + printf("[%d ## %s ## %d ## %d ## %d ## %s ## %s ## %s]\n", + player -> id, + player -> name, + player -> height, + player -> weight, + player -> birthYear, + player -> college, + player -> birthCity, + player -> birthState + ); +} + +Player player_read(char *line) { + + Player player = player_newBlank(); + + char *substringStart = line; + char *substringEnd = NULL; + char attribute[MAX_ATTRIBUTE_SIZE]; + + // Get id + proccess_attribute(attribute, &substringStart, &substringEnd, true); + player_setId(&player, atoi(attribute)); + + // Get name + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setName(&player, attribute); + + // Get height + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setHeight(&player, atoi(attribute)); + + // Get weight + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setWeight(&player, atoi(attribute)); + + // Get college + proccess_attribute(attribute, &substringStart, &substringEnd, false); + + // if(player_getId(&player) == 2159) printf("attribute: %s\n", attribute); + + player_setCollege(&player, attribute); + + // Get birth year + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setBirthYear(&player, atoi(attribute)); + + // Get birth city + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setBirthCity(&player, attribute); + + // Get birth state + proccess_attribute(attribute, &substringStart, &substringEnd, false); + player_setBirthState(&player, attribute); + + return player; +} + +Player *player_searchById(int id) { + + for(int i = 0; i < n; i++) { + + if(player_getId(&allPlayers[i]) == id) return &allPlayers[i]; + } + return NULL; +} + +// Gets +int player_getId(Player *player) { return player -> id; } +char *player_getName(Player *player) { return player -> name; } +int player_getHeight(Player *player) { return player -> height; } +int player_getWeight(Player *player) { return player -> weight; } +char *player_getCollege(Player *player) { return player -> college; } +int player_getBirthYear(Player *player) { return player -> birthYear; } +char *player_getBirthCity(Player *player) { return player -> birthCity; } +char *player_getBirthState(Player *player) { return player -> birthState; } + +// Sets +void player_setId(Player *player, int id) { player -> id = id; } +void player_setName(Player *player, char *name) { strcpy(player -> name, name); } +void player_setHeight(Player *player, int height) { player -> height = height; } +void player_setWeight(Player *player, int weight) { player -> weight = weight; } +void player_setBirthYear(Player *player, int birthYear) { player -> birthYear = birthYear; } +void player_setBirthCity(Player *player, char *birthCity) { strcpy(player -> birthCity, birthCity); } +void player_setBirthState(Player *player, char *birthState) { strcpy(player -> birthState, birthState); } +void player_setCollege(Player *player, char *college) { strcpy(player -> college, college); } + +// General +void startPlayers() { + + // Open file + FILE *fp; + char *line = NULL; + size_t len = 0; + ssize_t read; + + fp = fopen(FILE_PATH, "r"); + + if(fp == NULL) { + + perror("x Error opening file"); + exit(EXIT_FAILURE); + } + + // Skip first line + getline(&line, &len, fp); + + // Read all lines + while((read = getline(&line, &len, fp)) != -1) { + + // Read player from line + Player player = player_read(line); + + allPlayers[n++] = player; + + if(n >= MAX_PLAYERS) { + + perror("x Max players reached"); + exit(EXIT_FAILURE); + } + } + + // Close file and free memory + fclose(fp); + + if(line) free(line); +} + +// ---------------------------------------------------------------------------------------------------- // + +// Main +int main() { + + // ----------------------------------------------------------------- // + + // #1 - Start - Read all players in CSV file + startPlayers(); + + // ----------------------------------------------------------------- // + + // #2 - Read input and print players from pub.in id entries and add to mainPlayers array + + // Initialize mainPlayers array + Player mainPlayers[MAX_PLAYERS]; + int m = 0; + + char in[5]; + scanf(" %[^\n]s", in); + + while(true) { + + if(isEnd(in)) break; + else { + + int id = atoi(in); + + Player *player = player_searchById(id); + + if(player) mainPlayers[m++] = *player; + + // ------------------------- // + + scanf(" %[^\n]s", in); + } + } + + // ----------------------------------------------------------------- // + + // #3 - Read input and search for players from pub.in name entries in mainPlayers array + + // Start benchmark + clock_t startTime = clock(); + int comparisons = 0; + + // Order mainPlayers array by name asc + for(int i = 0; i < m; i++) { + + for(int j = i + 1; j < m; j++) { + + comparisons++; + + if(strcmp(player_getName(&mainPlayers[i]), player_getName(&mainPlayers[j])) > 0) { + + Player aux = mainPlayers[i]; + mainPlayers[i] = mainPlayers[j]; + mainPlayers[j] = aux; + } + } + } + + // Read input + char name[MAX_NAME_SIZE]; + scanf(" %[^\n]s", name); + + while(true) { + + if(isEnd(name)) break; + else { + + // Search for player + Player *foundPlayer = NULL; + + // Binary search + int left = 0; + int right = m - 1; + + while(left <= right) { + + int mid = left + (right - left) / 2; + + comparisons += 2; + + if(strcmp(player_getName(&mainPlayers[mid]), name) == 0) { + + foundPlayer = &mainPlayers[mid]; + break; + } + else if(strcmp(player_getName(&mainPlayers[mid]), name) < 0) left = mid + 1; + else right = mid - 1; + } + + // Print result + printf("%s\n", foundPlayer == NULL ? "NAO" : "SIM"); + + // ------------------------- // + + scanf(" %[^\n]s", name); + } + } + + // ----------------- // + + // Save benchmark in file + FILE *fp = fopen("753045_binaria.txt", "w"); + fprintf(fp, "753045\t%.0fms\t%d", (double)(clock() - startTime) / CLOCKS_PER_SEC * 1000.0, comparisons); + fclose(fp); + + // ----------------- // + + return 0; +} \ No newline at end of file diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pedro.out b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pedro.out new file mode 100644 index 0000000..477c895 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pedro.out @@ -0,0 +1,100 @@ +NAO +NAO +SIM +NAO +SIM +SIM +SIM +SIM +SIM +NAO +SIM +SIM +SIM +SIM +NAO +SIM +NAO +SIM +SIM +SIM +SIM +SIM +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +SIM +NAO +NAO +SIM +SIM +SIM +NAO +SIM +NAO +NAO +NAO +NAO +NAO +SIM +SIM +NAO +SIM +SIM +SIM +NAO +SIM +SIM +SIM +SIM +SIM +SIM +SIM +SIM +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +SIM +NAO +SIM +NAO +NAO +NAO +NAO +SIM +NAO +NAO +SIM +NAO +NAO +NAO +NAO +SIM +SIM +SIM +SIM +SIM +NAO +SIM +SIM +NAO diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.in b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.in new file mode 100644 index 0000000..8bbb092 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.in @@ -0,0 +1,151 @@ +1 +104 +1047 +1087 +1124 +119 +1425 +1456 +1487 +149 +1494 +1525 +1565 +1572 +1583 +1702 +1731 +1742 +1748 +1786 +1796 +1809 +1868 +1880 +193 +1998 +2011 +2035 +2083 +217 +2177 +2183 +2203 +228 +401 +412 +448 +479 +53 +533 +557 +627 +687 +721 +797 +812 +848 +950 +98 +FIM +A.J. Bramlett +Aaron Williams +Adrian Smith +Al Ferrari +Alec Kessler +Andy Johnson +Ariel Maughan +Art Burris +Ben McDonald +Ben Poquette +Bill Ebben +Bill Laimbeer +Bob Kinney +Bob Schafer +Bones McKinney +Carl Shaeffer +Cheick Diallo +Chris Harris +Chris Welp +Cliff Barker +Craig Dykema +Curtis Kitchen +Damian Jones +Damjan Rudez +Darnell Mee +Darren Tillis +Darryl Johnson +Dejounte Murray +Devin Booker +Devyn Marble +Dick Schnittker +Dijon Thompson +Donatas Motiejunas +Ed Dahler +Eddie Phillips +Eric Riley +Frank Johnson +Frank Selvy +Gaylon Nickerson +George Reynolds +Glenn McDonald +Harold Pressley +Hassan Whiteside +Herb Williams +Hiram Fuller +Ira Newble +Jack George +Jack Molinas +James Blackwell +Jaren Jackson +Jeff Sanders +Jeremy Evans +Jerry Fleishman +Joe Buckhalter +Joe Caldwell +Joe Young +John Johnson +John Stroud +Johnny Jones +Johnny Orr +Ken Johnson +Ken Norman +Kevin Grevey +Kevin Willis +Larry Drew +Larry Sykes +Leo Kubiak +Lionel Chalmers +Lorenzen Wright +Luigi Datome +Luis Flores +Mamadou N'Diaye +Marcus Fizer +Mark Strickland +Marvin Barnes +Mason Plumlee +Michael Phelps +Michael Stewart +Mike Davis +Montrezl Harrell +Nick Fazekas +Nikola Vucevic +Nolan Smith +Ollie Johnson +Omri Casspi +Othello Hunter +Paul Walther +Peyton Siva +Predrag Drobnjak +Quincy Acy +Ralph Drollinger +Robert Horry +Ron Harper +Russ Schoene +Sarunas Marciulionis* +Stephen Thompson +Thaddeus Young +Toby Kimball +Tony Bennett +Walter Dukes +FIM diff --git a/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.out b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.out new file mode 100644 index 0000000..477c895 --- /dev/null +++ b/tps/gabaritos/tp02/TP02Q04 - Pesquisa Binária em C/pub.out @@ -0,0 +1,100 @@ +NAO +NAO +SIM +NAO +SIM +SIM +SIM +SIM +SIM +NAO +SIM +SIM +SIM +SIM +NAO +SIM +NAO +SIM +SIM +SIM +SIM +SIM +NAO +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +SIM +NAO +NAO +SIM +SIM +SIM +NAO +SIM +NAO +NAO +NAO +NAO +NAO +SIM +SIM +NAO +SIM +SIM +SIM +NAO +SIM +SIM +SIM +SIM +SIM +SIM +SIM +SIM +NAO +NAO +SIM +NAO +NAO +NAO +NAO +NAO +NAO +NAO +SIM +NAO +SIM +NAO +SIM +NAO +NAO +NAO +NAO +SIM +NAO +NAO +SIM +NAO +NAO +NAO +NAO +SIM +SIM +SIM +SIM +SIM +NAO +SIM +SIM +NAO