Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] [Алгоритм] геокодирование 
V
    Опции темы
NoviceF
Дата 16.3.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Собственно задание следующее:

"Напишите программу, принимающую на вход любые почтовые адреса, удовлетворяющие грамматике 

<полный адрес> = <индекс>, <страна>, [<регион>], [<район>], <населенный пункт>, <адрес>;

и выдающая для каждого адреса имя улицы, не включая тип улицы. Например, для адреса «347924, Россия, Ростовская область, Таганрог, 17-Й Квартальный проезд, 25, строение 2, корпус 4, квартира 110» программа должна выдать «17-Й Квартальный».

Программа может быть реализована на любом языке программирования и должна принимать список адресов в виде текстового файла. Выдача результата – в выходной поток или файл".



Решил обратиться к C++, но моих знаний однозначно недостаточно. Со вводом/выводом я бы ещё мог попробовать разобраться, но какой использовать алгоритм для распознания элементов адреса с последующим выводом нужного сегмента, и как его реализовать, понять не могу.

И несколько адресов для примера, которые должна мочь обработать программа:

478545, Россия, Красноярский кр., г. Красноярск, пр-кт Молокова, 72г
658745, Россия, Сахалинская область, поселок Сахалинский, Петропавловское шоссе, 23-1, кв. 23
236544, Россия, Еврейская автономная область, Биробиджан, пр-кт им. Жукова, 32/3, кв 1


Спасибо, кто сможет помочь.

PM MAIL   Вверх
NoviceF
Дата 16.3.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



с просьбой удалять тему я поторопился.. smile

Это сообщение отредактировал(а) NoviceF - 17.3.2012, 13:48
PM MAIL   Вверх
borisbn
Дата 17.3.2012, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Код

#include <string>
#include <vector>
#include <algorithm>

typedef std::vector< std::string > string_list;

string_list operator+( const std::string & str, const string_list & v )
{
   string_list result( 1, str );
   result.insert( result.end(), v.begin(), v.end() );
   return result;
}

bool contains( const string_list & v, const std::string & str ) {
   return std::find( v.begin(), v.end(), str ) != v.end();
}

string_list split( const std::string & str, const std::string & sep )
{
   size_t sep_idx = str.find( sep );
   if ( sep_idx == std::string::npos ) {
      return string_list( 1, str );
   }
   return str.substr( 0, sep_idx ) + split( str.substr( sep_idx + 1, std::string::npos ), sep );
}

std::string get_street( const std::string & full_address )
{
   string_list address_parts = split( full_address, "," );
   const size_t street_pos = 5;
   if ( address_parts.size() <= street_pos ) {
      return "(wrong address)";
   }
   string_list street_parts = split( address_parts.at( street_pos ), " " );
   if ( street_parts.size() == 1 ) {
      return street_parts.at( 0 );
   }
   string_list street_defs =
   {
      "ул", "ул.", "улица",
      "пр", "пр.", "пр-кт", "проспект",
      "ш", "ш.", "шоссе",
      "п", "п.", "пер", "пер.", "переулок",
      "проезд"
   };
   std::string result;
   for ( string_list::const_iterator it = street_parts.begin(); it != street_parts.end(); ++it ) {
      if ( !contains( street_defs, *it ) ) {
         result += result.empty() ? *it : " " + *it;
      }
   }
   return result;
}

#include <iostream>
using std::cout;
using std::endl;

int main()
{
   std::string address =
   "347924, Россия, Ростовская область,, Таганрог, 17-Й Квартальный проезд, 25, строение 2,"
   " корпус 4, квартира 110";
   std::string street = get_street( address );
   cout << address << endl;
   cout << street << endl;

   address ="478545, Россия, Красноярский кр.,,г. Красноярск, пр-кт Молокова, 72г";
   street = get_street( address );
   cout << address << endl;
   cout << street << endl;

   address =
   "658745, Россия, Сахалинская область,, поселок Сахалинский, Петропавловское шоссе, 23-1, кв. 23";
   street = get_street( address );
   cout << address << endl;
   cout << street << endl;

   address =
   "236544, Россия, Еврейская автономная область,, Биробиджан, пр-кт им. Жукова, 32/3, кв 1";
   street = get_street( address );
   cout << address << endl;
   cout << street << endl;
}

вывод:
Цитата

347924, Россия, Ростовская область,, Таганрог, 17-Й Квартальный проезд, 25, строение 2, корпус 4, квартира 110
17-Й Квартальный
478545, Россия, Красноярский кр.,,г. Красноярск, пр-кт Молокова, 72г
Молокова
658745, Россия, Сахалинская область,, поселок Сахалинский, Петропавловское шоссе, 23-1, кв. 23
Петропавловское
236544, Россия, Еврейская автономная область,, Биробиджан, пр-кт им. Жукова, 32/3, кв 1
им. Жукова

http://liveworkspace.org/code/4ef422a3e83f...a8c671c8377c2ef

только у тебя в примерах отсутствует район. я вместо него поставил пустое место, но добавил запятую.
Если район не нужен, то поменяй street_pos на 4

Это сообщение отредактировал(а) borisbn - 17.3.2012, 12:11


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 17.3.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Спасибо, щас попробую разобраться smile

upd.

что-то не компилируется в нэтбинсе, ошибка такая:

main.cpp: In function �std::string get_street(const std::string&)’:
main.cpp:45:4: error: in C++98 �street_defs’ must be initialized by constructor, not by �{...}’
main.cpp:45:4: error: could not convert вЂ�{"\37777777763\37777777753", "\37777777763\37777777753.", "\37777777763\37777777753\37777777750\37777777766\37777777740", "\37777777757\37777777760", "\37777777757\37777777760.", "\37777777757\37777777760-\37777777752\37777777762", "\37777777757\37777777760\37777777756\37777777761\37777777757\37777777745\37777777752\37777777762", "\37777777770", "\37777777770.", "\37777777770\37777777756\37777777761\37777777761\37777777745", "\37777777757", "\37777777757.", "\37777777757\37777777745\37777777760", "\37777777757\37777777745\37777777760.", "\37777777757\37777777745\37777777760\37777777745\37777777763\37777777753\37777777756\37777777752", "\37777777757\37777777760\37777777756\37777777745\37777777747\37777777744"}’ to вЂ�string_list’
make[2]: *** [build/Debug/Cygwin_4.x-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

user posted image

Подскажите, пожалуйста, как инициализировать эту функцию в конструкторе (если нужно действительно это).

Это сообщение отредактировал(а) NoviceF - 17.3.2012, 21:17
PM MAIL   Вверх
borisbn
Дата 18.3.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Цитата(NoviceF @  17.3.2012,  13:46 Найти цитируемый пост)
что-то не компилируется в нэтбинсе

нетбинс - это не компилятор. а компилятор у тебя, судя по всему, стааааааренький.  не знает initilize_list....
Переделай так:
Код

string_list street_defs;
/* =
   {
      "ул", "ул.", "улица",
      "пр", "пр.", "пр-кт", "проспект",
      "ш", "ш.", "шоссе",
      "п", "п.", "пер", "пер.", "переулок",
      "проезд"
   };
*/
street_defs.push_back( "ул" );
street_defs.push_back( "ул." );
street_defs.push_back( "улица" );
street_defs.push_back( "пр" );
и т.д.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 19.3.2012, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



Да, конечно, компилятор был sygwin gcc-g++ 3.4.4-999. Попробовал с MinGW, не могу найти посмотреть версию, но последний, что я нашёл по ссылкам с http://mingw.org.. В общем MinGW тоже не компилирует 1й вариант, выдаёт ту же ошибку, что и sygwin. Может есть другие толковые компиляторы под netbeans или вообще лучше другую среду использовать?

2й же вариант кода работает с обоими компиляторами, спасибо.
PM MAIL   Вверх
borisbn
Дата 19.3.2012, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Посмотри в сторону qt.nokia.com/downloads/downloads#qt-creator 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.