Ir ao conteúdo

Posts recomendados

Postado

Boto isso no meu código mas o troféu não funciona 

 

 

 printf("\n\t       ___________        ");
                    printf("\n\t      '._==_==_=_.'       ");
                    printf("\n\t      .-\:      /-.       ");
                    printf("\n\t     | (|:.     |) |      ");
                    printf("\n\t      '-|:.     |-'       ");
                    printf("\n\t        \::.    /         ");
                    printf("\n\t         '::. .'          ");
                    printf("\n\t           ) (            ");
                    printf("\n\t         _.' '._          ");
 

Postado

É @skyneGKL de fato esse troféu sai como deveria, eu tentei usar no compilador que a @Midori falou e deu certo, mas pode ser que em outros não fique do jeito que você gostaria.

Eu te recomendo então a procurar coisas relacionadas a ASCII ART que são basicamente forma de se utilizar caracteres da tabela ASCII para "simular" um desenho, dessa forma: 

 

image.png.4efbb16a9d1737def2bae185ebb09882.png

  

Tem vários sites na internet que disponibilizam galerias com desenhos feitos apenas com caracteres ASCII.

Vou deixar aqui alguns desses sites com desenhos de troféus que eu consegui encontrar:

 

TROPHY - ASCII ART

Trophy.txt

Awards

Trophy Cup ASCII Text Art

 

Nesse ultimo site tem dois exemplos de troféus em ASCII ART eu testei o segundo e deu certo na minha máquina, tenta ai!

Esse foi o código que eu usei:

 

printf("\n────────────────█████████───────────────");
printf("\n──────────────█████████████─────────────");
printf("\n───────────███████████████████──────────");
printf("\n────────────────────────────────────────");
printf("\n────────████████████████████████────────");
printf("\n────────████████████████████████────────");
printf("\n────────────────────────────────────────");
printf("\n█████████─████████████████████─█████████");
printf("\n█████████─████████████████████─█████████");
printf("\n███───────████████────████████───────███");
printf("\n███───────██████───██───██████───────███");
printf("\n─███──────█████──████────█████──────███─");
printf("\n──███─────████─────██─────████─────███──");
printf("\n───███────████─────██─────████────███───");
printf("\n────███───█████────██────█████───███────");
printf("\n─────███──█████────██────█████──███─────");
printf("\n──────███─███████──────███████─███──────");
printf("\n───────██─████████████████████─██───────");
printf("\n────────█─████████████████████─█────────");
printf("\n────────────────────────────────────────");
printf("\n──────────████████████████████──────────");
printf("\n───────────██████████████████───────────");
printf("\n─────────────██████████████─────────────");
printf("\n───────────────███████████──────────────");
printf("\n────────────────────────────────────────");
printf("\n────────────────█████████───────────────");
printf("\n──────────────█████████████─────────────");

 

 

Postado

Sempre vejo essa técnica, às vezes com desenhos de milhares de linhas.

 

E nunca entendo. Não faça assim. É perda de tempo.

 

Use um arquivo com o desenho e faça UM ÚNICO PROGRAMA. Se seu programa for desenha.c vai gerar desenha.exe. Aí você escreve ele pra usar assim
 

	desenha trofeu.txt

 

Cria com o editor do IDE o tal trofeu.txt. E roda o programa assim. Pronto. 

 

Não ficou bom? Edite o desenho. NUNCA mexa no programa. Não desenhou direito? Corrija o programa. Não mexa no desenho.

 

Esse é o conceito de encapsulamento. O programa desenho e o desenho são um objeto: vão mostrar o desenho juntos. Um erro no programa não é um erro no desenho. Um erro no desenho não é um erro no programa.

 

E se precisa do desenho DENTRO do programa?

 

  • Fez uma aposta com alguém e precisa mesmo fazer isso com um printf() por linha?
  • Precisa mandar um programa que desenha pra esses programas chatos de contest tipo URI?
  • Quer mesmo o desenho dentro do programa pra não ter que distribuir o desenho em separado? 

Fácil: escreve outro programa, tipo cria.c. Para usar assim:

 

	cria trofeu.txt artista.c

 

E aí esse programa cria.exe pega o arquivo trofeu.txt que você já sabe que está certinho e gera o programa artista.c no IDE, sabendo que o desenho está certinho.

 

Não perca tempo.

 

Compila esse programa e a vida segue. Mais encapsulamento, só que nesse caso o conceito é diferente: o programa gerado vai incluir o desenho dentro dele: um erro no desenho vai ser um erro no programa :D

 

E o conceito de composição...

 

Quando o desenho está ok você vai na console ou no terminal e escreve o simples

 

	desenho trofeu.txt | cria artista.c


E o sistema passa o desenho que ia sair na tela direto para o programa que cria o programa e na saída vai ter o que?

 

o programa artista.exe que faz o tal desenho.

 

 

Sabe qual deve ser o tamanho de um programa desses? umas 20 linhas. 

 

E nunca vai ter que se preocupar com os desenhos.

 

Agradeça a Dennis Ritchie (+) e Ken Thompsom, os caras que criaram isso (pipe)

  • Curtir 1
Postado

Eu simplifiquei um pouco as coisas. Antes que alguém me ofenda ;) ...

 

Como o desenho tem todo tipo de símbolo é preciso tratar '\' (barra invertida)  '"' (aspas) e '%' para que o programa de saída compile direitinho.  Fora isso acho que vale o que expliquei.

  • Curtir 1
Postado

Vou deixar um exemplo do que tentei explicar aqui...

 

O EXEMPLO

 

ENTRADA em entrada.txt .
            .

%%%%%%%%%%%
%%       %%
%%%%%%%%%%%  / \
            /   \
            |   |
            """""
            % \ " 
            testes
            .
            .
            .

 

Esse poderia claro ser o tal troféu do exemplo:

 

             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...

 

Usei o de cima porque vai direto ao assunto:

 

A ideia é criar um programa em C que desenha... o desenho. Como o programa C vai usar printf() é preciso tratar aspas e barras invertidas e % de modo especial 

 

Eu falei em dois programas, desenha.c e cria.c porque em geral a gente quer poder tratar a entrada antes, para filtrar alguma coisa ou controlar o número de colunas.  Mas aqui o programa que desenha é equivalente a um TYPE no Windows. Mesmo assim vou deixar um exemplo de desenha.c

 

Spoiler

#define LIMITE_ 200

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

int main(int argc, char** argv)
{
    const char* e_padrao = "entrada.txt"; // entrada padrão
    unsigned    limite = LIMITE_; // limite padrão
    char        arquivo_e[80];
    char        arquivo_s[80];
    char        na_tela = 0;
    if (argc > 3) limite = atoi(argv[3]);  // limite
    if (argc > 2) // saida: o padrão = a tela mesmo
        strcpy(arquivo_s, argv[2]);
    else
        na_tela = 1;
    if (argc > 1) // a entrada
        strcpy(arquivo_e, argv[1]);
    else
        strcpy(arquivo_e, e_padrao);
    // mostra os parametros em uso
    if (na_tela)
        fprintf(stderr, "desenha(): Entrada \"%s\" Saida NA TELA Limite de %d linhas\n", arquivo_e, limite);
    else
        fprintf(stderr, "desenha(): Entrada \"%s\" Saida \"%s\" Limite de %d linhas\n", arquivo_e, arquivo_s, limite);

    FILE* E = fopen(arquivo_e, "rb");
    if (E == 0) return -1; // nao abriu entrada

    FILE* S = NULL;
    if (!na_tela)
    {
        S = fopen(arquivo_s, "wb");
        if (S == 0) return -2; // nao abriu saida
    }
    else
        S = stdout;

    char linha[150];
    unsigned saida = 1;
    while (!feof(E) && saida < limite)
    {
        fgets(linha, 150, E);
        if (strlen(linha) > 0) fprintf(S, "%s", linha);
        saida++;
    }
    fclose(E); fclose(S);
    return 0;
};  // main()
// desenha.c

 

 

A mecânica

 

        cria entrada.txt teste.c

 

Essa linha cria o programa teste.c a partir do desenho em entrada.txt

 

C:\Users\toninho\OneDrive\Imagens\Sync>cria entrada.txt teste.c
cria(): Entrada "entrada.txt" Saida: "teste.c" Limite de 200 linhas

C:\Users\toninho\OneDrive\Imagens\Sync>dir teste.c
 O volume na unidade C é ARFNETO
 O Número de Série do Volume é 12CF-772E

 Pasta de C:\Users\toninho\OneDrive\Imagens\Sync

13/05/2021  00:32               483 teste.c
               1 arquivo(s)            483 bytes
               0 pasta(s)   133.994.123.264 bytes disponíveis

C:\Users\toninho\OneDrive\Imagens\Sync>

 

E eis teste.c como gerado pelo programa

 

#include <stdio.h>
int main(void)
{
    printf("\n");
    printf("%%%%%%%%%%%%%%%%%%%%%%\n");
    printf("%%%%       %%%%\n");
    printf("%%%%%%%%%%%%%%%%%%%%%%  / \\\n");
    printf("            /   \\\n");
    printf("            |   |\n");
    printf("            \"\"\"\"\"\n");
    printf("            %% \\ \" \n");
    printf("            testes\n");
    printf("            .\n");
    printf("            .\n");
    printf("            .\n");
	return 0;
}
//  fim de teste.c

 

Note o tratamento dos caracteres problemáticos... compilando esse programa e rodando

 

C:\Users\toninho\OneDrive\Imagens\Sync>cl /W3  teste.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29915 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

teste.c
Microsoft (R) Incremental Linker Version 14.28.29915.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:teste.exe
teste.obj

C:\Users\toninho\OneDrive\Imagens\Sync>teste

%%%%%%%%%%%
%%       %%
%%%%%%%%%%%  / \
            /   \
            |   |
            """""
            % \ "
            testes
            .
            .
            .

C:\Users\toninho\OneDrive\Imagens\Sync>

 

Claro que o programa permite salvar o desenho dando o nome do arquivo

 

	teste > coisa.txt

 

E vai gravar o desenho no texto. E se deu tudo certo o desenho em coisa.txt deve ser igualzinho ao arquivo em entrada;txt, certo?

 

C:\Users\toninho\OneDrive\Imagens\Sync>teste > coisa.txt

C:\Users\toninho\OneDrive\Imagens\Sync>fc coisa.txt entrada.txt
Comparando os arquivos coisa.txt e ENTRADA.TXT
FC: nenhuma diferença encontrada


C:\Users\toninho\OneDrive\Imagens\Sync>

 

Um teste completo usando o trofeu
 

C:\Users\toninho\OneDrive\Imagens\Sync>
C:\Users\toninho\OneDrive\Imagens\Sync>type trofeu.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...
C:\Users\toninho\OneDrive\Imagens\Sync>cria trofeu.txt trofeu.c
cria(): Entrada "trofeu.txt" Saida: "trofeu.c" Limite de 200 linhas

C:\Users\toninho\OneDrive\Imagens\Sync>cl trofeu.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29915 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

trofeu.c
Microsoft (R) Incremental Linker Version 14.28.29915.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:trofeu.exe
trofeu.obj

C:\Users\toninho\OneDrive\Imagens\Sync>trofeu > teste.txt

C:\Users\toninho\OneDrive\Imagens\Sync>fc teste.txt trofeu.txt
Comparando os arquivos teste.txt e TROFEU.TXT
FC: nenhuma diferença encontrada


C:\Users\toninho\OneDrive\Imagens\Sync>type teste.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...

C:\Users\toninho\OneDrive\Imagens\Sync>


C:\Users\toninho\OneDrive\Imagens\Sync>
C:\Users\toninho\OneDrive\Imagens\Sync>type trofeu.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...
C:\Users\toninho\OneDrive\Imagens\Sync>cria trofeu.txt trofeu.c
cria(): Entrada "trofeu.txt" Saida: "trofeu.c" Limite de 200 linhas

C:\Users\toninho\OneDrive\Imagens\Sync>cl trofeu.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29915 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

trofeu.c
Microsoft (R) Incremental Linker Version 14.28.29915.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:trofeu.exe
trofeu.obj

C:\Users\toninho\OneDrive\Imagens\Sync>trofeu > teste.txt

C:\Users\toninho\OneDrive\Imagens\Sync>fc teste.txt trofeu.txt
Comparando os arquivos teste.txt e TROFEU.TXT
FC: nenhuma diferença encontrada


C:\Users\toninho\OneDrive\Imagens\Sync>type teste.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...

C:\Users\toninho\OneDrive\Imagens\Sync>


C:\Users\toninho\OneDrive\Imagens\Sync>
C:\Users\toninho\OneDrive\Imagens\Sync>type trofeu.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...
C:\Users\toninho\OneDrive\Imagens\Sync>cria trofeu.txt trofeu.c
cria(): Entrada "trofeu.txt" Saida: "trofeu.c" Limite de 200 linhas

C:\Users\toninho\OneDrive\Imagens\Sync>cl trofeu.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29915 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

trofeu.c
Microsoft (R) Incremental Linker Version 14.28.29915.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:trofeu.exe
trofeu.obj

C:\Users\toninho\OneDrive\Imagens\Sync>trofeu > teste.txt

C:\Users\toninho\OneDrive\Imagens\Sync>fc teste.txt trofeu.txt
Comparando os arquivos teste.txt e TROFEU.TXT
FC: nenhuma diferença encontrada


C:\Users\toninho\OneDrive\Imagens\Sync>type teste.txt
             ___________
            '._==_==_=_.'
            .-\:      /-.
           | (|:.     |) |
            '-|:.     |-'
              \::.    /
               '::. .'
                 ) (
               _.' '._
          jgs `"""""""`

https://ascii.co.uk/art/trophy
.

..

...

C:\Users\toninho\OneDrive\Imagens\Sync>


E pra que isso?

 

Esse programa pega qualquer arquivo que se tenha salvo no disco e gera um programa C que replica o desenho. Só que você só precisa escrever o programa uma vez. 

 

Ou nenhuma, porque tem o programa completo aqui.

 

Como colocar isso em outro programa?

 

Basta alterar o cria.c para gerar apenas os printf() e salvar como por exemplo trecho.h e incluir no seu programa onde precisa do desenho... Se precisar escreva e mostro um exemplo; é uma técnica muito comum.

 

Eis o programa que desenha o troféu, como gerado por cria.c

 

#include <stdio.h>
int main(void)
{
    printf("             ___________\n");
    printf("            '._==_==_=_.'\n");
    printf("            .-\\:      /-.\n");
    printf("           | (|:.     |) |\n");
    printf("            '-|:.     |-'\n");
    printf("              \\::.    /\n");
    printf("               '::. .'\n");
    printf("                 ) (\n");
    printf("               _.' '._\n");
    printf("          jgs `\"\"\"\"\"\"\"`\n");
    printf("\n");
    printf("https://ascii.co.uk/art/trophy\n");
    printf(".\n");
    printf("\n");
    printf("..\n");
    printf("\n");
    printf("...\n");
	return 0;
}
//  fim de trofeu.c

 

E o programa que gera o programa para qualquer desenho, o tal cria.c

 

#define LIMITE_ 200

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

char* arruma(const  char*);

int         main(int argc, char** argv)
{
    unsigned    limite = LIMITE_; // limite padrão
    char        arquivo_e[80];
    char        arquivo_s[80];
    char        do_teclado = 0;
    char        na_tela = 0;
    if (argc > 3) limite = atoi(argv[3]);  // limite
    if (argc > 2) // saida: o padrão = a tela mesmo
        strcpy(arquivo_s, argv[2]);
    else
        na_tela = 1;
    if (argc > 1) // a entrada
        strcpy(arquivo_e, argv[1]);
    else
        do_teclado = 1;

    // mostra os parametros em uso, em stderr
    if (do_teclado)
        fprintf(stderr, "cria(): Entrada TECLADO ");
    else
        fprintf(stderr, "cria(): Entrada \"%s\" ", arquivo_e);

    if (na_tela)
        fprintf(stderr, "Saida: NA TELA Limite de %d linhas\n\n\n\n\n", limite);
    else
        fprintf(stderr, "Saida: \"%s\" Limite de %d linhas\n", arquivo_s, limite);

    // abre os arquivos
    FILE* E = NULL; // entrada
    if (do_teclado)
        E = stdin;
    else
    {
        E = fopen(arquivo_e, "rb");
        if (E == 0) return -1; // nao abriu entrada
    }

    FILE* S = NULL; // saida
    if (na_tela)
        S = stdout;
    else
    {
        S = fopen(arquivo_s, "wb");
        if (S == 0) return -2; // nao abriu saida
    }

    // gera o programa
    const char* marca = "\t========== ==========\n";
    // inicio do programa
    if (na_tela) fprintf(stderr, "%s", marca); // ajuda
    fprintf(S, "%s", "\
#include <stdio.h>\n\
int main(void)\n\
{\n"
);

    // gera o codigo a partir do desenho
    char linha[150];
    unsigned saida = 1;
    while (!feof(E) && saida < limite)
    {
        fgets(linha, 150, E);
        char* linha_ok = arruma(linha);
        fprintf(S, "    printf(\"%s\\n\");\n", linha_ok);
        free(linha_ok);
        saida++;
    }

    // fim do programa
    char nome[150];
    if (!na_tela)
    {
        sprintf(nome, "//  fim de %s", arquivo_s);
        fprintf(S, "%s%s", "\treturn 0;\n}\n", nome);
    }
    else
    {
        fprintf(S, "%s", "\
\n\treturn 0;\n\
}\n\
//  fim\n");
        fprintf(stderr, "%s", marca);
    }

    if (!do_teclado) fclose(E);
    if (!na_tela)    fclose(S);
    return 0;
};  // main()

char* arruma(const char* original)
{
    char* saida = (char*)malloc(2 * strlen(original));
    char* p = saida;
    for (int in = 0; *(original + in) != 0; in += 1)
    {
        unsigned char letra = *(original + in);
        switch (letra)
        {
        case '\\':
        case '%':
            *(p++) = letra;
            *(p++) = letra;
            break;

        case '"':
            *(p++) = '\\';
            *(p++) = '"';
            break;

        case '\n':
            break;

        case '\r':
            break;

        default:
            *(p++) = letra;
            break;
        }
    };  // for()
    *p = 0;
    return saida;
};

 

RESUMO

 

você faz o desenho com o editor de texto ou copia de qualquer lugar, roda o programa cria.c e ele gera o programa em C que faz o desenho. Nada mais.

 

 

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