Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define INFINIT 10000000
- struct Client
- {
- int tsm; // timp fata de statia de metrou
- char* nc; // nume_client;
- int sp; // suma de plati
- };
- struct Graf_Client
- {
- int nuc; // numar clienti;
- int sic; // strazi intre clienti;
- int **mat; // matrice de adiacenta timp;
- };
- struct Statie_metrou
- {
- char* nume;
- int clc; // Comenzi livrate client - 0 sau 1 (a livrat toate comenzile)
- int nc; // nuumar_clienti
- struct Client *cl;
- struct Graf_Client gc;
- };
- struct Graf_Metrou
- {
- int N, M;
- struct Statie_metrou *sm;
- int **mad; // matrice adiacenta distanta
- };
- const int opersize = 12;
- const char* operations[] = { "conexiune", "legatura", "blocaj_tunel", "blocaj_strada", "adauga_ruta", "sterge_ruta", "adauga_strada", "sterge_strada",
- "drum_strada", "drum_metrou", "timp_minim_statie", "comanda_statie" };
- int oper_code(const char* oper)
- {
- int i;
- for (i = 0; i < opersize; i++)
- {
- if (strcmp(oper, operations[i]) == 0)
- {
- return i;
- }
- }
- return -1;
- }
- void conexiune(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char cl1[50];
- char cl2[50];
- sscanf(buf, "%s %s", cl1, cl2);
- int i, j;
- for (i = 0; i < gm->N; i++)
- {
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl1) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- break;
- }
- }
- if (i < gm->N)
- {
- int j1 = j;
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl2) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- int j2 = j;
- if ((gm->sm[i].gc.mat[j1][j2] < INFINIT) && (gm->sm[i].gc.mat[j1][j2] != 0))
- {
- fprintf(fisierout, "OK\n");
- }
- else
- {
- fprintf(fisierout, "NO\n");
- }
- }
- else
- {
- fprintf(fisierout, "NO\n");
- }
- }
- else
- {
- fprintf(fisierout, "NO\n");
- }
- }
- void legatura(FILE * fisierout, struct Graf_Metrou* gm, const char* station)
- {
- int i, j;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, station) == 0)
- {
- break;
- }
- }
- if (i < gm->N)
- {
- int last = 0;
- for (j = 0; j < gm->N; j++)
- {
- if ((gm->mad[i][j] < INFINIT) && (gm->mad[i][j] != 0))
- {
- last = j;
- }
- }
- for (j = 0; j < gm->N; j++)
- {
- if ((gm->mad[i][j] < INFINIT) && (gm->mad[i][j] != 0))
- {
- if (j == last)
- {
- fprintf(fisierout, "%s", gm->sm[j].nume);
- }
- else
- {
- fprintf(fisierout, "%s ", gm->sm[j].nume);
- }
- }
- }
- fprintf(fisierout, "\n");
- }
- }
- void blocaj_tunel(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char st1[50];
- char st2[50];
- sscanf(buf, "%s %s", st1, st2);
- int i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st1) == 0)
- {
- break;
- }
- }
- int i1 = i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st2) == 0)
- {
- break;
- }
- }
- int i2 = i;
- if ((i1 < gm->N) && (i2 < gm->N) && (i1 != i2))
- {
- gm->mad[i1][i2] = INFINIT;
- gm->mad[i2][i1] = INFINIT;
- }
- }
- void blocaj_strada(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char cl1[50];
- char cl2[50];
- sscanf(buf, "%s %s", cl1, cl2);
- int i, j;
- for (i = 0; i < gm->N; i++)
- {
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl1) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- break;
- }
- }
- if (i < gm->N)
- {
- int j1 = j;
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl2) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- int j2 = j;
- gm->sm[i].gc.mat[j1][j2] = INFINIT;
- gm->sm[i].gc.mat[j2][j1] = INFINIT;
- }
- }
- }
- void adauga_ruta(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char st1[50];
- char st2[50];
- int dist;
- sscanf(buf, "%s %s %d", st1, st2, &dist);
- int i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st1) == 0)
- {
- break;
- }
- }
- int i1 = i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st2) == 0)
- {
- break;
- }
- }
- int i2 = i;
- if (i1 < gm->N && i1 < gm->N && i1 != i2)
- {
- gm->mad[i1][i2] = dist;
- gm->mad[i2][i1] = dist;
- }
- }
- void sterge_ruta(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- blocaj_tunel(fisierout, gm, buf);
- }
- void adauga_strada(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char cl1[50];
- char cl2[50];
- int timp;
- sscanf(buf, "%s %s %d", cl1, cl2, &timp);
- int i, j;
- for (i = 0; i < gm->N; i++)
- {
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl1) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- break;
- }
- }
- if (i < gm->N)
- {
- int j1 = j;
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (strcmp(gm->sm[i].cl[j].nc, cl2) == 0)
- {
- break;
- }
- }
- if (j < gm->sm[i].nc)
- {
- int j2 = j;
- gm->sm[i].gc.mat[j1][j2] = timp;
- gm->sm[i].gc.mat[j2][j1] = timp;
- }
- }
- }
- void sterge_strada(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- blocaj_strada(fisierout, gm, buf);
- }
- //"drum_strada"
- void drum_metrou(FILE * fisierout, struct Graf_Metrou* gm, const char* buf)
- {
- char st1[50];
- char st2[50];
- sscanf(buf, "%s %s", st1, st2);
- int i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st1) == 0)
- {
- break;
- }
- }
- int i1 = i;
- for (i = 0; i < gm->N; i++)
- {
- if (strcmp(gm->sm[i].nume, st2) == 0)
- {
- break;
- }
- }
- int i2 = i;
- if ((i1 < gm->N) && (i2 < gm->N))
- {
- int** madcopy;
- madcopy = (int**)malloc(gm->N * sizeof(int*));
- for (i = 0; i < gm->N; i++)
- {
- madcopy[i] = (int*)malloc(gm->N * sizeof(int));
- }
- int j;
- for (i = 0; i < gm->N; i++)
- for (j = 0; j < gm->N; j++)
- madcopy[i][j] = gm->mad[i][j];
- int k;
- for (k = 0; k < gm->N; k++)
- {
- for (i = 0; i < gm->N; i++)
- {
- }
- for (j = 0; j < gm->N; j++)
- {
- if (madcopy[i][k] + madcopy[k][j] < madcopy[i][j])
- madcopy[i][j] = madcopy[i][k] + madcopy[k][j];
- }
- }
- }
- }
- //"timp_minim_statie"
- //"comanda_statie"
- void CitireDate(FILE * fisierin, struct Graf_Metrou* gm)
- {
- fscanf(fisierin, "%d", &gm->N);
- gm->sm = (struct Statie_metrou*)malloc(gm->N * sizeof(struct Statie_metrou));
- int i, j, k, m;
- char buf[100];
- for (i = 0; i < gm->N; i++)
- {
- fscanf(fisierin, "%s", buf);
- gm->sm[i].nume = (char*)malloc(strlen(buf) + 1);
- strcpy(gm->sm[i].nume, buf);
- fscanf(fisierin, "%d", &gm->sm[i].nc);
- gm->sm[i].cl = (struct Client*)malloc(gm->sm[i].nc * sizeof(struct Client));
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- fscanf(fisierin, "%s", buf);
- gm->sm[i].cl[j].nc = (char*)malloc(strlen(buf) + 1);
- strcpy(gm->sm[i].cl[j].nc, buf);
- fscanf(fisierin, "%d", &gm->sm[i].cl[j].tsm);
- fscanf(fisierin, "%d", &gm->sm[i].cl[j].sp);
- gm->sm[i].gc.nuc = gm->sm[i].nc;
- }
- fscanf(fisierin, "%d", &gm->sm[i].gc.sic);
- gm->sm[i].gc.mat = (int**)malloc(gm->sm[i].nc * sizeof(int*));
- for (k = 0; k < gm->sm[i].nc; k++)
- {
- gm->sm[i].gc.mat[k] = (int*)malloc(gm->sm[i].nc * sizeof(int));
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- if (k == j)
- {
- gm->sm[i].gc.mat[k][k] = 0;
- }
- else
- {
- gm->sm[i].gc.mat[k][j] = INFINIT;
- }
- }
- }
- for (k = 0; k < gm->sm[i].gc.sic; k++)
- {
- fscanf(fisierin, "%s", buf);
- for (m = 0; m < gm->sm[i].gc.sic; m++)
- {
- if (strcmp(buf, gm->sm[i].cl[m].nc) == 0)
- {
- break;
- }
- }
- int i1 = m;
- fscanf(fisierin, "%s", buf);
- for (m = 0; m < gm->sm[i].gc.sic; m++)
- {
- if (strcmp(buf, gm->sm[i].cl[m].nc) == 0)
- {
- break;
- }
- }
- int i2 = m;
- int timp;
- fscanf(fisierin, "%d", &timp);
- // simetrica
- gm->sm[i].gc.mat[i1][i2] = timp;
- gm->sm[i].gc.mat[i2][i1] = timp;
- }
- }
- fscanf(fisierin, "%d", &gm->M);
- // matrice adiacenta distanta
- gm->mad = (int**)malloc(gm->N * sizeof(int*));
- for (i = 0; i < gm->N; i++)
- {
- gm->mad[i] = (int*)malloc(gm->N * sizeof(int));
- for (j = 0; j < gm->N; j++)
- {
- if (i == j)
- {
- gm->mad[i][i] = 0;
- }
- else
- {
- gm->mad[i][j] = INFINIT;
- }
- }
- }
- for (i = 0; i < gm->M; i++)
- {
- fscanf(fisierin, "%s", buf);
- for (m = 0; m < gm->N; m++)
- {
- if (strcmp(buf, gm->sm[m].nume) == 0)
- {
- break;
- }
- }
- int i1 = m;
- fscanf(fisierin, "%s", buf);
- for (m = 0; m < gm->N; m++)
- {
- if (strcmp(buf, gm->sm[m].nume) == 0)
- {
- break;
- }
- }
- int i2 = m;
- int dist;
- fscanf(fisierin, "%d", &dist);
- // simetrica
- gm->mad[i1][i2] = dist;
- gm->mad[i2][i1] = dist;
- }
- }
- void DealocareMemorie(struct Graf_Metrou* gm)
- {
- int i, j;
- // Dealocare statii metrou
- for (i = 0; i < gm->N; i++)
- {
- // Dealoca nume statie
- free(gm->sm[i].nume);
- // Dealoca clienti
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- free(gm->sm[i].cl[j].nc);
- }
- free(gm->sm[i].cl);
- // Dealoca graf clienti
- for (j = 0; j < gm->sm[i].nc; j++)
- {
- free(gm->sm[i].gc.mat[j]);
- }
- free(gm->sm[i].gc.mat);
- }
- free(gm->sm);
- // Dealocare matrice de adiacenta
- for (i = 0; i < gm->N; i++)
- {
- free(gm->mad[i]);
- }
- free(gm->mad);
- }
- int main(int argc, char* argv[])
- {
- // argv[0]) - "curier.exe"
- // argv[1]) - "date.txt"
- // argv[2]) - "rezultate.out"
- FILE* fisierin = fopen(argv[1], "rt");
- if (fisierin == NULL)
- {
- printf("Cannot open the input file.\n");
- exit(1);
- }
- FILE* fisierout = fopen(argv[2], "wt");
- if (fisierout == NULL)
- {
- printf("Cannot open the output file.\n");
- exit(1);
- }
- //int nsm; // numar strazi matrice
- //int **mpss; // matrice de parcurgere strazi la sediu
- int i;
- struct Graf_Metrou gm;
- CitireDate(fisierin, &gm);
- int nc = 0;
- fscanf(fisierin, "%d\n", &nc);
- char oper[201];
- for (i=0; i< nc; i++)
- {
- fgets(oper, 200, fisierin);
- int len = (int)strlen(oper);
- oper[len - 1] = 0;
- len--;
- if (len == 0) break;
- int ipos = 0;
- int i;
- for (i = 0; i < len; i++)
- {
- if (oper[i] == ' ')
- {
- oper[i] = '\0';
- ipos = i + 1;
- break;
- }
- }
- int cod_oper = oper_code(oper);
- switch (cod_oper)
- {
- case 0:
- conexiune(fisierout, &gm, oper + ipos);
- break;
- case 1:
- legatura(fisierout, &gm, oper + ipos);
- break;
- case 2:
- blocaj_tunel(fisierout, &gm, oper + ipos);
- break;
- case 3:
- blocaj_strada(fisierout, &gm, oper + ipos);
- break;
- case 4:
- adauga_ruta(fisierout, &gm, oper + ipos);
- break;
- case 5:
- sterge_ruta(fisierout, &gm, oper + ipos);
- break;
- case 6:
- adauga_strada(fisierout, &gm, oper + ipos);
- break;
- case 7:
- sterge_strada(fisierout, &gm, oper + ipos);
- break;
- case 8:
- // drum_strada x y – Calculeaza cel mai scurt timp de la x la y(x si y sunt clienti).
- //finish(fisierout, &cproc, &idle, &ca, &cf, &lp, &lm, T);
- break;
- case 9:
- drum_metrou(fisierout, &gm, oper + ipos);
- break;
- case 10:
- // timp_minim_statie x
- //finish(fisierout, &cproc, &idle, &ca, &cf, &lp, &lm, T);
- break;
- case 11:
- // comanda_statie valoare_suma
- //finish(fisierout, &cproc, &idle, &ca, &cf, &lp, &lm, T);
- break;
- default:
- fprintf(fisierout, "Unknown order.\n");
- }
- }
- DealocareMemorie(&gm);
- fclose(fisierin);
- fclose(fisierout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement