Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13
  1. #11
    Amaro C++, il gusto pieno dell'undefined behavior.

  2. #12
    Ok, grazie mille a tutti! Ora compila e esegue. Ho fatto ancora qualche piccola modifica...

    Ora mi manca solo mettere la percentuale e mettere il > mentre scorre la barra, es: ==>

    correct source:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <memory.h>
    
    typedef unsigned int uint;
    
    typedef enum
    {
       false, true
    } bool;
    
    typedef struct
    {
       /* Carattere che rappresenta un blocco riempito della barra */
       char   cUnitFillBlock;
       /* Carattere che rappresenta un blocco vuoto della barra */
       char   cUnitEmptyBlock;
       /* Carattere iniziale della barra */
       char   cStartDelimitator;
       /* Carattere finale della barra */
       char   cEndDelimitator;
       /* Numero dei blocchi che costitutiscono la barra */
       uint   nTotalBlocksCount;
       /* Operazioni totali da effettuare */
       uint   nTotalOperations;
       /* Numero di operazioni per blocco */
       double   fOperationsPerBlock;
       /* Numero delle operazione totali effettuate */
       uint   nCurrOperation;
       /* Numero di blocchi "pieni" */
       uint   nFilledBlock;
       /* La barra intesa come stringa (es. "[========]") */
       char*   szBar;
    } ProgressBar;
    
    void InitializeProgressBar( ProgressBar* pPb, uint totBlocks, uint totOperations, char unitBlock, char unitEmptyBlock, char startDel, char endDel );
    void CleanProgressBar( ProgressBar* pPb );
    void ShowProgressBar( ProgressBar* pPb );
    bool UpdateProgressBar( ProgressBar* pPb, uint opToAdd );
    void isort( int a[], int n );
    void ClearScreen();
    
    
    
    int main()
    {
       int i;
       int size=0;
       clock_t start, end, dif;
       printf("Inserici la dimensione dell'array:\n");
       scanf("%d",&size);
       int a[size];
       srand( time(NULL) );
       // Riempie l' array con valori casuali
       for( i=0; i < size; ++i )
          a[i] = rand() % size;
       start=clock();
       isort( a, size );
       end=clock();
       dif=end-start;
       float tempo=(float)dif/(float)CLOCKS_PER_SEC;
       printf("Tempo di esecuzione: %f \n\n",tempo);
       return 0;
    }
    
    void isort( int a[], int n )
    {
       ProgressBar pb;
       int i, x=0, j=0;
       // Imposta i dati interni della barra
       InitializeProgressBar( &pb, 60, n-1, '=', ' ', '[', ']' );
       for( i=1; i<n; i++ )
       {
          x = a[i];
          j = i;
          while( j>0 && (x<=a[j-1]) )
          {
             a[j] = a[j-1];
             j--;
          }
          a[j] = x;
          // Se la barra è cambiata (il numero di blocchi "pieni" è cambiato)
          if( UpdateProgressBar( &pb, 1 ) )
          {
             // Cancella lo schermo
             // system("cls") // per DOS
             ClearScreen(); // per Unix
    
             // Mostra a video la nuova barra
             ShowProgressBar( &pb );
          }
       }
       CleanProgressBar( &pb );
    }
    void InitializeProgressBar( ProgressBar* pPb, uint totBlocks, uint totOperations, char unitBlock, char unitEmptyBlock, char startDel, char endDel )
    {
       // Imposta a 0 il numero di blocchi pieni
       pPb->nFilledBlock   = 0;
       // Imposta il numero dei blocchi totali, il numero totale di operazioni, i caratteri per i delimitatori e per i blocchi
       pPb->nTotalBlocksCount   = totBlocks;
       pPb->nTotalOperations   = totOperations;
       pPb->cUnitFillBlock      = unitBlock;
       pPb->cUnitEmptyBlock   = unitEmptyBlock;
       pPb->cStartDelimitator   = startDel;
       pPb->cEndDelimitator   = endDel;
       // Calcola il numero di operazioni per singolo blocco
       pPb->fOperationsPerBlock = (double)pPb->nTotalOperations / (double)pPb->nTotalBlocksCount;
       // Imposta a 0 il numero delle operazioni effettuate fin' ora
       pPb->nCurrOperation = 0;
       // Alloca memoria per la "barra-stringa", ne imposta i delimitatori e la riempe con blocchi "vuoti"
       pPb->szBar = (char*)malloc( sizeof(char) * pPb->nTotalBlocksCount + 2 + 1 );
       memset( pPb->szBar, pPb->cUnitEmptyBlock, sizeof(char)*(pPb->nTotalBlocksCount + 2 + 1) );
       pPb->szBar[0] = pPb->cStartDelimitator;
       pPb->szBar[ pPb->nTotalBlocksCount + 1] = pPb->cEndDelimitator;
       pPb->szBar[ pPb->nTotalBlocksCount + 2] = '\0';
    }
    
    void CleanProgressBar( ProgressBar* pPb )
    {
       if( pPb->szBar )
          free( pPb->szBar );
       pPb->szBar = NULL;
    }
    
    void ShowProgressBar( ProgressBar* pPb )
    {
       printf( "%s\n", pPb->szBar );
    }
    
    
    bool UpdateProgressBar( ProgressBar* pPb, uint opToAdd )
    {
       uint iCurrLastFilledBlock;
       // Aggiorna il numero delle operazioni effettuate
       pPb->nCurrOperation += opToAdd;
       // Dammi il numero di blocchi pieni secondo il nuovo numero delle operazioni
       iCurrLastFilledBlock = (uint)((double)pPb->nCurrOperation / pPb->fOperationsPerBlock);
       // Se il numero di blocchi pieni (appena calcolato) è maggiore di quello memorizzato
       if( iCurrLastFilledBlock > pPb->nFilledBlock )
       {
          // Aggiorna il numero dei blocchi pieni memorizzato
          pPb->nFilledBlock =  pPb->nCurrOperation / pPb->fOperationsPerBlock;
          // Aggiorna la barra-stringa
          memset( pPb->szBar+1, pPb->cUnitFillBlock, sizeof(char) * pPb->nFilledBlock );
          return true;
       }
       else
          return false;
    }
    
    void ClearScreen() // alternativa per Unix al posto di system("cls") per DOS
    {
        printf("\x1B[2J\x1B[1;1H");
    }

  3. #13
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Cioè vorresti un cosa del genere???
    codice:
    ====> 50%
    ========> 100%
    Se vuoi visualizzare in questo modo la barra, sappi che dovrai modificare una bella parte del codice. Io credevo che ti bastasse una barra di dimensioni fisse con dei delimitatori. Se invece ti va a genio una barra del genere:
    codice:
    [====    ] 50%
    [========] 100%
    Devi modificare le seguenti definizioni :
    codice:
    typedef struct
    {
       // Identico al precedente ...
       /* Percentuale d' avanzamento della barra*/
       uint   nPercentual;
    } ProgressBar;
    
    void InitializeProgressBar( ProgressBar* pPb, uint totBlocks, uint totOperations, char unitBlock, char unitEmptyBlock, char startDel, char endDel )
    {
       pPb->nPercentual      = 0;
       // il resto del codice è identico ...
    }
    
    void ShowProgressBar( ProgressBar* pPb )
    {
       printf( "%s %u%%\n", pPb->szBar, pPb->nPercentual );
    }
    
    bool UpdateProgressBar( ProgressBar* pPb, uint opToAdd )
    {
       uint iCurrLastFilledBlock, nNewPercentual;
       // Aggiorna il numero delle operazioni effettuate
       pPb->nCurrOperation += opToAdd;
       // Calcola la nuova percentuale
       nNewPercentual = (uint)((double)pPb->nCurrOperation / (double)pPb->nTotalOperations * 100.0f);
       // Dammi il numero di blocchi pieni secondo il nuovo numero delle operazioni
       iCurrLastFilledBlock = (uint)((double)pPb->nCurrOperation / pPb->fOperationsPerBlock);
       // Se il numero di blocchi pieni (appena calcolato) è maggiore di quello memorizzato 
       // oppure la percentuale è cambiata
       if( (iCurrLastFilledBlock > pPb->nFilledBlock) || (nNewPercentual > pPb->nPercentual) )
       {
          // Aggiorna la nuova percentuale
          pPb->nPercentual = nNewPercentual;
          // Aggiorna il numero dei blocchi pieni memorizzato
          pPb->nFilledBlock =  pPb->nCurrOperation / pPb->fOperationsPerBlock;
          // Aggiorna la barra-stringa
          memset( pPb->szBar+1, pPb->cUnitFillBlock, sizeof(char) * pPb->nFilledBlock );
          return true;
       }
       else
          return false;
    }
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.