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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Правильная инициализация ? http://www.cyberforum.ru/cpp-beginners/thread1010700.html
Здравствуйте уважаемые программисты! Мне необходимо описать два класса, один ArrayOfInt - якобы одномерный массив, и SqArrayOfInt - уже двумерный массив, основанный на массиве ArrayOfInt. Моя проблема: после инициализации случайными числами, матрица получается не той что должна быть. Например: после вызова функции из 37 строки, данные выводятся верные, а уже на 41 (хотя один и тот же вызов,...
C++ Можно ли разобрать экзешник? есть проблема, мне нужно где то найти исходный код файлового менеджера mucommander и несколько видоизменить его, поменять название и некоторые иконки. как я могу это сделать? http://www.cyberforum.ru/cpp-beginners/thread1010691.html
C++ Создать программу, которая выводит на экран символьную матрицу
создать прогу которая выводит на экран символьную матрицу. пример вывода. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
получить машинные результатный сравнить их со значениями соответствующей функции C++
помогите написать программу! данные ниже выражения представляют собой формулы приближенного вычисления различных функций по разложению их в ряд Тейлора в окрестностях указных точек. В последующем после программирования получить машинные результатный сравнить их со значениями соответствующей функции, указной при каждой формуле(эту функцию в заданной точке вычислить также на ЭВМ.) _____∞ F=x+...
C++ Дана целочисленная прямоугольная матрица. Определить: http://www.cyberforum.ru/cpp-beginners/thread1010683.html
2. Дана целочисленная прямоугольная матрица. Определить: а)количество столбцов, не содержащих ни одного нулевого элемента; b) характеристикой столбца целочисленной матрицы назовем сумму модулей его положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик. Помогите пожалуйста!
C++ Вывести координаты Как решить эту задачу? Капитан Флинт зарыл клад на Острове сокровищ. Он оставил описание, как найти клад. Описание состоит из строк вида: "North 5", где слово – одно из "North", "South", "East", "West", – задает направление движения, а число – количество шагов, которое необходимо пройти в этом направлении. Напишите программу, которая по описанию пути к кладу определяет точные... подробнее

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

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

Теперь у меня проблемы с начальным циклом, выбирающим 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru