Situation: vous êtes un enseignant du secondaire et enseignez à votre classe informatique comment écrire des programmes C. Cependant, comme ce n'est que le début du trimestre, vous ne leur avez pas enseigné l'importance de l'indentation et de l'espacement. Alors que vous marquez leur travail, vos yeux vous font tellement mal que vous criez à l'agonie et réalisez que cela ne peut pas continuer.
Tâche: Vous avez décidé d'écrire un programme, dans n'importe quelle langue, qui prend un code source C valide comme entrée et le produit bien formaté. Vous devez décider ce qu'est un code bien formaté, car il s'agit d'un concours de popularité. Nous vous encourageons à implémenter autant de fonctionnalités que possible, voici quelques exemples:
- Ajoutez une indentation appropriée au début de chaque ligne
- Ajoutez des espaces après
,
et d'autres opérateurs, par exemple en convertissantint a[]={1,2,3};
enint a[] = {1, 2, 3};
. N'oubliez pas de ne pas traiter les opérateurs dans les chaînes de caractères. - Supprimer les espaces de fin après chaque ligne
- En séparant les déclarations en plusieurs lignes, par exemple, l'élève peut écrire
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);}
tout en une seule ligne, vous pouvez les séparer en différentes lignes. Attention auxfor
boucles, elles contiennent des points-virgules, mais je ne pense vraiment pas que vous devriez les séparer. - Ajouter une nouvelle ligne après avoir défini chaque fonction
- Une autre autre fonctionnalité, vous pouvez trouver l'aide pour comprendre les codes de vos élèves.
Critères de victoire: Il s'agit d'un concours de popularité, donc la réponse avec la plupart des votes positifs l'emporte. En cas d'égalité, la réponse avec le plus de fonctionnalités implémentées l'emporte. Si c'est à nouveau une égalité, le code le plus court l'emporte.
Il est suggéré d'inclure dans votre réponse une liste des fonctionnalités que vous avez implémentées, ainsi qu'un exemple d'entrée et de sortie.
Modifier: comme demandé dans les commentaires, voici un exemple d'entrée, mais gardez à l'esprit qu'il ne s'agit que de référence et il est recommandé d'implémenter autant de fonctionnalités que possible.
Contribution:
#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;}
Voici comment je formaterais normalement ce code: (je suis une personne paresseuse)
#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;
}
Voici comment je pense qu'il est plus facile à lire:
#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;
}
De plus, maintenant que je commence à avoir des réponses, la réponse avec le plus grand nombre de votes sera acceptée 5 jours après la dernière réponse, c'est-à-dire s'il n'y a plus de nouvelles réponses dans les 5 jours, ce concours prendra fin.
la source
s/\s+/ /
) et l'appeler un jourRéponses:
Parce que nous parlons d'indentation et d'espaces blancs, nous devons simplement écrire le code dans une programmation un langage qui est réellement conçu autour des espaces blancs , car cela doit être le plus simple, non?
La solution est donc:
Le voici en base64:
Pour ceux qui ont des problèmes pour imprimer le code sur un papier, voici la version annotée (vous pouvez trouver un compilateur pour cela à la fin de la réponse):
Ce travail est toujours en cours, même si nous espérons qu'il devrait répondre à la plupart des critères!
Fonctionnalités actuellement prises en charge:
{
et}
.;
\"
)for
bloc)Exemple d'entrée (j'ai ajouté quelques cas de bord basés sur le commentaire de Quincunx, afin que vous puissiez vérifier qu'il se comporte correctement):
Exemple de sortie:
Notez que parce que les espaces blancs ne prennent pas en charge la vérification EOF, l'interpréteur lève une exception, que nous devons supprimer. Comme il n'y a aucun moyen dans les espaces blancs de vérifier l'EOF (pour autant que je sache, car c'est mon premier programme d'espaces blancs), c'est quelque chose d'inévitable, j'espère que la solution compte toujours.
Voici le script que j'ai utilisé pour compiler la version annotée dans les espaces appropriés:
Courir:
Notez que cela, outre la conversion des caractères
S
,L
etT
, permet également des commentaires sur une seule ligne avec#
, et peut automatiquement convertir des nombres et des littéraux de caractères simples dans leur représentation d'espaces. N'hésitez pas à l'utiliser pour d'autres projets d'espaces blancs si vous le souhaitezla source
for(i=0;i<10;i++)
;
intérieur(
/)
blocs serait suffisant). Je pense que cela devrait suffire pour considérer la solution "utilisable".Vim en toute simplicité, en n'utilisant techniquement qu'un seul caractère:=
Je ne suis pas un gourou de Vim, mais je ne sous-estime jamais son pouvoir et certains le considèrent comme un langage de programmation. Pour moi, cette solution est gagnante de toute façon.
Ouvrez le fichier dans vim:
Dans vim, appuyez sur les touches suivantes
gg=G
Explication:
gg va en haut du fichier
= est une commande pour corriger l'indentation
G lui indique d'exécuter l'opération jusqu'à la fin du fichier.
Vous pouvez enregistrer et quitter avec :wq
Il est possible de laisser
vim
exécuter la commande à partir de la ligne de commande, donc cela peut également être fait dans une seule ligne, mais je laisse cela aux personnes qui connaissentvim
mieux que moi.Exemple Vim d' un fichier d'entrée valide (fibonacci.c) avec un mauvais retrait.
Ouvrir dans vim:
vim fibonacci.c
appuyez surgg=Gla source
=GZZ
. (Vim golf ftw!)Étant donné que cela sera utilisé pour aider l'enseignant à mieux comprendre le code de l'élève, il est important de nettoyer d'abord l'entrée. Les directives de pré-processeur sont inutiles, car elles ne font qu'encombrer l'encombrement, et les macros peuvent également introduire du code malveillant dans le fichier. Nous ne voulons pas ça! De plus, il n'est absolument pas nécessaire de conserver les commentaires originaux de l'élève, car ils sont probablement complètement inutiles de toute façon.
Au lieu de cela, comme tout le monde sait qu'un bon code a besoin de bons commentaires, en plus de corriger l'indentation et la structure, pourquoi ne pas ajouter des commentaires très utiles autour des principaux points du code pour rendre le résultat encore plus compréhensible! Cela aidera certainement l'enseignant à évaluer le travail accompli par l'élève!
Donc à partir de cela:
Produisons ceci:
N'est-ce pas beaucoup mieux, avec tous les commentaires utiles autour des expressions?
Il s'agit donc d'une solution rubis utilisant la
cast
gemme, qui est un analyseur C (Oui, je triche) . Comme cela analysera le code et le réimprimera à partir de zéro, cela signifie que le résultat sera parfaitement indenté et également cohérent, par exemple:Et il contiendra également des commentaires très utiles sur le fonctionnement du code, qui seront super utiles pour les étudiants et le professeur!
indent.rb
Gemfile
la source
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 caractères
Le fichier d'entrée doit être nommé "input.c" et placé dans le répertoire de travail actuel.
Exemple de sortie, après avoir reçu l'entrée dans la question d'origine:
L'exécution peut prendre quelques secondes en fonction de votre matériel, alors soyez patient :)
la source
rm
?Rubis
Production:
Sortie pour l'entrée de cas de bord de @ SztupY:
Caractéristiques jusqu'à présent:
[x]
Ajoutez une indentation appropriée au début de chaque ligne[x]
Ajoutez des espaces après,
et d'autres opérateurs, par exemple en convertissantint a[]={1,2,3};
enint a[] = {1, 2, 3};
. N'oubliez pas de ne pas traiter les opérateurs dans les chaînes de caractères.[x]
Supprimer les espaces de fin après chaque ligne[x]
En séparant les déclarations en plusieurs lignes, par exemple, l'élève peut écriretmp=a;a=b;b=tmp;
ouint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
tout en une seule ligne, vous pouvez les séparer en différentes lignes. Attention auxfor
boucles, elles contiennent des points-virgules, mais je ne pense vraiment pas que vous devriez les séparer.[ ]
Ajouter une nouvelle ligne après avoir défini chaque fonction[ ]
Une autre autre fonctionnalité, vous pouvez trouver l'aide pour comprendre les codes de vos élèves.la source
Ceci est écrit en python et basé sur les normes de codage GNU.
Caractéristiques jusqu'à présent:
Code:
Exemple d'entrée (passez un nom de fichier comme argument):
Exemple de sortie:
Cela aura des bugs.
la source
.Net
Ouvrez ce fichier à l'aide de Visual Studio
Contribution:
Production:
la source