Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как добавить элемент в массив увеличив размерност?


Автор: Yuran89 28.11.2009, 12:46
Всем привет. У меня такая проблема:

Написал класс 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]

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

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++;

А вообще лучше все организовать через связной список

Автор: Abyx 28.11.2009, 13:39
это называется размер, а не размерность

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

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

Автор: djamshud 28.11.2009, 19:59
Заменить
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, см. код выше), а при уменьшении - вызвать деструкторы удаляемых элементов.

Автор: Yuran89 5.12.2009, 18:06
Цитата(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++;


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

Автор: shuttle 11.12.2009, 13:12
std::vector

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)