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

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

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

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

12.04.2013, 11:42. Просмотров 706. Ответов 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++
Всем привет. Вообщем вот мой код, он должен быть правильным, но почему-то я хватаю где-то мусор при выводе // chrome_test.cpp : Defines...

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

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

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

Не выводит результат - C++
Здравствуйте! Начал изучать данный язык программирования, написал следующую коротенькую программу: #include &lt;iostream.h&gt; #include...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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
:)
Эксперт С++
4392 / 3235 / 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();
}
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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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++ - 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++
Не понимаю почему, но нет вывода результата работы программы. #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int...

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

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


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

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

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