Situación: usted es un profesor de secundaria, enseña a su clase de informática cómo escribir programas en C. Sin embargo, dado que es solo el comienzo del término, no les ha enseñado sobre la importancia de la sangría y el espaciado. Mientras marca su trabajo, le duelen tanto los ojos que grita de agonía y se da cuenta de que esto no puede continuar.
Tarea: ha decidido escribir un programa, en cualquier lenguaje, que tome un código fuente C válido como entrada y salida con un buen formato. Debes decidir qué es un código bien formateado, ya que es un concurso de popularidad. Se le recomienda implementar tantas funciones como pueda, los siguientes son algunos ejemplos:
- Agregue la sangría adecuada al frente de cada línea
- Agregue espacios después
,
y otros operadores, por ejemplo, convertirint a[]={1,2,3};
aint a[] = {1, 2, 3};
. Sin embargo, recuerde no procesar operadores dentro de literales de cadena. - Eliminar espacios finales después de cada línea
- Separando las declaraciones en varias líneas, por ejemplo, el estudiante puede escribir
tmp=a;a=b;b=tmp;
oint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
todo en una línea, puede separarlas en diferentes líneas. Sinfor
embargo, tenga en cuenta los bucles, tienen punto y coma, pero realmente no creo que deba dividirlos. - Agregue una nueva línea después de definir cada función
- Otra de las características que puede aportar es la ayuda para comprender los códigos de sus alumnos.
Criterios ganadores: este es un concurso de popularidad, por lo que la respuesta con la mayoría de los votos positivos gana. En caso de empate, la respuesta con la mayoría de las características implementadas gana. Si eso es un empate nuevamente, entonces el código más corto gana.
Se sugiere incluir en su respuesta una lista de características que ha implementado, así como una entrada y salida de muestra.
Editar: según lo solicitado en los comentarios, aquí hay una entrada de muestra, aunque tenga en cuenta que es solo para referencia y se recomienda implementar tantas funciones como sea posible.
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;}
Así es como normalmente formatearía este código: (Soy una persona perezosa)
#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;
}
Así es como creo que es más fácil de leer:
#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;
}
Además, ahora que empiezo a tener respuestas, la respuesta con el mayor número de votos será aceptada 5 días después de la última respuesta, es decir, si no hay más respuestas nuevas dentro de los 5 días, este concurso finalizará.
fuente
s/\s+/ /
) y llamarlo un díaRespuestas:
Debido a que estamos hablando de sangría y espacios en blanco, solo tenemos que escribir el código en un lenguaje de programación diseñado en realidad en torno a los espacios en blanco , ya que eso debe ser más fácil, ¿verdad?
Entonces la solución es:
Aquí está en base64:
Para aquellos que tienen problemas para imprimir el código en un documento, aquí está la versión anotada (puede encontrar un compilador para esto al final de la respuesta):
Esto todavía es un trabajo en progreso, ¡aunque con suerte debería pasar la mayoría de los criterios!
Características compatibles actualmente:
{
y}
.;
\"
)for
bloque)Entrada de ejemplo (agregué algunos casos extremos basados en el comentario de Quincunx, para que pueda verificar que se comporta correctamente):
Salida de ejemplo:
Tenga en cuenta que debido a que el espacio en blanco no admite EOF, la comprobación del intérprete genera una excepción, que debemos suprimir. Como no hay forma en el espacio en blanco para verificar si hay EOF (por lo que sé, ya que este es mi primer programa de espacios en blanco) es algo inevitable, espero que la solución aún cuente.
Este es el script que utilicé para compilar la versión anotada en el espacio en blanco adecuado:
Correr:
Tenga en cuenta que esto, además de convertir los caracteres
S
,L
yT
, también permite comentarios de una sola línea#
y puede convertir automáticamente números y literales de caracteres simples en su representación de espacios en blanco. Siéntase libre de usarlo para otros proyectos de espacios en blanco si lo deseafuente
for(i=0;i<10;i++)
;
el interior(
/)
bloques serían suficientes). Creo que deberían ser suficientes para considerar la solución "utilizable".Vim de la manera fácil, técnicamente usando solo un personaje:=
No soy un vim guru, pero nunca subestimo su poder y algunos lo consideran como un lenguaje de programación. Para mí, esta solución es un ganador de todos modos.
Abra el archivo en vim:
Dentro de vim presione las siguientes teclas
gg=G
Explicación:
gg va al principio del archivo
= es un comando para arreglar la sangría
G le dice que realice la operación hasta el final del archivo.
Puede guardar y salir con :wq
Es posible dejar
vim
ejecutar el comando desde la línea de comandos, por lo que esto también se puede hacer de una sola vez, pero lo dejo a las personas que sabenvim
mejor que yo.Ejemplo de Vim un archivo de entrada válido (fibonacci.c) con sangría incorrecta.
Abrir en vim:
vim fibonacci.c
presionegg=Gfuente
=GZZ
. (Vim golf ftw!)Dado que esto se usará para ayudar al maestro a comprender mejor el código del estudiante, es importante desinfectar la entrada primero. Las directivas de preprocesador no son necesarias, ya que solo introducen el desorden, y las macros también pueden introducir código malicioso en el archivo. ¡No queremos eso! Además, es completamente innecesario retener los comentarios originales que escribió el alumno, ya que de todos modos probablemente sean completamente inútiles.
En cambio, como todos saben que un buen código necesita buenos comentarios, además de corregir la sangría y la estructura, ¿por qué no agregar algunos comentarios muy útiles en torno a los puntos principales del código para que el resultado sea aún más comprensible! ¡Esto definitivamente ayudará al maestro a evaluar el trabajo que ha realizado el alumno!
Entonces de esto:
Produzcamos esto:
¿No es mucho mejor, con todos los comentarios útiles sobre las expresiones?
Entonces, esta es una solución de rubí que utiliza la
cast
gema, que es un analizador C (Sí, estoy haciendo trampa) . Como esto analizará el código y lo volverá a imprimir desde cero, significa que el resultado será perfectamente sangrado y también consistente, por ejemplo:¡Y también contendrá comentarios muy útiles sobre cómo funciona el código, lo que será muy útil tanto para los estudiantes como para el profesor!
indent.rb
Gemfile
fuente
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 caracteres
El archivo de entrada debe llamarse "input.c" y colocarse en el directorio de trabajo actual.
Ejemplo de salida, habiendo alimentado la entrada en la pregunta original:
Puede tardar unos segundos en ejecutarse dependiendo de su hardware, así que sea paciente :)
fuente
rm
?Rubí
Salida:
Salida para la entrada de caso límite de @ SztupY:
Características hasta ahora:
[x]
Agregue la sangría adecuada al frente de cada línea[x]
Agregue espacios después,
y otros operadores, por ejemplo, convertirint a[]={1,2,3};
aint a[] = {1, 2, 3};
. Sin embargo, recuerde no procesar operadores dentro de literales de cadena.[x]
Eliminar espacios finales después de cada línea[x]
Separando las declaraciones en varias líneas, por ejemplo, el estudiante puede escribirtmp=a;a=b;b=tmp;
oint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
todo en una línea, puede separarlas en diferentes líneas. Sinfor
embargo, tenga en cuenta los bucles, tienen punto y coma, pero realmente no creo que deba dividirlos.[ ]
Agregue una nueva línea después de definir cada función[ ]
Otra de las características que puede aportar es la ayuda para comprender los códigos de sus alumnos.fuente
Esto está escrito en python y se basa en los estándares de codificación GNU.
Características hasta ahora:
Código:
Entrada de ejemplo (pase un nombre de archivo como argumento):
Salida de ejemplo:
Esto tendrá errores.
fuente
.Red
Abra ese archivo usando Visual Studio
Entrada:
Salida:
fuente