Ситуация: Вы учитель в старших классах и обучаете свой компьютерный класс написанию программ на Си. Однако, поскольку это только начало термина, вы не научили их важности отступов и пробелов. Когда вы отмечаете их работу, ваши глаза болят так сильно, что вы кричите в агонии, и понимаете, что это не может продолжаться.
Задача: Вы решили написать программу на любом языке, которая принимает действительный исходный код на языке C в качестве входных данных и выводит их в удобном формате. Вы должны решить, что представляет собой красиво отформатированный код, так как это конкурс популярности. Вам предлагается реализовать как можно больше функций, вот несколько примеров:
- Добавьте правильные отступы в начале каждой строки
- Добавьте пробелы после
,
и другие операторы, например, преобразованиеint a[]={1,2,3};
вint a[] = {1, 2, 3};
. Не забудьте не обрабатывать операторы внутри строковых литералов. - Удалить пробелы после каждой строки
- Разделив утверждения на несколько строк, например, студент может написать
tmp=a;a=b;b=tmp;
илиint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
все в одну строку, вы можете разделить их на разные строки. Знайте оfor
циклах, хотя, у них есть точки с запятой, но я действительно не думаю, что вы должны разделить их. - Добавить новую строку после определения каждой функции
- Другие функции, которые вы можете использовать, помогают понять коды ваших учеников.
Критерии победы: это конкурс популярности, поэтому ответ с большинством голосов проголосует. В случае ничьей, ответ с большинством реализованных функций выигрывает. Если это снова ничья, то выигрывает самый короткий код.
Вам предлагается включить в свой ответ список реализованных вами функций, а также пример ввода и вывода.
Редактировать: В соответствии с запросом в комментариях здесь приведен пример ввода, хотя имейте в виду, что он предназначен только для справки, и вам рекомендуется реализовать как можно больше функций.
Входные данные:
#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;}
Вот как я обычно форматировал бы этот код: (Я ленивый человек)
#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;
}
Вот как мне кажется легче читать:
#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;
}
Кроме того, теперь, когда я начинаю получать ответы, ответ с наибольшим количеством голосов будет принят через 5 дней после последнего ответа, то есть, если в течение 5 дней больше не будет новых ответов, этот конкурс закончится.
источник
s/\s+/ /
) и назвать это днемОтветы:
Поскольку мы говорим об отступах и пробелах, мы просто должны написать код на языке программирования, который фактически разработан вокруг пробелов , так как это должно быть проще всего, верно?
Итак, решение таково:
Вот это в base64:
Для тех, у кого есть проблемы с распечаткой кода на бумаге, здесь есть аннотированная версия (вы можете найти компилятор для этого в конце ответа):
Эта работа еще не завершена, хотя, надеюсь, она пройдет большинство критериев!
В настоящее время поддерживаются функции:
{
и}
символов.;
\"
)for
блок)Пример ввода (я добавил некоторые крайние случаи на основе комментария Quincunx, чтобы вы могли убедиться, что он ведет себя правильно):
Пример вывода:
Обратите внимание, что, поскольку пробелы не поддерживают EOF, при проверке intepreter возникает исключение, которое мы должны исключить. Поскольку в пробелах нет способа проверить EOF (насколько я знаю, поскольку это моя первая программа пробелов), это что-то неизбежное, я надеюсь, что решение все еще имеет значение.
Это скрипт, который я использовал для компиляции аннотированной версии в надлежащие пробелы:
Бежать:
Обратите внимание , что это, кроме преобразования
S
,L
иT
символов, а также позволяют однострочные комментарии с#
, и может автоматически преобразовывать числа и простые литералы символов в их пробельном представление. Не стесняйтесь использовать его для других пробельных проектов, если хотитеисточник
for(i=0;i<10;i++)
;
inside(
/)
blocks будет достаточно). Я думаю, что этого должно быть достаточно, чтобы считать решение "пригодным для использования".Vim простой способ, технически используя только один символ:=
Я не гуру вим, но я никогда не недооцениваю его мощь, и некоторые считают его языком программирования. Для меня это решение в любом случае является победителем.
Откройте файл в vim:
В VIM нажмите следующие клавиши
gg=G
Объяснение:
gg идет в начало файла
= команда для исправления отступа
G говорит ему выполнить операцию до конца файла.
Вы можете сохранить и выйти с :wq
Можно разрешить
vim
запуск команды из командной строки, так что это также может быть сделано в одну строку, но я оставляю это людям, которые знаютvim
лучше меня.Пример Vim допустимый входной файл (fibonacci.c) с плохим отступом.
Открыть в VIM:
vim fibonacci.c
нажмитеgg=Gисточник
=GZZ
. (Vim golf ftw!)Поскольку это будет использоваться, чтобы помочь учителю лучше понять код ученика, важно сначала санировать входные данные. Директивы препроцессора не нужны, поскольку они просто создают беспорядок, и макросы также могут вводить вредоносный код в файл. Мы этого не хотим! Кроме того, совершенно необязательно сохранять первоначальные комментарии, которые написал студент, поскольку они, вероятно, в любом случае совершенно бесполезны.
Вместо этого, поскольку всем известно, что хороший код нуждается в хороших комментариях, кроме исправления отступа и структуры, почему бы не добавить несколько очень полезных комментариев вокруг основных пунктов кода, чтобы сделать результат еще более понятным! Это, безусловно, поможет учителю оценить работу, которую проделал студент!
Итак, из этого:
Давайте произведем это:
Разве это не намного лучше, со всеми полезными комментариями вокруг выражений?
Так что это рубиновое решение, использующее
cast
гем, который является C-парсером (Да, я обманываю) . Поскольку это будет анализировать код и перепечатывать его с нуля, это будет означать, что результат будет идеально с отступом и также согласованным, например:А также он будет содержать очень полезные комментарии о том, как работает код, что будет очень полезно как для студентов, так и для учителя!
indent.rb
Gemfile
источник
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Баш, 35 знаков
Входной файл должен называться «input.c» и помещаться в текущий рабочий каталог.
Пример вывода, введя ввод в исходный вопрос:
Запуск может занять несколько секунд в зависимости от вашего оборудования, так что наберитесь терпения :)
источник
rm
?Рубин
Выход:
Вывод для входного регистра @ SztupY:
Особенности пока:
[x]
Добавьте правильные отступы в начале каждой строки[x]
Добавьте пробелы после,
и другие операторы, например, преобразованиеint a[]={1,2,3};
вint a[] = {1, 2, 3};
. Не забудьте не обрабатывать операторы внутри строковых литералов.[x]
Удалить пробелы после каждой строки[x]
Разделив утверждения на несколько строк, например, студент может написатьtmp=a;a=b;b=tmp;
илиint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
все в одну строку, вы можете разделить их на разные строки. Знайте оfor
циклах, хотя, у них есть точки с запятой, но я действительно не думаю, что вы должны разделить их.[ ]
Добавить новую строку после определения каждой функции[ ]
Другие функции, которые вы можете использовать, помогают понять коды ваших учеников.источник
Это написано на python и основано на стандартах кодирования GNU.
Особенности пока:
Код:
Пример ввода (передайте имя файла в качестве аргумента):
Пример вывода:
Это будет иметь ошибки.
источник
.Сеть
Откройте этот файл с помощью Visual Studio
Входные данные:
Выход:
источник