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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2012, 10:52   #1
MyQwErTy
Пользователь
 
Аватар для MyQwErTy
 
Регистрация: 16.10.2008
Сообщений: 73
Стрелка Задачи про <vector> и наследование

Дабы не создавать две новые темы, запихну все в одну.
Задача 1. Про <vector>:
В начало вектора целого типа дописать нечетные элементы этого вектора.
Решение:
Решение, собственно, готово,(код ниже) но возникла проблема.
Суть проблемы:
При первом выполнении цикла, где мы вставляем нечетный элемент в начало списка, все в порядке, но! при втором его выполнении берется откуда-то огромное число на 6-7 порядков большее, чем представленные в массиве.
Код:
Код:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;

void main()
{
	int n=0;
	vector <int> vec;
	cout<<"Enter n-->";
	cin>>n;
	srand(unsigned(time(NULL)));
    for(int i=0; i<n; i++)
	{
		vec.push_back(rand()%10);
		cout<<vec[i]<<" ";
	}
	cout<<endl;
//Начинаем вставлять нечетные элементы в начало списка.
	for(int i=0; i<n; i++)
	{
		if((vec[i]%2)!=0)
		{
			vec.insert(vec.begin(),vec[i]);
			n++;
			i++;
		}
	}
	cout<<"New vector: -->"<<endl;
	for(int i=0; i<n; i++)
         cout<<vec[i]<<" ";

}
Задача 2. Про наследование
Есть 4 объекта: точка, линия, круг, цилиндр.
С использованием наследования создать все объекты и т.п.(то, что нужно с ними проделать особо не важно)
Решение: Код ниже.
Суть проблемы:
Проблема 1.
Предположим я хочу создать функцию, которая будет выводить координаты линии, используя уже реализованную функцию вывода точек(printP(). В основной программе эта функция работает отлично, но в классе CLine, функция printL(); работать категорически отказывается.
Проблема 2.
Как было бы правильно реализовать конструктор класса CLine?
Код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
using namespace std;
class CPoint
{
private:
	int x;
	int y;
public:
	CPoint(int _x=0, int _y=0)
	{	
		x=_x;
		y=_y;
	}
	
	~CPoint() 
	{}
   
	void printP()
	{
		cout<<"("<<x<<","<<y<<")"<<endl;
	}
	
	int getX()
	{
		return x;
	}
	
	int getY()
	{
		return y;
	}

};
class CLine: public CPoint
{
private:
	CPoint p1(int x, int y);
	CPoint p2(int x, int y);

public:
	CLine(CPoint _p1, CPoint _p2)
	{}

	~CLine() {}

	void printL()
	{
		cout<<" Line--> from "<<p1.printP()<<" to "<<p2.printP()<<endl;
	}

};
void main()
{
	srand(unsigned(time(NULL)));

	CPoint a(rand()%10,rand()%10), b(rand()%10,rand()%10);
	CLine al(a,b);
	a.printP();
	b.printP();
	al.printL();
}


Заранее спасибо за помощь.
MyQwErTy вне форума Ответить с цитированием
Старый 19.10.2012, 17:56   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
class CLine: public CPoint
тут ты как бы говоришь, что линия - это частный случай точки - это не верно, наследование тут не нужно.

Математически можно сказать что линия - множество точек, а точка - это частный случай линии, в которой начало и конец совпадают, но с точки зрения ООП это тоже будет не верно.

наследование тут не нужно, используй агрегацию.

Класс линии написан от начала до конца не верно.
Я не понял что это такое: (и что ты хотел сделать)
Код:
private:
	CPoint p1(int x, int y);
	CPoint p2(int x, int y);
rrrFer вне форума Ответить с цитированием
Старый 19.10.2012, 18:15   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

а по первой задаче..., вцелом, ваш код работать должен, я его не менял почти, только отформатировал, вроде бы:
Код:
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <time.h>

int main() {
	int n;
	std::vector<int> vec;
	
	std::cout << "Enter n-->";
	std::cin >> n;
	
	srand(unsigned(time(NULL)));
	
	for (int i = 0; i < n; i++) {
		vec.push_back(rand() % 10);
		std::cout << vec[i] << " ";
	}
	std::cout << std::endl;
	
	for (int i = 0; i < n; i++) {
		if (vec[i]&1) {
			vec.insert(vec.begin(), vec[i]);
			n++;
			i++;
		}
	}
	
	std::cout << "New vector: -->" << std::endl;
	for (int i = 0; i < n; i++)
		std::cout << vec[i] << " ";

	std::cin.get(),std::cin.get();
	return 0;
}
формально он задачу решает, но делается это как-то...нехорошо.
В вашей задаче элементы должны добавляться в начало, поэтому вектор тут использовать нерационально, посмотрите на дек (если от задания можно отклониться). Ну и лучше использовать итераторы, это улучшит код, т.к. в вашей задаче вам не потребуется контролировать размер вектора и индекс текущего элемента.
rrrFer вне форума Ответить с цитированием
Старый 19.10.2012, 18:48   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
#include <iostream>
#include <deque>
#include <algorithm>

int main() {
	std::deque<int> vec;
	int n;
	auto outvec = [](std::deque<int> vec) {
		std::for_each(vec.begin(), vec.end(), [](int t) { std::cout << t << ' '; });
		std::cout << std::endl;
	};
	
	std::cin >> n;
	for (int i = 0; i < n; i++)
		vec.push_back(i);
	
	outvec(vec);
	
	std::for_each(vec.begin(), vec.end(), [&vec](int t) {
		if (t&1) vec.push_front(t);
	});
	
	outvec(vec);
	
	std::cin.get(),std::cin.get();
	return 0;
}
как-то так
rrrFer вне форума Ответить с цитированием
Старый 19.10.2012, 20:18   #5
MyQwErTy
Пользователь
 
Аватар для MyQwErTy
 
Регистрация: 16.10.2008
Сообщений: 73
По умолчанию

Спасибо за советы. Первую задачу я, слава богу, смог реализовать самостоятельно, но во второй-таки надо использовать наследование. Суть задачи состоит в том, чтобы на основе класса "точка" создать классы линия, круг и цилиндр. Мне интересно, как на основе класса точка создать все остальное.
П.с. Я хотел реализовать линию с помощью двух точек начала и конца.
П.п.с. Первая задача запустилась на другом компиляторе(MVS 2005), а писалось в MVS 2010.

Последний раз редактировалось MyQwErTy; 19.10.2012 в 20:22.
MyQwErTy вне форума Ответить с цитированием
Старый 19.10.2012, 20:33   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
По умолчанию
Спасибо за советы. Первую задачу я, слава богу, смог реализовать самостоятельно, но во второй-таки надо использовать наследование. Суть задачи состоит в том, чтобы на основе класса "точка" создать классы линия, круг и цилиндр. Мне интересно, как на основе класса точка создать все остальное.
П.с. Я хотел реализовать линию с помощью двух точек начала и конца.
П.п.с. Первая задача запустилась на другом компиляторе(MVS 2005), а писалось в MVS 2010.
Используй агрегирование, наследование тут не нужно.

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

Последний раз редактировалось rrrFer; 19.10.2012 в 20:39.
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи про организацию памяти. alezha Операционные системы общие вопросы 0 16.01.2012 13:51
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Вопрос про vector и обычный массив certman Общие вопросы C/C++ 2 02.04.2010 23:38
Вопрос про vector функцию insert Dimedrolum Общие вопросы C/C++ 2 18.09.2009 22:51
Чисто задачи (про карты) Simply-Art Общие вопросы Delphi 2 29.01.2007 13:50