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

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

Войти
Регистрация
Восстановить пароль
 
 
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
#1

Метод ранга. Неверно выводит результат - C++

12.04.2013, 11:42. Просмотров 715. Ответов 18
Метки нет (Все метки)

Добрый день, уважаемые форумчане! Столкнулся с такой проблемой. Есть задача, вот её условия:

Группе экспертов необходимо определить вариант нового закона, вводимого для поддержки начинающих частных предпринимателей. Были представлены следующие варианты проектов:
1)Предоставление льготных условий на получение кредита (льготный процент, значительная отсрочка погашения займа);
2)Не облагать предприятие налогами в течение 2-х лет;
3)Не облагать налогами на прибыль в течение 5 лет;

Оценки экспертов предложенных законопроектов приведены в матрице:
1 2 3
2 1 3
2 3 1
3 2 1
3 1 2
1 2 3

Где Э1...i - эксперты, Z1...j- проекты
Определить наилучшую альтернативу

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

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
#include <iostream>
#include <conio.h>
#include <clocale>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //Введем исходную матрицу оценок экспертов 
 
    int s[6][3] = {{1, 2, 3}, {2, 1, 3}, {2, 3, 1}, {3, 2, 1}, {3, 1, 2}, {1, 2, 3}};
    int i, j; 
    int k[6] = {0, 0, 0, 0, 0, 0};
 
    //выведем нашу матрицу на экран
    cout << "Наш массив:\n"; 
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            cout << s[i][j];
        putchar('\n');
    }
 
    //посчитаем матрицу нормированных оценок
    float z[6][3];
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            z[i][j] = float(s[i][j])/float(k[i]);
    }
 
    //вывод матрицы нормированных оценок
    cout << "\nМатрица нормированных оценок: \n";
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++); 
        cout << z[i][j];
        putchar('\n');
    }
 
 
    getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2013, 11:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод ранга. Неверно выводит результат (C++):

Метод Якоби. Выводит результат -1.INF и -1.IND - C++
Вот сделал прогу, но почему-то вместо нормального результата выводит это: result|x: -1.#INF -1.#IND -1.#INF -1.#IND -1.#IND ...

Неверно выводит вектор пар - C++
Здравствуйте. Цикл выводит нули вместо ожидаемых чисел. В чем же ошибка #include&lt;iostream&gt; #include&lt;vector&gt;

Быстрая сортировка выводит неверно - C++
Всем привет. Вообщем вот мой код, он должен быть правильным, но почему-то я хватаю где-то мусор при выводе // chrome_test.cpp : Defines...

Код неверно выводит массивы - C++
всем привет. в общем у меня такая проблема: установил Visual Studio 2013, начал на нем познавать язык С++, и тут такая проблема, когда я...

неверно выдает результат при компилировании - C++
добрый вечер, дана задача :&quot;1. Вычислить медианы треугольника со сторонами a, b, c по формулам(фото)&quot; но при отладке вне зависимости от...

C++ не выводит результат - C++
W7 ,64bit Borland C++ Builder Enterprise v6.0(10.161),я начинающий Копирую рабочую программу,вставляю в проект,запускаю,не выводит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 11:52 #2
Spotter, в 33 строке убрать точку с запятой. Ну и делить на k[i], в которых нули - не есть хорошо
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:06  [ТС] #3
Tulosba, поправил. Результат выводить стал иначе, но ещё не то, что нужно. По ручному способу решения задачи, у меня после запятой три символа. И результаты немного не совпадают (учитывая то, что ручным способом решил верно). Вот матрица нормированных оценок полученная ручным способом:

0,166 0,333 0,5
0,333 0,166 0,5
0,333 0,5 0,166
0,5 0,333 0,166
0,5 0,166 0,333
0,166 0,333 0,5

Вот, что выводит программа.
Метод ранга. Неверно выводит результат

Исправленный код:
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
#include <iostream>
#include <conio.h>
#include <clocale>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //Введем исходную матрицу оценок экспертов 
 
    int s[6][3] = {{1, 2, 3}, {2, 1, 3}, {2, 3, 1}, {3, 2, 1}, {3, 1, 2}, {1, 2, 3}};
    int i, j; 
    int k[6];
 
    //выведем нашу матрицу на экран
    cout << "Наш массив:\n"; 
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            cout << s[i][j];
        putchar('\n');
    }
 
    //посчитаем матрицу нормированных оценок
    float z[6][3];
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            z[i][j] = float(s[i][j])/float(k[i]);
    }
 
    //вывод матрицы нормированных оценок
    cout << "\nМатрица нормированных оценок: \n";
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++) 
        cout << z[i][j];
        putchar('\n');
    }
 
 
    getch();
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 12:13 #4
Spotter, так в массиве k где значения задаются? В 27 строке деление же на них.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:23  [ТС] #5
Tulosba, вот пример решения типовой задачи:
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
void main (void) 
{ 
//Введем исходную матрицу оценок экспертов 
int Z[4][3]; 
Z[0][0]=10; 
Z[0][1]=7;int i,j,s[4]={0,0,0,0}; 
//Посчитаем матрицу нормированных оценок 
float z[4][3]; 
for(i=0;i<4 ;i++) 
{ for(j=0;j<3;j++) 
z[i][j]=float(Z[i][j])/float(s[i]); 
} 
// Найдем веса целей 
w[j]=(z[0][j]+z[1][j]+z[2][j]+z[3][j])/4; 
for(j=0;j<3;j++) 
cout < < j+1 <<" Альтернатива: " < < w[j] < < endl; 
//Сортируем по убыванию 
//Ту альтернативу, которая имеет наибольший вес выбираем как лучший вариант 
if(w[i]>w[j] && i < j) 
{ 
temp=w[i]; 
w[i]=w[j]; 
w[j]=temp; 
}
Я задавал нули, как в примере (в примере матрица 4х3) т.е. 4 нуля, у меня 6х3, но если с нулями, то выводит вот что:
Метод ранга. Неверно выводит результат
В чем тогда может быть ошибка?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 12:36 #6
Spotter, Вы на ноль делите. Какой результат хотите получить при этом?
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:41  [ТС] #7
Tulosba, подскажите тогда, пожалуйста, как правильно будет? Ведь делаю все по примеру.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 12:46 #8
Spotter, если Вы задачу ручным способом решили, значит должны знать на какие коэффициенты делить.
Цитата Сообщение от Spotter Посмотреть сообщение
Ведь делаю все по примеру.
Вы же сами видите, что в примере результат тоже кривой.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:56  [ТС] #9
Tulosba, я и прошу помочь, чтобы разобраться как правильно.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 13:05 #10
Цитата Сообщение от Spotter Посмотреть сообщение
0,166 0,333 0,5
0,333 0,166 0,5
0,333 0,5 0,166
0,5 0,333 0,166
0,5 0,166 0,333
0,166 0,333 0,5
Если это правильные ответы. То можно просто убрать k[] и при вычислении z[i][j] делить на 6.

Добавлено через 30 секунд
Цитата Сообщение от Spotter Посмотреть сообщение
чтобы разобраться как правильно.
Я же не знаю какая у Вас формула используется для ручного вычисления.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 13:15  [ТС] #11
Tulosba, в общем суть такая, решал опять же по примеру (могу ссылку кинуть), и так, как рассказывали.

Наша исходная матрица:
1 2 3
2 1 3
2 3 1
3 2 1
3 1 2
1 2 3

посчитаем матрицу нормированных оценок, считаем так:
1) суммируем значения каждой строчки, и у нас получается в каждой строчке сумма 6, в итоге вот наша матрица нормированных оценок:

1/6 2/6 3/6
2/6 1/6 3/6
2/6 3/6 1/6
3/6 2/6 1/6
3/6 1/6 2/6
1/6 2/6 3/6

после вычислений получаем матрицу:

0,166 0,333 0,5
0,333 0,166 0,5
0,333 0,5 0,166
0,5 0,333 0,166
0,5 0,166 0,333
0,166 0,333 0,5

Вот формулы:

0 ≤ pij ≤ 10 (j = 1,m; i = 1,n).
Метод ранга. Неверно выводит результат
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 13:29  [ТС] #12
Tulosba, ещё такой вопрос, если мы делим на 6, то это получается мы подставили то число, которое нашли ручным способом. А как реализовать это вычисление в программе, чтобы в ходе выполнения все происходило?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 13:50 #13
Для вычисления значений k[i] можно использовать следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
int k[6];
// ...
for (i = 0; i < 6; i++) 
{
   int sum = 0;
   for (j = 0; j < 3; j++)
   {
      sum += s[i][j];
   }
   k[i] = sum;
}
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 16:43  [ТС] #14
Tulosba, сделал, как Вы написали, результаты в первой строчке полностью отличаются, в остальных есть отрицательные значения, что нужно исправить?

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
#include <iostream>
#include <conio.h>
#include <clocale>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //Введем исходную матрицу оценок экспертов 
 
    int s[6][3] = {{1, 2, 3}, {2, 1, 3}, {2, 3, 1}, {3, 2, 1}, {3, 1, 2}, {1, 2, 3}};
    int i, j; 
    int k[6];
 
    //выведем нашу матрицу на экран
    cout << "Наш массив:\n"; 
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            cout << s[i][j];
        putchar('\n');
    }
 
    //посчитаем матрицу нормированных оценок
    float z[6][3];
    for (i = 0; i < 6; i++) {
        int sum = 0;
        for (j = 0; j < 3; j++)
        {
            sum += s[i][j];
        }
        k[i] = sum;
        z[i][j] = float(s[i][j])/float(k[i]);
    }
 
    //вывод матрицы нормированных оценок
    cout << "\nМатрица нормированных оценок: \n";
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++) 
        cout << z[i][j];
        putchar('\n');
    }
    getch();
}
Метод ранга. Неверно выводит результат
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.04.2013, 17:10 #15
Spotter, Вы пытаетесь всё в один цикл впихнуть. Так не получится. Вот решение:
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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //Введем исходную матрицу оценок экспертов 
 
    int s[6][3] = {{1, 2, 3}, {2, 1, 3}, {2, 3, 1}, {3, 2, 1}, {3, 1, 2}, {1, 2, 3}};
    int i, j; 
    int k[6];
 
    //выведем нашу матрицу на экран
    cout << "Наш массив:\n"; 
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
            cout << s[i][j];
        putchar('\n');
    }
 
    //посчитаем матрицу нормированных оценок
    float z[6][3];
    for (i = 0; i < 6; i++) {
        int sum = 0;
        for (j = 0; j < 3; j++)
        {
            sum += s[i][j];
        }
        k[i] = sum;
//        z[i][j] = float(s[i][j])/float(k[i]);
    }
    
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++)
        {
            z[i][j] = float(s[i][j])/float(k[i]);
        }
    }    
 
    //вывод матрицы нормированных оценок
    cout << "\nМатрица нормированных оценок: \n";
    cout.precision(3);
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++) 
        cout << fixed << setw(6) << z[i][j];
        putchar('\n');
    }
    getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 17:10
Привет! Вот еще темы с ответами:

Не выводит результат - C++
Ни как не могу вывести результат. #include &lt;stdio.h&gt; #include &lt;math.h&gt; int F(int x) { return atan (x)+pow(log( x*x ),2); ...

Не выводит результат - C++
Не понимаю почему, но нет вывода результата работы программы. #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int...

не выводит результат C++ - C++
int _tmain(int argc, _TCHAR* argv) { float x2, y2, z2, r, x1, y1, z1, s; if (x1&lt;0) else if (y1&lt;0) else if (z1&lt;0) else...

Не выводит результат - C++
На 3 пункте меню, после решения программа выводит матрицу из нулей. Не могу разобраться, помогите пожалуйста) #include &quot;stdafx.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.04.2013, 17:10
Ответ Создать тему
Опции темы

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