Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
#1

Нахождения перимтров нескольких трапеций заданных по точкам - C++

07.10.2012, 23:46. Просмотров 985. Ответов 18
Метки нет (Все метки)

Вот сама задача."На вход подается некоторое количество трапеций (координаты вершин). Отсортировать и вывести их по возрастанию периметров. При вводе проверять, что вводятся трапеции."

Есть фрагмент программы для ввода координат и нахождения периметра для одной трапеции.А как быть если вводят несколько трапеций ,это вводить кучу новых переменных и делать все тоже самое что с первой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "StdAfx.h"
 #include <math.h>
#include <iostream>
using namespace std;
 
int main()
{
   
    double P,M,M1,M2,M3,x1,y1,x2,y2,x3,y3,x4,y4;
    cout<<"Введите координаты трапеции"<<endl;
    cout <<"A(x,y):";
    cin >> x1 >> y1;
    cout<<endl;
    cout <<"B(x,y):";
    cin >> x2 >> y2;
    cout<<endl;
    cout <<"C(x,y):";
    cin >> x3 >> y3;
    cout<<endl;
    cout <<"D(x,y):" ;
    cin >> x4 >> y4;
    cout<<endl;
    M= sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    M1= sqrt((x3-x2)*(x3-x2)+ (y3-y2)*(y3-y2));
    M2= sqrt((x4-x3)*(x4-x3)+ (y4-y3)*(y4-y3));
    M3= sqrt((x1-x4)*(x1-x4)+ (y1-y4)*(y1-y4));
    P=M1+M2+M3+M;
    cout<<"Периметр="<<P<<endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2012, 23:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождения перимтров нескольких трапеций заданных по точкам (C++):

Составить алгоритм нахождения суммы наибольшего и наименьшего из заданных чисел - C++
:(:(

Присваивание переменной одного значения из нескольких заданных - C++
Здравствуйте, у меня возник вопрос. Припустим есть цифры 12, 21, 68 и 0. Как присвоить переменной одно из этих значений(рандомно)? Подумал,...

Написать (переделать) программу с использованием ссылок в качестве параметров функций для нахождения минимального элемента из 3-х заданных - C++
Просто нахождение написал. Подскажите как использовать ссылки (&amp;) в качестве параметров функций. #include &quot;stdafx.h&quot; #include...

Сложение нескольких map (Вывести суммарный список деталей для заданных приборов) - C++
Здравствуйте! По заданию мне нужно вывести суммарный список деталей для заданных приборов. Например, сколько всего ножек нужно и...

Создание WinApi функции для нахождения максимального элемента массива в нескольких потоках - C++
Задача состоит в следующем: ножно написать программу, которая будет находить максимальное значение массива в нескольких потоках. Я написал...

Нахождения определенного интеграла методом трапеций - Lazarus
2. Используя процедурный тип данных реализовать функцию нахождения определенного интеграла любой заданной функции на заданном отрезке...

18
David Sylva
1288 / 950 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
08.10.2012, 14:58 #2
используй массив. например одна трапеция M[8]; А чтобы несколько используй матрицу matrix[4][8] - где 4 количество трапеций.
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
08.10.2012, 15:29  [ТС] #3
Нужно сделать через классы обьектов.пока что не представляю каким образом
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
22.10.2012, 18:00  [ТС] #4
вот задача:На вход подается некоторое количество трапеций (координаты вершин). Отсортировать и вывести их по возрастанию периметров. При вводе проверять, что вводятся трапеции.
Не получается реализовать ее.Буду благодарен за помощь.Я так понимаю что можно сделдать массив из количества трапеций,вводить сколько нужно ввести трапеций,за тем их координаты,потом найти площади,записать в массив площадей и отсортировать их.и вывести.
0
John Prick
802 / 735 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
22.10.2012, 20:16 #5
Цитата Сообщение от DeFeND Посмотреть сообщение
Я так понимаю что можно сделдать массив из количества трапеций,вводить сколько нужно ввести трапеций,за тем их координаты,потом найти площади,записать в массив площадей и отсортировать их.и вывести.
Можно динамически добавлять элементы в контейнер (вектор, например). Т.е. примерно так: вводится трапеция, обсчитывается периметр и добавляется в вектор. Нужно только придумать, как остановить ввод.
Сортировать можно перед выводом, а можно и после каждого добавления. (И чтобы пользователь не заметил задержек - сортировать в другом потоке ).
Цитата Сообщение от DeFeND Посмотреть сообщение
При вводе проверять, что вводятся трапеции.
А какие критерии трапеции?
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
12.11.2012, 19:54  [ТС] #6
Задание:На вход подается некоторое количество трапеций (координаты вершин).
Отсортировать и вывести их по возрастанию периметров.

Вот первый код который рабочий мною созданный.
Но нужно переделать его под классы обьектов.Во втором коде я начал переделывать код,но не могу создать класс для нахождения периметра.Помогите,подскажите полжалуйста!Спасибо


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Макс
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
const int n = 5;
 
typedef struct{
float x, y;
} POINT;
 
typedef struct{
POINT p[4];
} POINTARRAY;
 
int _tmain(int argc)
{
 
 
srand(time(0));
POINTARRAY arr[n];
 
for(int i = 0; i<n;i++)
{
for(int j = 0; j<4; j++)
{
arr[i].p[j].x = rand();
arr[i].p[j].y = rand();
}
 
}
 
 
float per[n] = {0};
 
for(int i = 0; i<n;i++)
{
int otr[4] = {0};
otr[0] = sqrt(pow((arr[i].p[0].x-arr[i].p[1].x),2)+pow((arr[i].p[0].y-arr[i].p[1].y),2));
otr[1] = sqrt(pow((arr[i].p[1].x-arr[i].p[2].x),2)+pow((arr[i].p[1].y-arr[i].p[2].y),2));
otr[2] = sqrt(pow((arr[i].p[2].x-arr[i].p[3].x),2)+pow((arr[i].p[2].y-arr[i].p[3].y),2));
otr[3] = sqrt(pow((arr[i].p[3].x-arr[i].p[0].x),2)+pow((arr[i].p[3].y-arr[i].p[0].y),2));
for(int j =0; j<=3;j++)
{
per[i]+=otr[j];
}
 
}
 
for(int i = 0; i<n;i++)
{
for(int j =0; j<4; j++)
{
printf("%f %f \n\t", arr[i].p[j].x, arr[i].p[j].y);
}
printf("perimetr %f \n\n\t", per[i]);
}
 
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (per[i] < per[j])
{
int buf = per[i];
per[i] = per[j];
per[j] = buf;
 
POINTARRAY bufPoint= arr[i];
arr[i] = arr[j];
arr[j] = bufPoint;
 
}
 
printf("\n sorting \n");
 
for(int i = 0; i<n;i++)
{
for(int j =0; j<4; j++)
{
printf("%f %f \n\t", arr[i].p[j].x, arr[i].p[j].y);
}
printf("perimetr %f \n\n\t", per[i]);
}
 
getchar();
return 0;
}
Второй код переделываю под классы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Trapecia.cpp: определяет точку входа для консольного приложения.
//
 
//На вход подается некоторое количество трапеций (координаты вершин). 
//Отсортировать и вывести их по возрастанию периметров.  
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
const int n = 2;
 
class tochka
{
public:
    void vvod()
    {
      int x,y;
     cout << "Vvedite kkoardinati x=";
     cin >>x;
     cout << "Vvedite kkoardinati y=";
     cin >>y;
    }
}; 
class Perimetr
{
public:
    void perimetr()
    {
      int x,y;
     cout << "Vvedite kkoardinati x=";
     cin >>x;
     cout << "Vvedite kkoardinati y=";
     cin >>y;
    }
}; 
typedef struct{
    int x,y;
}
POINT;
typedef struct{
    POINT p[4];
}
POINTARRAY;
 
int main(int argc)
{
 srand (time(0));
POINTARRAY arr[n];
 for(int i=0;i<n;i++)
 {
      for(int j=0;i<4;i++)
      {
    tochka x;
    x.vvod();
    tochka y;
    y.vvod();
      }
 }
 float per[n] = {0};
 
for(int i = 0; i<n;i++)
{
int otr[4] = {0};
otr[0] = sqrt(pow((arr[i].p[0].x-arr[i].p[1].x),2)+pow((arr[i].p[0].y-arr[i].p[1].y),2));
otr[1] = sqrt(pow((arr[i].p[1].x-arr[i].p[2].x),2)+pow((arr[i].p[1].y-arr[i].p[2].y),2));
otr[2] = sqrt(pow((arr[i].p[2].x-arr[i].p[3].x),2)+pow((arr[i].p[2].y-arr[i].p[3].y),2));
otr[3] = sqrt(pow((arr[i].p[3].x-arr[i].p[0].x),2)+pow((arr[i].p[3].y-arr[i].p[0].y),2));
for(int j =0; j<=3;j++)
{
per[i]+=otr[j];
}
 
}
 
//for(int i = 0; i<n;i++)
//{
//for(int j =0; j<4; j++)
//{
//printf("%f %f \n\t", arr[i].p[j].x, arr[i].p[j].y);
//}
//printf("perimetr %f \n\n\t", per[i]);
//}
 
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (per[i] < per[j])
{
int buf = per[i];
per[i] = per[j];
per[j] = buf;
 
POINTARRAY bufPoint= arr[i];
arr[i] = arr[j];
arr[j] = bufPoint;
 
}
 
printf("\n sorting \n");
 
for(int i = 0; i<n;i++)
{
for(int j =0; j<4; j++)
{
printf("%f %f \n\t", arr[i].p[j].x, arr[i].p[j].y);
}
printf("perimetr %f \n\n\t", per[i]);
}
 
getchar();
return 0;
}
0
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
12.11.2012, 20:10 #7
А зачем тебе так много классов? Не проще ли создать просто класс ТРАПЕЦИЯ, а Периметр, Точка и т.д. уже будут методами этого класса
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
12.11.2012, 20:14  [ТС] #8
Да,можно так,но я незнаю к сожелению как это реализовать.Вот и прошу помощи.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
12.11.2012, 20:15 #9
Цитата Сообщение от DeFeND Посмотреть сообщение
class tochka {
public: void vvod() {
int x,y;
cout << "Vvedite kkoardinati x="; cin >>x;
cout << "Vvedite kkoardinati y="; cin >>y;
}
};
Ох, посмотри хоть один пример объявления класса.
Например:
C++
1
2
3
4
5
6
7
8
class tochka {
 public:
  int x, y; 
  void vvod() {
    cout << "Vvedite kkoardinati x="; cin >>x; 
    cout << "Vvedite kkoardinati y="; cin >>y;
  } 
};
Это минимум, но это уже указывает на непонимание, как пользоваться полями класса.
0
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
12.11.2012, 20:30 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Trap
{
public:
    Trap();
    ~Trap();
    void tochka();
    int Perimetr();
private:
 
};
 
Trap::Trap()
{
}
 
Trap::~Trap()
{
}
Вот основа под класс, конструктор, деструктор, и ещё надо добавить данные. Вообще было бы неплохот тебе почитать про классы. Джесс Либерти с++ за 21 день. Тебе смотреть день 6
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
19.11.2012, 19:57  [ТС] #11
Задание:На вход подается некоторое количество трапеций (координаты вершин).
Отсортировать и вывести их по возрастанию периметров.

Почему-то нехочет работать вывод перимтров.Немогу разобраться с этим.остальное вроде все верно.
Помогите пожалуйста!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "stdafx.h"
#include "math.h"
#include <iostream>
using namespace std;
 
 
class pset 
{   
public:
     float x,y,c;
     void input ()
     { cout<<"input x";
       cin>>x;
       cout<<"input y";
       cin>>y;
     
     }
 
 
    void output()
     {
         cout << "(" << x << ";" << y << ";" << ")";
     }
 
     float getx() 
       {return x;}
     float gety() 
       {return y;}
    
 
 
     };
 
 
class Trap
{
private:
    pset A,B,C,D,S;
public:
    void input ()
{ cout << "input vektora:\n";
        A.input();
        B.input();
        C.input();
        D.input();
        
}
 
void output ()
{ 
    A.output();
    B.output();
    C.output();
    D.output();
    cout<<"\n";
}
    
    float volume ()                // ф-я подсчета объема
    {   
        float  AS,BS,CS,DS,Z;
 
        AS= sqrt((B.x-A.x)*(B.x-A.x) + (B.y-A.y)*(B.y-A.y)); 
        
        BS =sqrt((C.x-B.x)*(C.x-B.x) + (C.y-B.y)*(C.y-B.y)); 
        
        CS =sqrt((D.x-C.x)*(D.x-C.x) + (D.y-C.y)*(D.y-C.y)); 
 
         DS =sqrt((A.x-D.x)*(A.x-D.x) + (A.y-D.y)*(A.y-D.y)); 
 
         return  AS+DS+CS+BS;
            }
};
 
 
void main()
{
    
    Trap *P;
    int n, mv;
    float maxV = 0; // максимальный объем
    Trap *maxP;
    cout << "Input N = \n" ;
    cin >> n;
    P = new Trap[n];
 
    for (int i=0; i<n; i++)
    {       P[i].input();
    }
    
    maxV=0;
    maxP=NULL;
    mv=0;
    for (int i=0;i<n;i++)
    {
       if (maxV <(*(P+i)).volume())
      { maxV=(*(P+i)).volume();
        maxP=(P+i);
        mv=i;
      }
    }
 
 cout<<"max Trap = "; maxP->output();
 cout << "\n";
 cout<<"max Volume = "<<maxV << endl;
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7423 / 4538 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
19.11.2012, 20:32 #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
 
class Trapeze
{
    public:
        Trapeze(){}
        Trapeze(double x1, double y1, double x2, double y2,
                double x3, double y3, double x4, double y4);
        friend bool operator< (const Trapeze &, const Trapeze &);
        friend std::ostream& operator<< (std::ostream &, const Trapeze &);
    private:
        double _x1, _y1, _x2, _y2, _x3, _y3, _x4, _y4, P;
};
 
int main()
{
    double x1, x2, x3, x4, y1, y2, y3, y4;
    std::vector<Trapeze> v;
    while(std::cin>> x1>> y1>> x2>> y2>> x3>> y3>> x4>> y4)
        v.push_back (Trapeze (x1, y1, x2, y2, x3, y3, x4, y4) );
    std::sort(v.begin(), v.end());
    std::copy(v.begin(), v.end(),
        std::ostream_iterator<Trapeze> (std::cout, "\n") );
    return 0;
}
 
Trapeze::Trapeze(double x1, double y1, double x2, double y2,
                 double x3, double y3, double x4, double y4): _x1(x1), _y1(y1),
                _x2(x2), _y2(y2), _x3(x3), _y3(y3), _x4(x4), _y4(y4)
{
    P = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ) +
        sqrt( (x3-x2)*(x3-x2) + (y3-y2)*(y3-y2) ) +
        sqrt( (x4-x3)*(x4-x3) + (y4-y3)*(y4-y3) ) +
        sqrt( (x4-x1)*(x4-x1) + (y4-y1)*(y4-y1) );
}
 
bool operator< (const Trapeze &t1, const Trapeze &t2)
{
    return t1.P < t2.P;
}
 
std::ostream& operator<< (std::ostream &output, const Trapeze &t)
{
    output<< "A("<< t._x1<< ", "<< t._y1<< ")"<< std::endl
          << "B("<< t._x2<< ", "<< t._y2<< ")"<< std::endl
          << "C("<< t._x3<< ", "<< t._y3<< ")"<< std::endl
          << "D("<< t._x4<< ", "<< t._y4<< ")"<< std::endl
          << "P = "<< t.P<< std::endl;
    return output;
}
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
19.11.2012, 20:57  [ТС] #13
MrGluck , спасибо конечно,но мне бы в своей разобраться почему не работает.
PS: ваш вариант не получается запустить,бесконечное число чисел вводится и все.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7423 / 4538 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
19.11.2012, 20:59 #14
Цитата Сообщение от DeFeND Посмотреть сообщение
MrGluck , спасибо конечно,но мне бы в своей разобраться почему не работает.
PS: ваш вариант не получается запустить,бесконечное число чисел вводится и все.
Так и задумано. На винде: Ctrl + D - выход из цикла.
0
DeFeND
0 / 0 / 1
Регистрация: 18.10.2011
Сообщений: 37
19.11.2012, 21:07  [ТС] #15
Ну на счет выхода из цикла знаю.А есть ответ, почему моя программа не выводит?
0
19.11.2012, 21:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 21:07
Привет! Вот еще темы с ответами:

Распараллеливание нахождения интеграла методом трапеций - C#
сделал через PLINQ и через потоки, но через потоки уже час висит и никак, я думал вначале что реально просто так долго, но щас уже начал...

Найти точку пересечения графиков, заданных по точкам - MathCAD
Надо посчитать интегралы графиков, стоящих на пересечении, таких графиков много, поэтому хочется автоматизировать процесс. Собственно...

Вычислить методами Симпсона и методом трапеций интеграл от функции F(х)=1/(1+[) в заданных пределах [0.0,2.0] с точностью е=10^(-4). - Basic
Помогите довести программу до ума. Вычислить методами Симпсона и методом трапеций интеграл от функции F(х)=1/(1+ с точностью е=10^(-4)....

Подпрограммы. Составить программу нахождения наибольшего общего делителя нескольких чисел, используя функцию нахождения НОД двух чисел - Turbo Pascal
Задачи нужно решить с помощью процедур 1 Составить программу нахождения наибольшего общего делителя нескольких чисел, используя функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru