Untitled
unknown
plain_text
3 years ago
9.5 kB
7
Indexable
/* João Pimentel - iaed-23 - ist198951 - project1 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROUTE_NAME_LENGTH 21 /*Deviam ser 20?*/
#define MAX_STOP_NAME_LENGTH 50
#define MAX_ROUTES 200
#define MAX_STOPS 10000
#define MAX_LINKS 30000
#define BUFSIZE 8192
#define TRUE 1
#define FALSE 0
#define ERROR -1
/* Structure representing a stop */
typedef struct {
char name[MAX_STOP_NAME_LENGTH];
double latitude;
double longitude;
} Stop;
/* Structure representing a route*/
typedef struct {
char name[MAX_ROUTE_NAME_LENGTH];
char first_stop[MAX_STOP_NAME_LENGTH];
int route_num_stops;
double total_cost;
double total_duration;
char last_stop[MAX_STOP_NAME_LENGTH];
} Route;
/* Structure representing a link*/
typedef struct {
char career[MAX_ROUTE_NAME_LENGTH];
char origin_stop[MAX_STOP_NAME_LENGTH];
char destination_stop[MAX_STOP_NAME_LENGTH];
double cost;
double duration;
} Link;
Route routes[MAX_ROUTES];
Stop stops[MAX_STOPS];
Link links[MAX_LINKS];
char input_list[BUFSIZE];
char cmd;
int num_routes = 0;
int num_stops = 0;
int num_links = 0;
int findStop(char id[]) { /* If the names match, the function immediately returns the index of the current stop.*/
int i;
for (i = 0; i < num_stops; i++)
if (!strcmp(id, stops[i].name))
return i;
return ERROR;
}
void list_all_routes(){
int i;
for (i = 0; i < num_routes; i++) {
if (routes[i].route_num_stops == 0)
printf("%s %d %.2f %.2f\n", routes[i].name, routes[i].route_num_stops, routes[i].total_cost, routes[i].total_duration);
else
printf("%s %s %s %d %.2f %.2f\n", routes[i].name, routes[i].first_stop, routes[i].last_stop , routes[i].route_num_stops, routes[i].total_cost, routes[i].total_duration);
}
}
void list_all_routes_reverse(){
int i;
for (i = num_routes - 1; i >= 0; i--) {
printf("%s %s %.2f %.2f\n", routes[i].name, routes[i].first_stop, stops[findStop(routes[i].name)].latitude, stops[findStop(routes[i].name)].longitude);
}
}
int is_inverso_valid(char *str) {
return strcmp(str, "inv") == 0 ||
strcmp(str, "inve") == 0 ||
strcmp(str, "inver") == 0 ||
strcmp(str, "inverso") == 0;
}
int findRoute(char id[]) { /* If the names match, the function immediately returns the index of the current route.*/
int i;
for (i = 0; i < num_routes; i++) {
if (strcmp(id, routes[i].name) == 0)
return i;
}
return ERROR;
}
void list_routes() {
Route r;
int number_of_args, i, counter = 0;
char reverse[8];
number_of_args = sscanf(input_list, "%c %s %8s",&cmd, r.name, reverse);
if (number_of_args == 1)
list_all_routes();
if (number_of_args == 2){
if (num_routes == MAX_ROUTES) {
printf("Maximum number of routes reached.\n");
return;
}
if (findRoute(r.name) == ERROR) { /*Se não existir uma carreira com este nome,cria*/
strcpy(routes[num_routes].name, r.name);
num_routes++;
}
else{ /*Se existe, imprime o dessa carreira*/
for (i = 0; i < num_links; i++) {
if (strcmp(r.name, links[i].career) == 0) {
if (counter == 0){
printf("%s, %s", links[i].origin_stop, links[i].destination_stop);
counter++;
} else {
printf(", %s", links[i].destination_stop);
counter++;
}
}
}
printf("\n");
}
}
if (number_of_args == 3 && is_inverso_valid(reverse) )
list_all_routes();
if (number_of_args == 3 && !is_inverso_valid(reverse))
printf("incorrect sort option.\n");
}
void list_all_stops() {
int i;
for (i = 0; i < num_stops; i++) {
printf("%s: %16.12f %16.12f %d\n", stops[i].name, stops[i].latitude, stops[i].longitude, num_routes);
}
}
void list_stops() {
Stop s;
int number_of_args;
number_of_args = sscanf(input_list, "%c %s %lf %lf",&cmd, s.name, &s.latitude, &s.longitude);
if (s.name[0] == '"')
number_of_args = sscanf(input_list, "%c \"%50[^\"]\" %lf %lf",&cmd, s.name, &s.latitude, &s.longitude);
if (number_of_args == 1){
list_all_stops();
}
if (number_of_args == 2){
if (findStop(s.name) == ERROR) {
printf("%s: no such stop.\n", s.name);
return;
}
else
printf("%16.12f %16.12f\n", stops[findStop(s.name)].latitude, stops[findStop(s.name)].longitude);
}
if (number_of_args == 4){
/*Creates a new stop if it is not created yet*/
if (findStop(s.name) != ERROR){
printf("%s: stop already exists.\n", s.name);
return;
}
if (num_stops == MAX_STOPS) {
printf("Maximum number of stops reached.\n");
return;
}
strcpy(stops[num_stops].name, s.name);
stops[num_stops].latitude = s.latitude;
stops[num_stops].longitude = s.longitude;
num_stops++;
}
}
void addLinkToStart(Link link){
int i;
if (num_links == MAX_LINKS)
return;
for (i = num_links - 1; i >= 0; i--) {
links[i + 1] = links[i];
}
strcpy(links[0].origin_stop, link.origin_stop);
strcpy(links[0].destination_stop, link.destination_stop);
strcpy(links[0].career, link.career);
links[0].cost = link.cost;
links[0].duration = link.duration;
num_links++;
}
void addsLinks() {
Link l;
int num_to_add, index;
sscanf(input_list, "%c %s %s %s %lf %lf",&cmd, l.career, l.origin_stop, l.destination_stop, &l.cost, &l.duration);
if (l.origin_stop[0] == '"')
sscanf(input_list, "%c %s \"%50[^\"]\" %s %lf %lf",&cmd, l.career, l.origin_stop, l.destination_stop, &l.cost, &l.duration);
if (l.destination_stop[0] == '"')
sscanf(input_list, "%c %s %s \"%50[^\"]\" %lf %lf",&cmd, l.career, l.origin_stop, l.destination_stop, &l.cost, &l.duration);
if (l.origin_stop[0] == '"' && l.destination_stop[0] == '"')
sscanf(input_list, "%c %s \"%50[^\"]\" \"%50[^\"]\" %lf %lf",&cmd, l.career, l.origin_stop, l.destination_stop, &l.cost, &l.duration);
if (findRoute(l.career) == ERROR){
printf("%s: no such line.\n", l.career);
return ;
}
if (findStop(l.origin_stop) == ERROR){
printf("%s: no such stop.\n", l.origin_stop);
return ;
}
if (findStop(l.destination_stop) == ERROR){
printf("%s: no such stop.\n", l.destination_stop);
return ;
}
index = findRoute(l.career);
/*No caso das paragens da ligação, origem ou destino, não correspoderem a um dos extremos da carreira.*/
if ((strcmp(l.origin_stop, routes[findRoute(l.career)].first_stop) == 0 && strcmp(l.destination_stop, routes[findRoute(l.career)].last_stop) != 0) && routes[findRoute(l.career)].route_num_stops != 0) {
printf("link cannot be associated with bus line.\n");
return ;
}
if (strcmp(l.destination_stop, routes[findRoute(l.career)].last_stop) == 0 && strcmp(l.origin_stop, routes[findRoute(l.career)].first_stop) != 0 && routes[findRoute(l.career)].route_num_stops != 0) {
printf("link cannot be associated with bus line.\n");
return ;
}
if (l.cost < 0 || l.duration < 0){
printf("negative cost or duration.\n");
return ;
}
else {
num_to_add = 1;
if (strcmp(routes[findRoute(l.career)].first_stop, l.origin_stop) != 0 && strcmp(routes[findRoute(l.career)].last_stop, l.destination_stop) != 0 && routes[findRoute(l.career)].route_num_stops == 0) {
strcpy(routes[index].first_stop, l.origin_stop);
strcpy(routes[index].last_stop, l.origin_stop);
num_to_add = 2;
}
if (strcmp(routes[findRoute(l.career)].first_stop, l.origin_stop) == 0 && strcmp(routes[findRoute(l.career)].last_stop, l.destination_stop) != 0 && routes[findRoute(l.career)].route_num_stops != 0) {
strcpy(routes[index].last_stop, l.origin_stop);
}
if (strcmp(routes[findRoute(l.career)].last_stop, l.origin_stop) == 0){
strcpy(routes[findRoute(l.career)].last_stop, l.destination_stop);
}
if ((strcmp(routes[findRoute(l.career)].first_stop, l.destination_stop)) == 0 ){
strcpy(routes[index].first_stop, l.origin_stop);
addLinkToStart(l);
routes[findRoute(l.career)].total_cost += l.cost;
routes[findRoute(l.career)].total_duration += l.duration;
routes[findRoute(l.career)].route_num_stops += num_to_add;
return;
}
strcpy(links[num_links].origin_stop, l.origin_stop);
strcpy(links[num_links].destination_stop, l.destination_stop);
strcpy(links[num_links].career, l.career);
links[num_links].cost = l.cost;
links[num_links].duration = l.duration;
num_links++;
routes[findRoute(l.career)].total_cost += l.cost;
routes[findRoute(l.career)].total_duration += l.duration;
routes[findRoute(l.career)].route_num_stops += num_to_add;
}
}
void listsConnections(){
/*TODO: NOT IMPLEMENTED YET*/
}
int main() {
while (fgets(input_list, BUFSIZE, stdin) != NULL) {
if (strlen(input_list) > 0 && input_list[strlen(input_list) - 1] == '\n') {
input_list[strlen(input_list) - 1] = '\0'; /* adiciona o 0 ao final da lista*/
}
sscanf(input_list, "%c", &cmd);
switch (cmd) {
case 'q':
return 0;
case 'c':
list_routes();
break;
case 'p':
list_stops();
break;
case 'l':
addsLinks();
break;
case 'i':
listsConnections();
break;
}
}
return 0;
}Editor is loading...