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

Сравнени двух матриц (NxN-1) и (MxM-1) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вопрос про __function http://www.cyberforum.ru/cpp-beginners/thread172838.html
вопрос глупый, но все же: зачем в названии функциях пишут две __ - void __Plus(int a); - пример int __Display(int b) это для красоты кода(если честно не понимаю чего красивого) или это что-то другое?
C++ Используя датчик случайных чисел, получить координаты вершин треугольника x1, y1, x2, y2, x3, y3, принадлежащие отрезку [-5,5] Составьте программу для выполнения следующих заданий: 1. Ввести с клавиатуры длины отрезков a, b и c. 2. Проверить, могут ли быть эти отрезки сторонами треугольника, и вывести соответствующее сообщение. 3. Используя формулу Герона и теоремы синусов и косинусов, вычислить периметр и площадь треугольника, высоты ha, hb и hc, медианы ma, mb и mc и биссектрисы la, lb и lc треугольника. ... http://www.cyberforum.ru/cpp-beginners/thread172833.html
матрица инцидентности C++
матрица инцидентности задано множество пар вершин, построить матрицу инцидентности как вывести матрицу инцидентности?? cout<<"\nvvedite kilkist vershin: "; cin>>n; int kr; //введення cout<<"\n"<<"vvedite pochergovo rebra (po zavershenu vvedite '0'):"<<"\n";
Нужно Составить алгоритм расчета по двум формулам C++
Всем привет! Нужно написать код что бы пользователь мог ввести число переменной и программа всё должна посчитать и выдать результат Z1 и Z2 (Ответ должен получиться одинаковый)
C++ Добавление элем в список http://www.cyberforum.ru/cpp-beginners/thread172810.html
Помогите написать программу для добавление нового элемента в однонаправленный список перед минимальным ключом списка. Добавление элем реализую в "void los::dobavlenie()" Пока получилось только вставлять элемент в конец списка. А как вставить элемент перед нужным нам элементом, то есть перед минимальным. #include<iostream.h> #include<conio.h> #include<stdio.h> #include<iomanip.h> class los...
C++ Ищу ответы на вопросы из задачника Златопольского Д. М. "Сборник задач по программированию " Есть отличнейший задачник Златопольский Д. М. "Сборник задач по программированию " но решений в нём нет((( и найти их что-то не получаеться, может у кого есть, а то задачи решаю и очень хотелось бы свериться! подробнее

Показать сообщение отдельно
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.10.2010, 13:13     Сравнени двух матриц (NxN-1) и (MxM-1)
Да нет, реализация не усложняется))) Только что написал сначала для нулевой главной диагонали, потом, посмотрев задание, исключил её. Даже одна строка кода ушла)))
Вот что пока вышло:

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define A "A.txt"
#define B "B.txt"
 
// Связный список для хранения координат точек
struct plane
{
    double x;
    double y;
    struct plane *next;
};
 
struct plane *makePlane(char *filename, int *count);
void deletePlane(struct plane *start);
void distance(double **matrix, int dim, struct plane *start);
 
int main()
{
    struct plane *startA = NULL; // Начальный элемент списка точек первой плоскости
    struct plane *startB = NULL; // Начальный элемент списка точек второй плоскости
    double **distA;              // Матрица расстояний между всеми точками первой плоскости
    double **distB;              // Матрица расстояний между всеми точками второй плоскости
    int N, M;                    // Счётчики количества точек
    int i, j;
 
    startA = makePlane(A, &N); // Создаём список точек первой плоскости
    startB = makePlane(B, &M); // Создаём список точек второй плоскости
 
    distA = (double **)malloc(N * sizeof(double *));
 
    for (i = 0; i < N; i++)
        distA[i] = (double *)malloc((N - 1) * sizeof(double));
 
    distB = (double **)malloc(M * sizeof(double *));
 
    for (i = 0; i < M; i++)
        distB[i] = (double *)malloc((M - 1) * sizeof(double));
 
    distance(distA, N, startA);
    distance(distB, M, startB);
 
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N - 1; j++)
            printf("%lf  ", distA[i][j]);
 
        printf("\n");
    }
 
    printf("\n");
 
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < M - 1; j++)
            printf("%lf  ", distB[i][j]);
 
        printf("\n");
    }
 
    for (i = 0; i < N; i++)
        free(distA[i]);
 
    free(distA);
 
    for (i = 0; i < M; i++)
        free(distB[i]);
 
    free(distB);
 
    deletePlane(startA); // Очищаем память, выделенную для списка точек первой плоскости
    deletePlane(startB); // Очищаем память, выделенную для списка точек второй плоскости
 
    getch();
    return 0;
}
 
// Функция, создающая список точек, считываемых из файла
// Принимаемые параметры:
// filename - имя файла, содержащего координаты точек
// count - указатель на счётчик количества точек (в результате работы функции количество точек будет записано в эту переменную)
// Возвращаемое значение:
// Указатель на начало списка точек плоскости
struct plane *makePlane(char *filename, int *count)
{
    struct plane *start = NULL; // Начальный элемент списка точек плоскости
    struct plane *current;      // Текущий элемент списка точек плоскости
    struct plane *temp;         // Временный элемент
 
    FILE *fin; // Указатель на входной файл
 
    if ((fin = fopen(filename, "r")) == NULL) // Октрываем входной файл, а если его не удалось открыть,
    {
        fprintf(stderr, "Error opening file \"%s\"!", filename); // сообщаем об ошибке
        getch();
        exit(1);                                                 // и выходим
    }
 
    *count = 0;
 
    while(!feof(fin)) // Продолжаем считывание, пока не достигнем конца файла
    {
        temp = (struct plane *)malloc(sizeof(struct plane)); // Выделяем память под очередной элемент списка
        fscanf(fin, "%lf %lf", &(temp->x), &(temp->y));      // и считываем в него координаты очередной точки
        temp->next = NULL;                                   // Устанавливаем указатель на следующий элемент в NULL
 
        if (start == NULL) // Если список ещё не был создан
        {
            start = temp;    // Созданный элемент делаем начальным
            current = start; // Начальный элемент делаем текущим
        }
        else // Если продолжаем создание списка, начатое ранее
        {
            current->next = temp; // В текущем элементе указатель на следующий элемент устанавливаем на созданный
            current = temp;       // Созданный элемент делаем текущим
        }
 
        (*count)++; // Увеличиваем счётчик точек плоскости
    }
 
    fclose(fin);
 
    return start;
}
 
// Функция, очищающая память, выделенную для списка точек
// Принимаемые параметры:
// *start - указатель на начало списка точек
void deletePlane(struct plane *start)
{
    struct plane *temp; // Временный элемент
 
    // в цикле пробегаем все элементы списка
    while (start != NULL)
    {
        temp = start;        // Устанавливаем указатель temp на элемент start
        start = start->next; // Устанавливаем указатель start на следующий элемент списка
        free(temp);          // Освобождаем память, на которую указывает temp
    }
}
 
// функция, рассчитывающая расстояния между всеми точками плоскости
// Принимаемые параметры:
// **matrix - указатель на матрицу расстояний (в результате матрица запишется в эту переменную)
// dim - количество точек плоскости
// *start - указатель на список точек
void distance(double **matrix, int dim, struct plane *start)
{
    struct plane *temp; // Временная переменная
    double x, y;        // Вершины очередной точки, от которой считается расстояние до остальных точек
    int i, j, k;
 
    // В цикле забиваем данными все ячейки матрицы
    for (i = 0; i < dim; i++)
    {
        temp = start; // Устанавливаем временный указатель на начало списка точек
        k = 0;
 
        // Ищем точку, от которой будем рассчитывать расстояние до остальных
        while (k < i)
        {
            temp = temp->next;
            k++;
        }
 
        x = temp->x; // Запоминаем вершины
        y = temp->y; // найденной точки
        temp = temp->next;
 
        for (j = i; j < dim - 1; j++)
        {
            matrix[i][j] = sqrt(pow(x - temp->x, 2.0) + pow(y - temp->y, 2.0)); // Рассчитываем расстояние от найденной точки до очередной
            matrix[j + 1][i] = matrix[i][j];                                    // Поскольку расстояния дублируются, сохраняем найденной расстояние в дублируемую ячейку
            temp = temp->next;                                                  // Продвигаемся дальше по списку точек
        }
    }
}
Для простоты реализации сравнения всё же думаю, что удобнее хранить расстояния не в векторе, а в матрице. Да и нагляднее, когда есть матрица. Проще плоскость представлять.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru