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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
#1

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

19.04.2013, 11:47. Просмотров 1961. Ответов 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 11:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ранжирование проектов методом парных сравнений (C++):

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

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

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

Подсчитать количество парных и не парных элементов в матрице - C++
Дано матрицу 10*10, подсчитать количество парных и не парных элементов

Удаление парных и не парных елементов в контейнере - C++
Задача на удаление функцией erase() парных и не парных елементов из контейнеров. После компиляции программа на запуске выдает крит...

Ранжирование двустрочной таблицы, состоящей из цифр - C++
Нужно организовать ранжирование двустрочной таблицы, состоящей из цифр. Помогите пожалуйста. Не знаю даже как начать это делать

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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
Просмотров: 271

Размер: 2.2 Кб

3. Вычисляем веса проектов: (это действие я ещё вручную не решил).
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
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; 
    }
Spotter
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 130
19.04.2013, 18:11  [ТС] #13
stima, как говорится, честное пионерское, пробовал. ) Просто я очень сильно подзабыл С++. Давно с ним не работал. Если бы я немного иначе начал писать, думаю столько вопросов не возникло, но я уже решил все красиво сделать. Огромное вам спасибо, программу доделал полностью, все работает. Осталось только доработать мелкие нюансы, но эти нюансы уже для красоты отображения )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 18:11
Привет! Вот еще темы с ответами:

Ранжирование вершин на ориентированном графе без контуров по отношению к вершине - C++
Помогите сделать алгоритм по данному коду. Задание: Написать и исследовать программу, осуществляющюю ранжирование вершин на ориентированном...

Посимвольное сравнений чисел. - C++
Здравствуйте! Подскажите, как решить следующую задачу. Требуется посимвольно сравнить символы. Подсчитать в строке количество нулей и...

Скорость сравнений и присваиваний - C++
Доброго времени суток. Интересует вопрос: насколько примерно процесс сравнения двух элементов (напр. типа int) проходит быстрее, чем...

Количество сравнений в массиве - C++
И снова здравствуйте!) Есть рабочий код - поиск в двоичном массиве. Как модифицировать код, чтоб вычислить число сравнений при поиске?? ...


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

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

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