Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 1000
  6.  
  7. typedef struct corsa {
  8. char codice[30];
  9. char partenza[30];
  10. char destinazione[30];
  11. char data[30];
  12. char oraPar[30];
  13. char oraArr[30];
  14. char ritardo[30];
  15. }Corsa;
  16.  
  17. void primaStampa(int num, Corsa *c) {
  18. int i;
  19. for (i = 0; i < num; i++) {
  20. printf("%s %s %s %s %s %s %s\n", c[i].codice, c[i].partenza, c[i].destinazione, c[i].data, c[i].oraPar,
  21. c[i].oraArr, c[i].ritardo);
  22. }
  23. }
  24.  
  25. void stampa(int num, Corsa **c) {
  26. int i;
  27. for(i = 0; i < num; i++) {
  28. 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);
  29. }
  30. }
  31. void sortDate(int num, Corsa **c) {
  32. int i, j;
  33. Corsa *temp;
  34. for(i=0; i<num-1; i++) {
  35. for(j=0; j<num-1-i; j++) {
  36. int gg1, mm1, aa1, gg2, mm2, aa2, d1, d2;
  37. sscanf(c[j]->data,"%d/%d/%d", &gg1, &mm1, &aa1);
  38. d1 = gg1 + 100*mm1 + 10000*aa1;
  39. sscanf(c[j+1]->data,"%d/%d/%d", &gg2, &mm2, &aa2);
  40. d2 = gg2 + 100*mm2 + 10000*aa2;
  41. if(d2<d1) {
  42. temp = c[j];
  43. c[j] = c[j+1];
  44. c[j+1] = temp;
  45. }
  46. else if(d2 == d1) {
  47. int hh1, min1, hh2, min2, ora1,ora2;
  48. sscanf(c[i]->oraArr, "%d:%d", &hh1, &min1);
  49. ora1 = hh1*60+min1;
  50. sscanf(c[i]->oraArr, "%d:%d", &hh2, &min2);
  51. ora2 = hh2*60 + min2;
  52. if(ora1>ora2) {
  53. temp = c[j];
  54. c[j] = c[j+1];
  55. c[j+1] = temp;
  56. }
  57. }
  58. }
  59. }
  60. }
  61.  
  62. void sortTratta(int num, Corsa **c){
  63. int i, j;
  64. Corsa *temp;
  65. for(i=0; i<num-1; i++) {
  66. for(j=0; j<num-1-i; j++) {
  67. if(strcmp(c[j]->codice,c[j+1]->codice) > 0) {
  68. temp = c[j];
  69. c[j] = c[j+1];
  70. c[j+1] = temp;
  71. }
  72. }
  73. }
  74. }
  75. void sortStazione(int num, Corsa **c){
  76. int i, j;
  77. Corsa *temp;
  78. for(i=0; i<num-1; i++) {
  79. for(j=0; j<num-1-i; j++) {
  80. if(strcmp(c[j]->partenza,c[j+1]->partenza) > 0){
  81. temp = c[j];
  82. c[j] = c[j+1];
  83. c[j+1] = temp;
  84. }
  85. }
  86. }
  87. }
  88.  
  89.  
  90. void corseFromFermata(int n, Corsa* c, char lastOrd, int length) {
  91. int i, len1, len, j, k, found;
  92. int r = length - 1;
  93. int l = 0, m;
  94. char fermata[20];
  95. printf("\nDigita il nome della fermata di partenza: ");
  96. scanf("%s", fermata);
  97. len = strlen(fermata);
  98. if(lastOrd != 's') {
  99. for (i = 0; i < n; i++) {
  100. len1 = strlen(c[i].partenza);
  101. if (len == len1) {
  102. if (!strcmp(fermata, c[i].partenza))
  103. printf("%s\n", c[i].codice);
  104. } else {
  105. found = 1;
  106. j = 0;
  107. while (fermata[0] != c[i].partenza[j] && j < len1 - len)
  108. j++;
  109. k = 0;
  110. while (k != len) {
  111. if (fermata[k] != c[i].partenza[j + k])
  112. found = 0;
  113. k++;
  114. }
  115. if (found)
  116. printf("%s\n", c[i].codice);
  117. }
  118. }
  119. }
  120. else {
  121. while (l<=r) {
  122. m = (l+r)/2;
  123. if(strcmp(fermata, c[m].partenza) == 0) {
  124. printf("%s\n", c[m].codice);
  125. break;
  126. }
  127. if(strcmp(fermata, c[m].partenza) < 0)
  128. r = m-1;
  129. if(strcmp(fermata, c[m].partenza) > 0)
  130. l = m+1;
  131. }
  132. }
  133. }
  134.  
  135. int main() {
  136. FILE* fp;
  137. int finito = 0,i;
  138. Corsa c[MAX];
  139. int com;
  140. int numRighe;
  141. char lastOrd; //d = data; c = codice tratta; s = stazione di partenza
  142.  
  143. Corsa **codice, **data, **stazione;
  144.  
  145. fp = fopen("corse.txt","r");
  146. if(fp==NULL) return -1;
  147. fscanf(fp,"%d",&numRighe);
  148.  
  149. for(i = 0; i < numRighe; i++) {
  150. 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);
  151. }
  152. fclose(fp);
  153.  
  154. codice = data = stazione = malloc(numRighe * sizeof(Corsa *));
  155. for(i = 0; i < numRighe; i++) {
  156. codice[i] = data[i] = stazione[i] = &c[i];
  157. }
  158.  
  159. do {
  160. printf("\n\nCosa vorresti fare? Digitare il numero per attivare le corrispondenti operazioni.\n"
  161. "1) stampa a video i contenuti del log;\n"
  162. "2) stampa su file i contenuti del log;\n"
  163. "3) ordinamento per data, ora;\n"
  164. "4) ordinamento per codice tratta;\n"
  165. "5) ordinamento per stazione partenza;\n"
  166. "6) ricerca tratta per stazione di partenza (anche parziale);\n");
  167. scanf("%d", &com);
  168.  
  169. switch (com) {
  170. case 1: {
  171. primaStampa(numRighe,c);
  172. break;
  173. }
  174. case 2: {
  175. fp = fopen("corseStmp.txt","w");
  176. for(i = 0; i < numRighe; i++) {
  177. 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);
  178. }
  179. fclose(fp);
  180. break;
  181. }
  182. case 3: {
  183. sortDate(numRighe, data);
  184. stampa(numRighe, data);
  185. lastOrd = 'd';
  186. break;
  187. }
  188. case 4: {
  189. sortTratta(numRighe, codice);
  190. stampa(numRighe, codice);
  191. lastOrd = 'c';
  192. break;
  193. }
  194. case 5: {
  195. sortStazione(numRighe, stazione);
  196. stampa(numRighe, stazione);
  197. lastOrd = 's';
  198. break;
  199. }
  200. case 6: {
  201. corseFromFermata(numRighe,c, lastOrd, numRighe); // la ricerca dicotomica funziona solo se
  202. // si scrive tutta la fermata, no se รจ parziale
  203. break;
  204. }
  205. default:
  206. printf("Inserimento errato\n");
  207. finito = 1;
  208. break;
  209. }
  210.  
  211. }
  212. while(finito == 0);
  213. return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement