Untitled
unknown
plain_text
3 years ago
6.8 kB
5
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 route or circular row */
typedef struct {
char name[MAX_ROUTE_NAME_LENGTH];
int first_stop;
int last_stop;
} Route;
/* Structure representing a stop */
typedef struct {
char name[MAX_STOP_NAME_LENGTH];
double latitude;
double longitude;
} Stop;
/* Structure representing a link between two stops */
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];
int num_routes = 0;
int num_stops = 0;
int num_links = 0;
/* Functions to read the input from the user */
int readsNextWord(char str[]) {
char c = getchar();
int i = 0;
while (c == ' ' || c == '\t')
c = getchar();
while (c != ' ' && c != '\t' && c != '\n') {
str[i++] = c;
c = getchar();
}
str[i] = '\0';
return (c == '\n');
}
void readsWordUntilEnd(char str[]) {
char c = getchar();
int i = 0;
while (c == ' ' || c == '\t')
c = getchar();
while (c != '\n') {
str[i++] = c;
c = getchar();
}
str[i] = '\0';
}
void readsUntilEndline() {
char c = getchar();
while (c != '\n')
c = getchar();
}
void list_all_routes(){
int i;
for (i = 0; i < num_routes; i++) {
printf("%s: from %s to %s\n", routes[i].name, stops[routes[i].first_stop].name, stops[routes[i].last_stop].name);
}
}
void list_route(char *name){
int i;
for (i = 0; i < MAX_ROUTES; i++) {
if (strcmp(routes[i].name, name) == 0) {
printf("%d", routes[i].first_stop);
}
}
}
int is_inverso_valid(char *str) {
return strcmp(str, "inv") == 0 ||
strcmp(str, "inve") == 0 ||
strcmp(str, "inver") == 0 ||
strcmp(str, "inverso") == 0;
}
void list_routes() {
Route r;
char reverse[20];
if (readsNextWord(r.name) != 1){
if (readsNextWord(reverse) != 1 && is_inverso_valid(reverse))
list_all_routes();
/*imprime as paragens por ordem inversa*/
else if (!is_inverso_valid(reverse))
printf("incorrect sort option.\n");
/*imprime pela ordem normal*/
else
list_all_routes();
}
}
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;
}
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))
return i;
return ERROR;
}
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 add_route(char *arg) {
char name[MAX_ROUTE_NAME_LENGTH];
int first_stop, last_stop;
if (strlen(arg) == 0) {
printf("Invalid route name.\n");
return;
}
if (num_routes == MAX_ROUTES) {
printf("Maximum number of routes reached.\n");
return;
}
first_stop = num_stops;
last_stop = num_stops;
routes[num_routes].first_stop = first_stop;
routes[num_routes].last_stop = last_stop;
strcpy(routes[num_routes].name, name);
num_routes++;
printf("Route added successfully.\n");
}
void list_stops() { /*TODO: adicionar aqui o caso em que insere latitude e longitude*/
Stop s;
char latitude[100];
char longitude[100];
int number_of_args;
number_of_args = sscanf(input_list, "%s %lf %lf", s.name, &s.latitude, &s.longitude);
if (number_of_args == 0){
printf("%s\n", s.name);
printf("ai entrou\n");
list_all_stops();
}
if (number_of_args == 1){ /*se só der um argumento -> apenas dá a latitude e longitude*/
if (findStop(s.name) == ERROR)
printf("%s: no such stop.\n", s.name);
else
printf("%f %f\n", stops[findStop(s.name)].latitude, stops[findStop(s.name)].longitude);
}
if (number_of_args == 3){
printf("%s\n", latitude);
printf("%s\n", longitude);
/*cria nova paragem com os dados fornecidos*/
strcpy(stops[num_stops].name, s.name);
stops[num_stops].latitude = s.latitude;
stops[num_stops].longitude = s.longitude;
}
}
void addsLinks() {
Link l;
char cost[100];
char duration[100];
readsNextWord(l.career);
readsNextWord(l.origin_stop);
readsNextWord(l.destination_stop);
readsNextWord(cost);
l.cost = atof(cost);
readsNextWord(duration);
l.duration = atof(duration);
if (findRoute(l.career) == ERROR)
printf("%s: no such line.\n", l.career);
else if (findStop(l.origin_stop) == ERROR)
printf("%s: no such stop.\n", l.origin_stop);
else if (findStop(l.destination_stop) == ERROR)
printf("%s: no such stop.\n", l.destination_stop);
else if (l.cost < 0 || l.duration < 0)
printf("negative cost or duration.");
else {
strcpy(links[num_links].career, l.career);
strcpy(links[num_links].origin_stop, l.origin_stop);
strcpy(links[num_links].destination_stop, l.destination_stop);
links[num_links].cost = l.cost;
links[num_links].duration = l.duration;
num_links++;
}
}
void listsConnections(){
/*TODO: NOT IMPLEMENTED YET*/
}
int main() {
int c;
while ((c = getchar()) != EOF) {
switch (c) {
case 'q':
return 0;
case 'c': list_routes();
break;
case 'p': list_stops();
break;
case 'l': addsLinks();
break;
case 'i': listsConnections();
break;
}
}
return 0;
}
int main() {
char cmd;
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);
memmove(input_list, input_list + 1, strlen(input_list));
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...