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");
}