"\n" выдает в итоге 0D,0A. Если выводить символьную переменную, значение которой 0x0A, все равно будет два символа. Так вот, как разделить строки одним только символом 0A? -- Решаю олимпиадную задачу с автоматической проверкой на сервере. В примере выходного файла строки разделены именно этим символом, нужно создавать такой же. Вот только странно, что все три варианта разделения нормально отображаются в far. С чего бы это?
DarkWanderer как разделить строки одним только символом 0A? Надо установить для стандартного вывода бинарный режим. Для dos/win Код (Text): #include <stdio.h> #include <fcntl.h> #include <io.h> int main(void) { _setmode(_fileno(stdout), _O_BINARY); fprintf(stdout, "\n"); return 0; } все три варианта разделения нормально отображаются в far. С чего бы это? Исходные тексты far'а доступны http://farmanager.com/svn/trunk/unicode_far. Три варианта - dos/win - \xD\xA, nix - \xA и mac - \xD?
Можно ещё использовать cprintf вместо printf, он не вмешивается в выводимые данные. Или puts с sprintf.
q_q ->Надо установить для стандартного вывода бинарный режим. Для dos/win Получилось, да. Но теперь на сервере не компилится. Даже библиотеки отключил, повыносив константу и прототип, все равно. ->Три варианта - dos/win - \xD\xA, nix - \xA и mac - \xD? Да, они. Исходники ковырять не буду пока, стану считать, что варианты укладываются в логику и в far'e предусмотрены. Vov4ick cprintf выводит только на дисплей, а нужно в стандартный поток, который может быть любым. -- Читаю книгу "С. Скиена - Олимпиадные задачи по программированию", для проверки использую специально для книги созданный http://www.programming-challenges.com/ . Программа там вызывается что-то вида: program <infile >outfile. Во всех представленных примерах используется только printf и никакой смены режима. Компилятор - Lcc, какой у них - не знаю.
DarkWanderer Опиши процедуру компиляции "на сервере" и почему выходной файл "нужно создавать такой же"? Компилятор - Lcc, какой у них - не знаю. lcc, A Retargetable Compiler for ANSI C?
char str_out[256], str_in[]="string"; int A=0xa; str_out[0]=0; strcat(str_out,str_in); strcat(str_out,(char*)&A); или int l=strlen(str_out); str_out[l]=0xa; str_out[l+1]=0;
q_q ->Опиши процедуру компиляции "на сервере" и почему выходной файл "нужно создавать такой же"? Не знаю, как там компилируется. Есть web форма, куда можно скопировать исходник. Есть кнопка. Копируешь, жмешь, пишет скупой отчет - "wrong answer", "compiling error" и др. У меня выдает первый, значит, формат результатов не подходит. Как пишут, программа вначале компилируется, если без ошибок - запускается ряд тестов. В качестве входного и выходного потоков файлы. Затем файлы сверяются с эталонами. Примеры входных и выходных файлов можно скачать на том же сайте, мой выходной отличается только тем, что строки разделяются другими символами. lcc, A Retargetable Compiler for ANSI C? Кажется, нет. Но компилятор не принципиален. http://www.rsdn.ru/article/devtools/devtools.xml http://www.cs.virginia.edu/~lcc-win32/ _basmp_ Не пробовал еще так. Хотя должно быть стандартное решение, в примерах все так просто и аккуратно. -- Может, у меня и правда, ответ неправильный выдает? Тестировал слабо, но ошибок не вижу. Задача простая, самая первая в книге. h**p://www.darkwanderer.nm.ru/file/3n+1.rar
Проблема в другом. Если программа компиляется на сервере, значит использует она "серверную" libc, и значит выводит в качестве терминатора строки именно \n, а не \r\n. Я представляю о чём ты говоришь (с аттачем лень связываться) -- там очень внимательно надо читать условие, и при написании программы всё время думать о том, как программа должна себя вести в специальных случаях.
_basmp_ Твои попытки "обмануть" crtl наивны. Управляющие символы \n, \r, \t и т.п. характерны для исходного кода на Си. В объектном/исполняемом модуле они хранятся как числа - 0Ah, 0Dh, 09h. Добавление 0xD происходит в момент вывода 0xA, например, из исходных кодов crtl msvc6 Код (Text): /* CRT\SRC\WRITE.C строки со 143 по 161*/ ... if ( _osfile(fh) & FTEXT ) { /* text mode, translate LF's to CR/LF's on output */ p = (char *)buf; /* start at beginning of buffer */ dosretval = 0; /* no OS error yet */ while ( (unsigned)(p - (char *)buf) < cnt ) { q = lfbuf; /* start at beginning of lfbuf */ /* fill the lf buf, except maybe last char */ while ( q - lfbuf < BUF_SIZE - 1 && (unsigned)(p - (char *)buf) < cnt ) { ch = *p++; if ( ch == LF ) { ++lfcount; *q++ = CR; } *q++ = ch; } ... DarkWanderer Но компилятор не принципиален. Не совсем так. Скорее всего твой код может использовать только ANSI C, а _setmode - это dos/win specific. Может, у меня и правда, ответ неправильный выдает? Что бы ответить на этот вопрос, надо знать на каких данных тестируется код. С кодировкой конца строки проблем быть не должно, т.к. ты отдаешь исходный текст, то завершения строк ставит их (серверный) компилятор. Твой код не безупречен. Например, у твоей программы ограничение на 32-ве пары чисел, или нигде не сказано, что числа в паре будут упорядочены по возрастанию, а у тебя Код (Text): ... for(K=Data[i]; K<=Data[I+1]; K++) ... .
q_q вообще говоря, я никогда не интересовался в какой момент \n подменяется на 10 13. Но если это происходит именно в процедуре записи текста, то стоит попробовать спринтф и бинарную запись (приведеный сорец не оставляет выбора).
Полностью согласен с q_q. Спасибо. _basmp_ я ошибался с конкретикой вопроса. Еще не дорешал, правда. -- ACM - хорошая штука. И раз у меня принципиальные проблемы с самой простой из задач обязательно буду учавствовать в тренировках следующего года.
DarkWanderer Помню этот контест... пару лет назад решал задачки еще со старого сервера: http://acm.uva.es . Посмотрел Ваш исходник. Вообще совсем не обязательно (и даже нежелательно) сначала читать все входные данные, а потом только делать вывод. Поток ввода и поток вывода не коррелируют. Не рекомендовал бы использовать int... может в MSVC он и четырехбайтовый, но мало ли какой там компилятор. При работе с целыми числами в таких задачах лучше использовать unsigned long int или вообще __int64 (если не изменяет память, то для этого контеста он же long long). И самое главное! В задаче не сказано, что сначала идет меньшее число, а потом большее! Там сказано МЕЖДУ i и j. P.S. Не нужно извращаться с переходом на новую строку. \n там вполне нормально проходит.
Да, в коде были ошибки. Потом оптимизировать еще пришлось. Но решил и сервер принял. Кому не лень, прочитайте, где там еще некрасиво осталось. Код (Text): // 3n+1. // http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110101&format=html // @JUDGE_ID: 18321 110101 C // @BEGIN_OF_SOURCE_CODE #include <stdio.h> int GetCicleLength(int value) { int length=1; //cicle length while(value!=1) { if(!(value%2)) value/=2; else { value*=3; value++; } length++; } return length; } int main() { int a; // int b; // int t; int K; //index int maxL; // int curL; // while( scanf("%d %d",&a,&b)!=EOF ) { printf("%d",a); printf(" "); printf("%d",b); if(a>b) { t=a; a=b; b=t; } maxL=0; for(K=a; K<=b; K++) { curL=GetCicleLength(K); if(curL>maxL) maxL=curL; } printf(" %d\n",maxL); } return 00; } // @END_OF_SOURCE_CODE
l_inc Использование int проходит. А когда и в чем он был слово? -- Хотя да, перечитал сам весело стало, две строки и спрашиваю, что может быть не красивым. Получилось - похвастался. Тогда не так. Каким извратом можно такой код оптимизировать еще? Ради интереса.
DarkWanderer Ну в первой задаче постарались только дать примерное представление о том, как решать подобные задачи, поэтому особо хитрых формулировок и особо хитрых тестов там не было. А Вы попробуйте 10655. Или может даже совсем простую 10642. Там уже не пройдет. В шестнадцатибитном компиляторе.
l_inc А ведь и правда.. Обязательно порешаю остальные. Первый курс прошел. Впереди целых четыре, а с тренером уже познакомился. Все к одному, выбора не остается.