Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

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

Здравствуйте! Возникла проблема при написании программы для вычисления площадей треугольников, которые задаются координатами вершин на плоскости. Программа реализуется на основе контейнерного класса треугольника. Ниже приведен пример программы, в котором используется контейнер 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, 17:44   #2
Syuf
Участник клуба
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Адрес: В Visual Studio 2008
Сообщений: 599
Репутация: 70
По умолчанию

Код:

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, 17:48   #3
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Репутация: 10
По умолчанию

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

Подсказываю, раз уж сами не догадались: уберите функцию 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, 17:57   #5
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Репутация: 10
По умолчанию

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

Нет конструктора без аргументов: раз уж реализовали конструктор с одним аргументом, то компилятор считает, что вы сами сделаете все нужные конструкторы, не дает свои версии по умолчанию.
Напишите в класс 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, 18:11   #7
KEIego
Пользователь
 
Регистрация: 24.09.2010
Сообщений: 22
Репутация: 10
По умолчанию

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

Опции темы

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

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

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

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


01:54.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru