Difference between revisions of "Serve.cfg:problem:source header"

From EjudgeWiki
 
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. Если делаете эти файлы символическими ссылками, они не должны вести на один и тот же файл.