Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX 1000
- typedef struct corsa {
- char codice[30];
- char partenza[30];
- char destinazione[30];
- char data[30];
- char oraPar[30];
- char oraArr[30];
- char ritardo[30];
- }Corsa;
- void primaStampa(int num, Corsa *c) {
- int i;
- for (i = 0; i < num; i++) {
- printf("%s %s %s %s %s %s %s\n", c[i].codice, c[i].partenza, c[i].destinazione, c[i].data, c[i].oraPar,
- c[i].oraArr, c[i].ritardo);
- }
- }
- void stampa(int num, Corsa **c) {
- int i;
- for(i = 0; i < num; i++) {
- printf("%s %s %s %s %s %s %s\n",c[i]->codice, c[i]->partenza, c[i]->destinazione, c[i]->data, c[i]->oraPar, c[i]->oraArr, c[i]->ritardo);
- }
- }
- void sortDate(int num, Corsa **c) {
- int i, j;
- Corsa *temp;
- for(i=0; i<num-1; i++) {
- for(j=0; j<num-1-i; j++) {
- int gg1, mm1, aa1, gg2, mm2, aa2, d1, d2;
- sscanf(c[j]->data,"%d/%d/%d", &gg1, &mm1, &aa1);
- d1 = gg1 + 100*mm1 + 10000*aa1;
- sscanf(c[j+1]->data,"%d/%d/%d", &gg2, &mm2, &aa2);
- d2 = gg2 + 100*mm2 + 10000*aa2;
- if(d2<d1) {
- temp = c[j];
- c[j] = c[j+1];
- c[j+1] = temp;
- }
- else if(d2 == d1) {
- int hh1, min1, hh2, min2, ora1,ora2;
- sscanf(c[i]->oraArr, "%d:%d", &hh1, &min1);
- ora1 = hh1*60+min1;
- sscanf(c[i]->oraArr, "%d:%d", &hh2, &min2);
- ora2 = hh2*60 + min2;
- if(ora1>ora2) {
- temp = c[j];
- c[j] = c[j+1];
- c[j+1] = temp;
- }
- }
- }
- }
- }
- void sortTratta(int num, Corsa **c){
- int i, j;
- Corsa *temp;
- for(i=0; i<num-1; i++) {
- for(j=0; j<num-1-i; j++) {
- if(strcmp(c[j]->codice,c[j+1]->codice) > 0) {
- temp = c[j];
- c[j] = c[j+1];
- c[j+1] = temp;
- }
- }
- }
- }
- void sortStazione(int num, Corsa **c){
- int i, j;
- Corsa *temp;
- for(i=0; i<num-1; i++) {
- for(j=0; j<num-1-i; j++) {
- if(strcmp(c[j]->partenza,c[j+1]->partenza) > 0){
- temp = c[j];
- c[j] = c[j+1];
- c[j+1] = temp;
- }
- }
- }
- }
- void corseFromFermata(int n, Corsa* c, char lastOrd, int length) {
- int i, len1, len, j, k, found;
- int r = length - 1;
- int l = 0, m;
- char fermata[20];
- printf("\nDigita il nome della fermata di partenza: ");
- scanf("%s", fermata);
- len = strlen(fermata);
- if(lastOrd != 's') {
- for (i = 0; i < n; i++) {
- len1 = strlen(c[i].partenza);
- if (len == len1) {
- if (!strcmp(fermata, c[i].partenza))
- printf("%s\n", c[i].codice);
- } else {
- found = 1;
- j = 0;
- while (fermata[0] != c[i].partenza[j] && j < len1 - len)
- j++;
- k = 0;
- while (k != len) {
- if (fermata[k] != c[i].partenza[j + k])
- found = 0;
- k++;
- }
- if (found)
- printf("%s\n", c[i].codice);
- }
- }
- }
- else {
- while (l<=r) {
- m = (l+r)/2;
- if(strcmp(fermata, c[m].partenza) == 0) {
- printf("%s\n", c[m].codice);
- break;
- }
- if(strcmp(fermata, c[m].partenza) < 0)
- r = m-1;
- if(strcmp(fermata, c[m].partenza) > 0)
- l = m+1;
- }
- }
- }
- int main() {
- FILE* fp;
- int finito = 0,i;
- Corsa c[MAX];
- int com;
- int numRighe;
- char lastOrd; //d = data; c = codice tratta; s = stazione di partenza
- Corsa **codice, **data, **stazione;
- fp = fopen("corse.txt","r");
- if(fp==NULL) return -1;
- fscanf(fp,"%d",&numRighe);
- for(i = 0; i < numRighe; i++) {
- fscanf(fp,"%s %s %s %s %s %s %s",c[i].codice, c[i].partenza, c[i].destinazione, c[i].data, c[i].oraPar, c[i].oraArr, c[i].ritardo);
- }
- fclose(fp);
- codice = data = stazione = malloc(numRighe * sizeof(Corsa *));
- for(i = 0; i < numRighe; i++) {
- codice[i] = data[i] = stazione[i] = &c[i];
- }
- do {
- printf("\n\nCosa vorresti fare? Digitare il numero per attivare le corrispondenti operazioni.\n"
- "1) stampa a video i contenuti del log;\n"
- "2) stampa su file i contenuti del log;\n"
- "3) ordinamento per data, ora;\n"
- "4) ordinamento per codice tratta;\n"
- "5) ordinamento per stazione partenza;\n"
- "6) ricerca tratta per stazione di partenza (anche parziale);\n");
- scanf("%d", &com);
- switch (com) {
- case 1: {
- primaStampa(numRighe,c);
- break;
- }
- case 2: {
- fp = fopen("corseStmp.txt","w");
- for(i = 0; i < numRighe; i++) {
- fprintf(fp,"%s %s %s %s %s %s %s\n",c[i].codice, c[i].partenza, c[i].destinazione, c[i].data, c[i].oraPar, c[i].oraArr, c[i].ritardo);
- }
- fclose(fp);
- break;
- }
- case 3: {
- sortDate(numRighe, data);
- stampa(numRighe, data);
- lastOrd = 'd';
- break;
- }
- case 4: {
- sortTratta(numRighe, codice);
- stampa(numRighe, codice);
- lastOrd = 'c';
- break;
- }
- case 5: {
- sortStazione(numRighe, stazione);
- stampa(numRighe, stazione);
- lastOrd = 's';
- break;
- }
- case 6: {
- corseFromFermata(numRighe,c, lastOrd, numRighe); // la ricerca dicotomica funziona solo se
- // si scrive tutta la fermata, no se รจ parziale
- break;
- }
- default:
- printf("Inserimento errato\n");
- finito = 1;
- break;
- }
- }
- while(finito == 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement