Situação: Você é um professor do ensino médio, ensinando sua turma de computação como escrever programas em C. No entanto, como é apenas o começo do termo, você não os ensinou sobre a importância do recuo e do espaçamento. Ao marcar o trabalho deles, seus olhos doem tanto que você grita de agonia e percebe que isso não pode continuar.
Tarefa: Você decidiu escrever um programa, em qualquer idioma, que use um código-fonte C válido como entrada e produza-o com uma boa formatação. Você deve decidir o que é um código bem formatado, pois é um concurso de popularidade. Você é incentivado a implementar o maior número possível de recursos; a seguir, alguns exemplos:
- Adicione recuo adequado na frente de cada linha
- Adicione espaços depois
,
e outros operadores, por exemplo, conversãoint a[]={1,2,3};
paraint a[] = {1, 2, 3};
. Lembre-se de não processar operadores dentro de literais de string. - Remova os espaços finais após cada linha
- Separando as declarações em várias linhas, por exemplo, o aluno pode escrever
tmp=a;a=b;b=tmp;
ouint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
todas em uma linha, você pode separá-las em linhas diferentes. Esteja ciente dosfor
loops, porém, eles têm ponto e vírgula neles, mas eu realmente não acho que você deva separá-los. - Adicione uma nova linha após definir cada função
- Outro recurso que você pode oferecer é a ajuda para compreender os códigos de seus alunos.
Critérios de vencimento: este é um concurso de popularidade; portanto, a resposta com a maioria dos votos positivos vence. Em caso de empate, a resposta com mais recursos implementados vence. Se isso é um empate novamente, o código mais curto vence.
Sugerimos que você inclua na sua resposta uma lista de recursos que você implementou, bem como uma amostra de entrada e saída.
Editar: conforme solicitado nos comentários, há uma amostra de entrada, embora tenha em mente que é apenas para referência e é recomendável implementar o maior número possível de recursos.
Entrada:
#include <stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s",s);
for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your name in upper case is:\n%s\n",s);
return 0;}
É assim que eu normalmente formataria esse código: (sou uma pessoa preguiçosa)
#include <stdio.h>
#include <string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s",s);
for(i=0;i<strlen(s);i++) {
if(s[i]>='a'&&s[i]<='z') {
s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}
}
printf("Your name in upper case is:\n%s\n",s);
return 0;
}
É assim que eu acho que é mais fácil de ler:
#include <stdio.h>
#include <string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s", s);
for(i = 0; i < strlen(s); i++) {
if(s[i] >= 'a' && s[i] <= 'z') {
s[i] -= ('a' - 'A'); //this is same as s[i]=s[i]-'a'+'A'
}
}
printf("Your name in upper case is:\n%s\n", s);
return 0;
}
Além disso, agora que começo a ter respostas, a resposta com a maior contagem de votos será aceita 5 dias após a última resposta, ou seja, se não houver mais novas respostas dentro de 5 dias, este concurso será encerrado.
fonte
s/\s+/ /
) e chamá-lo um diaRespostas:
Como estamos falando de recuo e espaços em branco, basta escrever o código em uma programação, uma linguagem que é realmente projetada em torno do espaço em branco , pois isso deve ser mais fácil, certo?
Então a solução é:
Aqui está na base64:
Para aqueles que têm problemas para imprimir o código em um documento, aqui está a versão anotada (você pode encontrar um compilador para isso no final da resposta):
Isso ainda está em andamento, embora esperemos que passe na maioria dos critérios!
Recursos atualmente suportados:
{
e}
.;
\"
)for
bloco)Exemplo de entrada (adicionei alguns casos extremos com base no comentário do Quincunx, para que você possa verificar se ele se comporta corretamente):
Exemplo de saída:
Observe que, porque o espaço em branco não suporta EOF, a verificação do intérprete gera uma exceção, que precisamos suprimir. Como não há nenhuma maneira no espaço em branco de verificar o EOF (até onde eu sei, esse é o meu primeiro programa em espaço em branco), isso é algo inevitável, espero que a solução ainda conte.
Este é o script que eu usei para compilar a versão anotada no espaço em branco apropriado:
Para correr:
Observe que isso, além de converter os caracteres
S
,L
eT
, também permite comentários de linha única com#
, e pode converter automaticamente números e literais de caracteres simples em sua representação em espaço em branco. Sinta-se à vontade para usá-lo em outros projetos de espaço em branco, se desejarfonte
for(i=0;i<10;i++)
;
dentro seria suficiente). Eu acho que esses devem ser suficientes para considerar a solução "utilizável".(
)
Vim da maneira mais fácil, tecnicamente usando apenas um caractere:=
Eu não sou um guru do vim, mas nunca subestimo seu poder e alguns o consideram uma linguagem de programação. Para mim, esta solução é uma vencedora de qualquer maneira.
Abra o arquivo no vim:
No vim, pressione as seguintes teclas
gg=G
Explicação:
gg vai para o topo do arquivo
= é um comando para corrigir o recuo
G diz para executar a operação até o final do arquivo.
Você pode salvar e sair com :wq
É possível deixar
vim
executar o comando a partir da linha de comando, para que isso também possa ser feito em uma linha, mas deixo isso para as pessoas que sabemvim
melhor do que eu.Exemplo do Vim, um arquivo de entrada válido (fibonacci.c) com recuo incorreto.
Abrir no vim:
vim fibonacci.c
pressionegg=Gfonte
=GZZ
. (Vim golf ftw!)Como isso será usado para ajudar o professor a entender melhor o código do aluno, é importante higienizar a entrada primeiro. As diretivas de pré-processador são desnecessárias, pois apenas causam confusão e as macros também podem introduzir código malicioso no arquivo. Nós não queremos isso! Além disso, é completamente desnecessário reter os comentários originais que o aluno escreveu, pois eles provavelmente são completamente inúteis.
Em vez disso, como todos sabem que um bom código precisa de bons comentários, além de corrigir o recuo e a estrutura, por que não adicionar alguns comentários altamente úteis em torno dos pontos principais do código para tornar o resultado ainda mais compreensível! Definitivamente, isso ajudará o professor a avaliar o trabalho que o aluno fez!
Então a partir disso:
Vamos produzir isso:
Não é muito melhor, com todos os comentários úteis em torno das expressões?
Portanto, esta é uma solução em rubi que utiliza a
cast
gema, que é um analisador de C (sim, estou trapaceando) . Como isso analisará o código e o reimprimirá do zero, significa que o resultado será perfeitamente recuado e também consistente, por exemplo:E também conterá comentários muito úteis sobre como o código funciona, o que será super útil tanto para os alunos quanto para o professor!
indent.rb
Gemfile
fonte
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 caracteres
O arquivo de entrada deve ser nomeado "input.c" e colocado no diretório de trabalho atual.
Exemplo de saída, tendo recebido a entrada na pergunta original:
Pode demorar alguns segundos para ser executado, dependendo do seu hardware, então seja paciente :)
fonte
rm
?Rubi
Resultado:
Saída para a entrada de aresta do @ SztupY:
Recursos até agora:
[x]
Adicione recuo adequado na frente de cada linha[x]
Adicione espaços depois,
e outros operadores, por exemplo, conversãoint a[]={1,2,3};
paraint a[] = {1, 2, 3};
. Lembre-se de não processar operadores dentro de literais de string.[x]
Remova os espaços finais após cada linha[x]
Separando as declarações em várias linhas, por exemplo, o aluno pode escrevertmp=a;a=b;b=tmp;
ouint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
todas em uma linha, você pode separá-las em linhas diferentes. Esteja ciente dosfor
loops, porém, eles têm ponto e vírgula neles, mas eu realmente não acho que você deva separá-los.[ ]
Adicione uma nova linha após definir cada função[ ]
Outro recurso que você pode oferecer é a ajuda para compreender os códigos de seus alunos.fonte
Isso é escrito em python e baseado nos padrões de codificação GNU.
Recursos até agora:
Código:
Exemplo de entrada (passe um nome de arquivo como argumento):
Exemplo de saída:
Isso terá bugs.
fonte
.Internet
Abra esse arquivo usando o Visual Studio
Entrada:
Resultado:
fonte