Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пойду повешусь!!Через map / 13 сообщений из 13, страница 1 из 1
19.05.2006, 08:17
    #33737377
cruse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
Парни помогите сделать поиск по контейнеру через map. Уменя єсть процедура поиска но она чтото неработает.Помогите
Вот текст програми:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <iterator>
#include <map>
#include <cstring>
#pragma hdrstop

#include "Unit6.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
FILE *R,*V;
const int size= 5 ;
char r[ 20 ],v[ 20 ];
char rs[size][ 20 ],vs[size][ 20 ];
using namespace std;
typedef map<char*,char*,less<char*> >Psevdo;
Psevdo::iterator where;
Psevdo ps1;
void Search(Psevdo& ps1)//Поцедура поиска!!
{
char str[ 20 ];
Form1->LaE3->GetTextBuf(str,Form1->LaE3->GetTextLen()+ 1 );
      int k;
	Psevdo::iterator i1;

for(i1=ps1.begin();i1!=ps1.end();i1++)//Здесь ошибка
if (strcmp((*i1).first,str)== 0 ){
Form1->Label3->Caption="РЕЙС";break;}//+((*i1).first)
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BReadClick(TObject *Sender)
{
 R=fopen("Reis.txt","r+t");
 V=fopen("Vart.txt","r+t");
/// Reis.txt
Memo1->Clear();
Memo1->Lines->Add("РЕЙС:");
 do
 {
  fgets (r, 80 ,R);
  if(feof(R)) break;
 if(r[strlen(r)- 1 ]=='\n')r[strlen(r)- 1 ]= 0 ;//видалення зі стрічки останній символ
  Memo1->Lines->Add(r);
 }
 while(true);
 fclose(R);
Memo2->Clear();
Memo2->Lines->Add("ВАРТІСТЬ:");
do
 {
  fgets (v, 80 ,V);
  if(feof(V)) break;
 if(v[strlen(v)- 1 ]=='\n')v[strlen(v)- 1 ]= 0 ; //видалення зі стрічки останній символ
 Memo2->Lines->Add(v);
 }
 while(true);
 fclose(V);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BSaveClick(TObject *Sender)
{
 LaE1->GetTextBuf(r,LaE1->GetTextLen()+ 1 );
 LaE2->GetTextBuf(v,LaE2->GetTextLen()+ 1 );
  R=fopen("Reis.txt","a+t");
 fprintf(R,"%s\n",r);
  fclose(R);
  V=fopen("Vart.txt","a+t");
  fprintf(V,"%s\n",v);
  fclose(V);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BAsociaClick(TObject *Sender)
{
 R=fopen("Reis.txt","r+t");
 V=fopen("Vart.txt","r+t");
 int k= 0 ;
do
{
  fgets (rs[k], 20 ,R);
  fgets (vs[k], 20 ,V);
  if(feof(R)) break;
  if(feof(V)) break;
  if(rs[k][strlen(rs[k])- 1 ]=='\n')rs[k][strlen(rs[k])- 1 ]= 0 ;//видалення зі стрічки останній символ
  if(vs[k][strlen(vs[k])- 1 ]=='\n')vs[k][strlen(vs[k])- 1 ]= 0 ;
  k++;
 }
 while(true);
 fclose(R);
 fclose(V);
 for(int i= 0 ;i< 5 ;i++)
 {
  ps1.insert(Psevdo::value_type(rs[i],vs[i]));
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BSearchClick(TObject *Sender)
{ //char str[80];
  Search(ps1);
 
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
19.05.2006, 10:00
    #33737590
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
1) какая ошибка? (выдается сообщение об ошибке? ищется не то что надо? или еще что-нибудь)

2) если есть std::map, то зачем делать такой самопальный поиск в нем, перебирая подряд все элементы, когда этот контейнер специально придуман для того чтобы быстро искать по индексу?

3) less<char*> можно было не писать, т.к. оно по умолчанию. НО это неправильно , т.к. при вставке элементов сравниваться будут не строки, а значения указателей. Из-за этого контейнер будет работать скорее всего не так, как от него ожидается. Правильнее было бы написать свой функтор сравнения строк (см. код ниже), а лучше вообще отказаться от char* в пользу std::string.

Исходник не компилял (ибо что такое vcl? ). Вот набросал небольшой пример, чтобы показать, что я имел в виду в п.2 и п.3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <iostream>
#include <map>
#include <iterator>

using namespace std;

struct str_less
{
    bool operator()(const char *s1, const char *s2)
    {
        return (strcmp(s1, s2) <  0 );
    }
};

typedef map<char*, char*, less<char*> > TMap1;
typedef map<char*, char*, str_less > TMap2;

int main()
{
    TMap1 m1;
    TMap2 m2;

    m1["abc"] = "str1";  m2["abc"] = "str1";
    m1["xyz"] = "str2";  m2["xyz"] = "str2";
    m1["ijk"] = "str3";  m2["ijk"] = "str3";

    TMap1::iterator it1;
    TMap2::iterator it2;

    cout << "m1 (less<char*>)\n";
    for(it1 = m1.begin(); it1 != m1.end(); it1++ )
        cout << it1->first << " " << it1->second << "\n";

    cout << "\nm2 (str_less)\n";
    for(it2 = m2.begin(); it2 != m2.end(); it2++ )
        cout << it2->first << " " << it2->second << "\n";
    
    char s[ 4 ];
    strcpy(s,"abc");

    cout << "\nsearch for m2 = " << m2["abc"] << " " << m2[s] << "\n";
    cout << "\nsearch for m1 = " << m1["abc"] << " " << m1[s] << "\n";

    return  0 ;
}

Он вообще то тоже с ошибкой, да и вывод в последних строчках не случайно делается сначала для m2, а потом для m1, ибо по-другому не работает :) Но для иллюстрации сойдет.
...
Рейтинг: 0 / 0
19.05.2006, 13:48
    #33738582
cruse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
Я хочу чтобы в контейнере искало заданное слово которое вводится
из клавиатуры.
Эта функция должна вытягивать данные из контейнера и выводить в Label3.
Помогите организовать нормально поиск в контейнере!!
...
Рейтинг: 0 / 0
19.05.2006, 14:09
    #33738680
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
cruseЯ хочу чтобы в контейнере искало заданное слово которое вводится
из клавиатуры.
Эта функция должна вытягивать данные из контейнера и выводить в Label3.
Помогите организовать нормально поиск в контейнере!!

У контейнера std::map и так уже есть метод find. Поиск. Нормальнее некуда. Чем он не устраивает?
...
Рейтинг: 0 / 0
19.05.2006, 14:15
    #33738702
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
может ему нужно ближайшее значение?
тогда нужно на upper_bound смотреть...
...
Рейтинг: 0 / 0
19.05.2006, 14:24
    #33738748
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
cruseЯ хочу чтобы в контейнере искало заданное слово которое вводится
из клавиатуры.
Эта функция должна вытягивать данные из контейнера и выводить в Label3.
Помогите организовать нормально поиск в контейнере!!

Кстати, у меня ощущение, что мой первый ответ оставлен без внимания, а зря :)
Повторяю вопросы:

1) почему ключ (и значения) в контейнере имеют тип char*? Понимаю так веселей секс с отдадчиком и выяснением причин "отчего не работает", но...

2) см. п.1 почему не перейти на map<string, string> ?

3) зачем в ассоциативном контейнере для того чтобы найти нужный элемент выполняется последовательный перебор всех значений? Когда у map есть оператор доступа по индексу [] и метод find, которые делают все что надо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include <iostream>
#include <map>
#include <iterator>

using namespace std;

int main()
{
    typedef map<string, string> TMap;

    TMap m;

    m["abc"] = "str1";
    m["ijk"] = "str2";
    m["xyz"] = "str3";

    string skey;
    cout << "input key string:\n";  // ввод с клавиатуры (замени на свой vcl аналог)
    cin >> skey;

    TMap::iterator it = m.find(skey);

    // вывод на экран (замени на свой vcl аналог)
    if(it != m.end())
        cout << "value :" << it->second << "\n";
    else
        cout << "not found\n";

    return  0 ;
}
...
Рейтинг: 0 / 0
19.05.2006, 14:26
    #33738754
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
Поиск в map

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
. . .
    map_pens_t::const_iterator  IP;
    map_brush_t::const_iterator IB;
    map_fonts_t::const_iterator IF;

    if(Item->lngPenKey  )IP = m_mapPens.find (Item->lngPenKey);
    if(Item->lngBrushKey)IB = m_mapBrush.find(Item->lngBrushKey);
    if(Item->lngFontKey )IF = m_mapFonts.find(Item->lngFontKey);

    if( (Item->lngPenKey) && (IP != m_mapPens.end()) ){
      if(ht == htPrinter)hPen = IP->second.hPenPrinter;
      if(ht == htScreen )hPen = IP->second.hPenScreen;
    }
    if( (Item->lngBrushKey) && (IB != m_mapBrush.end()) ){
      hBrush = IB->second;
    }
    if( (Item->lngFontKey) && (IF != m_mapFonts.end()) ){
      if(ht == htPrinter)hFont = IF->second.hFontPrinter;
      if(ht == htScreen )hFont = IF->second.hFontScreen;
    }
. . .
...
Рейтинг: 0 / 0
19.05.2006, 15:07
    #33738949
cruse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
Извените пожалуста!!
А как вивести дание в Label3!
Form1->Label3->Caption="РЕЙС"+((*i1).first);-не работает может скинете пример для вивода в какой небудь компонент!!

Как вивести результат поиска если использовать typedef map<string, string> TMap!!!!
...
Рейтинг: 0 / 0
19.05.2006, 23:28
    #33739978
cruse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
Почему поиск неработает!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
#include <iostream>
#include <map>
#include <cstring>
#include <conio.h>
using namespace std;
const int size= 5 ;
// клас для зберігання імен-ключів
//typedef map<string,string> psevdo;
typedef map<char*,char*,less<char*> > psevdo;
psevdo ps1;
//char str;
int main() {
psevdo::iterator p;
FILE *R,*V;
char rs[size][ 20 ],vs[size][ 20 ];
R=fopen("Reis.txt","r+t");
V=fopen("Vart.txt","r+t");
int i= 0 ;
do
{
  fgets (rs[i], 20 ,R);
  fgets (vs[i], 20 ,V);
  if(feof(R)) break;
  if(feof(V)) break;
  if(rs[i][strlen(rs[i])- 1 ]=='\n')rs[i][strlen(rs[i])- 1 ]= 0 ;//видалення зі стрічки останній символ
  if(vs[i][strlen(vs[i])- 1 ]=='\n')vs[i][strlen(vs[i])- 1 ]= 0 ;
i++;
 }
while(true);
 fclose(R);
 fclose(V);
 for(int i= 0 ;i<size;i++)
 {
  ps1.insert(psevdo::value_type((rs[i]),(vs[i])));
 }
 cout<<"The table Reis  and  Vart"<<"\n";
 for(p= ps1.begin(); p != ps1.end(); p++)
        cout <<"Reis |"<<p->first <<"     "<<"Vart |"<<p->second << "\n";
//ввід імені ключа
char str[ 80 ];
cout << "Input name: ";
cin >> str;
// пошук номера за іменем-ключем
p = ps1.find ((str));
if (p!= ps1.end()) {
cout << "Znachennia: " << p->first<<""<<p->second<<"\n";break; }
else
{cout << "Imeni v asociatuvnomy spisky nemae\n";}
getch();
return  0 ;
...
Рейтинг: 0 / 0
21.05.2006, 19:45
    #33741199
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
cruseПочему поиск неработает!!


Приехали туристы в Иерусалим,приходят к Стене Плача,им все рассказывают,показывают,а потом говорят: Посмотрите,вон человек уже 15 лет,каждый день приходит сюда и молится,молится,разговаривает с Богом.Они изумились,подходят к этому человеку и спрашивают: Скажите,а Вы действительно все 15 лет сюда приходите - Да, И каждый день разговариваете с Богом - Да, Ну и какие у вас ощущения? -А как будто со стенкой разговариваю

(на всякий случай и во избежание - это анекдот!)

Пардон не удержался, но действительно возникает ощущение, что вы не читаете ответы :-/


Код: plaintext
1.
typedef map<char*,char*,less<char*> > psevdo;


Два раза я спрашивал - зачем в качестве ключей и значений (хотя со значениями в данном случае непринципиально) в контейнере используется char*? Вы понимаете, что вы делаете? Как устроен map, для чего он нужен и вообще?

В таком map у вас ключ - это значение указателя. Адрес. Число грубо говоря. Смотрим исходник дальше:


Код: plaintext
1.
char rs[size][ 20 ],vs[size][ 20 ];


Два массива строк, в который будут читаться, как я понял, какие-то названия (рейсы?) и какое-то соответствие для них. Ок. А потом:


Код: plaintext
1.
ps1.insert(psevdo::value_type((rs[i]),(vs[i])));


Что тут сделано? Прочитали в эти строки что-то из файла и потом запихнули в map два числа - указатель на одну строку rs[ i ] и на другую строку vs[ i ]. Теперь у нас в контейнере N пар указатель-указатель, адреса соотв. строк элеметнов этих массивов.

Что делается дальше:


Код: plaintext
1.
2.
3.
4.
5.
char str[ 80 ];
cout << "Input name: ";
cin >> str;
// пошук номера за іменем-ключем
p = ps1.find ((str));


Опс. Мы объявили еще один массив: str[80]. Его адрес (адрес первого эл-та массива) вряд-ли будет совпадать с rs[0] или rs[1] или ... rs[N], согласны? А именно эти значения у нас лежат в map и именно среди них будет происходить поиск. Есть еще вопросы почему ничего не находится?

Как сделать правильно, я уже писал два раза. Либо написать свой функтор сравнения строк, либо перейти на std::string, либо... что-нибудь еще :)

dixi
...
Рейтинг: 0 / 0
21.05.2006, 22:55
    #33741361
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
cruse
Как вивести результат поиска если использовать typedef map<string, string> TMap!!!!

Если вы, как видно, по предыдущему коду, умеете выводить char*, то у std::string есть метод c_str, возвращающий как раз char*. Найти это в документации заняло бы меньше времени, чем вопрос на форум писать, честное слово (только написать, про ожидание ответа я уж молчу)... Нет, ответить не сложно, ничего такого, но ваше время оно ведь ваши деньги. Не жалко? :)
...
Рейтинг: 0 / 0
22.05.2006, 11:10
    #33741954
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
redskinдокументации заняло бы меньше времени, чем вопрос на форум писать, честное слово (только написать, про ожидание ответа я уж молчу)... Нет, ответить не сложно, ничего такого, но ваше время оно ведь ваши деньги.

Вообще-то выводить можно и const char *, и не нужно тогда дорогого c_str().

Встречный кстате вопрос: своих денег и времени не жалго ?
...
Рейтинг: 0 / 0
22.05.2006, 11:27
    #33742022
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пойду повешусь!!Через map
MasterZiv
Встречный кстате вопрос: своих денег и времени не жалго ?

Я то этим занимаюсь в свободное время (дома или с работы в coffee-break). Каждый развлекается по-своему :) А тут товарищ ждет ответа, без которого как понимаю дело у него не движется или движется гораздо медленнее, чем если бы посмотреть в книжку или в msdn пошарить. Вот что имел в виду.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пойду повешусь!!Через map / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]