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

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

Восстановить пароль Регистрация
 
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 11:42     Метод ранга. Неверно выводит результат #1
Добрый день, уважаемые форумчане! Столкнулся с такой проблемой. Есть задача, вот её условия:

Группе экспертов необходимо определить вариант нового закона, вводимого для поддержки начинающих частных предпринимателей. Были представлены следующие варианты проектов:
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++
не выводит результат C++ C++
Не выводит результат C++
C++ C++ не выводит результат
C++ Не выводит не правильный результат
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.04.2013, 12:36     Метод ранга. Неверно выводит результат #6
Spotter, Вы на ноль делите. Какой результат хотите получить при этом?
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:41  [ТС]     Метод ранга. Неверно выводит результат #7
Tulosba, подскажите тогда, пожалуйста, как правильно будет? Ведь делаю все по примеру.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.04.2013, 12:46     Метод ранга. Неверно выводит результат #8
Spotter, если Вы задачу ручным способом решили, значит должны знать на какие коэффициенты делить.
Цитата Сообщение от Spotter Посмотреть сообщение
Ведь делаю все по примеру.
Вы же сами видите, что в примере результат тоже кривой.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
12.04.2013, 12:56  [ТС]     Метод ранга. Неверно выводит результат #9
Tulosba, я и прошу помочь, чтобы разобраться как правильно.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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();
}
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
15.04.2013, 10:00  [ТС]     Метод ранга. Неверно выводит результат #16
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#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];
    float w[3];
 
    //выведем нашу матрицу на экран
    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;
    }
    
    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');
    }
    cout << "\n";
 
    //найдем веса целей
    w[j] = (z[0][j] + z[1][j] + z[2][j] + z[3][j] + z[4][j] + z[5][j])/6;
    for (j = 0; j < 3; j++)
        cout << j+1 << " Альтернатива: " << w[j] << endl;
 
    //сортируем по убыванию
    int temp;
    if (w[i] > w[j] && i < j) {
        temp = w[i];
        w[i] = w[j];
        w[j] = temp;
    }
 
    getch();
}
Метод ранга. Неверно выводит результат
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.04.2013, 10:32     Метод ранга. Неверно выводит результат #17
То, что у Вас написано как:
C++
1
2
3
w[j] = (z[0][j] + z[1][j] + z[2][j] + z[3][j] + z[4][j] + z[5][j])/6; 
for (j = 0; j < 3; j++) 
cout << j+1 << " Альтернатива: " << w[j] << endl;
Должно быть так:
C++
1
2
3
4
5
for (j = 0; j < 3; j++) 
{
   w[j] = (z[0][j] + z[1][j] + z[2][j] + z[3][j] + z[4][j] + z[5][j])/6; 
   cout << j+1 << " Альтернатива: " << w[j] << endl;
}
Вы используете переменную j вне цикла, поэтому вычисление идет неверно.
Чтобы такие ошибки отлавливать на этапе компиляции нужно объявлять переменную цикла в самом цикле:
C++
1
for (int j = 0; j < 3; j++)
И убрать предварительные объявления - строка 13.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
15.04.2013, 11:01  [ТС]     Метод ранга. Неверно выводит результат #18
Tulosba, я извиняюсь, что я Вас и так уже сильно напрягаю, просто давно с консольными приложениями не работал, последние вопросы ещё.

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

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
#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];
    float w[3];
 
    //выведем нашу матрицу на экран
    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;
    }
    
    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');
    }
    cout << "\n";
 
    //найдем веса целей
    for (j = 0; j < 3; j++) {
        w[j] = (z[0][j] + z[1][j] + z[2][j] + z[3][j] + z[4][j] + z[5][j])/6; 
        cout << j+1 << " Альтернатива: " << w[j] << endl;
    }
 
    //сортируем по убыванию
    int temp;
    if (w[i] > w[j] && i < j) {
        temp = w[i];
        w[i] = w[j];
        w[j] = temp;
    }
 
    //найдем наилучший вариант
    float maxW = w[0];
    int variant = 0;
    for (j = 1; j < 3; j++) {
        if (w[j] > maxW) {
            maxW = w[j];
            variant = j;
        }
    }
 
    cout << "\nНаилучшей эффективной альтернативой будет вариант: " << variant;
    getch();
}
Метод ранга. Неверно выводит результат
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 11:53     Метод ранга. Неверно выводит результат
Еще ссылки по теме:

Программа не выводит результат C++
Метод Якоби. Выводит результат -1.INF и -1.IND C++
C++ Не выводит результат

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.04.2013, 11:53     Метод ранга. Неверно выводит результат #19
Spotter, сортировки у Вас нет, потому что нет цикла. Повторюсь про объявление переменной цикла в самом цикле. Перепишите, убрав 13 строку - позволит избежать множества дурацких ошибок.
Вариант считает правильно, но выводит по базе 0, а надо +1, как при выводе альтернативы.
Yandex
Объявления
15.04.2013, 11:53     Метод ранга. Неверно выводит результат
Ответ Создать тему
Опции темы

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