Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado
Olá

Eu gostaria de saber como eu faço para imprimir os triângulos em toda a extensão  da janela e com n maiores que 5..
Se eu coloco n  maior que 5 dá erro. É como se a janela tivesse a metade do tamanho que tem.
A figura começa a ficar amontoada no canto esquerdo. E não consigo colocar mais que duas figuras por página.
O que está errado?


#include <stdio.h>
#include <stdlib.h>
void figura(int);

int main()
{
    int n;

    printf("Digite n\n");
    scanf("%d",&n);
    figura(n);
    printf("\n\n");
    return 0;
}

void figura(int a){
    int i,j,k,cont=1,cont2=0,cont3=0,
        cont4=0;

    for(i=0;i<a;i++){
        printf("\n");
        for(j=0;j<cont;j++){
                for(k=0;k<80000000;k++)
                        ;
            while(cont2<cont){
            printf("*");
            cont2++;
            }
            printf("\t\t");
            while(cont3<cont){
            printf("*");
            cont3++;
            }
        }
        cont++;
        cont2=0;
        cont3=0;
    }
}

 

26_11_2020_figuras_geometricas_2.png

26_11_2020_figuras_geometricas_2_dois.png

Postado

Faltou calcular os espaços extras individuais de cada linha.

 

Pode ser feito assim:

Spoiler

/*
 * Olá
 *
 * Eu gostaria de saber como eu faço para imprimir os triângulos em toda a
 * extensão da janela e com n maiores que 5. Se eu coloco n maior que 5 dá erro.
 * É como se a janela tivesse a metade do tamanho que tem. A figura começa a
 * ficar amontoada no canto esquerdo. E não consigo colocar mais que duas figuras
 * por página.
 *
 * O que está errado?
 */

#include <stdio.h>
#include <stdlib.h>

void desenhar(int linhas, int triangulos);

void limparBuffer();


int main() {
    int lido = 0;
    int linhas = 0;
    int triangulos = 0;

    do {
        printf("Digite a quantidade de linhas: ");
        lido = scanf("%d", &linhas);
        limparBuffer();
    } while (lido != 1);

    do {
        printf("Digite a quantidade de triangulos: ");
        lido = scanf("%d", &triangulos);
        limparBuffer();
    } while (lido != 1);

    // Extrai o valor absoluto para evitar valores negativos.
    if (linhas < 0) linhas *= -1;
    if (triangulos < 0) triangulos *= -1;

    desenhar(linhas, triangulos);
    return EXIT_SUCCESS;
}


/**
 * Desenha os triângulos na tela.
 *
 * @param linhas     Quantidade de linhas que cada triângulo terá.
 * @param triangulos Quantidade de triângulos que deve ser desenhado.
 */
void desenhar(int linhas, int triangulos) {
    // Percorre todas as linhas do triângulo
    for (int i = 1; i <= linhas; ++i) {

        // Desenha a quantidade determinada de triângulos
        for (int j = 0; j < triangulos; ++j) {
            // Desenha o triângulo
            for (int k = 0; k < i; ++k) {
                printf("%c", '*');
            }

            // Calcula e aplica a separação entre os triângulos
            for (int k = 0; k < linhas - i; ++k) printf(" ");
            printf("\t\t");
        }

        // Pula para a próxima linha do triângulo
        printf("\n");
    }
}

void limparBuffer() {
    while (getchar() != '\n');
}

 

 

  • Amei 1
Postado
    int i,j,k,cont=1,cont2=0,cont3=0,
        cont4=0;

    for(i=0;i<a;i++){
        printf("\n");
        for(j=0;j<cont;j++){
                for(k=0;k<80000000;k++)
                        ;

 

Seu programa não está bom e tem muitos erros. Você tem um livro sobre a linguagem? Uma apostila?

 

O que faz você achar que um int k possa contar até 80. 80 milhões?

 

O enunciado não está claro. Que significa "toda extensão da janela"? Como sabe qual a extensão da janela?

 

 

  • Obrigado 1
Postado

Talvez seja melhor usar espaço em vez do tab, assim a figura ficará alinhada (isso depende do tamanho da tela/janela) com base no valor de n, p.ex,

 

#include <stdio.h>

void figura(int i){
    int j = 0;
    while(j <= i){
        printf("*");
        j++;
    }
}

void espaco(int n){
    while(n--){
        printf(" ");
    }
}

int main(){
    int i = 0, n = 20;
    
    while(i < n){
        figura(i);
        espaco(n - i);
        figura(i);
        printf("\n");
        i++;
    }
    return 0;
}

 

  • Obrigado 1
Postado

@arfneto Olá, Tudo bem?

O laço for em que uso a variável k  é apenas para  diminuir o processamento para que 

triângulo vá se formando lentamente. Só isso. Você sabe alguma função que eu possa usar no lugar do for para obter o mesmo efeito? Se puder me dizer eu agradeço. 

Quanto ao programa não estar bom. Eu estou aprendendo. Sei que estou melhorando a cada dia. Sei que  vocês programadores são melhores do que eu, justamente por isso, porque  já são programadores e eu ainda não sou, estou aprendendo,  mas sei também que eu chego lá. É por isso que eu vim aqui buscar ajuda, porque sei que vocês são muito melhores do que eu e podem me ajudar. 

Toda a extensão da janela significa fazer aparecer mais do que dois triângulos lado a lado.  Quando tento isso os triângulos saem desconfigurados. 

E quando tento criar um triângulo com mais de 5 linhas também está saindo uma figura desconfigurada. 

Obrigada pela ajuda. 

@AdrianoSiqueira Obrigada. Vou tentar implementar dessa forma. 

@Midori Obrigada. Vou tentar fazer dessa forma para ver.

Postado
4 horas atrás, Cristina2000 disse:

O laço for em que uso a variável k  é apenas para  diminuir o processamento para que 

triângulo vá se formando lentamente

 

Ao usar uma coisa assim você está fazendo o computador "calcular" algo intensamente, apenas para gastar o tempo. Não é uma coisa socialmente saudável :) Imagine rodar isso num grande computador na universidade. Centenas de programas intensamente contando de 1 em 1 com a CPU a 100% para... gastar décimos de segundo. Fazendo nada ativamente em um sistema multiusuário e multitarefa apenas para passar o tempo.

 

Você não disse se está usando Linux ou Windows e isso faz diferença. Mas o princípio é o mesmo: o que se usa é que se chama de alarme, basicamente porque é um alarme. Em C a maior parte dessas coisas fica em time.h.

 

Essa é uma área chata onde Windows e Linux/Unix divergem. Estou escrevendo de memória mas tem coisas que simplesmente não funcionam nos dois. Mesmo que use o Windows o tal compilador gcc vindo do Unix.

 

De todo modo em resumo você usa as funções em time.h e o que tiver em seu sistema

  • no Linux/Unix/Mac use sleep() ou nanosleep() e o argumento diz quanto tempo quer que o programa espere. Em nanosegundos. Dúvida? apenas escreva na tela: man nanosleep e tecle ENTER....

    Se seu sistema estiver em português talvez o texto esteja em português
     

 

  

  • NANOSLEEP(2)  Linux Programmer's Manual    
    
    NAME
           nanosleep - high-resolution sleep
    
    SYNOPSIS
           #include <time.h>
    
           int nanosleep(const struct timespec *req, struct timespec *rem);
    
       Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
    
           nanosleep(): _POSIX_C_SOURCE >= 199309L
    
    DESCRIPTION
             
           nanosleep()  suspends the execution of the calling thread until either at least
             the time specified in *req has elapsed, or the delivery of a signal that triggers
             the invocation of a handler in the call
             
             ...
            

  

 

  • no Windows use Sleep() --- em Windows.h --- e passe o número de milissegundos que você quer que o sistema espere


É bem simples 🙂

usando decimos como um valor em décimos de segundo

 

    unsigned decimos = 20; // 2s


No Linux
 

    int n = usleep(decimos * fator);

 

E como o tempo para usleep() é em ns o fator deve ser 100.000

 

No Windows
 

    Sleep(decimos * fator);

 

E como o tempo para Sleep() é em ms o fator deve ser 100

 

Claro que pode escrever o número direto e fixo

 

Exemplo:
 

Esse programa mostra a data e hora, espera dois segundos e mostra a data e hora e o tempo que passou. Algo assim
 

28/11/2020 16:35:00
28/11/2020 16:35:02
Tempo = 2.000000s


em Windows
 

#include <stdio.h>
#include <time.h>
#include <windows.h>

typedef struct tm Hora;

int main(void)
{
    unsigned    decimos = 20; // 2s
    unsigned    fator = 100;
    char        linha[80];

    time_t inicio;
    time_t fim;
    Hora* info;
    time(&inicio);
    info = localtime(&inicio);
    // formata a hora de inicio
    strftime(linha, 80, "%d/%m/%Y %H:%M:%S", info);
    printf("%s\n", linha);

    Sleep(decimos * fator);

    fim = time(NULL);
    info = localtime(&fim);
    // formata a hora do fim
    strftime(linha, 80, "%d/%m/%Y %H:%M:%S", info);
    printf("%s\n", linha);
    double lapso = difftime(fim, inicio);
    printf("Tempo = %fs\n", lapso);
    return 0;
}

 

em Unix

 

#include <stdio.h>
#include <time.h>
#include <unistd.h>


typedef struct tm Hora;

int main(void)
{

    time_t inicio;
    time_t fim;
    Hora* info;
    time(&inicio);
    unsigned decimos = 20; // 2s
    unsigned fator = 100 * 1000;

    info = localtime(&inicio);
    char linha[80];
    strftime(linha, 80, "%d/%m/%Y %H:%M:%S", info);
    printf("%s\n", linha);

    int n = usleep(decimos * fator);

    fim = time(NULL);
    info = localtime(&fim);
    strftime(linha, 80, "%d/%m/%Y %H:%M:%S", info);
    printf("%s\n", linha);
    
    double lapso = difftime(fim, inicio);
    printf("Execution time = %f\n", lapso);
    return 0;
}

 

O resultado, claro. é o mesmo.

 

4 horas atrás, Cristina2000 disse:

Quanto ao programa não estar bom. Eu estou aprendendo. Sei que estou melhorando a cada dia. Sei que  vocês programadores são melhores do que eu, justamente por isso, porque  já são programadores e eu ainda não sou, estou aprendendo,  mas sei também que eu chego lá. É por isso que eu vim aqui buscar ajuda, porque sei que vocês são muito melhores do que eu e podem me ajudar


Não sei se está escrevendo isso para mim ou para "vocês programadores".  Não sou programador e o que eu disse sobre seu programa foi naquela data e hora, sobre o programa como postou. Programadores escrevem programas bons e ruins. Especialistas, cientistas, eu e todo mundo. Tomei a liberdade de escrever aquilo por ser esse um forum público. Julguei seu programa de acordo com meu conhecimento e opinião, mas nenhum dos dois é importante.

 

No entanto eu te expliquei vários porques e estou indo bem mais longe que o comum, te mostrando programas funcionais em Windows e Unix que mostram além do que você precisa, com exemplos de uso das funções em time.h

 

4 horas atrás, Cristina2000 disse:

Toda a extensão da janela significa fazer aparecer mais do que dois triângulos lado a lado.  Quando tento isso os triângulos saem desconfigurados

 

Você precisa definir o que quer fazer. Eu ainda não fui capaz de entender. Se quer escrever os triângulos lado a lado precisa do simples: dizer quantos triângulos vai escrever lado a lado e saber como perguntar ao sistema qual a largura em colunas da tela quando seu programa roda. E precisa dizer se todos os triângulos lado a lado serão iguais.

 

O tempo levou há muito aquela realidade de telas terem sempre 24 linhas e 80 colunas. A tela padrão na console do Windows por exemplo tem esse tamanho aí:
 

image.png.1509eb27e723a841ece33c4eb6508ef9.png

 

Mas você pode mudar a gosto.

 

4 horas atrás, Cristina2000 disse:

E quando tento criar um triângulo com mais de 5 linhas também está saindo uma figura desconfigurada

 

Que significa "desconfigurado"? Qual a configuração para os triângulos?

 

 

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...