PDA

Просмотр полной версии : Просьба к программистам



CoValent
19.08.2010, 16:25
Есть такой симулятор боевых действий - Armed Assualt (ныне уже II часть). Поскольку его разработчики-чехи постоянно создают карты то тропической Европы, то Чернаруси с Такистаном (то есть создают любые карты вне территории США) - я пробую делать копию острова Оаху, штат Гавайи (да-да, Перл-Харбор и т.п.)

К сожалению, мне требуется небольшая программа для этого. Вот, что она должна делать:

...Задача: нужна программа, которая из двух файлов с одинаковым количеством строк будет считывать строки, сверять их и записывать результат сверки в третий файл.

Подробно: есть два текстовых файла, с равным количеством строк (16.777.216 в каждом). Каждая строка состоит из 3-х положительных или отрицательных чисел - X Y Z - с пробелом между ними. Программа должна взять первую строку файла A, взять такую же порядковую строку файла B, сверить число Z в обеих строках и записать такую же порядковую строку в файл C по алгоритму

записать числовые значения X Y из файла A;
если в файле A числовое значение Z<0 и в файле B числовое значение Z=0, то записать числовое значение Z из файла A;
если в файле A числовое значение Z=0 и в файле B числовое значение Z=0, то записать числовое значение Z=0;
если в файле A числовое значение Z=0 и в файле B числовое значение Z>0, то записать числовое значение Z из файла B.

после чего перейти к сверке и записи следующей строки, и так до самого окончания файла.

Графический режим: не требуется.
Агрументы запуска: могут быть использованы строчные из BAT-файла или любым другим удобным для программиста способом, хоть намертво заданными именами.
Желательно: индикатор текущего выполнения, любым способом, начиная с номера строки и заканчивая %%.
Сроки создания: мне кажется, что любой программист способен создать подобное за 5 минут (мне точно не требовалось бОльшего лет 18 назад) - но я могу и потерпеть несколько дней.
Среда исполнения: законченный исполняемый файл, работающий в любой голой операционной системе Windows или подробные объяснения, как запустить готовый продукт в средах Microsoft Visual C++ / Microsoft .NET Framework 4.
Что могу за это: легко пожертвую одной из строчек "Credits" и "Special Thanks" у готовой карты. :)
Спасибо всем, кто поможет! :)

DogEater
19.08.2010, 16:51
А если в файле А Z>0, что писать в C?

CoValent
19.08.2010, 16:56
А если в файле А Z>0, что писать в C?
В файле A не может быть Z>0, так как это файл глубин (в том числе рек и ручьёв), и все значения Z там меняются от отрицательных до 0. Так же, как в файле B не может быть отрицательных значений (это файл высот и там значение Z колеблется от 0 до положительных значений).

Но если я и там налажаю - а я могу! :D - то было бы неплохо, чтобы программа об этом оповещала, записывала в файл C Z=0, и отдельным файлом записывала номер строки и саму строку.

Буду тогда смотреть, где же я в ландшафтере налажал... :ups:

Gelo
19.08.2010, 17:18
Проще было бы выложить примеры файлов.

DogEater
19.08.2010, 17:24
Скриптик в целом готов, часов в 19 я его откомпилирую его в ActivePerl и выложу сюда.
А можно пример данных для тестового прогона?

CoValent
19.08.2010, 17:36
Вот простенький файл у острова 256*256. Нужна ли пара с файлами высот и глубин?

CoValent
19.08.2010, 17:37
Понял, нужна... сейчас сделаю.

CoValent
19.08.2010, 17:55
Вот два файла.

DogEater
19.08.2010, 18:53
использование: diffalt.exe <fileA> <fileB>
в том же каталоге пишется файл результатов result.XXX.txt где XXX - номер процесса, сделано для того что бы избежать перезаписывания.
в случае возникновения ошибок они записываются в файл error.XXX.txt, ult где XXX - номер процесса.
формат файла ошибок: номер строки с ошибкой:имя файла:строка содержавшая ошибку целиком
Если размер файла ошибок равен нулю - значит ошибок не было.
При работе утилита выдаёт номер обработанной строки в стандартный вывод для контроля исполнения.

RR_Rumata
19.08.2010, 19:23
Кстати не описано что делать, если (A)Z<0 и B(Z)>0.
Смотрим на Line # 23762.

2DogEater. В этом случае ты записал 0, хотя (A)Z = -0.0001 (т.е. больше похоже на 0), и в этом случае нужно писать 1 из B.

DogEater
19.08.2010, 19:46
Кстати не описано что делать, если (A)Z<0 и B(Z)>0.
Смотрим на Line # 23762.
Это в каком файле? А или B? У меня
Раз не описано, то обрабатываем по умолчанию как ошибку и пишем 0 в файл С.
Если заказчик опишет что делать в таком случае - сделаем.


2DogEater. В этом случае ты записал 0, хотя (A)Z = -0.0001 (т.е. больше похоже на 0), и в этом случае нужно писать 1 из B.
Если заказчик укажет необходимость такого сравнения(и точность округления) - сделаем.

CoValent
19.08.2010, 20:17
...diffalt.exe <fileA> <fileB>...
Спасибо, всё работает отлично! :)

Живой анекдот: вот после этой операции, как оказалось, я уже не могу посмотреть результат в той же программе, что сделала исходные два файла... она этот формат только пишет, но не читает! :lol:

Ладно, всё равно там вся работа через... не скажу как... но визуализация лишь на предпоследнем шаге, и тоже в аналоговом режиме, а не в цифре...

Спасибо! :)

Что написать в благодарностях?

CoValent
19.08.2010, 20:25
Кстати не описано что делать, если (A)Z<0 и B(Z)>0...
Писать из второго, но писать с ошибкой, ибо по определению (A)Z≤0 и B(Z)≥0.

...Смотрим на Line # 23762.

2DogEater. В этом случае ты записал 0, хотя (A)Z = -0.0001 (т.е. больше похоже на 0), и в этом случае нужно писать 1 из B.
У меня в файлах A и B эти строки таковы:

0.6328 -0.2813 -1.0035
0.6328 -0.2813 0.0000

Итоговая строка верна:

0.6328 -0.2813 -1.0035

DogEater
19.08.2010, 21:09
Писать из второго, но писать с ошибкой, ибо по определению (A)Z≤0 и B(Z)≥0.

Стоп, не понял. Так делать доп. обработку это случая или нет?

CoValent
19.08.2010, 21:33
Стоп, не понял. Так делать доп. обработку это случая или нет?
Скорее, проверку этих случаев и такое же вынесение в отдельный файлик.

Там действительно в первом случае всегда должно быть меньше или равно 0 и во втором только больше или равно 0 же.

Так что если не сложно... :ups:

DogEater
19.08.2010, 22:34
Для варианта (A)Z≤0 и B(Z)≥0 запись в файл С из файла B плюс запись в ошибку обоих значений.
Так?
Кстати таких набралось строк около 800.

CoValent
19.08.2010, 23:35
Спасибо! :)

Там и должно было быть так - я чуть заехал "на море", когда слепил "сушу". :)

DogEater
20.08.2010, 09:30
Ну и прекрасно!
Нехай потопчут нашу рідну Гавайщіну! :)