Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240

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

19.04.2013, 11:47. Показов 8865. Ответов 12
Метки нет (Все метки)

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

Компании требуются кадры в новый отдел. Чтобы грамотнее выбрать будущих работников директор приглашает группу экспертов из 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.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.04.2013, 11:47
Ответы с готовыми решениями:

Упорядочить 5 чисел, используя не более 7 парных сравнений
Доброго времени суток, нужна помощь, есть задачка, не можем решить всей группой: упорядочить 5 чисел используя не более 7 парных сравнений.

Сортировать 5 чисел используя не более 7 парных сравнений этих чисел между собой
Сортировать 5 чисел используя не более 7 парных сравнений этих чисел между собой.

Сортировка методом пузырька и количество сравнений
мне нужно сделать программу делающую сортировку пузырьком и считающую кол-во сравнений на массив состоящий из 10 чисел, я вот сижу и думаю...

12
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 12:29
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;
  }
1
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 13:00  [ТС]
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();      
}
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 13:20
Сори я не проверял результат.

Добавте при выводе
C++
1
std:;cout << std::fixed << std::setprecision(/*нужная вам точность*/)  << matrix[i][j];
0
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 13:26  [ТС]
stima, не помогло, первую строчку ввожу, нажимаю ентер, чтобы вторую ввести, и вот что получается.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 14:00
Проблема в том, что Вы водите значение с запятой. А европейский стандарт говорит точка. Решения 2:
1. Вводите значения с точкой.
2. Считывайте значение как строку и сами решайте что с ней делать.
1
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 15:46  [ТС]
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();      
}
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 16:02
Напишите задачу полностью, по отрывкам сложно уловить всю картину.
0
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 16:19  [ТС]
stima, условие задачи.

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

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

1. Эксперты оценивают выгодность проектов в долях единицах:

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


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

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

Размер: 2.2 Кб

3. Вычисляем веса проектов: (это действие я ещё вручную не решил).
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 16:49
Цитата Сообщение от 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 это столбци
1
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 17:46  [ТС]
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] и т.д.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
19.04.2013, 17:52
Цитата Сообщение от 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; 
    }
1
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
19.04.2013, 18:11  [ТС]
stima, как говорится, честное пионерское, пробовал. ) Просто я очень сильно подзабыл С++. Давно с ним не работал. Если бы я немного иначе начал писать, думаю столько вопросов не возникло, но я уже решил все красиво сделать. Огромное вам спасибо, программу доделал полностью, все работает. Осталось только доработать мелкие нюансы, но эти нюансы уже для красоты отображения )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.04.2013, 18:11
Помогаю со студенческими работами здесь

Сортировка методом парных перестановок
1. Реализовать алгоритм сортировка методом парных перестановок.

Реализовать алгоритм сортировка методом парных перестановок
1. Реализовать алгоритм сортировка методом парных перестановок. 2. Задана матрица размером N×M, N,M&lt;50. Получить массив B,...

Сортировка одномерного массива методом слияния с минимальным количеством сравнений
Доброе время суток господа программисты. Я полный чайник в программировании. Прошу помочь мне в нелегком деле. Надо написать программу...

Отсортировать массив методом включения и обмена и определить количество сравнений
Дано линейный массив целых чисел. Отсортировать его методом включения и обмена и определить количество сравнений.

Сортировка массива методом Шейкера с выводом количества сравнений и обменом
Написал код для сортировки массива по Шейкеру. Мне еще нужно реализовать подсчет числа сравнений и обменов и их вывод. Помогите пожалуйста...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru