Jump to content
DanielMor

Ajuda.. Como fazer um grafico

Recommended Posts

DanielMor

boas..

eu sou novo a programar, e estou com um problema num codigo que ando a escrever a dois dias...

É assim, kero fazer um programa que desenhe um graficoxy(escrito) e dados valores de x e de y... ele desenhe os pontos no grafico..

Estou a usar um char array[][] para desenhar o grafico... e o meu problema esta na funçao que verifica onde sao os pontos...

o k ja escrevi foi isto

# include <stdio.h>
main()
{
      int i, j, dist=60, p=0, p2=0;
      float cor1[19]={0,1.82,3.65,5.47,7.30,9.12,10.95,12.77,14.60,16.42,18.24,20.07,21.89,23.72,25.54,27.37,29.20,31.02};
      float cor2[19]={0,0.80,1.51,2.11,2.62,3.03,3.34,3.55,3.67,3.69,3.61,3.42,3.15,2.78,2.31,1.79,1.07,0.30};
      double valor1c=0, vcarcter2=0, vcarcter1=0, vcarter0=0, vcarter00=0;
      char graf[16][60];
      //cria o grafico... 
      for(j=0,i=0;j<14;j++)
      {
             for(i=0;i<60;i++)
             {
                  if(i==0)
                  {   
                      graf[j][0]='|';
                  }
                  else
                  {
                      graf[j][i]=' ';
                  }
             }
      }
      if(j==14)
      {
           for(i=0;i<60;i++)
           {
               graf[14][i]='_';
           }
      }
      j++;
      if(j==15)
      {
           for(i=0;i<60;i++)
           {
           graf[15][i]=' ';
           }
      }
      graf[14][0]='|';
      graf[14][50]=' ';
      graf[14][51]='.';
      graf[14][52]=' ';
      graf[15][50]='|';
      graf[15][51]='_';
      graf[15][52]='|';
     
     valor1c=1.2;
     vcarcter2=valor1c;
     vcarter00=valor1c;
     
     //A minha dificuldade....(deveria verificar onde seriam os pontos)
     for(p=0, p2=0, i=13, j=1, vcarcter1=0, vcarcter2=1.2;p<19; p++)
     {
              if((cor1[p]<vcarcter2)&&(cor1[p]>=vcarcter1))
              {
                               
                               for(p2=0, i=13, vcarter0=0, vcarter00=0 ;p2<19;i--,p2++)
                               {
                                  if((cor2[p2]<vcarter00) && (cor2[p2]>=vcarter0))
                                  {
                                             graf[j][i]='.';
                                       }
                               
                               vcarter0=vcarter0+valor1c;
                               vcarter00=vcarter00+valor1c;
                               }
              }        
              
              j++;
              vcarcter2=vcarcter2+valor1c;
              vcarcter1=vcarcter1+valor1c;
              
     }
     //desenha o grafico
     printf("grafico:\n\n");

      for(j=0,i=0;j<16;j++)
      {
           printf("          ");
                      for(i=0;i<60;i++)
                      {
                                  printf("%c", graf[j][i]);
                                  
                      }
      printf("\n");
      }
      getch();
}

A minha dificuldade é criar ciclos k verifiquem se o x estiver entre vcarcter1 e o vcarcter2.. e se o y estiver entre o vcarter0 e o vcarter00.. entao mudar o caracter dessa possiçao para '.' que sera um ponto no grafico...

Alguem me pode ajudar??

Share this post


Link to post
Share on other sites
bubulindo

Lamento imenso não estar com cabeça agora para analisar, mas deixa-me desde já dar os parabéns pela correcta utilização do fórum. :thumbsup:


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
DanielMor

Obrigado.. Eu so publiquei este post porque tbem estou sem cabeça para pensar...

Mas se pudesses verificar o ciclo for da minha duvida... eu sei que tem la umas variáveis dificies de perceber... mas posso explicar o que escrevi..

Share this post


Link to post
Share on other sites
bubulindo

Eu vejo por ali coisas a mais...  e coisas a menos.

Primeiro, a funcão main retorna um int, logo convém adicionar isso para cortar os warnings... eu sou um pouco OCD acerca dos warnings.

Depois o problema que vejo é em termos de escala... ou seja se quisesses fazer um gráfico com base em tempo, em que de X em X (não variável) tinhas um valor para fazer o gráfico, isto seria simples. Mas da maneira que tens os valores

float cor1[19]={0,1.82,3.65,5.47,7.30,9.12,10.95,12.77,14.60,16.42,18.24,20.07,21.89,23.72,25.54,27.37,29.20,31.02};
torna-se complicado ligar a escala (neste caso X) em inteiro ao valor em float. Percebes?

Repara que no código não tens sequer os valores da escala nos eixos do X e Y... Logo o que penso que está a acontecer é que não estás a conseguir ligar o que pretendes com as limitacões do sistema onde estás a fazer isto. :thumbsup:

Como podes saber onde colocar o ponto X1 em relacão ao ponto X2 se não sabes o espaco relativo que tens entre eles?

Pelo menos a mim, deu-me imensos warnings... e ao ver o que cada um deles era descobri imensas cenas que não parecem fazer sentido. Exemplos:

dist, declarada e nunca usada.

i na linha 82, declarada e nunca usada.

p2 na linha 57, declarada e nunca usada.

vcarter00 na linha 54,

vcacrter2 na linha 53,

vcarter0 na linha8, vcarcter1 na linha 8, valor1c na linha 8 (esta linha é popular),

p na linha 5

Visto isto, convém desde já avisar-te que deves ter uma nomenclatura consistente para as variáveis.

carter, carcter quando querias escrever character não indica muito... mas o ponto que quero focar aqui não é o teu conhecimento ou desconhecimento de inglês. É o facto de teres (para teu bem) de escolher um nome fixo para a variável. Ou é carter ou carcter. Até podia ser Sumo_de_laranja... mas no mesmo programa não ficaria bem teres outra variável chamada Sume_de_maca ou sume_de_ananas. Enfim... pormenores.

Depois não percebi para que serve isto:

valor1c=1.2;

vcarcter2=valor1c;

vcarter00=valor1c;

Quanto ao desenho do gráfico propriamente dito, comeca por:

- Escolher o valor máximo das escalas (podes ver qual é o valor máximo dos dados que tens e escolher esse como o valor máximo da escala.

- Definir o número de intervalos que vais ter em cada eixo, ou seja, quantos caracteres onde podes colocar um ponto vais ter em cada eixo e dividir o valor máximo pelo número de intervalos definido. Assim podes ficar com um valor que indica o incremento por ponto no eixo que servirá para calcular os limites para o posicionamento do ponto.

Depois comecas a correr o eixo dos X e em cada posicão dividindo o valor do Y pelo "valor que indica o incremento por ponto" ficas com a posicão do vector graf onde deves colocar o ponto. no eixo dos X, fazes o mesmo. Confuso?

Não leves a mal perguntar isto, mas tiveste algum dia de fazer um gráfico na escola? Não me estou a referir a um plot de uma funcão, porque aí tu tens os intervalos definidos de início, mas a um gráfico de leituras.

O que escrevi em cima foi como me ensinaram a fazer gráficos na escola prai no 7o ou 8o ano... apenas tentei transpôr para como seria num programa.

Para terminar, para que fizeste isto? 

      graf[14][0]='|';

      graf[14][50]=' ';

      graf[14][51]='.';

      graf[14][52]=' ';

      graf[15][50]='|';

      graf[15][51]='_';

      graf[15][52]='|';

Fica aquele efeito estranho no fim da escala e não percebi porquê.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
DanielMor

Eu ja consegui fazer o grafico... de uma maneira mt mais simples... nao fica la mt perfeito mas pronto...

Share this post


Link to post
Share on other sites
bubulindo

O k ainda nao percebeste foi que como a distancia é inserida pelo o utilizador nunca vai ser certa... o k é certo a é apenas o buraco k esta na posição graf[14][51] mas como a primeira posição de cada linha esta ocupada com | (o limite do grafico) so existem 50 caracteres ate ao buraco..

Ou seja cada caracter vai ter um valor.... neste caso é 1.2... pk vcarcter1=(dist( que tem o valor 60)/50); este calculo estava no codigo mas dps tirei porque estava a utilizar sempre os mesmos valores..... é apenas experimental...

Aquilo que disse continua a ser válido para estas condições.

isso ia dar variaveis inteiras...

N1=(vcarcter2/1.2)   

N2=(vcarter00/1.2)

isto ia dar-me kantos caracteres avançou ate o valor de x ou y pertencer ao intervalo...  exemplo um x=3.5 na condiçao do if so seria verdadeira no intervalo 

2.4 a 3.6 se dividirmos o 3.6/1.2 da 3... então o x pertence ao 3 caracter...

E não é o que pretendes? Mais tarde ou mais cedo vais precisar de ter um número inteiro para usar no índice do vector. A não ser que tenhas inventado vectores com índices fraccionários. :S

Outra coisa, se vais tracar uma trajectória, porque não fixaste o valor do X para garantir que tinhas um ponto em cada caracter do vector X e só calculavas o Y?

Ahh eu ainda nao utilizo muito o int antes do main() pk o meu stor deu essa materia a pouco e ele disse k para ja nao precisavamos muito....

este codigo dps vai passar a ser funcao no codigo do trabalho final e ai é k meto o int....

Se não usas o int, metes o void... mas isso vai contra a definição da função main(). Se não meteres nada, o compilador define a função como retornando um int e como não tens um return, sai um aviso pelo compilador... logo, da próxima vez mete um int. É uma questão de princípio, só isso.

Ontem experimentei a minha ideia para resolver o problema e resultou. Ok, não fazia ideia da bola de golf... mas ainda assim o método que usei para colocar os pontos funciona desta maneira também.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Baderous

Se não meteres nada, o compilador define a função como retornando um int

Isso deixou de ser verdade a partir do C99, depende do compilador.

Com o GCC é gerando o seguinte warning:

warning: return type defaults to ‘int’

http://my.safaribooksonline.com/9780136085881/ch17lev1sec9?bookview=contents#X2ludGVybmFsX0ZsYXNoUmVhZGVyP3htbGlkPTk3ODAxMzYwODU4ODEvNjU1

http://home.datacomm.ch/t_wolf/tw/c/c9x_changes.html

Share this post


Link to post
Share on other sites
bubulindo

Ok... eu não ando em cima das convencões, mas em todo o caso é uma questão de principio definir as coisas. seja void, int char*...


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.