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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как добавить элемент в массив увеличив размерност? динамические массивы 
:(
    Опции темы
Yuran89
  Дата 28.11.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 16.1.2009
Где: }{рустовая

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



Всем привет. У меня такая проблема:

Написал класс avto, в нем данные об автомобиле.Моя задача создать массив таких классов изначально задав размерность этого массива. Данная программа должна осуществлять следующее:
1.  Вывод всего списка автомобилей.
2. Поиск по марке автомобиля.
3. Возможность добавления нового автомобиля( нового класса с данными об автомобиле в список).

И так первые 2 пункта я сделал, а вот как добавить новый элемент в массив увеличив исходную размерность я не могу додуматься...

вот моя функция main():
 
Код
 
void main() 
{
int n,i,z;

avto *spis;
cout<<"vvedite kolvo mashin :"<< endl;
cin>>n;
spis=new avto [n];
for( i = 0; i < n; i++) 
{
      cout << "==============================" << endl;
      spis[i].zapolnenie();
}

do {
    cout<<"-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-*"<< endl;
    cout<<"1-vivesti vesi spisok; 2-naiti marku; 3-dobaviti mashinu; 0-vihod."<< endl;
    cin>>z;
        vibor(z,spis,n);
}while (z!=0);
}



вот функция вывода всего списка и поиска по марке (добавление элемента я тоже попытался сделать здесь ) :
Код
void vibor(int z,avto *spis,int n)
{
//    avto *sps;
    char s[10];
    int i,r=0,g=0;
if (z==1)
    {    int y=g+n;
         for( i = 0; i < y; i++) 
         {
            spis[i].show();
         }
    }
else
{
     if (z==2)
     {
         cout<<"Vvedite marku mashini : "<< endl;
                 cin>>s;
          for( i = 0; i < n; i++)
          {
              if (strcmp(spis[i].m(),s)==0)
              {
                  spis[i].show();r++;
              }
          }
          if (r==0)  cout<<endl<<"Net takoi marki v nashem salone!"<<endl<<endl;
     }
//добавление нового элемента
     else
     {
         g++;
         spis=new avto [n+1];
         cout << "==============================" << endl;
         spis[n].zapolnenie();
     }        
}
}

сам класс:
Код
struct data
{
    int den,mes,god;
};

class avto
{
private:
    char marka[20];//марка машины
    char cvet[15];   //цвет машины
    int s_num;        //серийный номер
    int reg_num;     //регистрационный номер
    int dver;           // кол-во дверей
    int price;           //цена
    data data_reg;   //дата регистрации
    
    public:
          void zapolnenie();   // заполнение данными
          void show();            //вывод данных
          char* m();              //возвращает марку
          char* c();                //возвращает цвет
          int s_n();                 //возвращает серийный номер
          int r_n();                 //  возвращает рег-й номер
          int d();                    //возвращает кол-во дверей
          int p();                    //возвращает цену

          
};


Я знаю что не верно организовываю добавление элемента, может кто-нибудь разберется как это сделать?

[/code]
PM MAIL WWW   Вверх
sQu1rr
Дата 28.11.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Особо не читал код, но если хотите увеличить массив, сохранив старые элементы, вы пытаетесь сделать это тут,
Код

spis=new avto [n+1];
cout << "==============================" << endl;
spis[n].zapolnenie();

То попробуйте так:
Код

avto * newspis = new avto[n + 1];
for( i = 0; i < n; ++i )
    newspis[i] = spis[i];
newspis[n].zapolnenie();
delete [] spis;
spis = newspis;
n++;

А вообще лучше все организовать через связной список
PM MAIL Skype GTalk   Вверх
Abyx
Дата 28.11.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это называется размер, а не размерность
PM MAIL   Вверх
andrew_121
Дата 28.11.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Yuran89, Модераторы простите ;)
Скажи, на каком форуме ты еще не запостил этот вопрос?

Это сообщение отредактировал(а) andrew_121 - 28.11.2009, 18:24


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Carlos0N
Дата 28.11.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я не уверен канешно, но помойму единственный вариант - создать новый массив большего размера и скопировать туда все из старого, вобщем sQu1rr все написал))
и кстати, функции доступа к элементам класса лучше называть не int p();  а к примеру int getPrise(); я не придераюсь, просто к правильному оформлению лучше сразу приучатся))

PM MAIL ICQ   Вверх
djamshud
Дата 28.11.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

Репутация: 8
Всего: 39



Заменить
spis=new avto [n];

на
Код

spis=(typeof(spis))malloc(sizeof(avto)*n);
for(int i=0;i<n;i++)
new(&spis[i])avto();


Не забыть подключить файл new.

Изменять размер с помощью функции realloc, не забыв при увеличении размера проинициализировать новые элементы (new, см. код выше), а при уменьшении - вызвать деструкторы удаляемых элементов.

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Yuran89
Дата 5.12.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 16.1.2009
Где: }{рустовая

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



Цитата(andrew_121 @  28.11.2009,  13:46 Найти цитируемый пост)
Yuran89, Модераторы простите ;)
Скажи, на каком форуме ты еще не запостил этот вопрос?

Да я задал этот вопрос на нескольких форумах..
Но хороший ответ получил только здесь..



Цитата(sQu1rr @  28.11.2009,  13:31 Найти цитируемый пост)
Особо не читал код, но если хотите увеличить массив, сохранив старые элементы, вы пытаетесь сделать это тут,
код C++
spis=new avto [n+1];
cout << "==============================" << endl;
spis[n].zapolnenie();

То попробуйте так:
код C++
avto * newspis = new avto[n + 1];
for( i = 0; i < n; ++i )
    newspis[i] = spis[i];
newspis[n].zapolnenie();
delete [] spis;
spis = newspis;
n++;


спасибо за помощь я так и сделаю.

Это сообщение отредактировал(а) Yuran89 - 5.12.2009, 18:07
PM MAIL WWW   Вверх
shuttle
Дата 11.12.2009, 13:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



std::vector
--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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