gabarito tp02 e questões tp03

This commit is contained in:
Felipe Domingos 2022-09-25 09:50:28 -03:00
parent d6c82a49aa
commit 436c56fb3d
3 changed files with 1135 additions and 0 deletions

BIN
tps/enunciado/tp3.pdf Normal file

Binary file not shown.

645
tps/fonte/Game.c Normal file
View File

@ -0,0 +1,645 @@
/**
* @file Game.c
* @author Pedro Costa
* @version 0.1
* @date 2022-09-25
*
* @copyright Copyright (c) 2022
*/
// -------------------------------------------------------------------------------- //
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
// -------------------------------------------------------------------------------- //
// Definitions
#define MAX_GAMES 9000
#define MAX_FIELD_SIZE 250
#define MAX_STRING_ARRAY_SIZE 100
// -------------------------------------------------------------------------------- //
// Structs
typedef struct
{
int year,
month;
} Date;
typedef struct
{
char name[MAX_FIELD_SIZE],
owners[MAX_FIELD_SIZE],
website[MAX_FIELD_SIZE],
developers[MAX_FIELD_SIZE],
languages[MAX_STRING_ARRAY_SIZE][30],
genres[MAX_STRING_ARRAY_SIZE][30];
Date release_date;
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
float price, upvotes;
bool windows_os, mac_os, linux_os;
} Game;
// -------------------------------------------------------------------------------- //
// Functions
bool isFim(char *str) { return str[0] == 'F' && str[1] == 'I' && str[2] == 'M'; }
void substring(char *string, char *string_start, int length)
{
strncpy(string, string_start, length);
string[length] = '\0';
}
char *getMonthName(int month)
{
switch (month)
{
case 1:
return "Jan";
break;
case 2:
return "Feb";
break;
case 3:
return "Mar";
break;
case 4:
return "Apr";
break;
case 5:
return "May";
break;
case 6:
return "Jun";
break;
case 7:
return "Jul";
break;
case 8:
return "Aug";
break;
case 9:
return "Sep";
break;
case 10:
return "Oct";
break;
case 11:
return "Nov";
break;
case 12:
return "Dec";
break;
default:
return "N/A";
break;
}
}
int getMonthNumber(char *month)
{
if (!strcmp(month, "Jan"))
return 1;
else if (!strcmp(month, "Feb"))
return 2;
else if (!strcmp(month, "Mar"))
return 3;
else if (!strcmp(month, "Apr"))
return 4;
else if (!strcmp(month, "May"))
return 5;
else if (!strcmp(month, "Jun"))
return 6;
else if (!strcmp(month, "Jul"))
return 7;
else if (!strcmp(month, "Aug"))
return 8;
else if (!strcmp(month, "Sep"))
return 9;
else if (!strcmp(month, "Oct"))
return 10;
else if (!strcmp(month, "Nov"))
return 11;
else if (!strcmp(month, "Dec"))
return 12;
}
// -------------------------------------------------------------------------------- //
// Class game functions
void game_start(Game *game)
{
strcpy(game->name, "");
strcpy(game->owners, "");
strcpy(game->website, "");
strcpy(game->developers, "");
for (int i = 0; i < MAX_STRING_ARRAY_SIZE; i++)
{
strcpy(game->languages[i], "");
strcpy(game->genres[i], "");
}
game->release_date.month = -1;
game->release_date.year = -1;
game->app_id = -1;
game->age = -1;
game->dlcs = -1;
game->avg_playtime = -1;
game->price = -1;
game->upvotes = -1;
game->windows_os = false;
game->mac_os = false;
game->linux_os = false;
game->count_languages = 0;
game->count_genres = 0;
}
void game_print(Game *game)
{
int hours = game->avg_playtime / 60,
minutes = game->avg_playtime % 60;
printf("%i %s %s/%04i %s %i %.2f %i [", game->app_id, game->name, getMonthName(game->release_date.month), game->release_date.year, game->owners, game->age, game->price, game->dlcs);
for (int i = 0; i < game->count_languages; i++)
{
printf("%s%s", game->languages[i], i < game->count_languages - 1 ? ", " : "");
}
printf("] %s %s %s %s ", game->website, game->windows_os ? "true" : "false", game->mac_os ? "true" : "false", game->linux_os ? "true" : "false");
if (isnan(game->upvotes))
printf("0.0%% ");
else
printf("%.0f%% ", game->upvotes);
if (hours > 0)
{
printf("%ih ", hours);
if (minutes > 0)
printf("%im ", minutes);
}
else
{
if (minutes > 0)
printf("%im ", minutes);
else
printf("null ");
}
printf("%s [", game->developers);
for (int i = 0; i < game->count_genres; i++)
{
printf("%s%s", game->genres[i], i < game->count_genres - 1 ? ", " : "");
}
printf("]\n");
}
Game game_clone(Game *game)
{
Game cloned;
strcpy(cloned.name, game->name);
strcpy(cloned.owners, game->owners);
strcpy(cloned.website, game->website);
strcpy(cloned.developers, game->developers);
for (int i = 0; i < game->count_languages; i++)
strcpy(cloned.languages[i], game->languages[i]);
for (int i = 0; i < game->count_genres; i++)
strcpy(cloned.genres[i], game->genres[i]);
cloned.release_date.month = game->release_date.month;
cloned.release_date.year = game->release_date.year;
cloned.app_id = game->app_id;
cloned.age = game->age;
cloned.dlcs = game->dlcs;
cloned.avg_playtime = game->avg_playtime;
cloned.price = game->price;
cloned.upvotes = game->upvotes;
cloned.windows_os = game->windows_os;
cloned.mac_os = game->mac_os;
cloned.linux_os = game->linux_os;
return cloned;
}
void game_read(Game *game, char *line)
{
char c_search, sub[MAX_FIELD_SIZE];
int index = 0, atr_index = 0;
// ------------------------------------------------------------ //
// Find "AppID"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
game->app_id = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Name"
if (line[atr_index] != ',')
{
if (line[atr_index] == '\"')
{
atr_index++;
c_search = '\"';
}
else
c_search = ',';
while (true)
{
index++;
if (line[index] == c_search)
{
substring(sub, &line[atr_index], index - atr_index);
strcpy(game->name, sub);
if (c_search == ',')
index++;
else if (c_search == '\"')
index += 2;
atr_index = index;
break;
}
}
}
else
{
strcpy(game->name, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find release date
if (line[atr_index] != ',')
{
if (line[atr_index] == '\"')
{
atr_index++;
c_search = '\"';
}
else
c_search = ',';
while (true)
{
index++;
if (line[index] == c_search)
{
substring(sub, &line[atr_index], index - atr_index);
char subDate[10];
substring(subDate, &sub[0], 3);
game->release_date.month = getMonthNumber(subDate);
if (c_search == ',')
{
substring(subDate, &sub[4], 4);
game->release_date.year = atoi(subDate);
index++;
}
else if (c_search == '\"')
{
int nmbSpace = 0;
for (int i = 0;; i++)
{
if (sub[i] == ' ')
nmbSpace++;
if (nmbSpace == 2)
{
i++;
substring(subDate, &sub[i], 4);
game->release_date.year = atoi(subDate);
break;
}
}
index += 2;
}
atr_index = index;
break;
}
}
}
else
{
game->release_date.month = 0;
game->release_date.year = 0;
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Owners"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
strcpy(game->owners, sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Age"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
game->age = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Price"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
game->price = atof(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "DLCs"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
game->dlcs = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Languages"
while (true)
{
index++;
if (line[index] == ']')
{
index++;
if (line[index] == ',')
index++;
else if (line[index] == '\"')
index += 2;
atr_index = index;
break;
}
else if (line[index] == '\'')
{
int wordStart = index + 1;
while (true)
{
index++;
if (line[index] == '\'')
{
substring(sub, &line[wordStart], index - wordStart);
strcpy(game->languages[game->count_languages++], sub);
break;
}
}
}
}
// ------------------------------------------------------------ //
// Find "Website"
if (line[atr_index] != ',')
{
if (line[atr_index] == '\"')
{
atr_index++;
c_search = '\"';
}
else
c_search = ',';
while (true)
{
index++;
if (line[index] == c_search)
{
substring(sub, &line[atr_index], index - atr_index);
strcpy(game->website, sub);
atr_index = ++index;
break;
}
}
}
else
{
strcpy(game->website, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Windows"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
if (!strcmp(sub, "True"))
game->windows_os = true;
atr_index = ++index;
break;
}
}
// Find "Mac"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
if (!strcmp(sub, "True"))
game->mac_os = true;
atr_index = ++index;
break;
}
}
// Find "Linux"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
if (!strcmp(sub, "True"))
game->linux_os = true;
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Upvotes"
int positives, negatives;
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
positives = atoi(sub);
atr_index = ++index;
break;
}
}
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
negatives = atoi(sub);
atr_index = ++index;
break;
}
}
game->upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ------------------------------------------------------------ //
// Find "AVG Playtime"
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
game->avg_playtime = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Developers"
if (line[atr_index] != ',')
{
if (line[atr_index] == '\"')
{
atr_index++;
c_search = '\"';
}
else
c_search = ',';
while (true)
{
index++;
if (line[index] == c_search)
{
substring(sub, &line[atr_index], index - atr_index);
strcpy(game->developers, sub);
atr_index = ++index;
break;
}
}
}
else
{
strcpy(game->developers, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Genres"
if (index < strlen(line) - 1)
{
if (line[index] == ',')
atr_index = ++index;
if (line[atr_index] == '\"')
{
atr_index++;
while (true)
{
index++;
if (line[index] == ',')
{
substring(sub, &line[atr_index], index - atr_index);
strcpy(game->genres[game->count_genres++], sub);
atr_index = ++index;
}
else if (line[index] == '\"')
{
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
if (sub[strlen(sub) - 2] == '\"')
sub[strlen(sub) - 2] = '\0';
strcpy(game->genres[game->count_genres++], sub);
break;
}
}
}
else
{
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
sub[strlen(line) - 2 - atr_index] = '\0';
strcpy(game->genres[game->count_genres++], sub);
}
}
}
// ---------------------------------------------------------------------------------------------------------- //
int main()
{
char csvFile[20];
scanf("%s", csvFile);
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen(csvFile, "r");
if (fp == NULL)
exit(EXIT_FAILURE);
// ------------------------------------------------------------ //
while ((read = getline(&line, &len, fp)) != -1)
{
Game game;
game_start(&game);
game_read(&game, line);
game_print(&game);
}
// ------------------------------------------------------------ //
fclose(fp);
if (line)
free(line);
return EXIT_SUCCESS;
}

490
tps/fonte/Game.java Normal file
View File

@ -0,0 +1,490 @@
/**
* @file Game.java
* @author Pedro Costa
* @version 0.1
* @date 2022-09-25
*
* @copyright Copyright (c) 2022
*/
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
public class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages,
ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime,
float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) {
this.name = name;
}
public void setOwners(String owners) {
this.owners = owners;
}
public void setWebsite(String website) {
this.website = website;
}
public void setDevelopers(String developers) {
this.developers = developers;
}
public void setLanguages(ArrayList<String> languages) {
this.languages = languages;
}
public void setGenres(ArrayList<String> genres) {
this.genres = genres;
}
public void setReleaseDate(Date release_date) {
this.release_date = release_date;
}
public void setAppId(int app_id) {
this.app_id = app_id;
}
public void setAge(int age) {
this.age = age;
}
public void setDlcs(int dlcs) {
this.dlcs = dlcs;
}
public void setAvgPlaytime(int avg_playtime) {
this.avg_playtime = avg_playtime;
}
public void setPrice(float price) {
this.price = price;
}
public void setUpvotes(float upvotes) {
this.upvotes = upvotes;
}
public void setWindows(boolean windows) {
this.windows = windows;
}
public void setMac(boolean mac) {
this.mac = mac;
}
public void setLinux(boolean linux) {
this.linux = linux;
}
public String getName() {
return this.name;
}
public String getOwners() {
return this.owners;
}
public String getWebsite() {
return this.website;
}
public String getDevelopers() {
return this.developers;
}
public ArrayList<String> getLanguages() {
return this.languages;
}
public ArrayList<String> getGenres() {
return this.genres;
}
public Date getReleaseDate() {
return this.release_date;
}
public int getAppId() {
return this.app_id;
}
public int getAge() {
return this.age;
}
public int getDlcs() {
return this.dlcs;
}
public int getAvgPlaytime() {
return this.avg_playtime;
}
public float getPrice() {
return this.price;
}
public float getUpvotes() {
return this.upvotes;
}
public boolean getWindows() {
return this.windows;
}
public boolean getMac() {
return this.mac;
}
public boolean getLinux() {
return this.linux;
}
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public void ler(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if (line.charAt(atr_index) != ',') {
if (line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
} else
c_search = ',';
while (true) {
index++;
if (line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if (c_search == ',')
index++;
else if (c_search == '\"')
index += 2;
atr_index = index;
break;
}
}
} else
atr_index = ++index;
// ---------------------------------- //
// Find release date
if (line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if (line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
} else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while (true) {
index++;
if (line.charAt(index) == c_search) {
try {
this.release_date = df.parse(line.substring(atr_index, index));
} catch (java.text.ParseException e) {
e.printStackTrace();
}
if (c_search == ',')
index++;
else if (c_search == '\"')
index += 2;
atr_index = index;
break;
}
}
} else
atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while (true) {
index++;
if (line.charAt(index) == ']') {
index++;
if (line.charAt(index) == ',')
index++;
else if (line.charAt(index) == '\"')
index += 2;
atr_index = index;
break;
} else if (line.charAt(index) == '\'') {
int wordStart = index + 1;
while (true) {
index++;
if (line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if (line.charAt(atr_index) != ',') {
if (line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
} else
c_search = ',';
while (true) {
index++;
if (line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
} else
atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while (true) {
index++;
if (line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while (true) {
index++;
if (line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float) (positives * 100) / (float) (positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while (true) {
index++;
if (line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if (line.charAt(atr_index) != ',') {
if (line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
} else
c_search = ',';
while (true) {
index++;
if (line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
} else
atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if (index < line.length() - 1) {
if (line.charAt(index) == ',')
atr_index = ++index;
if (line.charAt(atr_index) == '\"') {
atr_index++;
while (true) {
index++;
if (line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
} else if (line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
} else
this.genres.add(line.substring(atr_index, line.length()));
}
}
public void imprimir() {
String avg_pt = null;
if (this.avg_playtime == 0)
avg_pt = "null ";
else if (this.avg_playtime < 60)
avg_pt = this.avg_playtime + "m ";
else {
if (this.avg_playtime % 60 == 0)
avg_pt = this.avg_playtime / 60 + "h ";
else
avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " "
+ this.owners + " " + this.age + " " + String.format("%.2f", this.price) + " " + this.dlcs + " "
+ this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " "
+ (Float.isNaN(this.upvotes) ? "0.0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers
+ " " + this.genres);
}
}