Advertisement
daniele2013

complessità funzioni del fun.h del progetto dev c++

Apr 8th, 2014
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.51 KB | None | 0 0
  1. #include "fun.h"
  2. /*DANIELE PUOI FARE IL COMPLESSO */
  3. void check_exit(struct strada rotatoria[N_P],int* time, int* log){ //Funzione di uscita delle macchine
  4.    int i;
  5.    if (*log!=0){
  6.         FILE *fp=fopen("log_uscite.txt", "a");
  7.         for(i=1;i<6;i++) // Controlliamo i N_S posti che intersecano le strade con la rotatoria
  8.             if(rotatoria[(i*3-1)].car!=NULL && rotatoria[(i*3-1)].car->destinazione==(i-1)){//Le strade si intersecano nella rotatoria nei punti 2-N_S-8-11-N_P la destinazione ? espressa da un numero N 0<=N<=4
  9.                 fprintf(fp,"Tempo %d - L'auto %d uscira' all'uscita %d \n",*time,rotatoria[(i*3-1)].car->targa,rotatoria[(i*3-1)].car->destinazione);
  10.                 free(&(rotatoria[(i*3-1)].car)); // Liberiamo l'indrizzo della macchina
  11.                 rotatoria[i*3-1].car=NULL; // Segnaliamo che quel posto della rotatoria, ? ora vuoto
  12.         }
  13.         fclose(fp);
  14.     }
  15.     else{
  16.         for(i=1;i<6;i++) // Controlliamo i N_S posti che intersecano le strade con la rotatoria
  17.             if(rotatoria[(i*3-1)].car!=NULL && rotatoria[(i*3-1)].car->destinazione==(i-1)){//Le strade si intersecano nella rotatoria nei punti 2-N_S-8-11-N_P la destinazione ? espressa da un numero N 0<=N<=4
  18.                 printf("Tempo %d - L'auto %d uscira' all'uscita %d \n",*time,rotatoria[(i*3-1)].car->targa,rotatoria[(i*3-1)].car->destinazione);
  19.                 free(&(rotatoria[(i*3-1)].car)); // Liberiamo l'indrizzo della macchina
  20.                 rotatoria[i*3-1].car=NULL; // Segnaliamo che quel posto della rotatoria, ? ora vuoto
  21.             }
  22.     }
  23. }
  24.  
  25. comp_1 - check exit
  26. {
  27.     TEMPO
  28.     La complessità di tempo dipende dal numero di elementi che si controllano nei cicli for sia che log sia 0 che sia diverso da 0;
  29.     dati n elementi da controllare, la complessità asintotica di tempo è O(n).
  30.     SPAZIO
  31.     La struttura dati utilizzata per l'algoritmo si basa su un array di struct (monodimensionale) per cui la complessità di spazio è pari
  32.     alla sua dimensione ( O(N_P) )
  33. }
  34.  
  35. /*DANIELE PUOI FARE IL COMPLESSO */
  36. void check_enter(struct strada rotatoria[N_P], struct strada *confluenti[N_S]){ //Funzione di entrata delle macchine
  37.   int i;
  38.   for (i=1;i<6;i++)
  39.       if(confluenti[i-1]!=NULL)
  40.           if(rotatoria[(i*3-1)].car==NULL){
  41.               rotatoria[(i*3-1)].car=confluenti[i-1]->car;
  42.               struct strada *tmp=(struct strada*)&confluenti[i-1]; //Salviamo il top in una variabile temporanea
  43.               confluenti[i-1]=confluenti[i-1]->next; // Il prossimo pezzo di strada diventa il top
  44.               free(tmp); // Svuotiamo al variabile temporanea
  45.           }
  46.  
  47.  
  48. }
  49.  
  50. comp_2 - check enter
  51. {
  52.     TEMPO
  53.     La complessità di tempo dipende dal numero di elementi che si controllano nel ciclo for;
  54.     dati n elementi da controllare, la complessità asintotica di tempo è O(n).
  55.     SPAZIO
  56.     La struttura dati utilizzata per l'algoritmo si basa su un array di struct (monodimensionale), ed inoltre la variabile temporanea creata
  57.     viene deallocata subito per cui la complessità di spazio è pari alla dimensione dell'array    ( O(N_P) )
  58. }
  59.  
  60. /*DANIELE PUOI FARE IL COMPLESSO */
  61. void shift_L(struct strada rotatoria[N_P]){ //Funzione che simula la circolazione, in senso antiorario, della rotatoria
  62.   int x;
  63.   struct strada a;
  64.   a=rotatoria[0];
  65.   for (x=0;x<14;x++)
  66.       rotatoria[x]=rotatoria[x+1];
  67.   rotatoria[14]=a;
  68.  
  69. }
  70.  
  71. comp_3 - shift L
  72. {
  73.     TEMPO
  74.     La complessità di tempo dipende dal numero di elementi che si controllano nel ciclo for;
  75.     dati n elementi da controllare, la complessità asintotica di tempo è O(n).
  76.     SPAZIO
  77.     La struttura dati utilizzata per l'algoritmo si basa su un array di struct (monodimensionale) per cui la complessità si spazio è pari
  78.     alla sua dimensione ( O(N_P) )
  79. }
  80.  
  81. /*Inserisce nella strada N[0-4] una nuova macchina in coda
  82. Se nessuna macchina ? presenta la testa viene reindirizzata a quella macchina.
  83. */
  84. /*DANIELE PUOI FARE IL COMPLESSO */
  85. void new_car(struct strada *road){
  86.     int x=0;
  87.     road->car=malloc(sizeof(struct macchina));
  88.     printf("Inserire destinazione: [0-4]\n");
  89.     while(x<0 || x>4 || scanf("%d",&x)!=1){
  90.         while (getchar() != '\n');
  91.         printf("Input non valido, reinserire la destinazione\n");
  92.         scanf("%d", &x);
  93.     }
  94.     road->car->destinazione=x;
  95.     printf("Inserire targa:\n");
  96.     scanf("%d",&(road->car->targa));
  97. }
  98.  
  99. comp_4 - new car
  100. {
  101.     TEMPO
  102.     L'algoritmo prende in input un numero e controlla se esso è valido (cioè se è compreso tra 0 e 4, inclusi).
  103.     La complessità di tempo dell'algoritmo dipende da quante volte si inserisce un numero illegale, arrivando ad una costante.
  104.     SPAZIO
  105.     Nell'algoritmo si alloca semplicemente una singola struct, perciò la complessità spaziale è costante.
  106. }
  107.  
  108. /*DANIELE PUOI FARE IL COMPLESSO */
  109. void stampa_lista(struct strada *head){ //Funzione che stampa tutte le macchine presenti in una strada
  110.     if(head!=NULL){
  111.         printf("%d/%d-->", head->car->destinazione, head->car->targa);
  112.         stampa_lista(head->next);
  113.     }
  114.     else
  115.         printf("fine coda\n");
  116. }
  117.  
  118. comp_5 - stampa lista
  119. {
  120.     TEMPO
  121.     L'algoritmo stampa in modo ricorsivo una lista presa in input; la sua complessità temporale dipende da quanti elementi ci sono nella lista.
  122.     Con n elementi, la complessità asintotica di tempo è O(n).
  123.     SPAZIO
  124.     Nell'algoritmo non vengono allocate o create variabili ma viene solo letta una lista come parametro, perciò la complessità di spazio dell'algoritmo
  125.     è O(n) con n dimensione ipotetica della lista.
  126. }
  127.  
  128. void new_road(struct strada *head[N_S], int numero_strada){ //Funzione utilizzata per inizializzare le strade
  129.     struct strada *tmp=head[numero_strada];
  130.     if (head[numero_strada]== NULL){
  131.         head[numero_strada]=(struct strada *)malloc(sizeof(struct strada));
  132.         new_car(head[numero_strada]);
  133.         head[numero_strada]->next=NULL;
  134.         return;
  135.     }
  136.     while(tmp->next!=NULL)
  137.         tmp=tmp->next;
  138.     tmp->next=(struct strada *)malloc(sizeof(struct strada));
  139.     tmp->next->next=NULL;
  140.     tmp=tmp->next;
  141.     new_car(tmp);
  142. }
  143.  
  144. comp_6 - new road
  145. {
  146.     TEMPO
  147.     La funzione controlla se ci sono elementi nell'array di puntatori a struct head[N_S]; se non è così, si alloca una struct e si richiama la funzione
  148.     new_car che ha complessità costante. Poi si scorre la lista finchè non si trova la coda e poi si richiama la funzione new_car.
  149.     Al più, la complessità asintotica di tempo corrisponde a O(n) dato dallo scorrere della lista avvenuto nel ciclo while, dove n è la dimensione
  150.     ipotetica della lista.
  151.     SPAZIO
  152.     La funzione prende in input un array di struct e crea nuovi elementi sia che l'if sia valutato vero e sia dopo in ciclo while.
  153.     Al più, la complessità asintotica di spazio corrisponde alla dimensione effettiva dell'array e cioè è un O(N_S).
  154. }
  155.  
  156. /*DANIELE PUOI FARE IL COMPLESSO */
  157. void stampa_situazione(struct strada *confluenti[N_S], struct strada rotatoria[N_P]){ //Funzione di stampa della situazione presente nella rotatoria
  158.     int i;
  159.     system("cls");
  160.     printf(" ");
  161.     for (i=0;i<N_S;i++){
  162.         printf("      |");
  163.         if(confluenti[i] !=NULL)
  164.             printf("CAR");
  165.         else printf("___");
  166.             printf("| ");
  167.     }
  168.     printf("\n");
  169.     for (i=0;i<N_P;i++)
  170.         printf("----");
  171.     printf("\n");
  172.     for (i=0;i<N_P;i++)
  173.         if (rotatoria[i].car!=NULL)
  174.             printf("%d%d ", rotatoria[i].car->destinazione, rotatoria[i].car->targa);
  175.     else
  176.         printf("___ ");
  177.     printf("<--\n");
  178.     for (i=0;i<N_P;i++)
  179.         printf("----");
  180.     printf("\n");
  181.     for (i=0;i<N_P;i++)
  182.         printf("   |");
  183.     printf("\n");
  184.     for (i=0;i<N_P;i++)
  185.         printf(" %X  ",i+1);
  186.     printf("\n");
  187.     for (i=0;i<N_S;i++){
  188.         printf("Ingressi futuri strada %d: ",i);
  189.         stampa_lista(confluenti[i]);
  190.         printf("\n");
  191.     }
  192.     printf("\n\n\n");
  193. }
  194.  
  195. comp_7 - stampa situazione
  196. {
  197.     TEMPO
  198.     Nell'algoritmo vengono usati più volte dei cicli for per scorrere e stampare gli elementi degli array di struct, ma mai in modo innestato,
  199.     perciò la complessità asintotica di tempo è O(N_P + N_S).
  200.     SPAZIO
  201.     Nell'algoritmo non vengono create variabili aggiuntive, ma si fa uso di array di struct presi in input come parametri.
  202.     Perciò la complessità di spazio dell'algoritmo è pari alla somma delle dimensioni dei due array arrivando a O(n) con n = N_P + N_S.
  203. }
  204.  
  205. /*DANIELE PUOI FARE IL COMPLESSO */
  206. void RCG(struct strada rotatoria[N_P]){// Random Car Generator
  207.    int i;
  208.    srand(time(NULL));
  209.    for(i=0;i<N_P;i++){
  210.        free(rotatoria[i].car);
  211.        rotatoria[i].car=NULL;
  212.    }
  213.    printf("\nGenerazione casuale rotatoria");
  214.    int check;
  215.    for (i=0;i<N_P;i++){
  216.        if(rand()%N_S>=rand()%N_S){
  217.            rotatoria[i].car=(struct macchina *)malloc(sizeof(struct macchina));
  218.            rotatoria[i].car->destinazione=rand()%N_S;
  219.            check=rand()%100;
  220.             (check<10) ? check*=10 : 0;// Controlla che nessuna targa sia inferiore a 10
  221.            rotatoria[i].car->targa=check;
  222.            Sleep(200);
  223.            printf(".");
  224.        }
  225.    }
  226.    printf("\n");
  227. }
  228.  
  229. comp_8 - rcg
  230. {
  231.     TEMPO
  232.     La complessità di tempo dipende dal numero di elementi che si controllano nei due cicli for;
  233.     la complessità totale è la somma delle complessità dei due cicli for, cioè O(N_P).
  234.     SPAZIO
  235.     La struttura dati utilizzata per l'algoritmo si basa su un array di struct (monodimensionale) per cui la complessità si spazio è pari
  236.     alla sua dimensione ( O(N_P) )
  237. }
  238.  
  239. /*DANIELE PUOI FARE IL COMPLESSO */
  240. struct strada *rimuovi_elem(struct strada* head, int targa, int *trovato){ //Funzione che cerca e rimuove una macchina con una certa targa in una strada
  241.   if(head!=NULL){
  242.       struct strada *tmp;
  243.       if(head->car->targa==targa){
  244.           free(head->car);
  245.           tmp=head->next;
  246.           free(head);
  247.           *trovato=1;
  248.           return tmp;
  249.       }
  250.       head->next=rimuovi_elem(head->next, targa, trovato);
  251.   }
  252.   return head;
  253. }
  254.  
  255. comp_9 - rimuovi elem
  256. {
  257.     TEMPO
  258.     L'algoritmo rimuove, agendo in modo ricorsivo, un elemento da una lista;
  259.     perciò la complessità asintotica temporale dipende da quanti elementi ci sono nella lista, nel caso peggiore è O(n) dove n è il numero di elementi.
  260.     SPAZIO
  261.     L'algoritmo si basa su una struttura dati della forma di una lista; la complessità di spazio per cui è O(n) dove n è il numero di nodi.
  262. }
  263.  
  264. /*DANIELE PUOI FARE IL COMPLESSO */
  265. void remove_car(struct strada *confluenti[N_S]){ //Funzione che cerca e rimuove una macchina con una certa targa nelle varie strade
  266.     int targa, i, trovato=0;
  267.     printf("\nInserire la targa della macchina da rimuovere:");
  268.     scanf("%d",&targa);
  269.     for(i=0;i<N_S;i++){
  270.       confluenti[i]=rimuovi_elem(confluenti[i], targa, &trovato);
  271.       if(trovato==1)
  272.             return;
  273.     }
  274.     printf("Macchina non trovata\n");
  275. }
  276.  
  277. comp_10 - remove car
  278. {
  279.     TEMPO
  280.     Nell'algoritmo c'è un ciclo for in cui si richiama ad ogni iterazione la funzione rimuovi_elem;
  281.     la complessità asintotica complessiva dell'algoritmo dipende dal numero di confronti effettuati nel ciclo e cioè dalla dimensione dell'array di struct
  282.     ossia O(N_S).
  283.     SPAZIO
  284.     La struttura dati utilizzata per l'algoritmo si basa su un array di struct (monodimensionale) per cui la complessità si spazio è pari
  285.     alla sua dimensione ( O(N_S) )
  286. }
  287.  
  288. /*DANIELE PUOI FARE IL COMPLESSO */
  289. void read_file(struct strada rotatoria[N_P]){ //Funzione che legge una situazione iniziale da file
  290.     int i, x, t=0;
  291.     FILE *fp=fopen("situazione.txt", "r");
  292.     for(i=0;i<N_P;i++){
  293.        free(rotatoria[i].car);
  294.        rotatoria[i].car=NULL;
  295.     }
  296.     if(fp!=NULL){
  297.         printf("\nCaricamento rotatoria");
  298.         for(i=0; i<N_P; i++){
  299.             fscanf(fp, "%d", &x);
  300.             if(x>0){
  301.                 while(x>=100){
  302.                     x=x-100;
  303.                     t++;
  304.                 }
  305.                 rotatoria[i].car=malloc(sizeof(struct macchina));
  306.                 rotatoria[i].car->targa=x;
  307.                 rotatoria[i].car->destinazione=t;
  308.                 x=t=0;
  309.                 Sleep(200);
  310.                 printf(".");
  311.             }
  312.         }
  313.         printf("\n");
  314.         fclose(fp);
  315.     }else
  316.         printf("Impossibile aprire il file\n");
  317. }
  318.  
  319. comp_11 - read file
  320. {
  321.     Nell'algoritmo si apre un file e si legge ciò che c'è dentro;
  322.     la complessità dipende da se esiste il file;
  323.     se non esiste, essa è uguale a O(N_P) che deriva dal primo for, mentre se viene aperto il file, ad essa va sommata la complessità derivante dal ciclo
  324.     for che a sua volta richiama un ciclo while che termina appena il controllo viene soddisfatto, cioè subito.
  325.     La complessità asintotica temporale totale nel caso peggiore (file aperto) è uguale a:
  326.     O(N_P) + O(N_P)= O(N_P).
  327.     SPAZIO
  328.     La complessità asintotica di spazio dipende dalla struttura dati utilizzata e cioè un array di struct monodimensionale. Perciò essa
  329.     corrisponde a O(N_P).
  330. }
  331.  
  332. void save_file(struct strada rotatoria[N_P]){ //Funzione che salva la situazione attuale in un file
  333.     int i;
  334.     FILE *fp=fopen("situazione.txt", "w");
  335.     if(fp!=NULL){
  336.         printf("\nSalvataggio rotatoria");
  337.         for (i=0; i<N_P; i++){
  338.             if (rotatoria[i].car!=NULL)
  339.                 fprintf(fp, "%d%d ", rotatoria[i].car->destinazione, rotatoria[i].car->targa);
  340.             else
  341.                 fprintf(fp, "0 ");
  342.         }
  343.         printf("\n");
  344.         fclose(fp);
  345.         system("notepad.exe situazione.txt");
  346.     }else
  347.         printf("Impossibile aprire il file\n");
  348. }
  349.  
  350. comp_12 - save file
  351. {
  352.     TEMPO
  353.     La funzione legge i dati presenti nell'array di struct e li salva in un file, se è possibile aprirlo in scrittura;
  354.     perciò la complessità asintotica di spazio nel caso peggiore (file aperto) dipende dalla dimensione dell'array (N_P)
  355.     arrivando al più a O(N_P).
  356.     SPAZIO
  357.     L'algoritmo scorre i dati presenti in un array di struct e li scrive se è possibile su un file di testo;
  358.     al più, la complessità asintotica di spazio arriva a O(N_P) dove N_P è la dimensione dell'array.
  359. }
  360.  
  361. /*DANIELE PUOI FARE IL COMPLESSO */
  362. void pulizia(struct strada rotatoria[N_P], struct strada *confluenti[N_S]){ //Funzione utilizzata per deallocare tutte le strutture allocate
  363.     pulizia_rotatoria(rotatoria);
  364.     pulizia_strada(confluenti[0]); //Richiamando la funzione in questo modo senza utilizzare un for, sono state risparmiate 6 iterazioni, ovvero i controlli del for
  365.     pulizia_strada(confluenti[1]);
  366.     pulizia_strada(confluenti[2]);
  367.     pulizia_strada(confluenti[3]);
  368.     pulizia_strada(confluenti[4]);
  369. }
  370.  
  371. comp_13 - pulizia
  372. {
  373.     TEMPO
  374.     La funzione è scritta apposta per non inserire cicli, in questo modo si accede ai dati in modo diretto, come è possibile fare con un array.
  375.     Per cui, la complessità asintotica di tempo è costante.
  376.     SPAZIO
  377.     L'algoritmo non introduce nuove variabili, ma si basa solamente sull'array dato come parametro alla funzione, per cui la complessità asintotica
  378.     di spazio dipende esclusivamente dalla dimensione dell'array e cioè O(N_P).
  379. }
  380.  
  381. /*DANIELE PUOI FARE IL COMPLESSO */
  382. void pulizia_rotatoria(struct strada rotatoria[N_P]){ //Funzione utilizzata per deallocare le macchine presenti nella rotatoria
  383.     int i;
  384.     for(i=0;i<N_P;i++){
  385.       free(rotatoria[i].car);
  386.       rotatoria[i].car=NULL;
  387.   }
  388. }
  389.  
  390. comp_14 - pulizia rotatoria
  391. {
  392.     TEMPO
  393.     Il ciclo for presente nell'algoritmo scorre ad uno ad uno gli elementi dell'array di struct dato in input alla funzione;
  394.     perciò la complessità di tempo totale è O(N_P) dove N_P è la dimensione dell'array.
  395.     SPAZIO
  396.     L'algoritmo scorre gli elementi dell'array di struct senza ricorrere all'uso e alla creazione di variabili aggiuntive per cui la complessità
  397.     asintotica di spazio totale dipende esclusivamente dalla dimensione dell'array dato in input, ossia O(N_P) con N_P dimensione dell'array.
  398. }
  399.  
  400. /*DANIELE PUOI FARE IL COMPLESSO */
  401. void pulizia_strada(struct strada *head){ //Funzione utilizzata per deallocare le strade e le macchine in esse contenute
  402.     if(head!=NULL){
  403.         pulizia_strada(head->next);
  404.         free(head->car);
  405.         free(head);
  406.     }
  407. }
  408.  
  409. comp_15 - pulizia strada
  410. {
  411.     TEMPO
  412.     La funzione dealloca gli elementi dalla lista concatenata data in input, per cui, essendo essa anche ricorsiva, al più si ha una complessità
  413.     asintotica di tempo pari al numero di nodi in esso presenti, e cioè con n elementi si ha un O(n).
  414.     SPAZIO
  415.     L'algoritmo scorre semplicemente in modo ricorsivo i nodi in una lista concatenata, in modo ricorsivo, per deallocarli, per cui la complessità
  416.     asintotica di spazio è al più O(n) con n ipotetico numero di nodi nella lista.
  417. }
  418.  
  419. void impostazioni(int *N, int *W, int *log, struct strada rotatoria[N_P]){ //Funzione utilizzata per aggiungere delle modifiche rispetto al menù principale
  420.      system("cls");
  421.      printf("1 - Numero simulazioni\n2 - Tempo tra ogni istantanea(s)\n3 - Genera casualmente una situazione nella rotatoria\n4 - Salva situazione rotatoria\n5 - Attiva o disattiva l'exit log delle macchine\n");
  422.      int S=0;
  423.      scanf("%d", &S);
  424.      switch(S){
  425.           case 1:
  426.           printf("\nInserire il numero di simulazioni da effettuare: ");
  427.           scanf("%d", N);break;
  428.           case 2:
  429.           printf("\nOgni quanto tempo vuoi che vengano scattate le istantanee? (s)");
  430.           scanf("%d", W);break;
  431.           case 3:
  432.             RCG(rotatoria);break;
  433.           case 4:
  434.             save_file(rotatoria);break;
  435.           case 5:
  436.               if(*log==0)
  437.                 *log=1;
  438.               else *log=0;
  439.               break;
  440.       }
  441.       system("cls");
  442.  }
  443.  
  444.  comp_16 - impostazioni
  445.  {
  446.     TEMPO
  447.     La funzione fa scegliere all'utente un'azione da compiere ed in base ad essa esegue un comando, tra cui anche la chiamata della funzione RCG o
  448.     della funzione save_file; poichè RCG ha complessità O(N_P) e save_file O(N_P), e poichè le altre sono semplici istruzioni atomiche, allora
  449.     la complessità asintotica di tempo nel caso peggiore corrisponde alla chiamata di una delle due funzioni e cioè a O(N_P).
  450.     SPAZIO
  451.     Come nella complessità temporale, anche la complessità spaziale asintotica corrisponde, nel caso peggiore della chiamata di una delle due funzioni,
  452.     a O(N_P).
  453.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement