Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Programa que imprime a si mesmo

Boa noite, senhores! Gostaria de pedir ajuda em um exercício da faculdade. O desafio é criar um programa que imprime o próprio conteúdo de uma maneira que a saída mostrada na tela é idêntica ao código escrito dentro do programa. A princípio, me veio na cabeça a ideia de utilização de recursividade, impressão de um array de char com uma cópia do código e até mesmo abrir o próprio arquivo ".c" e imprimir seu conteúdo. este ultimo método foi o único funcional e este é um exemplo utilizado:

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

int main(void)
{
    // printf("codigo imprimindo a si proprio");
    imprime();
    return EXIT_SUCCESS;
}
void imprime()
{
    char file[2000];
    FILE *code = fopen("ex9.c", "r");
    if (code == 0)
    {
        printf("ERRO! O PROGRAMA NAO PODE SER EXECUTADO CORRETAMENTE DEVIDO A AUSENCIA DE UM ARQUIVO VITAL.\n");
    }
    while (fgets(file, 2000, code) != NULL)
        printf("%s", file);
    fclose(code);
}

entretanto, essa ideia caiu por terra no momento que o professor falou que a mesma não pode ser utilizada.

O principal desafio deste problema é fazer com que o ultimo printf() também imprima a si mesmo de uma forma que a saida seja igual a que está presente no código:

[código];
printf("[código]");
printf("printf("[código]");");

Como vocês podem ver, a primeira função imprime o código, a segunda imprime a primeira, mas não tem como ela "se imprimir" tendo a necessidade de haver uma nova função para imprimir a anterior. Sinceramente, já esgotei todas as minhas idéias. caso alguém possa me ajudar, ficarei muito grato!

2 respostas

Olá Eduardo, tudo bem ? Espero que sim.

Realmente é um problema bem desafiador, porque ficamos preso em uma recursão, precisamos pensar em alguma maneira de eliminar esse ponto, fiz esse código que não resolve e percebi que ia ficar preso nisso:

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

int main(void)
{
    char valor[] = "#include <stdio.h>\\n#include <stdlib.h>\\n\\nint main(void)\\n{\\n    char valor[] = \\n     printf(\"%s\", valor);\\n    return EXIT_SUCCESS;\\n}";
    printf("#include <stdio.h>\n#include <stdlib.h>\n\nint main(void)\n{\n    char valor[] = \n    printf(\"%s\", valor);\n    return EXIT_SUCCESS;\n}", valor);
    return EXIT_SUCCESS;
}

Você poderia dar algum contexto, o professor deve ter passado algum conteúdo que ajuda a solucionar esse problema, qual é a disciplina e qual matéria o professor está passando ? Talvez com essas informações eu consiga pensar em algo. (Vou continua tentando aqui, me parece algo relacionado a matéria de compiladores)

Fico no aguardo, bons estudos.

solução!

Olá, Igor! Estou bem sim, obrigado, espero que você também!

Sou estudante de Engenharia de Controle e Automação pela Universidade de Pernambuco, este desfio foi passado pelo meu professor da disciplina de informática. Ele apresentou a ideia do programa e mostrou o problema da ultima função não conseguir "auto imprimir-se". não falou muito mais do que isso (até porquê a ideia era justamente da gente quebrar a cabeça para desenvolver). Felizmente, depois de uma pesquisa relativamente demorada que eu fiz antes de ontem, eu descobri uma espécie de programa chamado "quine". Seu único objetivo é imprimir a si mesmo, com as condições de não possuir nenhum tipo de entrada de dados e não poder abrir, ler e imprimir o próprio arquivo .c. Era exatamente isto que eu estava procurando e através de um exemplar bem simples eu entendi o seu funcionamento e consegui realizar o exercício. ;)

Caso esteja interessado, vou deixar o exemplo que eu encontrei:

#include <stdio.h>
int main(void)
{
char *str="#include <stio.h>%cint main(void)%c{%cchar *str=%c%s%c;%cprintf(str,10,10,10,34,str,34,10,10,10,10);%creturn 0;%c}%c";
printf(str,10,10,10,34,str,34,10,10,10,10);
return 0;
}

Desde já, peço muito obrigado pela ajuda!