Ir ao conteúdo
  • Cadastre-se

C Erro no código em C


Cristina2000

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

    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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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?

 

 

Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!