Difference between revisions of "Serve.cfg:problem:source header"
Podlesnykh (talk | contribs) |
|||
Line 19: | Line 19: | ||
преобразования языка программирования можно использовать различные | преобразования языка программирования можно использовать различные | ||
файлы для разных языков программирования. | файлы для разных языков программирования. | ||
+ | |||
+ | source_header и source_footer обычно лежит там же, где и условия задач (в каталоге statements). | ||
+ | Рекомендуется в конце source_header и начале source_footer ставить лишний перевод строки, чтобы текст, посланный участником, не склеивался и не вызывал ошибку компиляции. Valgrind и компиляторы сообщают о номере строки, в которой произошла ошибка. Из-за source_header'а номера строк изменяются. Чтобы участники могли понять, в чём ошибка, рекомендуется либо указывать длину source_header'а в условии, либо, если позволяет язык, явным образом делать номера строк сдвинутыми на некую большую круглую константу. | ||
+ | |||
+ | Пример source_header'а. | ||
+ | <pre> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include <string.h> | ||
+ | |||
+ | int cmp_int(const void * p1, const void * p2); | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int x,y,z; | ||
+ | scanf("%d",&x); | ||
+ | scanf("%d",&y); | ||
+ | z=cmp_int(&x,&y); | ||
+ | if(((x-y<0)&&(z<0))||((x-y>0)&&(z>0))||((x==y)&&(z==0))) | ||
+ | {printf("%d\n",x-y); return 0;} | ||
+ | printf("%d\n",z); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | #line 1000 | ||
+ | |||
+ | |||
+ | </pre> | ||
+ | |||
+ | В данной задаче участник должен реализовать функцию cmp_int. Логика проверки (фактически, чекер) встроена в source_header. Аргументы, передаваемые функции, берутся из тестов и часть их может быть видна участнику, а в случае ошибки вывод функции участника виден как вывод программы. Чекер может использоваться стандартный (cmp_int). | ||
+ | |||
+ | |||
+ | В описании задачи в конфигурационном файле serve.cfg можно указать, что в разных вариантах header'ы будут разными. | ||
+ | Например: | ||
+ | <pre> | ||
+ | [problem] | ||
+ | id = 87 | ||
+ | super = "Generic" | ||
+ | short_name = "elong_07" | ||
+ | long_name = "is equal" | ||
+ | max_open_file_count = 32 | ||
+ | max_process_count = 64 | ||
+ | full_score = 80 | ||
+ | test_score = 1 | ||
+ | score_bonus = "16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1" | ||
+ | open_tests = "1:full" | ||
+ | standard_checker = "cmp_file" | ||
+ | enable_language = "gcc-vg" | ||
+ | enable_language = "g++-vg" | ||
+ | variant_num = 2 | ||
+ | source_header = "elong_07_begin-%Vv.c" | ||
+ | </pre> | ||
+ | В данном примере в зависимости от варианта перед кодом участника будет либо elong_07_begin-1.c, либо elong_07_begin-2.c. Если делаете эти файлы символическими ссылками, они не должны вести на один и тот же файл. |
Latest revision as of 16:12, 27 October 2015
Навигация: Главная страница/Система ejudge/Использование/Конфигурационные файлы/serve.cfg/Конфигурационные параметры задач/source_header
Редактирование элемента: страница "Editing contest", вкладка "Problems (serve.cfg)", блок "Abstract problems", поле "Source header file", либо страница "Editing contest", вкладка "Problems (serve.cfg)", блок "Concrete problems", поле "Source header file".
Данная переменная вместе с переменной source_footer позволяет задавать имя файла с текстом, который будет использоваться в начале и конце сданных решений при компиляции программы. Например, условие задачи может требовать написания одной функции или класса, а не целой программы. В этом случае при компиляции в начало текста программы можно добавить, например, директивы подключения необходимых библиотек, а в конец программы - главную функцию программы, которая считывает входные данные из файла, запускает пользовательскую функцию и записывает результат в выходной файл. Таким образом на турнирах могут использоваться задачи в стиле TopCoder. Значения переменных наследуются от абстрактной задачи, при этом выполняются форматные подстановки. Особенность данных переменных в том, что форматные подстановки выполняются непосредственно перед компиляцией программы и, таким образом, могут использовать форматные преобразования языка программирование. С помощью форматных преобразования языка программирования можно использовать различные файлы для разных языков программирования.
source_header и source_footer обычно лежит там же, где и условия задач (в каталоге statements). Рекомендуется в конце source_header и начале source_footer ставить лишний перевод строки, чтобы текст, посланный участником, не склеивался и не вызывал ошибку компиляции. Valgrind и компиляторы сообщают о номере строки, в которой произошла ошибка. Из-за source_header'а номера строк изменяются. Чтобы участники могли понять, в чём ошибка, рекомендуется либо указывать длину source_header'а в условии, либо, если позволяет язык, явным образом делать номера строк сдвинутыми на некую большую круглую константу.
Пример source_header'а.
#include <stdio.h> #include <string.h> int cmp_int(const void * p1, const void * p2); int main() { int x,y,z; scanf("%d",&x); scanf("%d",&y); z=cmp_int(&x,&y); if(((x-y<0)&&(z<0))||((x-y>0)&&(z>0))||((x==y)&&(z==0))) {printf("%d\n",x-y); return 0;} printf("%d\n",z); return 0; } #line 1000
В данной задаче участник должен реализовать функцию cmp_int. Логика проверки (фактически, чекер) встроена в source_header. Аргументы, передаваемые функции, берутся из тестов и часть их может быть видна участнику, а в случае ошибки вывод функции участника виден как вывод программы. Чекер может использоваться стандартный (cmp_int).
В описании задачи в конфигурационном файле serve.cfg можно указать, что в разных вариантах header'ы будут разными.
Например:
[problem] id = 87 super = "Generic" short_name = "elong_07" long_name = "is equal" max_open_file_count = 32 max_process_count = 64 full_score = 80 test_score = 1 score_bonus = "16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1" open_tests = "1:full" standard_checker = "cmp_file" enable_language = "gcc-vg" enable_language = "g++-vg" variant_num = 2 source_header = "elong_07_begin-%Vv.c"
В данном примере в зависимости от варианта перед кодом участника будет либо elong_07_begin-1.c, либо elong_07_begin-2.c. Если делаете эти файлы символическими ссылками, они не должны вести на один и тот же файл.