Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с классами в C++
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Bo2nik
Короче у меня большие проблемы с ООП. Собственно, вопроса пока тока два - как вызвать из main метод add и правильно написана add?

void add() – создаем массив и добавляем в него элемент.
void sort() – сортировка массива
float mid() – среднее арифметическое всех элементов в массиве

Пользователь вводит количество векторов. Потом определяет тип вектора(1-integer,2-float), далее вызывается add и формируется массив. С этим массивом уже выполняем sort и mid.

Пример, как все это должно выглядеть:

Enter the number of vector: 2
Enter type of 1 vector (1-integer, 2-float): 1
Enter length of vector: 3
Enter the vector: 9 2 5
Enter type of 2 vector (1-integer, 2-float): 2
Enter length of vector: 4
Enter the vector: 1 5 3.079 0.5

After work:
2 5 9
Middle value: 5.33333
0.5 1 3.079 5
Middle value: 2.39475


Код

#include "stdafx.h"
#include <stdio.h>
#include <iostream>

using namespace std;

class Vector
{
protected:
    int n;
public:
    Vector(int nn) {n=nn}
    void virtual sort() {}
    void virtual add() {}
    float virtual mid() {}
    void virtual show();
};

class IntVector:public Vector
{
    int a[10];
public:
    intvector(int nn, int* na):vector(nn)
    {
        int i=0;
        while (i<n)
        {
            *(a+i)=*(na+i);
            i++;
        }
    }
    
    void add(int m)
    {
        int i=0,j,n,ia[10];
        while (i<m)
        {
            cout << "Enter the length of the " << i+1 << " vector: ";
            cin >> n;
            cout << "Enter the vector: ";
            for (j=0; j<n; j++)
                cin >> *(ia+j);
            *(mas+i)=new intvector(n,ia);
        }
    }

    void sort();
    
    float mid()
    {
    }

    void show()
    {
        int i=0;
        vector::show();
        while(i<n)
        {
            cout<<*(a+i)<<" ";
            i++;
        }
    }
};
void main
{
}


Класс FloatVector я так думаю будет похож на IntVector за исключением некоторых функций?
volvo
Цитата
Собственно, вопроса пока тока два - как вызвать из main метод add и правильно написана add?
Собственно, если программа вываливается с десятком синтаксических ошибок, может она быть правильной?

С++ - case-sensitive язык, и intvector совсем не то же самое, что IntVector. Просто vector-а это тоже касается... mas, к которому ты обращаешься в методе add, вообще нигде не описан.

Избавляйся хотя бы от явных синтаксических ошибок...

Цитата
Пользователь вводит количество векторов. Потом определяет тип вектора(1-integer,2-float), далее вызывается add и формируется массив. С этим массивом уже выполняем sort и mid.
Кстати, чего ты это вручную делаешь? Думаешь, получится красивее, чем в STL? Даже и без STL:

template <class T>
class Vector {
  T arr[10]; // и работай с нужным типом
  ...
};

Все, что останется сделать в наследнике - правильно инстанцировать шаблон...
Bo2nik
Цитата(volvo @ 28.05.2008 18:58) *

Собственно, если программа вываливается с десятком синтаксических ошибок, может она быть правильной?


Да это был просто набросок. Вот я сделал по-другому(и вроде все работает):


#include <stdio.h>
#include <stdafx.h>
#include <iostream>


using namespace std;


class vector
{
protected:
    int n;
public:
   vector(int nn)
   {
	   n=nn;
   }
   void virtual sort();
   void virtual add() 
   {
	   n++;
   }
   float virtual mid()
   {
	   return 0;
   }
   int virtual num()
   {
	   return n;
   }
   void virtual show()
   {
   }
};

class intvector:public vector
{
	int a[10];
public:
    intvector(int nn, int* na):vector(nn)
	{
		int i=0;
		while (i<n) *(a+i)=*(na+i++);
	}
    void add(int b)
	{
		vector::add();
		*(a+n)=b;
	}
	void sort();
	float mid()
	{
		int i=0;
		float s=0;
		vector::mid();
		while (i<n)
			s=s+*(a+i++);
		return s/n;
	}
    int num()
	{
		return n;
	}
	void show()
	{
		int i=0;
		vector::show();
		while(i<n)
			cout<<*(a+i++)<<" ";
	}
};

class floatvector:public vector
{
	float a[10];
    public:
        floatvector(int nn, float* na):vector(nn)
		{
			int i=0;
			while (i<nn)
				*(a+i)=*(na+i++);
		}
	void add(float b) 
	{
		vector::add();
		*(a+n)=b;
	}
	void sort();
	int num()
	{
		return n;
	}
	float mid()
	{
		int i=0;
		float s=0;
		vector::mid();
		while (i<n) 
			s=s+*(a+i++);
		return s/n;
	}
	void show()
	{
		int i=0;
		vector::show();
		while(i<n) 
			cout<<*(a+i++)<<" ";
	}
};
void vector::sort()
	{}

void intvector::sort()
{
	vector::sort();
	int i,b,j;
	for (i=0; i<n-1; i++)
	for (j=i+1; j<n; j++)
		if (*(a+i)>*(a+j))
		{
			b=*(a+i);
			*(a+i)=*(a+j);
			*(a+j)=b;
		}
}

void floatvector::sort()
{
	vector::sort();
	int i,j;
	float b;
	for (i=0; i<n-1; i++)
    for (j=i+1; j<n; j++)
		if (*(a+i)>*(a+j))
        {
            b=*(a+i);
            *(a+i)=*(a+j);
            *(a+j)=b;
        }
}

vector* mas[20];

void main()
{
	int i=0,j,m,n,ia[10],c;
	float fa[10];
	cout << "Enter the number of vectors: ";
	cin >> m;
	while (i<m)
	{
        cout << "Enter the type of the " << i+1 << " vector(1-integer/2-float): ";
		cin >> c;
		cout << "Enter the length of the " << i+1 << " vector: ";
		cin >> n;
		cout << "Enter the vector: ";
		if (c==1)
		{
			for (j=0;j<n;j++) 
				cin >> *(ia+j);
			*(mas+i)=new intvector(n,ia);
		}
		else if (c==2)
		{
			for (j=0;j<n;j++)
				cin >> *(fa+j);
			*(mas+i)=new floatvector(n,fa);
		}
		else
			{
				cout << "Incorrect command!!!";
				i--;
			}
		i++;
	}
	for (i=0; i<m; i++) 
	{
		(*(mas+i))->show();
		cout<<"\n";
	}
	cout << "After work: \n";
	for (i=0; i<m; i++)
	{
		(*(mas+i))->sort();
		(*(mas+i))->show();
		cout<<"\n";
		cout << "Middle value: " << (*(mas+i))->mid() << "\n";
	}
	getchar();
}




Теперь вопрос: у меня вставка элемента в массив происходит в main, а мне надо чтобы было в add, как это сделать вообще не представляю, подскажите.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.