imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 25.10.2005, 20:45     # 1
andrei solovjev
Newbie
 
Регистрация: 16.06.2005
Сообщения: 38

andrei solovjev Нуль без палочки
Классы в Си++

В общем получил задачу по информатике:
Не очень понятно как определить центр тяжести многоугольника, как повернуть многоугольник. И что значит "псевдографического рисунка"? И вообще как проще всего это написать, в смысле алгоритма?

1.Разработать класс "многоугольник" в соответствии со следующим
заданием:
Состояние класса-
Фигура определяется количеством вершин и массивом координат вершин на
плоскости(типа float). Для описания вершины целесообразно использовать
структуру. Память под массив вершин выделяется статически,во время
компиляции,и задается массивом фиксированного предельного размера.
Протокол класса-
Определяет возможности создания и инициализации экземпляров класса и
правила их использования(методы класса).
Предусмотреть следующие возможности:
-пустой конструктор для инициализации экземпляров и массивов
экземпляров класса по умолчанию.
-создание экземпляров класса с инициализацией значением единственной
вершины("точка").
-создание экземпляров класса с инициализацией количеством вершин и
массивом координат вершин.
-ввод экземпляров класса из входного потока и вывод ((*)
псевдографического рисунка) в выходной поток(с помощью перегруженных
операторов >> и << ).
-определение "центра тяжести" многоугольника.
-добавление вершины многоугольника(с помощью перегруженного оператора
+=).
-получение координат вершины многоугольника,заданной ее номером(с
помощью перегруженного оператора []).
-выполнение операции поворота многоугольника относительно заданной
точки на определенный угол,кратный 90 градусам,против часовой
стрелки((*) с помощью перегруженного оператора ()).
-перемещение многоугольника((*)с помощью перегруженного оператора()) в
направлении и на величину вектора,построенного из точки {0,0} в
заданную.
2.Проектирование класса рекомендуется начать с представления состояния
класса,учитывающего заданные операции,а затем реализации конструкторов
и перегруженного оператора вывода. Для отладки и исчерпывающего
тестирования других методов разработанного класса реализовать
диалоговую программу,которая позволяет вводить параметры,отлаживаемых
методов.
3.Повторить разработку класса при условии,что память под массив
структур необходимой длины выделяется динамически,во время выполнения
программы(с помощью оператора new;память задается указателем на
структуру в состоянии класса).
Дополнить интерфейс класса следующими возможностями:
-создание экземпляра класса с его инициализацией другим экземпляром
класса(копирующий конструктор).
-переопределение экземпляра класса(с помощью перегруженного оператора
присваивания).
4.Написать прикладную программу,использующую разработанныц класс.
Примечание:пункты задания,отмеченные (*),являются дополнительными.

Реализация в среде Microsoft Visual C++ 6.0.
andrei solovjev вне форума  
Старый 26.10.2005, 00:45     # 2
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
1. "Центр тяжести"
Вычисляется из расчёта одинаковых грузов в вершинах. С точки зрения рассчёта - координаты точки, являющиеся средним арифметическим по каждой.
2. Как повернуть относительно точки O(x0,y0).
т.е. для каждой точки Ai(xi,yi) вычисляются новые координаты
для поворота на 90 градусов
xi=x0+(yi-y0); yi=y0+(x0-xi);
180 градусов
xi=x0+(x0-xi); yi=y0+(y0-yi);
270 градусов
xi=x0-(yi-y0); yi=y0-(x0-xi);
3. Псевдографический рисунок
Насколько я понимаю в вершинах нарисовать квадратики, форматирую строки вывода. Ну и возможно ещё координатную сетку нарисовать.
Алгоритм: выбираешь минимум по Х-су, потом сортируешь точки по уменьшению координаты по У-ку. Ну и, проходя по отсортированному списку, соответствующим образом форматируешь строки и выводишь на экран.

Или тебе нужна полная реализация класса?
_Lynx_ вне форума  
Старый 26.10.2005, 19:05     # 3
andrei solovjev
Newbie
 
Регистрация: 16.06.2005
Сообщения: 38

andrei solovjev Нуль без палочки
_Lynx_, спасибо, очень сильно помог.

>>Или тебе нужна полная реализация класса?
Это было бы очень нагло с моей стороны. Я хочу сам разобраться.
andrei solovjev вне форума  
Старый 27.10.2005, 02:52     # 4
andrei solovjev
Newbie
 
Регистрация: 16.06.2005
Сообщения: 38

andrei solovjev Нуль без палочки
_Lynx_, кстати формулы для поворота немного не верны, они поворачивают по часовой стрелки, а нужно против, т.е. поменять местами 90 и 270...

Еще, я был бы очень благодарен, если ты сказал бы алгоритм как осуществить
перемещение многоугольника в направлении и на величину вектора,построенного из точки {0,0} в
заданную.
andrei solovjev вне форума  
Старый 27.10.2005, 07:25     # 5
Shama_in_da_for
Guest
 
Сообщения: n/a

Не уверен, если я правильно понял на счет вектора. Но по ходу елементарно, тебе просто нужно посчитат разность координат х и y вектора и прибавить соответствуюшие значения к координатам вершин многоугольника!
А псевдографика - ето походу рисунок не в графическом режиме, а с исползованием возможностей АСКИ таблицы!

Последний раз редактировалось Shama_in_da_for; 27.10.2005 в 07:28.
 
Старый 27.10.2005, 16:48     # 6
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Про стрелку проглядел

Пусть у тебя вектор {x0,y0}.
Тогда для каждой точки многоугольника
xi+=x0;
yi+=y0;

Цитата:
Shama_in_da_for:
А псевдографика - ето походу рисунок не в графическом режиме, а с исползованием возможностей АСКИ таблицы!
Естественно!
Вопрос только в том надо ли рисовать стороны и делать заливку.
В принципе стороны рисовать не так уж сложно, главное подобрать соответствующие значки.
_Lynx_ вне форума  
Старый 28.10.2005, 01:56     # 7
andrei solovjev
Newbie
 
Регистрация: 16.06.2005
Сообщения: 38

andrei solovjev Нуль без палочки
Всем спасибо. Класс написал, вот код, если кому интересно:

Код:
#include <iostream.h>

const SIZE = 100;

struct Item {
	float x;
	float y;
	int n;
};

class O {
private:
	Item a[SIZE];
	void create(Item &x) {x.n = 0;}
public:
	O();
	O(float[],float[],int);
	O operator+=(Item);
	void show(int) ;
	void center(int);
	void povorot(int, int, float, float);
	void peremeshenie(int, float, float);
	void operator [] (int);
	friend ostream& operator<<(ostream&, O&);
	friend istream& operator>>(istream&, O&);
	};

O::O() {
	for (int i = 0; i < SIZE; i++) create(a[i]);
}
O::O(float x1[], float y1[], int num) {
	for (int i = 0; i < num; i++){
		a[i].x=x1[i];
		a[i].y=y1[i];
		a[i].n=num;
	}
}

void O::show(int num){
	cout<<endl<<"Mnogougolnik s vershinami:\n";
	for (int i=0; i<num; i++){
		cout<<"("<<a[i].x<<","<<a[i].y<<"), ";
	}
}

void O::center(int num){
	cout<<endl<<"Mnogougolnik s koordinatami centra tyazesti:\n";
	float x=0,y=0;
	for (int i=0; i<num; i++){
		x=x+a[i].x;
		y=y+a[i].y;
	}
	x=x/num;
	y=y/num;
	cout<<"("<<x<<","<<y<<")"<<endl;
}

void O::povorot(int num, int ugol, float x, float y){
	float q,w;
		for (int i=0;i<num;i++){
			if (ugol==90){
				q=x+(y-a[i].y);
				w=y+(a[i].x-x);
				cout<<"("<<q<<","<<w<<") ";
			}
			if (ugol==180){
				q=x+(x-a[i].x);
				w=y+(y-a[i].y);
				cout<<"("<<q<<","<<w<<") ";
			}
			if (ugol==270){
				q=x+(a[i].y-y);
				w=y+(x-a[i].x);
				cout<<"("<<q<<","<<w<<") ";
			}
		}
}


void O::peremeshenie(int num, float x, float y){
	for (int i=0; i<num; i++)
		//float q=a[i].x+x, w=
	cout<<"("<<a[i].x+x<<","<<a[i].y+y<<") ";
}


void O::operator [] (int num){
	cout<<"("<<a[num].x<<","<<a[num].y<<") ";
}

O O::operator +=(Item item){
	for (int i=0; i<SIZE; i++){
		if (a[i].n==-858993460||a[i].n==0) {
			a[i]=item;
			break;
		}
	}
	return *this;
}

ostream& operator<<(ostream& os, O& P){
	for (int i=0; i<SIZE; i++){
		if (P.a[i].n>0){
			os<<"("<<P.a[i].x<<","<<P.a[i].y<<"), ";}
	}
	return os;
}

istream& operator>>(istream& is, O& P){
	Item item;
	int kol=0;
	cout<<"Please, enter number of corners:\n"<<"->";
			cin>>kol;
			cout<<"Please, enter a kordinati\n";
			for (int i=0;i<kol;i++){
				cout<<"Enter a "<<i<<" koord x\n"<<"->";
				cin>>item.x;
				cout<<"Enter a "<<i<<" koord y\n"<<"->";
				cin>>item.y;
				item.n=kol;
				P+=item;
			}
			cout<<"New mnogoug sformirovan\n";
			return is;
}



void main() {
	int choice, choise2=-1;
	O P;
	Item item;
	    	int kol=0;
			float xx[SIZE], yy[SIZE], povorot_x, povorot_y, rv_x,rv_y;
			int i=0;
	do {
		
	    cout<<"\nPlease, select a choise"<<endl;
		cout << "1.New"<<endl<<"2.Add a mnogoug"<<endl<<"3.Vivod koordinat\n"<<"4.Opredelenie centra tyazesti\n"<<"5.Povorot figuri na ugol kratnii 90\n"<<"6.Peremeshenie\n"<<"7.Vivod koordinat vershin\n"<<"8.Dobavlenie tochki (+=)\n";
        cout<<"9.Exit\n";
		cin >> choice;
		cout << endl;
		switch (choice) {
		case 1:
			P = O();
	        cout<<"New pustoy mnogoug is created"<<endl;
			break;
			//////////////////
		case 2:
			cin>>P;
			break;
			/////////////////////////
			case 3:
				//P.show(kol);
				cout<<P;
			break;
			////////////////////////
			case 4:
				P.center(kol);
			break;
			////////////////////////
			case 5:
				cout<<"Vvedite koordinati tochki, otnositelno kotoroy nuzno osushestvit povorot\n";
				cout<<"X=";
				cin>>povorot_x;
				cout<<"Y=";
				cin>>povorot_y;
				cout<<"Viberite ugol:\n1.90 gradusov\n2.180 gradusov\n3.270 gradusov\n";
				cin>>choise2;
				switch (choise2) {
		          case 1:
				    cout<<"1.90 gradusov"<<endl;
			
					P.povorot(kol,90,povorot_x,povorot_y);
			      break;
				  ////////
		          case 2:
				    cout<<"2.180 gradusov"<<endl;
					P.povorot(kol,180,povorot_x,povorot_y);
			      break;
				  ////////
		          case 3:
				    cout<<"3.270 gradusov"<<endl;
					P.povorot(kol,270,povorot_x,povorot_y);
			      break;
				  ////////
				}
			break;
			/////////////////////////
			case 6:
				cout<<"Peremeshenie na radius-vector\nVvedite koordinati radius-vectora:\nX=";
				cin>>rv_x;
				cout<<"Y=";
				cin>>rv_y;
				P.peremeshenie(kol,rv_x,rv_y);
			break;
			////////////////////////
			case 7:
				cout<<"Vvedite nomer vershini\n->";
				cin>>rv_x;
				P[rv_x];
			break;
			////////////////////////
			case 8:
			cout<<"Please, enter a kordinati\n X=";
				cin>>item.x;
				cout<<"Y=";
				cin>>item.y;
				item.n=1;
			P+=item;
			kol++;
			break;
		
		
		}
	}
			while (choice != 9);
	
}
andrei solovjev вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 01:47.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.