Ir ao conteúdo

Posts recomendados

Postado

1 - Crie uma função que receba um array de inteiros e desenhe um gráfico vertical usando '*'. Cada linha do gráfico possui quantidade de asteriscos igual o valor numérico dos elementos do array. Ex: para o array formado pelos elementos {4,5,6,1,8}{4,5,6,1,8}, o gráfico seria da forma

****

*****

******

*

********

2 - Refaça a questão anterior realizando agora o traçado do gráfico na horizontal. Ex: para o array formado pelos elementos {4,5,6,1,8}{4,5,6,1,8}, o gráfico seria da forma

        *

        *

    *   *

  * *   *

* * *   *

* * *   *

* * *   *

* * * * *

 

Fiz a 1 assim (código abaixo), mas não soube fazer a 2

#include <stdio.h>

#include <string.h>

 

int main(){

    char dado[40], cop[40];

    int i, tamanho, j;

    printf("Desenhar um gráfico na vertical: \n");

    printf("insira os dados: ");

 

    fgets(dado, 40, stdin);

    tamanho = strlen(dado)-1;

    for(i=0; i<=tamanho; i++){

        if(dado>=48 && dado<=57){

        int k = dado - 48;

            for(j=0; j<k; j++){

                printf("*");

            }

        printf("\n");

        }

    }

}

  • Obrigado 1
Postado

@danielvitor     seu código está bom e funcionando bem , e de acordo com o enunciado ,  mas o exemplo dado  não é na vertical e sim na horizontal , e aqui não é matriz e sim um vetor de char , e como você não usou o botão   <>    que está desenhado lá na barra de ferramentas da janela postar , seu código ficou faltando alguns caracteres como os   [ i ]  , que sumiram do seu código ,  então poderia ser assim   :

#include <stdio.h>
#include <string.h>

int main(){
    char dado[40], cop[40];
    int i, tamanho, j;
    printf("Desenhar um gr%cfico na vertical: ",160);
    printf("insira os dados: ");

    fgets(dado, 40, stdin);
    tamanho = strlen(dado)/*-1*/;/* por que menos hum  */
    for(i=0; i<tamanho; i++){
        if(dado[i]>=48 && dado[i]<=57){/* faltou a posição no vetor */
            int k = dado[i] - 48;
            for(j=0; j<k; j++){
                printf("*");
            }
            printf("\n");
        }
    }
}

 

Postado

@danielvitor    a dois é mais complicada , e para fazer mais facilmente você pode recorrer a biblioteca windows.h , se você estiver usando o windows ,  e posicionar o cursor na posição que você quer que imprima o  ( * )  ,   assim ele pula de uma linha para outra , fazendo na vertical , e começando a imprimir de baixo para cima para ficar igual ao exemplo ,  e uma função para isso é a função gotoxy ,  muito encontrada na internet ,  poste o código da segunda para vermos como está e em que podemos ajudar    .

Postado

Olá todos!

 

Então@devair1010 @danielvitor  , acredito que a solução de @devair1010 sem o uso de matrizes é bom  porque dispensa a necessidade de mais memória e joga a responsabilidade para o processo (gosto muito disso) se fosse só isso estaria ótimo. Contudo, quando percebemos que o segundo enunciado pede uma alteração do primeiro para satisfazer sua resposta isso dá uma certa aflição e por último o problema exige função própria.

 

Em 26/09/2019 às 22:26, devair1010 disse:

a dois é mais complicada , e para fazer mais facilmente você pode recorrer a biblioteca windows.h ...

Nesse caso o primeiro também deve recorrer as referidas bibliotecas, já que o enunciado segundo pede o mesmo que o primeiro, porém na vertical (uma alteração de sentido do gráfico).

 

Opinião: Recomendo tentar usar as matrizes para a questão 1) e não é difícil não. Considere o maior elemento (quantitativamente) da lista o número de colunas e o número de elementos as linhas preencha percorrendo linhas x colunas. Para a questão dois percorra colunas x linhas.

 

 

 

  • Obrigado 1
Postado

@danielvitor    como bem lembrado por @MB_  , o segundo precisa ser igual ao primeiro apenas modificando o traçado do gráfico de horizontal para vertical , então usando uma matriz de char , inicializada com valor zero , que tenha o tamanho da tela do console , que são 25 linhas e 80 colunas ,  preenche a matriz colocando o asterisco nas linhas e colunas , depois imprime todos os caracteres da matriz .

  • Curtir 1
Postado
Em 26/09/2019 às 21:07, danielvitor disse:

@devair1010 Eu imaginei que deveria usar matriz para responder a 2, por isso coloquei. A 1 deu certo, obrigado! mas como fariria a 2?

 


Pode ser, mas nem precisa...

 

Entendo a ideia de @devair1010 mas veja que o enunciado diz desenhar um gráfico. Ninguém disse que pode usar um cursor e criar algo que só vai funcionar na tela. Imagine seu programa.c e alguém escrever

programa > Daniel-grafico.txt 

para imprimir ou mandar para alguém... :D De volta ao enunciado e exemplo, vou imaginar que o vetor foi escrito duas vezes por engano já que só aparece uma vez no gráfico

 

Em 26/09/2019 às 20:24, danielvitor disse:

2 - Refaça a questão anterior realizando agora o traçado do gráfico na horizontal. Ex: para o array formado pelos elementos {4,5,6,1,8}{4,5,6,1,8}, o gráfico seria da forma

        *

        *

    *   *

  * *   *

* * *   *

* * *   *

* * *   *

* * * * *

 

Claro que no computador podemos usar milhões de técnicas e estruturas e tal, mas nesse caso não é preciso nada: olhe bem para o vetor e desenho final e considere

  • é claro que para imprimir na vertical você vai imprimir um número de linhas igual ao topo do gráfico, que é claro o valor mais... ALTO. No exemplo 8. Então você vai imprimir um número de linhas igual ao maior valor.
  • Em cada linha você vai imprimir Y valores, onde Y é o tamanho do vetor, 5 no exemplo. Sempre Y
  • Então é um loop para o total de X linhas onde você imprime SEMPRE Y colunas, ou com branco ou com asterisco
  • Na linha inicial você imprime branco ou asterisco dependendo do valor do vetor para tal linha: no exemplo, a linha inicial é 8 então imprime asterisco para os que tiverem valor >= 8
  • Na linha seguinte imprime de novo Y valores, com asterisco para os que tem valor >=7
  • Até que na última e oitava linha imprime Y valores, com asterisco para as colunas com valor >= 1. Todas, no caso do exemplo.
  • Não precisa de matriz ou salvar nada porque não tem que ter memória: só precisa saber a linha que está imprimindo, que é a variável do loop, o total de colunas, que é o tamanho do vetor, e o total de linhas, que é o maior valor no vetor, que vai ditar a altura da maior coluna... Depois que imprimiu já era
  • Só precisa de um loop, tipo um for, o total de colunas que é o tamanho do vetor dado por strlen(vetor), dois char para preenchido/não preenchido que no caso estão definidos como branco e asterisco, e o total delinhas, que é o maior valor no vetor, que você pode calcular com um for logo no início.

 

  • Curtir 2
Postado
2 horas atrás, arfneto disse:

Não precisa de matriz ou salvar nada porque não tem que ter memória: só precisa saber a linha que está imprimindo, que é a variável do loop, o total de colunas, que é o tamanho do vetor, e o total de linhas, que é o maior valor no vetor, que vai ditar a altura da maior coluna... Depois que imprimiu já era

Concordo!

 

Ainda não enxerguei como a 2 solução de @arfneto é um mudança de sentido, pois me parece algo completamente novo; e tal qual a solução primeira @devair1010 e sua segunda com o uso do gotoxy. Duas coisas diferentes, a priore tive a impressão de que os dois problemas precisam ter a mesma técnica.

 

 
int histograma(unsigned int vetor_tamanho, int* vetor_elementos);
int main(void)
{
      histograma(5, (int [5]){4, 5, 6, 1, 8});
      return 0;
}

int histograma(unsigned int vetor_tamanho, int* vetor_elementos)
{
/* Suponha abaixo existir uma matriz quadrada A, para o problema
   2 resolve a transposta de A ou não ?
   
      * * * *
      * * * * *
      * * * * * *
      *
      * * * * * * * *
      
*/
      return 0;
}

Haja memória.

  • Curtir 1
Postado
2 horas atrás, MB_ disse:

a priore tive a impressão de que os dois problemas precisam ter a mesma técnica

 

O enunciado apenas diz 

 

Em 26/09/2019 às 20:24, danielvitor disse:

Refaça a questão anterior realizando agora o traçado do gráfico na horizontal

 

Mas devem ficar bem similares as funções já que muda apenas o sentido do desenho :) 

 

Não sou o instrutor que escreveu essa questão --- nem o cara que vai avaliar os programas --- mas pelo exemplo parece claro que isso é pra ser mostrado assim na tela, de modo que possa ser salvo, editado, impresso, mostrado no forum do Clube do Hardware, coisas assim.  Mas sou apenas voluntário aqui pra tirar dúvidas sobre o tema do forum ;) Mas programar o cursor para escrever asteriscos em coordenadas não parece ser o caso. Por exemplo, como eu disse antes, se o instrutor usar

programa > Daniel-grafico-dv.txt 

para salvar os tais gráficos não vai ter nada pra ver.

 

De volta ao enunciado, parte 2: 

 

Uma função como essa abaixo imprime na vertical

int imprime_vertical(int elemento[], int total)
{
    int i;
    int max = elemento[0];
    for (i = 1; i < total; ++i)
    {
        if (elemento[i] > max) max = elemento[i];
    }    // end for: max e o maior valor
    for (int y = max; y >= 1; --y)
    {    // imprime as linhas de max ate 1, 'total'colunas
        for (int x = 0; x < total; ++x)
        {
            if (elemento[x] >= y)
                printf("*");
            else 
                printf(" ");
        }    // end for
        printf("\n");    // fim da linha y
    }    // end for
    return 0;
}    // end imprime_vertical()

E é claro bem parecida com a "transposta" rotina que imprime na horizontal, que podia ser escrita assim: 

int imprime_horizontal(int elemento[], int total)
{
    for (int x = 0; x < total; ++x)
    {    // para cada linha imprime coluna com os *
        for (int y = 0; y < elemento[x]; ++y) printf("*");
        printf("\n");    // passa para a proxima linha
    }    // end for
    return 0;    // so isso
}    // end imprime_horizontal()

Dois loops como a anterior, linha e coluna. Apenas tem um loop antes para achar o número de linhas que vai imprimir


Estou postando o código porque afinal é apenas a transcrição do que já escrevi no outro post. Espero não ferir muito as regras do forum. Esse programa de teste

int main()
{
    int        teste[5] = { 4,5,6,1,8 };
    int        curva[40] = { 4,4,4,4,3,3,3,3,2,2,2,2,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4 };
    printf("[1 horizontal]\n\n");
    imprime_horizontal(teste, 5);
    printf("[2 vertical]\n\n");
    imprime_vertical(teste, 5);
    printf("[3 vertical]\n\n");
    imprime_vertical( curva, 40);
    return 0;
}

Mostraria isso

[1 horizontal]

****
*****
******
*
********
[2 vertical]

    *
    *
  * *
 ** *
*** *
*** *
*** *
*****
[3 vertical]

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

Que pode ser editado, impresso e postado, já que não endereçamos cursor nem nada.

:)

Bom final de semana a todos
 

  • Curtir 2
Postado
15 minutos atrás, arfneto disse:

Não sou o instrutor que escreveu essa questão --- nem o cara que vai avaliar os programas

Porque está dizendo isso!? 🤔, aqui ninguém deve ser censurado. Cavalo dado não se olha os dentes.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!