Grafico Barra em Modo Texto

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Grafico Barra em Modo Texto

Mensagem por mauricioportela »

Bom dia!

Alguem conhece alguma lib ou codigo de grafico de barra modo texto? Estou criando um modulo sobre a "lei do primeiro digito" (Lei de Benford/Newcomb). pesquisando na net, não encontrei nenhum código.

Até aqui, consegui fazer isso:

Código: Selecionar todos

#include "box.ch"
// compilar: hbmk2 -lhbct
// ** hbct - log10()
function main()
    local cCorBarE := "R+/N", cCorBarO := "BG+/N"
    local aDigito, aDados
    set decimals to 1
    aDigito := { { 1, LOG10(1+(1/1))*100, "DIG1", cCorBarE }, ;
                 { 2, LOG10(1+(1/2))*100, "DIG2", cCorBarE }, ;
                 { 3, LOG10(1+(1/3))*100, "DIG3", cCorBarE }, ;
                 { 4, LOG10(1+(1/4))*100, "DIG4", cCorBarE }, ;
                 { 5, LOG10(1+(1/5))*100, "DIG5", cCorBarE }, ;
                 { 6, LOG10(1+(1/6))*100, "DIG6", cCorBarE }, ;
                 { 7, LOG10(1+(1/7))*100, "DIG7", cCorBarE }, ;
                 { 8, LOG10(1+(1/8))*100, "DIG8", cCorBarE }, ;
                 { 9, LOG10(1+(1/9))*100, "DIG9", cCorBarE } }

    aDados  := { { 1, 31.1, "DB_1", cCorBarO }, ;
                 { 2, 16.6, "DB_2", cCorBarO }, ;
                 { 3, 14.5, "DB_3", cCorBarO }, ;
                 { 4,  8.6, "DB_4", cCorBarO }, ;
                 { 5,  8.9, "DB_5", cCorBarO }, ;
                 { 6,  7.7, "DB_6", cCorBarO }, ;
                 { 7,  6.8, "DB_7", cCorBarO }, ;
                 { 8,  4.1, "DB_8", cCorBarO }, ;
                 { 9,  4.6, "DB_9", cCorBarO } }

    cls
    @ 00, 00, 50, 132 BOX B_SINGLE + SPACE(1)
    SetMode(50, 132)
    @ 01, 55 SAY "Digito" COLOR "R+/N"
    @ 01, 64 SAY "Probabilidade" COLOR "R+/N"
    for p := 1 to 9
        @ p+1, 58 SAY ALLTRIM(STR(aDigito[p][1]))
        @ p+1, 70 SAY ALLTRIM(STR(aDigito[p][2]))
    next

    // Tentativa em apresentar o grafico na vertical
    // nCol := 2
    // for d := 1 to 9
    //     imprimeBarra( nCol, aDigito[d][2], "", cCorBarE )
    //     nCol += 4
    //     imprimeBarra( nCol,  aDados[d][2], aDados[d][3], cCorBarO )
    //     nCol += 4
    // next

    // Tentativa em apresentar o grafico na horizontal
    TAMANHO := LEN(aDigito)
    nLinha := 12
    for d := 1 to TAMANHO
        imprimeBarra_H( nLinha, aDigito[d][2], aDigito[d][3], cCorBarE )
        nLinha++
        imprimeBarra_H( nLinha, aDados[d][2] , aDados[d][3] , cCorBarO )
        nLinha++
    next
    nLinha++
    @ nLinha, 00
return nil

function imprimeBarra_H( nLinha, nPercent, cTitulo, cCorBar )
    LOCAL nValor
    nValor := int(nPercent)
    @ nLinha, 02 SAY "[ " + cTitulo + " ]" COLOR cCorBar
    nColuna := LEN(cTitulo) + 7
    @ nLinha, nColuna SAY replicate(chr(219)+chr(219),nValor) + " " + ALLTRIM(STR(nPercent)) COLOR cCorBar
return nil

//
// Nota: 
// - a linha 20 serah o piso;
// - a linha 10 serah o teto;
// 
function imprimeBarra( nColuna, nPercent, cTitulo, cCorBar )
    LOCAL nValor
    nValor := (20 - (nPercent/10)) // trabalhando com decimais
    nValor += (nValor - 20) // valor obtido apartir de 20 para 10 **
    nValor += (nValor - 20) // para dobrar o tamanho da barra
    @ 21, nColuna SAY cTitulo COLOR cCorBar
    @ 22, nColuna SAY IF( cTitulo == "", "", alltrim(str(nPercent))) COLOR cCorBar
    for b := 20 to nValor step -1
        @ b, nColuna SAY chr(178) + chr(178) COLOR cCorBar
    next
return nil

//
// TODO: Funcao: teste Qui Quadrado
//

e o resultado é essa imagem anexa.

Se alguem tiver um codigo pra gerar grafico modo texto e puder compartilhar, eu agradeceria muito.

Obrigado!!

Att

Mauricio
Anexos
tela_grafico_horizontal.png
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Grafico Barra em Modo Texto

Mensagem por Itamar M. Lins Jr. »

Olá!
Tem um livro antigo, "111 funções do Clipper" de Ramalho. Vem alguns gráficos para CONSOLE.
Vou ver se encontro aqui o PRG.
https://pctoledo.org/forum/viewto ... 031#p81699

Código: Selecionar todos

GRAFHOR2()
INKEY(0)

PRIVATE M[12,2]

M[1,1]=100
M[2,1]=200
M[3,1]=300
M[4,1]=400
M[5,1]=250
M[6,1]=335
M[7,1]=050
M[8,1]=220
M[9,1]=360
M[10,1]=390
M[11,1]=215
M[12,1]=280


M[1,2]="JAN"
M[2,2]="FEV"
M[3,2]="MAR"
M[4,2]="ABR"
M[5,2]="MAI"
M[6,2]="JUN"
M[7,2]="JUL"
M[8,2]="AGO"
M[9,2]="SET"
M[10,2]="OUT"
M[11,2]="NOV"
M[12,2]="DEZ"

GRAFV2(M,.T.,"EVOLUCAO MENSAL DE VENDAS","EM MILHARES DE PECAS",;
       "MEGATRON ASSESSORIA E TREINAMENTO")
inkey(0)

ASIZE(M,6)
GRAFV2(M,.F.,"EVOLUCAO SEMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
       "REGIAO DE SAO PAULO")

inkey(0)
ASIZE(M,3)
GRAFV2(M,.T.,"EVOLUCAO TRIMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
       "REGIAO DE SAO PAULO")

INKEY(0)

PRIVATE M[12,2]

M[1,1]=100
M[2,1]=200
M[3,1]=300
M[4,1]=400
M[5,1]=250
M[6,1]=335
M[7,1]=050
M[8,1]=220
M[9,1]=360
M[10,1]=390
M[11,1]=215
M[12,1]=280


M[1,2]="JAN"
M[2,2]="FEV"
M[3,2]="MAR"
M[4,2]="ABR"
M[5,2]="MAI"
M[6,2]="JUN"
M[7,2]="JUL"
M[8,2]="AGO"
M[9,2]="SET"
M[10,2]="OUT"
M[11,2]="NOV"
M[12,2]="DEZ"



GRAFV1(M,.T.,"EVOLUCAO MENSAL DE VENDAS","EM MILHARES DE PECAS",;
       "MEGATRON ASSESSORIA E TREINAMENTO")

inkey(0)

ASIZE(M,6)
GRAFV1(M,,"EVOLUCAO SEMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
       "REGIAO DE SAO PAULO")

inkey(0)
ASIZE(M,3)
GRAFV1(M,.T.,"EVOLUCAO TRIMESTRAL DE VENDAS","EM MILHARES DE PECAS",;
       "REGIAO DE SAO PAULO")

INKEY(0)

GRAFHOR1()
INKEY(0)
GRAFHOR1("RECEITA","RECEITA DA FILIAL SAO PAULO")


******************************************************************
FUNCTION GRAFV1(V,MOSTRAVAL,TITULO1,TITULO2,TITULO3)
SAVE SCREEN TO TGV1
CLEAR
MOSTRAVAL=IF(MOSTRAVAL=NIL,.F.,.T.)
TAM=LEN(V) ; LARG:= 60/TAM        //IF(TAM<=7,7,5)
M1={CHR(240),CHR(177),CHR(178),CHR(219),CHR(220),CHR(221), ;
    CHR(240),CHR(197),CHR(206),"*"     ,"X"     ,"+"}

PORC:=  T:=0
FOR I = 1 TO TAM
 PORC=IF( PORC <= V[I,1],V[I,1],PORC)
NEXT
 ESCALA = PORC / 5
 PORC1=PORC
 NUM:= NUM1:= NUM2:=0
 FOR NUM= 1 TO 21 STEP 4
   @ NUM,0 SAY STR(PORC,4)
    PORC = PORC - ESCALA
 NEXT
 FOR I = 1 TO 20
    @ I,5 SAY CHR(179)
 NEXT
 @ I,5 SAY CHR(192) + REPL(CHR(196),72)
 T=6-LARG
 FOR I = 1 TO TAM
  @ 22,T+LARG+1 SAY LEFT(V[I,2],LARG)
  POS =INT(V[I,1]*20/PORC1) ; BAR=20-POS+1
  FOR J=20 TO BAR STEP-1
    @ J,T+LARG+1 SAY REPL(M1[I],LARG)
  NEXT
   IF MOSTRAVAL=.T.
      @ BAR,T+LARG+(LARG/2) SAY STR(V[I,1],3)
   ENDIF
  T=T+ LARG+1
 NEXT

IF TITULO1<>NIL
 POSINI=(80-LEN(TITULO1))/2
 @ 23,POSINI SAY TITULO1
ENDIF
IF TITULO2<>NIL
 POSINI=(80-LEN(TITULO2))/2
 @ 24,POSINI SAY TITULO2
ENDIF
IF TITULO3<>NIL
 POSINI=(80-LEN(TITULO3))/2
 @ 0,POSINI SAY TITULO3
ENDIF
INKEY(0)
RESTORE SCREEN FROM TGV1

***************************************************
FUNCTION GRAFV2(V,MOSTRAVAL,TITULO1,TITULO2,TITULO3)
SAVE SCREEN TO TGV2
CLEAR
SET DEVICE TO PRINTER
TAM=LEN(V) ; PRIVATE BAR[TAM,3]  ; LARG:= 60/TAM
M1={"*","X","+","@","#","$","^","|","\",":","/",">"}
PORC:=0 ; T=6-LARG
FOR I = 1 TO TAM
 PORC=IF( PORC <= V[I,1],V[I,1],PORC)
NEXT
 ESCALA = PORC / 5
 PORC1=PORC
 NUM:= NUM1:= NUM2:=0

@ PROW(),0 SAY "|"+REPL("-",78)+"|"
@ PROW()+1,0 SAY "|"
POSINI=(79-LEN(TITULO1))/2
@ PROW(),POSINI SAY TRIM(TITULO1)
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"

FOR I = 1 TO TAM
  POS =INT(V[I,1]*20/PORC1) ; BAR[I,1]=23-POS+1
  BAR[I,2]=IF(I=1,8,BAR[I-1,2]+LARG+1)
NEXT
FOR I = PROW() TO 23
DO CASE
 CASE PROW()=4
  LINHA="|"+STR(PORC,4) +" |"
  PORC=PORC-ESCALA
 CASE PROW()=8
   LINHA="|"+STR(PORC,4)+" |"
   PORC=+PORC-ESCALA
 CASE PROW()=12
   LINHA="|"+STR(PORC,4)+" |"
   PORC=+PORC-ESCALA
 CASE PROW()=16
   LINHA="|"+STR(PORC,4)+" |"
   PORC=PORC-ESCALA
 CASE PROW()=20
   LINHA="|"+STR(PORC,4)+" |"
   PORC=PORC-ESCALA
 CASE PROW()=24
   LINHA="|"+STR(PORC,4)+" |"
   PORC=PORC-ESCALA
 OTHERWISE
   LINHA="|     |"
ENDCASE
   LINHA=LINHA+SPACE(72)+"|"
 FOR J= 1 TO TAM
  IF BAR[J,1]<=PROW()
    LINHA=STUFF(LINHA,BAR[J,2],LARG+1,REPL(M1[J],LARG)+" ")
   IF BAR[J,3]=NIL .AND. MOSTRAVAL =.T.
    LINHA=STUFF(LINHA,BAR[J,2],4,STR(V[J,1],4))
    BAR[J,3]=.F.
   ENDIF
  ENDIF
 NEXT
 @ PROW(),0 SAY LINHA
 @ PROW()+1,0 SAY ""
NEXT
 @ PROW(),0 SAY "|   0 "+REPL("-",73)+"|"
 @ PROW()+1,0 SAY "|"
 FOR I = 1 TO TAM
  @ PROW(),BAR[I,2] SAY LEFT(V[I,2],LARG)
 NEXT
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
IF TITULO2<>NIL
 POSINI=(80-LEN(TITULO2))/2
 @ PROW()+1,0 SAY "|"
 @ PROW(),POSINI SAY TRIM(TITULO2)
 @ PROW(),79 SAY "|"

ENDIF
IF TITULO3<>NIL
 POSINI=(80-LEN(TITULO3))/2
 @ PROW()+1,0 SAY "|"
 @ PROW(),POSINI SAY TRIM(TITULO3)
 @ PROW(),79 SAY "|"
ENDIF
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
RESTORE SCREEN FROM TGV2
EJECT
SET DEVICE TO SCREEN




           ****
           ****
           ****

******************************************************
FUNCTION GRAFHOR1(ARQUIVO,TITULO)
IF ARQUIVO=NIL
  ARQ="GRAFBAR.DBF"
  ELSE
  ARQ=ARQUIVO+".DBF"
ENDIF
IF TITULO=NIL
 TITULO="PRESSIONE AS SETAS SUPERIOR E INFERIOR PARA VER MAIS"
ENDIF
SAVE SCREEN TO GRH1
CLEAR
IF FILE("&ARQ")
  USE (ARQ)
 ELSE
  @ 23,10 SAY "ARQUIVO DE PARAMETROS NAO ENCONTRADO"
  INKEY(2)
  RETURN NIL
ENDIF
MAIOR=VALOR
MENOR=VALOR
TAMMAX=65
MEIO=TAMMAX/2+10
tamanho=lastrec()
PRIVATE M[2,TAMANHO] ,G[TAMANHO]
for i = 1 to tamanho
   MAIOR=MAX(MAIOR,VALOR)
   MENOR=MIN(MENOR,VALOR)
   m[1,I]=legenda
   m[2,I]=valor
   SKIP
NEXT
MEDIA=MAIOR-MENOR

FOR I = 1 TO TAMANHO
M[1,I]=LEFT(M[1,I],7)+" "+REPL( cHR(176),(M[2,I]-MENOR)/MEDIA*TAMMAX+1 )+;
   STR(M[2,I],4)
NEXT


@ 09,0 TO 19,79
@ 20   ,9 SAY CHR(24)
@ ROW(),MEIO SAY CHR(24)
@ ROW(),75 SAY CHR(24)
@ 21   ,5 SAY MENOR PICT '99999'
@ 21   ,MEIO-3 SAY MEDIA PICT '99999'
@ 21   ,TAMMAX+5 SAY MAIOR PICT '99999'
@ 22   ,0 TO 24,79 DOUBLE
POSINI=(80-LEN(TITULO))/2
@ 23,POSINI SAY TITULO


* Retire os astericos das linhas abaixo se quiser mostrar o grafico
* na cor branca e azul e sem mostrar o cursor da funcao achoice()

*CORANTIG=SETCOLOR()
*SETCOLOR("W/B,W/B")

A=ACHOICE(10,01,18,78,M[1],,,9,8)
*SET COLOR TO &CORANTIG
RESTORE SCREEN FROM GRH1


FUNCTION GRAFHOR2(ARQUIVO,TITULO,CENTRALIZA)
IF ARQUIVO=NIL
  ARQ="GRAFBAR.DBF"
  ELSE
  ARQ=ARQUIVO+".DBF"
ENDIF
IF TITULO=NIL
 TITULO="TESTE DE GRAFICO"
ENDIF
IF CENTRALIZA=NIL
 CENTRALIZA=.T.
ENDIF
SAVE SCREEN TO GRH2
IF FILE("&ARQ")
  USE (ARQ)
 ELSE
  @ 23,10 SAY "ARQUIVO DE PARAMETROS NAO ENCONTRADO"
  INKEY(2)
  restore screen from grh2
  release grh2
  RETURN NIL
ENDIF
QTD=LASTREC()
IF QTD>58
  @ 23,10 SAY "MAIS DE 58 ELEMENTOS NAO PODEM SER EXIBIDOS.."
  INKEY(2)
  RESTORE SCREEN FROM GRH2
  RETURN NIL
ENDIF
MAIOR=VALOR
MENOR=VALOR
TAMMAX=65
MEIO=TAMMAX/2+10
DO WHILE .NOT. EOF()
   MAIOR=MAX(MAIOR,VALOR)
   MENOR=MIN(MENOR,VALOR)
   SKIP
ENDDO
MEDIA=MAIOR-MENOR

GOTO TOP
IF QTD<58 .AND. CENTRALIZA
 LININI=(66-(QTD+8))/2-1
 ELSE
  LININI=1
ENDIF
SET DEVICE TO PRINTER
@ LININI,0 SAY " "
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
DO WHILE .NOT. EOF()
 LINHA="|"+LEFT(LEGENDA,7)+" "+REPL("*",(VALOR-MENOR)/MEDIA*TAMMAX+1 )+;
  STR(VALOR,4)
 LINHA+=REPL(" ",79-LEN(LINHA))+"|"
 @ PROW()+1,0 SAY LINHA
 SKIP
ENDDO

@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
@ PROW(),9 SAY "^"
@ PROW(),MEIO SAY "^"
@ PROW(),75 SAY "^"
@ PROW()+1,0 SAY "|"
@ PROW(),5 SAY MENOR PICT '99999'
@ PROW(),MEIO-3 SAY MEDIA PICT '99999'
@ PROW(),TAMMAX+5 SAY MAIOR PICT '99999'
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"
POSINI=(79-LEN(TITULO))/2
@ PROW(),POSINI SAY TRIM(TITULO)
@ PROW(),79 SAY "|"
@ PROW()+1,0 SAY "|"+REPL("-",78)+"|"
EJECT
SET DEVICE TO SCREEN
RESTORE SCREEN FROM GRH2
RELEASE GRH2
RETURN NIL
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Grafico Barra em Modo Texto

Mensagem por JoséQuintas »

Aqui tem a da WVG e depois outra puro console.

http://pctoledo.com.br/forum/viewtopic. ... ra+grafico
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Grafico Barra em Modo Texto

Mensagem por mauricioportela »

Boa noite!

Passando aqui para agradece!

Obrigado Itamar e Quintas!!

Att

Mauricio
Responder