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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 02:31   #1
AleksENN
Пользователь
 
Регистрация: 24.06.2010
Сообщений: 17
По умолчанию Автомобили и прочее а также классы в С++

Нужен намёк или подсказка по производным классам.
вот код:
Код:
header files:
#pragma once
class Garag {
public:
	AAwto*arr;
	Garag(char* zwet_car, int* zena);
	void Print_Car();
	void SetZena(int );
	void SetZwetCar(const char*);
	~Garag();
private:	
	int zena;
	char zwet_car[64];
	
};
class AAwto:public Garag{
	char* wladelez;
	char* nomer;
	double probeg;
public:
	AAwto();
	AAwto(char* wladelez,char* nomer,double probeg, char* zwet_car, int* zena);
	void SetName(const char*);
	void SetNomer(const char* );
	void SetProbeg(double );
	const char* GetName()const;
	const char* GetNomer();
	double GetProbeg();
	void CopyAwto(AAwto & d);
	void PrintAwto();
};
void SaveData(AAwto * arr, int size);
AAwto * LoadData( int & size);
AAwto*RemoveAwto(AAwto*,int&,int );
AAwto *AddAwto(AAwto*,int&, AAwto &);
void AllPrint( AAwto*,const int );
int Search(AAwto*,int ,char*);
int SearchF(const AAwto*,int ,const char*);
void Sort(AAwto*,int );
void Print_Car(Garag*,const int);
cpp file:
#include<iostream>
#include<string.h>
#include<fstream>
#include<iomanip>
#include "lib.h"
using namespace std;
AAwto::AAwto()

{
	this->wladelez=new char[strlen("none")+1];
	strcpy(this->wladelez,"none");
	this->nomer=new char[strlen("aa-00")+1];
	strcpy(this->nomer,"aa-00");
	this->probeg=0;
}
AAwto::AAwto(char*wladelez,char* nomer,double probeg)
{
	this->wladelez=new char[strlen(wladelez)+1];
	strcpy(this->wladelez,wladelez);
	this->nomer=new char[strlen(nomer)+1];
	strcpy(this->nomer,nomer);
	this->probeg=probeg;
}
void AAwto::SetName(const char*wladelez)
{
	if(this->wladelez)
		delete []this->wladelez;
	this->wladelez=new char[strlen(wladelez)+1];
	strcpy(this->wladelez,wladelez);
}
void AAwto::SetNomer(const char*nomer)
{
	this->nomer=new char [strlen(nomer)+1];
	strcpy(this->nomer,nomer);
}
void AAwto::SetProbeg(double probeg)
{
	this->probeg=probeg;
}
const char* AAwto::GetName()const{
	return this->wladelez;
}
const char* AAwto::GetNomer(){
	return this->nomer;
}
double AAwto::GetProbeg(){
	return this->probeg;
}
void AAwto::CopyAwto(AAwto & d)
{
	this->SetName(d.GetName());
	this->SetNomer(d.GetNomer());
	this->SetProbeg(d.GetProbeg());
}
void AAwto:: PrintAwto()
{
	cout<<endl<<"name :  "<<setw(16)<<this->GetName()<<endl;
	cout<<"nomer : "<<setw(15)<<this->GetNomer()<<endl;
	cout<<"probeg : "<<setw(15)<<this->GetProbeg()<<endl;
}
AAwto * LoadData( int & size){
	ifstream fin("test.txt");
	AAwto * arr;
	fin >> size;
	arr = new AAwto[size];
	for(int i = 0; i < size; i++){
		char name[25];
		char nom[10];
		double prob;
		fin >> name;
		fin >> nom;
		fin >> prob;
		arr[i].SetName(name);
		arr[i].SetNomer(nom);
		arr[i].SetProbeg(prob);
	}
	fin.close();
	return arr;
}
void SaveData(AAwto * arr, int size){
	ofstream fout("test.txt");
	fout << size << endl;
	for(int i = 0; i < size; i++){
		fout << arr[i].GetName() <<endl;
		fout << arr[i].GetNomer() << endl;
		fout << arr[i].GetProbeg() << endl;
	}
	fout.close();
}
AAwto*RemoveAwto(AAwto*arr,int&size,int index)
{
	AAwto *tmp=new AAwto[size-1];
	for(int i=0;i<index;i++)
		tmp[i].CopyAwto(arr[i]);
	size--;
	for(int i=index;i<size;i++)
		tmp[i].CopyAwto(arr[i+1]);
	delete []arr;
	return tmp;
}
AAwto *AddAwto(AAwto*arr,int&size, AAwto & car)
{
	AAwto *tmp=new AAwto[size+1];
	for(int i=0;i<size;i++)
		tmp[i].CopyAwto(arr[i]);
	tmp[size].CopyAwto(car);
	delete []arr;
	size++;
	return tmp;
}
void AllPrint( AAwto*arr,const int size)
{
	for(int i=0;i<size;i++){
		cout <<"\n"<<i+1<< " - car:\n";
		arr[i].PrintAwto();}

}
int Search(AAwto*arr,int size,char n[10])
{
	for(int i=0;i<size;i++)
	{
		if (stricmp(arr[i].GetNomer(),n)==0)
			return i;
	}
	return -1;
}
int SearchF(const AAwto*arr,int size,const char name[25])
{
	for(int i=0;i<size;i++)
	{
		if(stricmp( arr[i].GetName(),name)==0)
			return i;
	}
	return-1;
}
void Sort(AAwto*arr,int size)
{
	for(int step=0;step<size-1;step++){
		for(int i=0;i<size-1;i++){
			if(stricmp(arr[i].GetName(),arr[i+1].GetName())>0){
				AAwto tmp;
				tmp.CopyAwto(arr[i]);
				arr[i].CopyAwto(arr[i+1]);
				arr[i+1].CopyAwto(tmp);
			}
		}
	}
}
}
AleksENN вне форума Ответить с цитированием
Старый 18.12.2010, 02:33   #2
AleksENN
Пользователь
 
Регистрация: 24.06.2010
Сообщений: 17
По умолчанию

сам по себе клас авто вобще легко дался -думал и дальше дело плёвое...но вот застопорился
Код:
main cpp:
#include<iostream>
#include<string.h>
#include<fstream>
#include<iomanip>
#include"lib.h"
using namespace std;
void main()
{  
	int size=0,choice=0, index=0,number=0, a=0,zena=0;
	int awto=0;
	cout<<"Enter size:"<<endl;
	cin>>size;
	char zwet_car[64];
	char family[32];
	AAwto *arr;
	arr=new AAwto[size];
	for(int i = 0; i < size; i ++){
		char name[25];
		char nom[10];
		double prob;
		cout << "\n Enter name:  ";
		cin >> name;
		cout << "\n Enter nomer:  ";
		cin >> nom;
		cout << "\n Enter probeg:  ";
		cin >> prob;
		cout<<"\n Enter zena:   ";
		cin >> zena;
		cout<<"\n Enter zwet_car:   ";
		cin >> zwet_car;
		arr[i].SetName(name);
		arr[i].SetNomer(nom);
		arr[i].SetProbeg(prob);
		arr[i].SetZena(zena);
		arr[i].SetZwetCar(zwet_car);
	}

	do{
		cout << "\n========================||\n";
		cout << " Delete               - 1 ||" << endl;
		cout << " Addition             - 2 ||" << endl;
		cout << " Search               - 3 ||" << endl;
		cout << " Sort                 - 4 ||" << endl;
		cout << " Print                - 5 ||" << endl;
		cout << " Chtenie              - 6 ||" << endl;
		cout << " record input         - 7 ||" << endl;
		cout << " Print podrobno Garag - 8 ||" << endl;
		cout << " Exit                 - 0 ||" << endl;
		cout << "==========================||\n";
		cin >> choice;
		cout << endl;
		switch(choice){
		case 1:
			cout << "Vvedite index udaleniya awto:";
			cin >> index;
			arr=RemoveAwto(arr,size, index);
			break;
		case 2:
			cout << "\n Vvedite nomer plusuemogo awto:\n";
			cin>>awto;
			for(int i=0;i<awto;i++)
			{
				AAwto awto;
				char nom[10];
				double prob;
				char name[25];
				cout<<"Enter name,numb,probig\n";
				cin>>name>>nom>>prob;
				awto.SetName(name);
				awto.SetNomer(nom);
				awto.SetProbeg(prob);
				arr=AddAwto(arr,size, awto);
			}
			cout << "\n Plussing  succes to end\n";
			break;
		case 3:
			cout<<"\n Do switch:\n 1-search of family\n 2-nomer\n";
			cin>>a;
			if(a==1)
			{
				cout<<"\n Enter familiya of owner:";
				cin>>family;
				index=SearchF(arr,size,family);
				if(index>-1)
					cout<<" \n Nomer awto - "<<index+1;
				else
					cout<<"\n Awto not founded!\n ";
			}
			else
			{
				char num[10];
				cout << "\n Nomer awto dla poiska: ";
				cin>>num;
				index=Search(arr,size,num);
				if(index>-1)
					cout<<"\n Nomer awto - "<<index+1;
				else
					cout<<"\n Awto not founded!\n";
			}
			break;
		case 4:
			Sort(arr,size);
			break;
		case 5:
			AllPrint(arr,size);
			break;
		case 6:
			arr = LoadData(size);
			break;
		case 7:
			SaveData(arr, size);
			break;
		case 8:
			Print_Car(arr,size);
			break;
		case 0:
			cout << "\n Poka" <<endl;
			break;
		default:
			cout << "\n Error "<<endl;
		}
	}while(choice!=0);
	delete[]arr;
}
конструктор по умолчанию в клас гараж добавил
VC выдаёт:
1>lib.obj : error LNK2001: неразрешенный внешний символ ""public: __thiscall Garag::~Garag(void)" (??1Garag@@QAE@XZ)"
1>main.obj : error LNK2001: неразрешенный внешний символ ""public: __thiscall Garag::~Garag(void)" (??1Garag@@QAE@XZ)"
1>lib.obj : error LNK2001: неразрешенный внешний символ ""public: __thiscall Garag::Garag(void)" (??0Garag@@QAE@XZ)"
1>main.obj : error LNK2001: неразрешенный внешний символ ""void __cdecl Print_Car(class Garag *,int)" (?Print_Car@@YAXPAVGarag@@H@Z)"
1>main.obj : error LNK2001: неразрешенный внешний символ ""public: void __thiscall Garag::SetZwetCar(char const *)" (?SetZwetCar@Garag@@QAEXPBD@Z)"
1>main.obj : error LNK2001: неразрешенный внешний символ ""public: void __thiscall Garag::SetZena(int)" (?SetZena@Garag@@QAEXH@Z)"
1>D:\homeauto\Debug\homeauto.exe : fatal error LNK1120: 5 неразрешенных внешних элементов

Последний раз редактировалось AleksENN; 18.12.2010 в 05:10.
AleksENN вне форума Ответить с цитированием
Старый 18.12.2010, 13:14   #3
AleksENN
Пользователь
 
Регистрация: 24.06.2010
Сообщений: 17
По умолчанию

если без производного класса то реализовать это всё дело вышло - просто подключил
библиотеки обоих классов к одному исполняемому файлу и заново меню переписал, получилось что то вроде реализации одного гаража как масива обьектов авто...нафиг мне это нужно так и не понял, на что пол ночи угробил - вот часть кода коротко. Но блин такое чуство что не в ту сторону По идее оптимальный код всё таки должен выйти через призводный клас??? тут не столь важны параметры как уловить принцип реализации.
Код:
#include"lib.h"
#pragma once
class Garag{

	AAwto**arr;
	int size;
public:
	Garag();
	void AddAAwto(AAwto*d);
	void Print();
	void SortGarag();
	int Search(char*);
	void PrintAwto(int);
	void RemoveAwto(int);
	void RedagName(int,char*);
	void RedagNom(int,char*);
	void RedagProbeg(int,double);
	void LoadData();
	void Savedata();
	~Garag();

};
......
Garag::Garag(){
	this->arr=NULL;
	this->size=0;
}
void Garag::Print(){

	for(int i=0;i<this->size;i++)
		this->arr[i]->Print_Car();
}
Garag::~Garag(){
	if(this->arr!=NULL){
		for(int i=0;i<this->size;i++)
			delete this->arr[i];
		delete []this->arr;
		this->arr=NULL;
	}
}
void Garag::LoadData(){
    ifstream fin("test.txt");
    fin >> this->size;
    this->arr=new AAwto*[this->size];
    for(int i=0;i<this->size;i++){
        char name[25];
        char num[9];
        double probig;
        fin>> name;
        fin >> nom;
        fin>> probeg;
        this->arr[i]->SetName(name);
        this->arr[i]->SetNumber(nom);
        this->arr[i]->SetProbeg(prob);
}
    fin.close();
}
void Garag::Savedata(){
        ofstream fout("test.txt");
		fout <<this->size  << endl;

		for(int i = 0; i <this-> size; i++){
			fout <<this->arr[i]->GetName()<<endl;
			fout << this->arr[i]->GetNumber() << endl;
			fout << this->arr[i]->GetProbig() << endl;
		}
		fout.close();
   }
void Garag::AddAwto(AAwto*d){
	if(this->arr==NULL){
		this->arr=new AAwto*[1];
	this->arr[0]=d;                                     
	this->size++;
	}
	else{
		AAwto**tmp=new AAwto*[this->size+1];
	for(int i=0;i<this->size;i++)
		tmp[i]=this->arr[i];
	tmp[this->size]=d;
	delete[]this->arr;
	this->arr=tmp;
	this->size++;
}
}
void Garag::RedagName(int index,char name[25]){
	this->arr[index]->SetName(name);
}
void Garag::RedagNum(int index,char num[9]){
	this->arr[index]->SetNumber(num);
}
void Garag::RedagProbeg(int index,double pr){
	this->arr[index]->SetProbig(pr);
}
void Garag::RemoveAwto(int index){
	AAwto**tmp=new AAwto*[this->size-1];
	for(int i=0;i<index;i++)
		tmp[i]=this->arr[i];
	for(int i=index;i<this->size-1;i++)
			tmp[i]=this->arr[i+1];
	delete[]this->arr;
	this->arr=tmp;
	this->size--;
}
int Garag::Search(char n[9])
{
	for(int i=0;i<this->size;i++)
	{
		if (stricmp(this->arr[i]->GetNomer(),n)==0)
			return i;
	}
	return -1;
}
void Garag::PrintAwto(int i){
	cout.fill('_');
	cout<<endl<<"name : "<<setw(16)<<this->arr[i]->GetName()<<endl;
		cout<<"nomer : "<<setw(15)<<this->arr[i]->GetNomer()<<endl;
		cout<<"probeg : "<<setw(15)<<this->arr[i]->GetProbeg()<<endl;
}
void Garag:: SortGarag()
{
	for(int step=0;step<this->size-1;step++){
		for(int i=0;i<this->size-1;i++){
			if(stricmp(this->arr[i]->GetName(),this->arr[i+1]->GetName())>0){
					AAwto tmp;
				tmp.CopyCar(*arr[i]);
				this->arr[i]->CopyCar(*arr[i+1]);
				this->arr[i+1]->CopyCar(tmp);
			
			}
		}
	}
	
}
AleksENN вне форума Ответить с цитированием
Старый 18.12.2010, 13:59   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Вообще-то в вашем коде никто копаться не будет, пока не узнает точного задания. А уж потом подскажут, правильная у вас реализация или нет
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 18.12.2010, 14:18   #5
AleksENN
Пользователь
 
Регистрация: 24.06.2010
Сообщений: 17
По умолчанию

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

получилось что зациклился на одном и том же. В подробную реализацию не углубляюсь так как сделал ещё десяток вариантов этой же задачи с использованием всего чего только можно... но блин мне кажется должен быть короткий и красивый вариант без конфликтов.

ещё вопрос - могут ли быть нюансы работы компилятора на х64 в принципе??? или от платформы зависимости быть не может?

Последний раз редактировалось Stilet; 18.12.2010 в 20:06.
AleksENN вне форума Ответить с цитированием
Старый 18.12.2010, 18:42   #6
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ладно, чтоб все это понять, что вы тут написали, мне нужно время, которого у меня сейчас нет. Одно могу сказать: ваш вариант, где гараж является массивом машин(сообщение №3), имхо, правильный. Потому что наследовать Автомобиль от Гаража - неправильный подход
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 18.12.2010, 19:04   #7
AleksENN
Пользователь
 
Регистрация: 24.06.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Ладно, чтоб все это понять, что вы тут написали, мне нужно время, которого у меня сейчас нет. Одно могу сказать: ваш вариант, где гараж является массивом машин(сообщение №3), имхо, правильный. Потому что наследовать Автомобиль от Гаража - неправильный подход
спасибо. Думаю показать преподавателю завтра все варианты, но всё ж тоже думаю что указанный вами наиболее удачен.
AleksENN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчёт маски и прочее diffractus Помощь студентам 1 29.01.2010 11:35
iTunes, zoomBrowser и прочее Altera Свободное общение 10 07.07.2009 09:55