Ir ao conteúdo
  • Cadastre-se

C O troféu não esta formando


skyneGKL

Posts recomendados

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         _.' '._          ");
 

Link para o comentário
Compartilhar em outros sites

É @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──────────────█████████████─────────────");

 

 

Link para o comentário
Compartilhar em outros sites

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

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.

 

 

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