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

Ранжирование проектов методом парных сравнений - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 11:47     Ранжирование проектов методом парных сравнений #1
Добрый день, уважаемые форумчане! Столкнулся с такой проблемой. В общем, вот само задание:

Компании требуются кадры в новый отдел. Чтобы грамотнее выбрать будущих работников директор приглашает группу экспертов из 5-ти человек, которые оценивают ниже перечисленные варианты:
Z1 - переманить лучших сотрудников конкурентов;
Z2 - отправить сотрудников других отделов на курсы повышения квалификации;
Z3 - провести конкурс среди студентов, заканчивающих ВУЗ.
Z1...j - объекты экспертизы
Определить наиболее предпочтительный вариант.

В ручном режиме задачу почти дорешал, последнее действие оставил, чтобы сравнить результаты с выполнением программы. В общем начал я писать программу, и к сожалению, подзабыл С++. Я выделил динамически память под массив, и вот тут одна проблема, нужно чтобы массив был не целочисленный, а с дробными числами, т.е. float. И вот никак не могу переделать его под данный тип.

Код программы:

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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
 
        int **a = NULL;
        int height = 0;
        int width = 0;
 
        cout << " Введите размер матрицы (ширина,высота) :\n>";   
        cin >> height >> width;
        a = new int *[height];
        for(int i = 0 ; i < height; i++)
        {
                a[i] = new int[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";
        }
       
        
        for(int i=0;i<height;i++)
        {
                delete[] a[i];
        }
        delete[]a;
        getch();      
}
Добавлено через 2 минуты
Ещё, если не сложно, подскажите пожалуйста, как правильней реализовать вот данных, чтобы каждое значение матрицы не превышало 1, т.е. 0,1 0,3 0,8, 0,45.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 12:29     Ранжирование проектов методом парных сравнений #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
#include <iostream>
 
int main()
  {
  float **matrix = NULL;
  int height = 0, width = 0;
 
  std::cout << "Enter matrix size(n, m): " << std::endl;   
  std::cin >> height >> width;
 
  matrix = new float*[height];
  for(int i = 0 ; i < height; i++)
    matrix[i] = new float[width];
 
  std::cout << "Enter expert's marks" << std::endl;
  for(int i = 0; i < height; ++i)
    {
    for(int j = 0; j < width; ++j)
      {
      float temp;
      std::cin >> temp;
 
      if (temp >= 0.f && temp <= 1.f) //negative?
        matrix[i][j] = temp;
      else
        {
        std::cout << "Incorrect input "<< std::endl;
        --j;
        }
      }               
    }
 
  std::cout << "Expert's marks" << std::endl;
  for(int i = 0; i < height; ++i)
    {
    int last = width - 1;
    for(int j = 0; j < last; ++j)
      std::cout << matrix[i][j] << " ";
    std::cout << matrix[i][last] << std::endl;
    }
  
  for(int i = 0; i < height; ++i)
    delete[] matrix[i];
  delete[] matrix;
 
  std::cin.get();   
  return 0;
  }
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 13:00  [ТС]     Ранжирование проектов методом парных сравнений #3
stima, сделал по вашему примеру, но проблема осталась. Выкладываю скрин и код.

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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
 
        float **matrix = NULL;
        int height = 0;
        int width = 0;
 
        cout << " Введите размер матрицы (ширина,высота) :\n>";   
        cin >> height >> width;
 
        matrix = new float *[height];
        for(int i = 0 ; i < height; i++)
                matrix[i] = new float[width];
 
        cout << "\nВведите оценки экспертов: \n\n";
        for(int i = 0; i < height; i++)
        {
                for(int j = 0; j < width; j++)
                {
                    float temp;
                    cin >> temp;
 
                    if (temp >= 0.f && temp <= 1.f) //negative?
                        matrix[i][j] = temp;
                    else
                    {
                        cout << "Неккоректные оценки "<< endl;
                        --j;
                    }
                }               
        }
        cout << "\nИсходные оценки экспертов: \n\n";
        for(int i = 0; i < height; i++)
        {
            int last = width - 1;
            for(int j = 0; j < last; j++)
                {
                        cout << matrix[i][j] << " " << "\t";
                        cout << matrix[i][last] << endl;
 
                }
                cout << "\n\n";
        }
       
        
        for(int i = 0; i < height; i++)
        {
                delete[] matrix[i];
        }
        delete[]matrix;
        getch();      
}
Ранжирование проектов методом парных сравнений
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 13:20     Ранжирование проектов методом парных сравнений #4
Сори я не проверял результат.

Добавте при выводе
C++
1
std:;cout << std::fixed << std::setprecision(/*нужная вам точность*/)  << matrix[i][j];
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 13:26  [ТС]     Ранжирование проектов методом парных сравнений #5
stima, не помогло, первую строчку ввожу, нажимаю ентер, чтобы вторую ввести, и вот что получается.
Ранжирование проектов методом парных сравнений
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 14:00     Ранжирование проектов методом парных сравнений #6
Проблема в том, что Вы водите значение с запятой. А европейский стандарт говорит точка. Решения 2:
1. Вводите значения с точкой.
2. Считывайте значение как строку и сами решайте что с ней делать.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 15:46  [ТС]     Ранжирование проектов методом парных сравнений #7
stima, огромное Вам спасибо! Все из головы вылетело, элементарное забыл) Все работает, прописал ещё кусок программы, и столкнулся ещё с одной проблемой. Мне вот сейчас осталось реализовать два последних действия. И тут возник вопрос. В методе кривой пример, и пример со статическим массивом, и известным его размером. У меня же размер задается пользователем, и вот тут вопрос. Как в моем случае реализовать вот это действие: находим оценки, характеризующие предпочтения одного из проектов над остальными? Как я понимаю, это нужно сделать с помощью цикла? Вот как это действие выглядит в примере статического массива:

C++
1
2
3
4
5
6
7
8
9
10
//находим оценки,характеризующие предпочтения одного из проектов над остальными 
f[0]=Sum[0]+Sum[2]+Sum[4]; 
f[1]=Sum[1]+Sum[6]+Sum[8]; 
f[2]=Sum[3]+Sum[7]+Sum[10]; 
f[3]=Sum[5]+Sum[9]+Sum[11]; 
for(i=0;i<4;i++) 
{ 
cout < < f[i] < < "" < < endl; 
Sumf+=f[i]; 
}
Далее выполняется последнее действие программы:

C++
1
2
3
4
// вычисляем веса проектов 
for(i=0;i<4;i++) 
w[i]=f[i]/Sumf; 
}
Код, который написал с Вашей помощью, выглядит сейчас так:
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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
 
        float **matrix = NULL;
        int height = 0;
        int width = 0;
 
        cout << " Введите размер матрицы (ширина,высота) :\n>";   
        cin >> height >> width;
 
        matrix = new float *[height];
        for(int i = 0 ; i < height; i++)
                matrix[i] = new float[width];
 
        cout << "\nВведите оценки экспертов: \n\n";
        for(int i = 0; i < height; i++)
        {
                for(int j = 0; j < width; j++)
                {
                    float temp;
                    cin >> temp;
 
                    if (temp >= 0.f && temp <= 1.f) //negative?
                        matrix[i][j] = temp;
                    else
                    {
                        cout << "\nНеккоректные оценки "<< endl;
                        --j;
                    }
                }               
        }
        cout << "\nИсходные оценки экспертов: \n\n";
        for(int i = 0; i < height; i++)
        {
            //int last = width - 1;
            for(int j = 0; j < width; j++)
                {
                        cout << fixed << setprecision(2) << matrix[i][j] << " " << "\t";
                }
                cout << "\n\n";
        }
 
        //производим подсчет суммы по столбцам
        float Sum[6];
        for(int i = 0; i < height; i++) 
            Sum[i]=0; 
        for(int j = 0; j < width; j++) { 
            for(int i = 0; i < height; i++) 
            { 
                cout << matrix[i][j] << " "; 
                Sum[j] += matrix[i][j]; 
            } 
            cout << "Сумма столбца = " << Sum[j] << endl; 
        } 
        
 
        for(int i = 0; i < height; i++)
        {
                delete[] matrix[i];
        }
        delete[]matrix;
        getch();      
}
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 16:02     Ранжирование проектов методом парных сравнений #8
Напишите задачу полностью, по отрывкам сложно уловить всю картину.
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 16:19  [ТС]     Ранжирование проектов методом парных сравнений #9
stima, условие задачи.

Компании требуются кадры в новый отдел. Чтобы грамотнее выбрать будущих работников директор приглашает группу экспертов из 5-ти человек, которые оценивают ниже перечисленные варианты:
Z1 - переманить лучших сотрудников конкурентов;
Z2 - отправить сотрудников других отделов на курсы повышения квалификации;
Z3 - провести конкурс среди студентов, заканчивающих ВУЗ.
Z1...j - объекты экспертизы
Определить наиболее предпочтительный вариант.

Решение задачи вручную:

1. Эксперты оценивают выгодность проектов в долях единицах:
Ранжирование проектов методом парных сравнений
Где Э1...i - эксперты, Z1...j- проекты
Определить наиболее предпочтительный вариант.


2. Находим оценки, характеризующие предпочтение одного из проектов над всеми прочими проектами

Название: 22.png
Просмотров: 265

Размер: 2.2 Кб

3. Вычисляем веса проектов: (это действие я ещё вручную не решил).
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 16:49     Ранжирование проектов методом парных сравнений #10
Цитата Сообщение от Spotter Посмотреть сообщение
У меня же размер задается пользователем, и вот тут вопрос.
размер чего?

Добавлено через 4 минуты
Цитата Сообщение от Spotter Посмотреть сообщение
1
//находим оценки,характеризующие предпочтения одного из проектов над остальными
f[0]=Sum[0]+Sum[2]+Sum[4];
f[1]=Sum[1]+Sum[6]+Sum[8];
f[2]=Sum[3]+Sum[7]+Sum[10];
f[3]=Sum[5]+Sum[9]+Sum[11];
for(i=0;i<4;i++)
{
cout < < f[i] < < "" < < endl;
Sumf+=f[i];
}

В Вашем случае это
C++
1
2
3
f[0]=Sum[0]+Sum[2]; 
f[1]=Sum[1]+Sum[4]; 
f[2]=Sum[3]+Sum[5];
где индексы массива Sum это столбци
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 17:46  [ТС]     Ранжирование проектов методом парных сравнений #11
stima, это сделал, только один нюанс. В примере выглядит вот так получается:

C++
1
2
3
4
5
for(i=0;i<4;i++) 
{ 
cout < < f[i] < < "" < < endl; 
Sumf+=f[i]; 
}
Вот не могу у себя это Sumf вставить, как не пробовал объявлять - ошибку выдает.

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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
 
        float **matrix = NULL;
        int height = 0;
        int width = 0;
 
        cout << " Введите размер матрицы (высота,ширина) :\n>";   
        cin >> height >> width;
 
        matrix = new float *[height];
        for(int i = 0 ; i < height; i++)
                matrix[i] = new float[width];
 
        cout << "\nВведите оценки экспертов: \n\n";
        for(int i = 0; i < height; i++)
        {
                for(int j = 0; j < width; j++)
                {
                    float temp;
                    cin >> temp;
 
                    if (temp >= 0.f && temp <= 1.f) //negative?
                        matrix[i][j] = temp;
                    else
                    {
                        cout << "\nНеккоректные оценки "<< endl;
                        --j;
                    }
                }               
        }
        cout << "\nИсходные оценки экспертов: \n\n";
        cout << fixed << setprecision(3) << "    Z1-Z2           Z1-Z3           Z2-Z3\n";
        for(int i = 0; i < height; i++)
        {
            //int last = width - 1;
            for(int j = 0; j < width; j++)
                {
                        cout << fixed << setprecision(2) << matrix[i][j] << " " << "\t";
                }
                cout << "\n\n";
        }
 
        //производим подсчет суммы по столбцам
        float Sum[6];
        for(int i = 0; i < width; i++) 
            Sum[i]=0; 
        for(int j = 0; j < width; j++) { 
            for(int i = 0; i < height; i++) 
            { 
                cout << matrix[i][j] << " "; 
                Sum[j] += matrix[i][j]; 
            } 
            cout << "Сумма столбца = " << Sum[j] << endl; 
        } 
 
        //находим оценки,характирезующие предпочтения одного из проектов над остальными 
        float f[3];
        f[0]=Sum[0]+Sum[2]; 
        f[1]=Sum[1]+Sum[4]; 
        f[2]=Sum[3]+Sum[5]; 
 
        for(int i = 0; i < 3; i++) { 
            cout << "\nf[i] = " << f[i] << endl; 
        } 
        
        for(int i = 0; i < height; i++)
        {
                delete[] matrix[i];
        }
        delete[]matrix;
        getch();      
}
Без него ведь получается основное последнее вычисление не сделать никак. И ещё одно, как в Си помню, а как тут сделать не помню, хочу сделать, чтобы при выводе этого фрагмента:
C++
1
2
3
for(int i = 0; i < 3; i++) { 
            cout << "\nf[i] = " << f[i] << endl; 
        }
выводилось не для всех просто f[i] = , а f[1] = , f[2] и т.д.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
19.04.2013, 17:52     Ранжирование проектов методом парных сравнений #12
Цитата Сообщение от Spotter Посмотреть сообщение
Вот не могу у себя это Sumf вставить, как не пробовал объявлять - ошибку выдает.
Вы точно пробовали?)
C++
1
float Sumf = 0.f;
C++
1
2
3
4
for(int i = 0; i < 3; i++)
    { 
            cout << "f[" << i << "] = " << f[i] << endl; 
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 18:11     Ранжирование проектов методом парных сравнений
Еще ссылки по теме:

C++ Ранжирование вершин на ориентированном графе без контуров по отношению к вершине
C++ Сортировка одномерного массива методом слияния с минимальным количеством сравнений
C++ Отсортировать 5 чисел за 7 сравнений

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

Или воспользуйтесь поиском по форуму:
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 18:11  [ТС]     Ранжирование проектов методом парных сравнений #13
stima, как говорится, честное пионерское, пробовал. ) Просто я очень сильно подзабыл С++. Давно с ним не работал. Если бы я немного иначе начал писать, думаю столько вопросов не возникло, но я уже решил все красиво сделать. Огромное вам спасибо, программу доделал полностью, все работает. Осталось только доработать мелкие нюансы, но эти нюансы уже для красоты отображения )
Yandex
Объявления
19.04.2013, 18:11     Ранжирование проектов методом парных сравнений
Ответ Создать тему
Опции темы

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