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

Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 4 - C++

Восстановить пароль Регистрация
 
xorrer
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 23
18.11.2013, 12:10     Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 4 #1
Само задание звучит так: "Из заданного на плоскости множества точек выбрать три различные точки так,
чтобы разность между площадью круга, ограниченного окружностью, проходящей через эти три точки,
и площадью треугольника с вершинами в этих точках была минимальной "
Плюс все функции при выполнении оформить в виде шаблонов.

Извините, пожалуйста, очень прошу еще немножко помочь... Какая-то жуткая лаба... С девизом "через тернии к звездам"

Теперь у меня проблемы с начальным циклом, выбирающим 3 точки и с сортировкой итогового массива получившихся значений. Начальный тройной цикл, в итоге, обрабатывает точки в 2 раза один и тот же набор точек, причем 1 комбинации не хватает. Эта ошибка получается из-за неполадок со 2-ым индексом (у меня j). Т.е. если у меня в тестовом примере координаты |X|: 2 4 6 8, а |Y|: 3 5 7 9, то возможные комбинации точек: (2;3) (4;5) (6;7) | (2;3) (6;7) (8;9) | (2;3) (4;5) (8;9) | (4;5) (6;7) (8;9). И вот этой комбинации (2;3) (4;5) (8;9) программа не видит, а остальные 3 прогоняет 2 раза. И я не знаю, что изменить в задании цикла, чтобы 2-ой индекс работал правильно...

С итоговым массивом проблема еще хлеще
Нужно его отсортировать по значению разности площадей, то бишь по элементам 4-ого столбца. А поскольку я не очень дружу и с простым пузырьком, то с таким в упор не понимаю, что делать. Понимаю, как отсортировать двумерный массив в зависимости от элементов другого одномерного массива, а вот как отсортировать данный массив по значениям в его же столбце... Помогите понять, пожалуйста. Даже преподаватель уже замучила, на письма с вопросами только через неделю отвечает

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// happiness.cpp: определяет точку входа для консольного приложения.
//
/* каждый пункт в виде шаблона функции  
   данные в кач. параметров
   примеры программ, использующих шаблоны для int, float, double
   
   "из заданного на плоскости множества точек выбрать три различные точки так, 
   чтобы разность между площадью круга, ограниченного окружнотью, проходящей через эти три точки, 
   и площадью треугольника с вершинами в этих точках была миимальной"  */
 
/*1) создать массив x,y; создать массив для конечных результатов 1 итерации функции с площадями
2) создать функцию, выбирающую 3 точки и считающую площадь треугольника и площдь круга (полученные результаты записывать в табличку!)
3) создать другую функцию, которая будет выполнять сортировку по площадям, дабы найти минимальную.
+++++
x,y вбиваются пользователем!*/
 
 
 
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
 
template <class type> 
void func (int lstr, type **a1, type **s1)
{
    int i, j;
    double const pi = 3.14;
    //type x1, x2, x3, y1, y2, y3, x, y, SC, ST;
    double ma, mb, x1, x2, x3, y1, y2, y3, x, y, SC, ST,r; // необходимые для вычислений значения: ma, mb - коэффициенты прямых, 
                                                           //x1, x2, x3, y1, y2, y3 - координаты точек, x, y - координаты центра,
                                                           //SC - площадь круга, ST - площадь треугольника, r - радиус круга
    
    type **s = new type*[lstr]; //создание массива итоговых значений (площадей + их разности)
    for ( i = 0; i < lstr; i++){
        s[i] = new type[4];
    }
   
    type **a = new type*[lstr]; //создание задаваемого массива координат
    for ( i = 0; i < lstr; i++){ 
        a[i] = new type[2];
    }
    
    cout << "Enter matrix: ";
    
    for ( i = 0; i < lstr; i++) { // ввод координат в массив a
        for (j = 0; j < 2; j++) {
            cin >> a[i][j];
        }
        cout << endl;
    }
    
    cout << "  X  " << " | " << "  Y  " << endl;
    cout << endl;
    
    for (i = 0; i < lstr; i++) { // вывод матрицы коорданит а
        for (j = 0; j < 2; j++){ 
            cout << setw(4) << a[i][j] << "  ";
        }
        cout << endl;
    }
    
   bool flag, flag2, flag3; // переменные-флаги, при значении false - выход из цикла
  
   for (int f = 0; f < lstr - 2 ; f++){  // цикл для записи полученных результатов SC, ST, SC-ST  в массив s   
        if (flag3 == false) {                // проверка значения флага на выход из цикла 
            break;
        }
        for (int ii = 0; ii < lstr - 2; ii++){
            if (flag2 == false) {              // проверка значения флага на выход из цикла
                flag3 = false;
                break;
            }
            for (int jj = ii + 1; jj < lstr - 1; jj++) {
                if(flag == false) {                   // проверка значения флага на выход из цикла
                    flag2 = false;
                    break;
                }
                for (int kk = jj + 1; kk < lstr; kk++) { 
                
                // проблема с циклом!!!!!!!!! не выдает 1 точку и повторяет 3!!!!!!
                    x1 = a[ii][0];
                    y1 = a[ii][1];
 
                    x2 = a[jj][0];
                    y2 = a[jj][1];
      
                    x3 = a[kk][0];
                    y3 = a[kk][1];
     
                    cout << " P1(x1;y1) =  ( " << x1 << " ; " << y1 << " )" << endl;
                    cout << " P2(x2;y2) =  ( " << x2 << " ; " << y2 << " )" << endl;
                    cout << " P3(x3;y3) =  ( " << x3 << " ; " << y3 << " )" << endl;
                
                /////////здесь будет ошибка в расчетах (бесконечность), если в знаменателе будет 0... а он там будет при равенстве x1 и x2 или x2 и x3
                    if ((x1 != x2) && (x2 != x3)) {
                        ma = (y2-y1)/(x2-x1);
                        cout << "ma" <<  endl; cout <<ma <<endl;
                        mb = (y3-y2)/(x3-x2);
                        cout << "mb" << mb << endl;
                    }
                    else {
                        cout << "False! x1=x2 or x2=x3! Please enter new points" << endl;
                        flag = false; // меняется значение флага для выхода из внутреннего цикла
                        break;
                    }
                //////////////
                    if (mb - ma == 0) {
                        cout << "P1P2 || P2P3 : these points don't form a circle " << endl;
                        break;
                    }
                    
                    x =  (ma*mb*(y1-y3)+mb*(x1+x2)-ma*(x2+x3))/2*(mb-ma); //нахождение координат центра окружности
                    y =  ((-1)*(x - (x1+x2)/2))/ma +(y1+y2)/2;
                    
                    cout << "The center O(x;y)" << x << "  " << y << endl;
 
                    //type r =(type) sqrt(double( /*(x1-x)*(x1-x) - (y1-y)*(y1-y)*/sq )); 
                    r = sqrt(double (fabs(( (x1-x)*(x1-x) - (y1-y)*(y1-y))) )); //радиус
                    cout << "The radius " << r << endl;
                    
                    if (r == 0) {
                        cout << "these points don't form a circle"<< endl;
                        break;
                    }
                
                    SC = pi*r*r;
                    cout << "Square of the circle " << SC << endl;
                
                    ST = fabs(((x1-x3)*(y2-y3) - (x2-x3)*(y1-y3))/2.0);
                    cout << "Square of the tringle " << ST << endl;
                    
                    // запись результатов в массив s
                    s[f][0] = ii;
                    s[f][1] = SC;
                    s[f][2] = ST; 
                    s[f][3] = SC - ST;
                }
            }
        }           
   }
   
   // как сделать проверку на НЕНАЛИЧИЕ хотя бы одного решения, дабы не выполнять сортировку?????
   cout << "  №  " << "|" << " S of circle " << "|" << " S of tringle " << "|" << "   SC - ST  " << endl;
   
   // вывод не отсортированного массива итоговых значений 
   for (int f = 0; f < lstr; f++) {
       for (int g = 0; g < 4; g++) {
           cout << setw(4) << s[f][g] << "  ";
       } 
       cout << endl;
   }
   
   // пузырьковая сортировка
   for (j = lstr-1; j > 0; j--){
       for (i = 0; i < j; i++) {
           if (s[j+1][4] < s[j][4]) {
               type* min = s[j];
               s[j] = s[j+1];
               s[j+1] = min;
           } 
       }
   }
   
   cout << "sorted data" << endl;
   cout << endl;
   cout << "  №  " << "|" << " S of circle " << "|" << " S of tringle " << "|" << "   SC - ST  " << endl; 
   
   //вывод отсортированного массива итоговых значений s[i][j]
   for (int iw = 0; iw < lstr; iw++) {
       for (int jw = 0; jw < 4; jw++) {
           cout << setw(4) << a[iw][jw] << "  ";
       }
       cout << endl;
   }
}
 
  
 
 
int main()
{
    int lstr;
    cout << "Enter lstr > 3 strings" << endl;
    cin >> lstr;
    int q;
 
    do {     
        cout << "Choose the type of array" << endl;
        cout << "1 - int" << endl;
        cout << "2 - double" << endl;
        cout << "3 - float" << endl;
        cin >> q;
        
        switch(q) 
        {
        case 1: int ** s1;
                int ** a1;
                func ( lstr, a1, s1);
                break;
        
        case 2: double **s2;
                double **a2;
                func ( lstr, a2, s2);
                break;
        
        case 3: float double **s3;
                float **a3;
                func ( lstr, a3, s3);
                break;
        }
    } while (q != 4);
    
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 12:10     Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 4
Посмотрите здесь:

Целочисленная арифметика ,Одномерные массивы ,Двумерные массивы C++
C++ Одномерные и двумерные массивы, задачи на зачет
задачи на двумерные и одномерные массивы C++
Программирование задачи на двумерные и одномерные массивы с использованием шаблонов C++
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 2
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 3
Двумерные и одномерные массивы C++
Использование шаблонов функций в задаче на двумерные массивы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru