Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2018, 20:04   #1
makc1833
 
Регистрация: 03.09.2018
Сообщений: 3
По умолчанию ошибка в коде научной работе

это моя научная работа. суть в том что она ищет коэффициенты корреляции спирмена из входной матрицы вводимой с клавиатуры. сначала вводим высоту и ширину матрицы. затем она ранжируется и со 110( где еще коментарий "подсчет коэффициентов спирмена") строки идет сам расчет коэффициентов где собственно и ошибка. сама программа должна брать каждый столбец этой матрицы и сравнивать с каждым другим столбцом это матрицы и по формуле расчитывать коэффициенты и заносить в таблицу коэффициентов корреляции. проблема в том что программа правильно расчитывает несколько первых значений а дальше неправильно я думаю проблема гдето в циклах но не пойму где. например чтобы вам не заморачиваться и не считать все по формулам вводите входные данные так: сначала 4 2(это высота и ширина входной матрицы) затем сама матрица
2 2
2 1
3 2
1 2
затем она ранжируется и на выходе должна выйти матрица
1 0.25
0.25 1
но она делает такую
1 -0.5
0.25 -0.5
вообще количество столбцов во входной матрице можетбыть любое, но мне бы пока разобраться с двумя столбцами.
помогите пожалуйста. вот код программы:
Код:
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
#include <math.h>
using namespace std;

int main()
{
setlocale(LC_ALL, "Russian");

// ВВОД МАТРИЦЫ

int height = 0;
int width = 0;

cout << " Введите размер матрицы (ширина,высота) :\n>";
cin >> height >> width;
double **A = new double *[height];
for(int i = 0 ; i < height; i++)
{
A[i] = new double[width];
}
cout << "\nВведите оценки экспертов: \n\n";
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
cin >> A[i][j];
}
}
cout << "\nИсходные оценки экспертов: \n\n";
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
cout << A[i][j] << " " << "\t";
}
cout << "\n\n";
}

// РАНЖИРОВАНИЕ МАТРИЦЫ

double **B = new double *[4];
for (int i = 0; i < 4; i++)
B[i] = new double[height];
for (int j = 0; j < width; j++)
{
for (int i = 0; i < height; i++)
{
B[0][i] = A[i][j];
B[1][i] = B[0][i];
B[2][i] = i + 1;
}

bool exit = false;
while (!exit)
{
exit = true;
for (int i = 0; i < height - 1; i++)
{
if (B[1][i] > B[1][i + 1])
{
swap(B[1][i], B[1][i + 1]);
exit = false;
}
}
}

double first, last, ser;
exit = false;
while (!exit)
{
exit = true;
for (int i = 0; i < height - 1; i++)
{
if ((B[1][i] == B[1][i + 1]) && (B[2][i] != B[2][i + 1]))
{
first = i;
for (int j = i + 1; j < height; j++)
if (B[1][j] == B[1][i])
last = j;
ser = (first + last) / 2 + 1;
for (int j = first; j <= last; j++)
B[2][j] = ser;
exit = false;
}
}
}

for (int i = 0; i < height; i++)
for (int j = 0; j < height; j++)
if (B[0][i] == B[1][j])
B[3][i] = B[2][j];


for (int i = 0; i < height; i++)
A[i][j] = B[3][i];
}

cout << "ранжированная матрица по столбцам:\n\n";
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
cout << A[i][j] << " " << "\t";
cout << endl;
cout << endl;
}

//ПОДСЧЕТ КОЭФФИЦИЕНТОВ СПИРМЕНА
cout << "Таблица коеффициетов корреляции Спирмена:\n\n";
double **Sp = new double *[width];
for (int i = 0; i < width; i++)
{
Sp[i] = new double[width];
}
double raznkv, razn, sumkv = 0;
for(int j = 0; j < width; j++)
{
for(int cou = 0; cou < width; cou++)
{
for(int i = 0; i < height; i++)
{
razn = A[i][j]-A[i][cou];
raznkv = pow(razn, 2);
sumkv = sumkv + raznkv;
}
Sp[cou][j] = 1 -((6*sumkv)/(height*(pow(height,2)-1)));
}
}

for (int i = 0; i < width; i++)
{
for (int j = 0; j < width; j++)
cout << Sp[i][j] << " " << "\t";
cout << endl;
cout << endl;
}

}
makc1833 вне форума Ответить с цитированием
Старый 04.09.2018, 15:54   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ну ввели
ну посчитали
ну увидели что результаты не совпали с ожидаемыми
а дальше?
где ЖЕЛАЕМЫЕ формулы расчета? (алгоритм получения результата)
написанный то алгоритм мы восстановим(при желании), НО...
результаты не удовлетворяют, а как НАДО получать ПРАВИЛЬНЫЙ результат неизвестно.
или же вы хотите чтобы мы самостоятельно изучили КАК НАДО рассчитывать.
даже если это просто то все равно это время и прочие ресурсы

Простой пример из вашего кода
Код:
if ((B[1][i] == B[1][i + 1]) && (B[2][i] != B[2][i + 1]))
участвует ДВЕ колонки, НО ...
Код:
swap(B[1][i], B[1][i + 1]);
exit = false;
здесь меняем только одну, а другую надо иль нет(НЕИЗВЕСТНО).


Код:
      for (int i = 0; i < height; i++)
        for (int j = 0; j < height; j++)
          if (B[0][i] == B[1][j])
            B[3][i] = B[2][j];
А если НЕ совпали что туда B[3][j] попадет?
А почему сравниваем ...[i] ==... [j] ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.09.2018, 18:27   #3
makc1833
 
Регистрация: 03.09.2018
Сообщений: 3
По умолчанию

я ж и говорю ошибка со 110 строки где циклы с расчетами. все формулы там есть. все что идет до 110 строки это ввод массива с клавиатуры который работает правильно и ранжирование этого массива которое тоже работает правильно
makc1833 вне форума Ответить с цитированием
Старый 04.09.2018, 19:27   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

если формула (алгоритм. цикл с расчетами) записан правильно значит мы получили ПРАВИЛЬНЫЙ результат.
НО результат НЕ совпал с ожидаемым, значит что-то пошло не так.
Узнать что пошло не так, можно лишь ЗНАЯ как должно быть.(знать МАТЕМАТИЧЕСКУЮ алгоритмизацию используемых расчетов описанную в ... неизвестно где)
даже если весь алгоритм это 2+2
ведь возможно вам НАДО БЫЛО посчитать 2+1
По имеющемуся(и только по нему) НЕПРАВИЛЬНОМУ коду НЕЛЬЗЯ сказать КАК будет правильно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.09.2018, 21:39   #5
makc1833
 
Регистрация: 03.09.2018
Сообщений: 3
По умолчанию

я нашел ошибку. боже такая глупая) не там переменные объявил, надо было в цикле где переменная cou. все заработало как надо
makc1833 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Ошибка. Компилируется, но не запускается. Ошибка duplicate class. Проблема не в коде. nevender Общие вопросы по Java, Java SE, Kotlin 2 13.02.2016 13:24
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Тема научной работы по php Abuhamed PHP 2 13.01.2012 09:18
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
1. Написать процедуру печати вещественного числа в научной форме Shamonya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 05.11.2010 20:43