Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 12:43   #1
Yura_n
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 23
Вопрос Добавить элемент в массив увеличив его размерность

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

Написал класс 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();                    //возвращает цену

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

Последний раз редактировалось Yura_n; 28.11.2009 в 12:47. Причина: ошибки редактирования
Yura_n вне форума Ответить с цитированием
Старый 28.11.2009, 13:50   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

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

Код:
vector <auto> auto_list;
Мы создали вектор автомобилей, он пока пуст. Поэтому необходимо добавить данные, это делается так:

Код:
auto spis;                         //объявляем экземпляр класса
...                                                 //тут выполняется вся необходимая работа, как, например, заполнение полей данными.
auto_list.push_back(auto spis);   //добавляем заполненный объект в список.
Добавлять можно сколько угодно (ну разумеется в пределах ресурсов Вашей машины), вектор - это, по сути, массив, который сам следит за памятью и сам, автоматически, расширяется, при добавлении нового элемента.
Для того, что бы обратится к определенным объектам в векторе, есть ряд методов:

Код:
auto_list[n]     //обращение к n-ому элементу (количество элементов всего - auto_list.size() )
auto_list.front  //получаем первый элемент 
auto_list.back  //получаем последний элемент
P.S. Не забудьте подключить заголовочный файл векторов
Код:
#include <vector>
oleg kutkov вне форума Ответить с цитированием
Старый 28.11.2009, 15:06   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Лучше даже задать вектор сразу с определенным числом элементов:
Код:
cout<<"vvedite kolvo mashin :"<< endl;
cin>>n;
vector<avto> avtolist*(n);
И потом обращаться к каждому элементы с помощью operator[]
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 05.12.2009, 18:09   #4
Yura_n
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 23
По умолчанию

я сделал так

Код:
avto *Add(avto spis[],int n)
{
	avto *spis1;
	spis1=new avto[n];
	for(int i=0;i<n;i++)
		spis1[i]=spis[i];
		spis1[n-1].zapolnenie();
	delete []spis;
	spis=spis1;
	return spis1;

}

Последний раз редактировалось Sazary; 06.12.2009 в 23:47.
Yura_n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
размерность матрицы wolf950 Общие вопросы Delphi 1 03.08.2009 22:42
добавить/удалить элемент Revenholm Общие вопросы C/C++ 3 13.06.2009 17:17
Добавить элемент в массив MAKEDON Общие вопросы C/C++ 2 23.03.2009 18:47
найти наименьший элемент и его номер в заданной таблице tim777777 Помощь студентам 1 02.03.2009 15:12