Clipper On Line • Ver Tópico - Grafico Barra em Modo Texto

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

 

Grafico Barra em Modo Texto

Mensagempor mauricioportela » 25 Abr 2021 05:13

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:

#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 de usuário

mauricioportela
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 83
Data de registro: 29 Jul 2016 04:22
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 21 vezes

Grafico Barra em Modo Texto

Mensagempor Itamar M. Lins Jr. » 25 Abr 2021 18:50

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.
http://www.pctoledo.com.br/forum/viewtopic.php?f=5&t=14031#p81699
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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Grafico Barra em Modo Texto

Mensagempor JoséQuintas » 25 Abr 2021 19:21

José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Grafico Barra em Modo Texto

Mensagempor mauricioportela » 26 Abr 2021 00:29

Boa noite!

Passando aqui para agradece!

Obrigado Itamar e Quintas!!

Att

Mauricio
Avatar de usuário

mauricioportela
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 83
Data de registro: 29 Jul 2016 04:22
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 21 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 21 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro