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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 16:41   #1
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Восклицание Площадь треугольника (через контейнерные классы)

Здравствуйте! Возникла проблема при написании программы для вычисления площадей треугольников, которые задаются координатами вершин на плоскости. Программа реализуется на основе контейнерного класса треугольника. Ниже приведен пример программы, в котором используется контейнер vector из стандартной библиотеки шаблонов (STL). Мне же необходимо реализовать программу без подключения к STL, то есть не используя стандартных контейнерных классов, нужно создать свои собственные. Как это реализовать? Помогите пожалуйста.
Код:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cmath>
#include<vector>

using namespace std;

class Apex{
  public: double x;
          double y;
          Apex(char*t): x(atof(strtok(t,";"))), y(atof(strtok(NULL,";"))){};
};

class Triangle{
  private: vector<Apex> v;
  public: Triangle(char*t1, char*t2, char*t3){v.push_back(Apex(t1)); v.push_back(Apex(t2)); v.push_back(Apex(t3));};
          float Area();
};

float Triangle::Area()
{
  float p,s,l[3];

  l[0]=sqrt(pow(fabs(v[0].x-v[1].x),2)+pow(fabs(v[0].y-v[1].y),2));
  l[1]=sqrt(pow(fabs(v[1].x-v[2].x),2)+pow(fabs(v[1].y-v[2].y),2));
  l[2]=sqrt(pow(fabs(v[0].x-v[2].x),2)+pow(fabs(v[0].y-v[2].y),2));
  p=(l[0]+l[1]+l[2])/2;
  s=sqrt(p*(p-l[0])*(p-l[1])*(p-l[2]));

  return s;
};

int main(int argc, char** argv)
{
  int i,n;
  char *t1 = new char[BUFSIZ];
  char *t2 = new char[BUFSIZ];
  char *t3 = new char[BUFSIZ];

  cout<<endl<<"Input the number of triangles: ";
  cin>>n;

  for(i=0; i<n; i++)
    {
      cout<<endl<<"Input coordinates of the apexes of the "<<i+1<<" triangle"<<endl<<"in form x1;y1 x2;y2 x3;y3: ";
      cin>>t1>>t2>>t3;
      Triangle T(t1,t2,t3);
      cout<<"Area = "<<T.Area()<<endl;
    }

  cout<<endl;

  delete(t1);
  delete(t2);
  delete(t3);
}
KEIego вне форума Ответить с цитированием
Старый 04.11.2010, 16:44   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
class Triangle{
  private: Apex v[3];  public: Triangle(char*t1, char*t2, char*t3){v.push_back(Apex(t1)); v.push_back(Apex(t2)); v.push_back(Apex(t3));};
          float Area();
};
А в чем проблема? Или я чего-то не понял?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.11.2010, 16:48   #3
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

Мне нельзя подключать #include<vector>, то есть вообще обращаться к стандартной библиотеке шаблонов. А функция push_back, как я понимаю, из STL. В общем не удается реализовать программу без стандартных контейнеров.
KEIego вне форума Ответить с цитированием
Старый 04.11.2010, 16:51   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Подсказываю, раз уж сами не догадались: уберите функцию push_back;
Замените ее просто на:
Код:
Triangle(char*t1, char*t2, char*t3){v[0] = Apex(t1); v[1] = Apex(t2); v[2] = Apex(t3);};
И пользуйтесь <Enter>.
И стандартные шаблоны изначально тут нафиг не нужны - они тормозят программу.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.11.2010, 16:57   #5
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

А почему в таком случае компилятор выдает ошибку 17 no matching function for call to `Apex::Apex()' ?
KEIego вне форума Ответить с цитированием
Старый 04.11.2010, 17:07   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Нет конструктора без аргументов: раз уж реализовали конструктор с одним аргументом, то компилятор считает, что вы сами сделаете все нужные конструкторы, не дает свои версии по умолчанию.
Напишите в класс Apex Apex() {}. И не ставьте ';' после '}' в реализации встроенных ф-ий:
Код:
class Triangle{
  private: Apex v[3];  public: Triangle(char*t1, char*t2, char*t3){v.push_back(Apex(t1)); v.push_back(Apex(t2)); v.push_back(Apex(t3));};
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.11.2010, 17:11   #7
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
По умолчанию

Спасибо огромное! Совсем недавно занимаюсь С++, поэтому знания уж очень слабые.
KEIego вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны площадь круга и площадь квадрата Joker<777> Паскаль, Turbo Pascal, PascalABC.NET 10 17.01.2012 07:00
Вычислить площадь треугольника. С++ varlonec Помощь студентам 2 26.01.2010 20:07
[C++] Вывод на экран, контейнерные класссы Troi666 Помощь студентам 2 14.12.2009 05:00
ассемблер. Написать функцию, вычисляющую по заданным точкам а,b,c площадь треугольника abс. qimbo Помощь студентам 5 05.01.2008 13:54