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

Матрица. Построить логический вектор. - C++

Восстановить пароль Регистрация
 
Tepliar
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 17
05.05.2012, 20:06     Матрица. Построить логический вектор. #1
Помогите решить задачку второго курса на языке С++...
Дана квадратная матрица размерности nxn. необходимо построить логический вектор, каждый элемент которого равен true, если в строке существует элемент, который делит весь массив на две части с одинаковой суммой элементов в каждой

есть эта задачка на языке Delphi, c++ не знаю... может кто нибудь ее преобразовать в С++, ну или написать ее самому, буду премного благодарен.

вот сам код на делфи

Delphi
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
program str105n17;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  windows;
const n=4;
Type  str=array[1..n] of integer;
      massiv=array[1..n] of str;
 
function f(var stroka:str):boolean;
var i,k:integer;
    sum1,sum2:integer;
begin
 f:=false;
 k:=2; 
 repeat
  sum1:=0;sum2:=0;
  for i:=1 to k-1 do sum1:=sum1+stroka[i];
  for i:=k+1 to n do sum2:=sum2+stroka[i];
  if sum1=sum2 then f:=true;
  k:=k+1;
 until (sum1=sum2) or (k>=n);
end;
 
procedure create_matr (var m:massiv);
 var i,j:integer;
 begin
  for i:=1 to n do
  for j:=1 to n do
  //m[i][j]:=random(10);
  read(m[i][j]);
  readln;
 end;
 
procedure write_matr (var m:massiv);
var i,j:integer;
begin
for i:=1 to n do
  begin
    for j:=1 to n do
    write(m[i,j]:4);
    writeln;
  end;
end;
var a:massiv;
    v:array[1..n] of boolean;
    stolbec:str;
    i,j:integer;
begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
writeln('Введите элементы матрицы размером ',n,'x',n);
create_matr(a);
writeln('Матрица A:');
write_matr(a);
writeln('Результаты по строкам:');
for i:=1 to n do
   begin
    v[i]:=f(a[i]);
    write(v[i],' ');
   end;
writeln;
writeln('Результаты по столбцам:');
for j:=1 to n do
 begin
  for i:=1 to n do
  stolbec[i]:=a[i,j];
  v[j]:=f(stolbec);
  write(v[j],' ');
 end;
readln;
end.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2012, 20:06     Матрица. Построить логический вектор.
Посмотрите здесь:

Вектор и матрица C++
C++ построить вектор из элементов матрицы
C++ Матрица и вектор
C++ Построить вектор
C++ Есть квадратная матрица А порядка n и вектор b с n элементами. Получить вектор Аb.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.05.2012, 01:36     Матрица. Построить логический вектор. #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
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cassert>
 
 
template<typename T>
std::vector<bool> f(std::vector<std::vector<T>> const& matrix) {
    std::vector<bool> result(matrix.size(), false);
    
    auto resultIt = std::begin(result);
    for (auto matrixIt = std::begin(matrix); matrixIt != std::end(matrix); ++matrixIt, ++resultIt) {
        for (auto rowBeginIt = std::begin(*matrixIt), rowEndIt = std::end(*matrixIt), rowIt = std::begin(*matrixIt);
                rowIt != rowEndIt;
                ++rowIt) {
            if (std::accumulate(rowBeginIt, rowIt, T()) == std::accumulate(std::next(rowIt), rowEndIt, T())) {
                *resultIt = true;
                break;
            }
        }
    }
    
    return result;
}
 
 
int main() {
    std::vector<std::vector<int>> matrix = {
        { 1,  2,  4,  3,  4,  3 },
        { 4,  5,  6, -9,  0,  0 },
        { 7,  8,  9, 10, -9, -8 },
        { 8,  0, -3,  3, 19, 22 },
        { 8, -9,  7, 13,-16,  5 },
        { 6, 13, -8, 66,-77,100 }
    };
    std::vector<bool> expected = {
        true,
        false,
        false,
        false,
        true,
        true
    };
    
    auto result = f(matrix);
    
    std::cout << std::boolalpha;
    std::copy(std::begin(result), std::end(result), std::ostream_iterator<bool>(std::cout, "\n"));
    
    assert(result == expected);
}
Добавлено через 20 минут
Если нет поддержки нового стандарта:
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 <iterator>
#include <vector>
#include <algorithm>
#include <numeric>
 
 
template<typename T>
std::vector<bool> f(std::vector<std::vector<T> > const& matrix) {
    typedef typename std::vector<std::vector<T> >::const_iterator  matrix_iterator;
    typedef typename std::vector<T>::const_iterator                row_iterator;
    typedef std::vector<bool>::iterator                            result_iterator;
    
    std::vector<bool> result(matrix.size(), false);
    
    result_iterator resultIt = result.begin();
    for (matrix_iterator matrixIt = matrix.begin(); matrixIt != matrix.end(); ++matrixIt, ++resultIt) {
        for (row_iterator rowBeginIt = matrixIt->begin(), rowEndIt = matrixIt->end(), rowIt = matrixIt->begin();
                rowIt != rowEndIt;
                ++rowIt) {
            if (std::accumulate(rowBeginIt, rowIt, T()) == std::accumulate(rowIt + 1, rowEndIt, T())) {
                *resultIt = true;
                break;
            }
        }
    }
    
    return result;
}
 
 
int main() {
    std::size_t n;
    std::cout << "n? ";
    std::cin >> n;
    std::vector<std::vector<int> > matrix(n, std::vector<int>(n));
    for (std::size_t i = 0; i != n; ++i) {
        for (std::size_t j = 0; j != n; ++j) {
            std::cout << "[" << i << "][" << j << "]? ";
            std::cin >> matrix[i][j];
        }
    }
        
    std::vector<bool> result = f(matrix);
    
    std::cout << std::boolalpha;
    std::copy(result.begin(), result.end(), std::ostream_iterator<bool>(std::cout, "\n"));
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
07.05.2012, 02:48     Матрица. Построить логический вектор. #3
Если что, есть более оптимальное решение.
qwertyyy
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 4
31.05.2012, 19:30     Матрица. Построить логический вектор. #4
gray fox
напиши более оптимальное
Tepliar
0 / 0 / 0
Регистрация: 12.04.2012
Сообщений: 17
31.05.2012, 21:51  [ТС]     Матрица. Построить логический вектор. #5
gray_fox, спасибо кстати за те решения, очень помог
от души
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
01.06.2012, 21:38     Матрица. Построить логический вектор. #6
Цитата Сообщение от qwertyyy Посмотреть сообщение
gray fox
напиши более оптимальное
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
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <cassert>
 
 
template<typename T>
std::vector<bool> f(std::vector<std::vector<T>> const& matrix) {
    std::vector<bool> result(matrix.size(), false);
    
    auto resultIt = std::begin(result);
    for (auto matrixIt = std::begin(matrix); matrixIt != std::end(matrix); ++matrixIt, ++resultIt) {
        assert(matrixIt->size() > 1);
        
        auto rowIt = std::begin(*matrixIt);
        T lhs = T();
        T rhs = std::accumulate(std::next(rowIt), std::end(*matrixIt), T());
                
        do {
           if (lhs == rhs) {
              *resultIt = true;
              break;
           }
           
           lhs += *rowIt;
           rhs -= *++rowIt;
        } while (rowIt != std::end(*matrixIt));
    }
    
    return result;
}
 
 
int main() {
    std::vector<std::vector<int>> matrix = {
        { 1,  2,  4,  3,  4,  3 },
        { 4,  5,  6, -9,  0,  0 },
        { 7,  8,  9, 10, -9, -8 },
        { 8,  0, -3,  3, 19, 22 },
        { 8, -9,  7, 13,-16,  5 },
        { 6, 13, -8, 66,-77,100 }
    };
    std::vector<bool> expected = {
        true,
        false,
        false,
        false,
        true,
        true
    };
    
    auto result = f(matrix);
    
    std::cout << std::boolalpha;
    std::copy(std::begin(result), std::end(result), std::ostream_iterator<bool>(std::cout, "\n"));
    
    assert(result == expected);
}
http://liveworkspace.org/code/42f775...1c84ec267a392f
Yandex
Объявления
01.06.2012, 21:38     Матрица. Построить логический вектор.
Ответ Создать тему
Опции темы

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