PDA

View Full Version : [C] Percentuale di caricamento


Ov3rLo4d
03-11-2009, 17:11
Ciao a tutti,

premetto che il programma è fatto sotto win 7, anche se per quello che sto facendo e devo fare non cambia nulla.

Cmq quello che vorrei fare è la percentuale di caricamento di una parte di codice... Mi spiego meglio. In pratica ho fatto un esercizio con sul selection sort e sull'insertion sort che vengono eseguiti uno di fila all'altro dopo aver terminato l'ordinamento di un array. A me servirebbe sapere come fare per far si che durante l'ordinamento mi dica a che punto è in percentuale e magari anche una barra di caricamento... tutto ciò da terminale, cioè senza grafica o altra roba...

es:

[============ ] |/-|\ 50%

gli slash,back-slash ecc sarebbe quell'affarino che gira durante il caricamento XD

Grazie mille a tutti

wizard1993
03-11-2009, 17:50
non mi pare si possa fare in maniera standard, un sistema "fatto con l'accetta" sarebbe cancellare tutta la consolle (su windows con system("cls");) e poi riscrivere sopra la barra

Ov3rLo4d
03-11-2009, 19:32
perchè il mio problema è che non so come fare a creare un dato statico sullo schermo che si aggiorna...

VICIUS
03-11-2009, 21:56
Intendi qualcosa di simile a questo?
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
for (int i = 0; i < 100; ++i)
{
printf("completato %d\r", i);
fflush(stdout);
sleep(1);
}

return 0;
}

Ov3rLo4d
03-11-2009, 22:33
ciao, spero di si, che sia quello che intendo...

me lo potresti spiegare? ho provato a compilarlo e mi dice che il for va il loop



#EDIT 1


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

void isort(int a[], int n){
int i;
int x=0;
int j=0;
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;
}
}

int main(int argc, char** argv)
{
clock_t start, end, dif;
float tempo=0;
int N=0;
int M=0;
printf("Inserisci la dimensione dell'array: \n");
scanf("%d",&N);
printf("Ora inserisci il range degli elementi: \n");
scanf("%d",&M);

int a[N]; // x isort

// ISORT****************
printf("\n\n\t\t***ISORT***\n\n");
start=clock();
isort(a,N);
end=clock();
dif=end-start;
tempo=(float)dif/(float)CLOCKS_PER_SEC;
for (int i = 0; i < 100; ++i)
{
printf("completato %d\r", i);
fflush(stdout);
sleep(1);
}

return 0;
}


ho messo il sorgente per far funzionare l'insertion sort...

In pratica oltre a far misurare il tempo vorrei una barra di caricamento con percentuale...

es: [======== ========] 50%

VICIUS
03-11-2009, 23:25
Il codice è semplice. printf usa \r per tornare indietro e fflush forza l'output in caso il terminale abbia un suo buffer interno. Ovviamente non basta fare copia e incolla per fare quello che vuoi te. devi modificare il codice del sort perché si preoccupi di aggiornare la barra di avanzamento mentre sta ordinando.

Ov3rLo4d
04-11-2009, 11:00
SOLUZIONE TROVATA:


#include <stdio.h>
#include <unistd.h>

typedef enum
{
false=0,
true=!false
} bool;

typedef struct
{
/* Delimitatore iniziale (es. [ )*/
char StartDelimiter;
/* Delimitatore finale (es. ] )*/
char EndDelimiter;
/* Blocco centrale (es. = )*/
char Block;
/* Ultimo blocco (es. > ) */
char CurBlock;
/* Flag che indica se mostrare la percentuale di avanzamento o meno */
bool PrintPercent;
} ProgressBarSettings;


void PrintProgressBar(unsigned int Width, double Max, double Pos, bool update, ProgressBarSettings * Settings);

int main()
{
int i;
/* Inizializza le impostazioni della barra */
ProgressBarSettings pbs;
pbs.StartDelimiter='[';
pbs.EndDelimiter=']';
pbs.Block='=';
pbs.CurBlock='>';
pbs.PrintPercent=true;
printf("Progress: ");
/* Mostra la barra vuota */
PrintProgressBar(40,80,0,false,&pbs);
for(i=0;i<=80;i++)
{
/* Attende la pressione di un tasto (funzione non-standard) */
sleep(1);
/* Aggiorna la barra di avanzamento */
PrintProgressBar(40,80,i,true,&pbs);
}
printf(" Done");
sleep(1);
return 0;
}

void PrintProgressBar(unsigned int Width, double Max, double Pos, bool update, ProgressBarSettings * Settings)
{