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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип данных map. Мне очень стыдно но... лаба. 
:(
    Опции темы
Sapient
Дата 4.6.2005, 14:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Задание дословно:
"Класс "Словарь без повторений". Методы: добавление элементов словаря, удаление элементов словаря по ключу, получение информационного значения по ключу, отображение элементов словаря на дисплее, чтение-запись объектов с диска/на диск. Примечание: в данном случае следует использовать параметризацию обобщенного класса двумя типами."

Насколько я понял для всего этого очень хорошо подходит контейнерный тип map. Пытался поизучать по хэлпу, что-то ничего толком не получается smile А "примечание" это я так понимаю значит что ключ и информационное значение должны иметь разные типы (короче информационное значение не числовой, а строковый). Получается нужно шаблоны использовать...

Вобщем народ, кому не лень, помогите пожалуйста.
  Вверх
batigoal
Дата 4.6.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 1
Всего: 151



А язык-то какой? Си?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Void
Дата 4.6.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Ну да, ты фактически std::map и описал. А в чем проблема-то, конкретно?
Выглядеть это будет примерно так:
Код

#include <iostream>
#include <fstream>
#include <map>
#include <string>

typedef std::map<int, std::string> dict_t;
// тип данных словаря. int - ключ, std::string - значение
typedef dict_t::iterator iter_t; // тип итератора
typedef dict_t::const_iterator citer_t; // константный итератор
typedef dict_t::value_type value_t; // пара ключ-значение

// где-то в теле программы

dict_t dict; // переменная словарь
dict[2] = "hello"; // так осуществляется запись
// если ключ уже существует, значение будет перезаписано,
// иначе будет создана новая запись
dict.erase(2); // удалить элемент с ключом 2
// этот метод вернет число удаленных элементов,
// т.е. 1, если такой элемент есть, 0 в противном случае
std::string s = dict[2]; // таким образом мы получаем значение по ключу
// примечание: если элемента с заданным ключом не существует,
// ошибки не произойдет - будет создана новая запись с данным ключом
// и значением элемента по умолчанию. Чтобы обойти это, делаем так:
if ((iter_t i = dict.find(2)) != dict.end()) {
// все в порядке, элемент есть
} else {
// ну нет, так нет...
}
// чтобы пробежаться по всем элементам словаря:
iter_t i = dict.begin(), end = dict.end();
for ( ; i != end; ++i) {
    std::cout << i->first << std::endl; // вывести ключ
    std::cout << i->second << std::endl; // вывести значение
}

В файл скидывать тоже удобнее всего потоками (fstream).

P.S.
Lamer George
Цитата
А язык-то какой? Си?

Sapient
Цитата
Получается нужно шаблоны использовать...

smile

Это сообщение отредактировал(а) Void - 4.6.2005, 20:20


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Sapient
Дата 5.6.2005, 12:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Void спасибо. А не подскажешь почему в куче строк возникает одна и та же ошибка E2206 Illegal character ''(0xa0)? Пишу в консоли Buildera'а. Начинается уже со строчки:
Код

typedef map<int, string> dict_t;

Не понимает map, string, dict_t.
  Вверх
batigoal
Дата 5.6.2005, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 1
Всего: 151



Void
Шаблоны не только в Си есть smile



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Void
Дата 5.6.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Цитата(Sapient @ 5.6.2005, 14:51)
А не подскажешь почему в куче строк возникает одна и та же ошибка E2206 Illegal character ''(0xa0)?

Как вариант, попробуй перепечатать код вручную, а не copy-paste.

Lamer George
Помимо Си++ шаблоны называются шаблонами только в D. А дженерики - это уже совсем другая история smile

Это сообщение отредактировал(а) Void - 5.6.2005, 23:56


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Guest
Дата 6.6.2005, 11:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пробовал, бесполезно:(
Глянь, может поймешь в чем причина...

Код

//---------------------------------------------------------------------------

#pragma hdrstop
#include <vcl.h>
#include <iostream>
#include <map>
#include <string>



//---------------------------------------------------------------------------

#pragma argsused
using namespace std;
class Slovar
{
  private:

  public:
    typedef map<int, string> dict_t;
    typedef dict_t::iterator iter_t;
    dict_t dict;
    void glav();
    void steret(int a);
    void zapis(int a);
    void dobav(string a);
};

void Slovar::glav()
{
  dict[1] = "Vasja";
  dict[2] = "Petja";
  dict[3] = "Dasha";
  dict[4] = "Natasha";
  dict[5] = "Sasha";
  dict[6] = "Misha";
  dict[7] = "Slava";
  dict[8] = "Dima";

  iter_t i = dict.begin(), end = dict.end();
  for ( ; i != end; ++i) 
     {cout << i->first << "_" << i->second << endl;}
};

void Slovar::zapis(int a)
{       if ((iter_t i = dict.find(a)) != dict.end()) 
        { cout << i->second << endl;
        } 
        else 
        { cout << "zapis ne naidena" << endl;
        }
}

void Slovar::steret(int a)
{
        dict.erase(a);
        cout<<"zapis "<<a<<" sterta"<<endl;
};

void Slovar::dobav(string a)
{
int z;
z=0;
iter_t i = dict.begin(), end = dict.end();
        for ( ; i != end; ++i) 
        {z++;
        }
        dict[z++] = a;

}

int main(int argc, char* argv[])
{

  Slovar massiv;
  massiv.glav();
  cout<<"1 - viviesti spisok"<<endl
  <<"2 - steret zapis 'x'"<<endl
  <<"3 - dobavit zapis 'name'"<<endl
  <<"4 - viviesti zapis 'x'"<<endl;
  int a;
  int x;
  cin>>a;
  cin>>x;
        if (a==1)
        {massiv.glav();
        }
        if (a==2)
        {massiv.steret(x);
        }
        if (a==3)
        {cout<<"vvedite 'name'"<<endl;
        string s;
        cin>>s;
        massiv.dobav(s);
        }
        if (a==4)
        {massiv.zapis(x);
        }


  int b;
  cin>>b;

  return 0;

}
//---------------------------------------------------------------------------

  Вверх
Sapient
Дата 6.6.2005, 11:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Последняя мессага мой ессно.
  Вверх
Void
Дата 6.6.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Код

void Slovar::zapis(int a)
{
        iter_t i = dict.find(a);
        if (i != dict.end()) 
        { cout << i->second << endl;
        } 
        else 
        { cout << "zapis ne naidena" << endl;
        }
}

Вот так у меня работает. В первом варианте меня слегка переклинило - такая конструкция недопустима.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Любитель
Дата 7.6.2005, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Вообще
Цитата
Illegal character ''(0xa0)
это пробел 'русский' (160-ый).
А ещё: в Билдере STL точно есть?


--------------------
PM MAIL ICQ Skype   Вверх
Sapient
Дата 7.6.2005, 13:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Любитель! Где ж ты раньше был!:) Хотя все равно вовремя, я как раз сегодня сдал. Проблема как всегда в таких случаях тупа и смешна. Все дело в том что при copy/paste в билдер все пробелы занеслись как... пробелы:) Т.е. именно символы пробелов. Я думал он мне указывает на слова, оказалось на пробелы. Достаточно было уже в билдере удалить пробел и вставить новый...
  Вверх
Void
Дата 7.6.2005, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 6
Всего: 173



Цитата(Sapient @ 7.6.2005, 15:11)
Проблема как всегда в таких случаях тупа и смешна. Все дело в том что при copy/paste в билдер все пробелы занеслись как... пробелы:)

Уважаемый, я вам об этом пятью постами выше говорил.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Любитель
Дата 7.6.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Он похоже перепечатывал только слова smile


--------------------
PM MAIL ICQ Skype   Вверх
Pakshin A. S.
Дата 7.6.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 5
Всего: 61




 ! 
 
Тока без оффтопа и конфликта... не стоит принимать близко к сердцу все посты, написанные другими...

PM   Вверх
Sapient
Дата 8.6.2005, 04:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Void я тебе тоже очеь благодарен, даже за внимание которое ты мне уделил smile smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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