Página 1 de 1

Grafico Barra em Modo Texto

Enviado: 25 Abr 2021 05:13
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

Grafico Barra em Modo Texto

Enviado: 25 Abr 2021 18:50
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.

Grafico Barra em Modo Texto

Enviado: 25 Abr 2021 19:21
por JoséQuintas
Aqui tem a da WVG e depois outra puro console.

http://pctoledo.com.br/forum/viewtopic. ... ra+grafico

Grafico Barra em Modo Texto

Enviado: 26 Abr 2021 00:29
por mauricioportela
Boa noite!

Passando aqui para agradece!

Obrigado Itamar e Quintas!!

Att

Mauricio