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

Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
14.06.2013, 21:57     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #1
Добрый вечер!
Подскажите пожалуйста каким образом можно реализовать следующую задачу.
Необходимо найти все парные элементы в двумерном массиве (т.е. которых только 2) и сложить их.
Массив заполняется случайными числами...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 21:57     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их)
Посмотрите здесь:

C++ В двумерном массиве заменить все элементы, кратные 3, на 1 и найти их количество
В двумерном числовом массиве все отрицательные элементы замените нулями C++
C++ в двумерном числовом массиве * все отрицательное элементы заменить нулями
В двумерном массиве 5x7 заменить все элементы на 0 C++
Все парные элементы заменить на их квадраты, а не парные умножить на 2 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valentina
66 / 66 / 3
Регистрация: 13.05.2012
Сообщений: 130
14.06.2013, 22:44     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #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
#include<iostream>
using namespace std;
const int c=10;
int main()
{
    int a[c][c];
setlocale (LC_CTYPE,"rus");
cout<<"Введите размерность матрицы: \n";
int r,m;
cin>>r;
cin>>m;
 
 
for( int i=0;i<r;i++)
  for( int j=0;j<m;j++)
  {cout<<"Введите элемент матрицы a["<<i<<"]["<<j<<"]:\n";
cin>>a[i][j];
}
double sum=0;
cout<<"Данная матрица имеет такие положительные элементы:"<<endl;
for( int i=0;i<r;i++)
  for( int j=0;j<m;j++)
  {
      if(a[i][j]%2==0)
      {
          cout<<"a["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
          sum+=a[i][j];
      }
  }
 
cout<<"Сумма положительных элементов равна: \n"<<sum<<endl;
 
 
  system("pause");
return 0;
}
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 16:56  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #3
C++
1
if(a[i][j]%2==0)
Причем тут это. Я имел в виду нахождение в двумерном массиве 2-х одинаковых элементов. Просто бывают такие случаи когда их три, четыре... А Ваше условие проверяет значение элемента на кратность 2-м.
Кто-нибудь сталкивался с подобной проблемой... Укажите путь.

Добавлено через 17 часов 25 минут
Неужели никто не сможет помочь???
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
15.06.2013, 17:10     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #4
Цитата Сообщение от Bugrimov Посмотреть сообщение
Добрый вечер!
Подскажите пожалуйста каким образом можно реализовать следующую задачу.
Необходимо найти все парные элементы в двумерном массиве (т.е. которых только 2) и сложить их.
Массив заполняется случайными числами...
Условие слегка не ясное. Приведите пример что-ли.
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:00  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #5
Например есть двумерный массив (найти парные отрицательные элементы)
1 2 3 4 -1 0
-1 -3 -3 -3 -4 1
-2 6 -5 -2 1 7

искать только парные элементы (-1 и -2). Остальные не брать в расчет, т.е. -1+(-2) = -3.
Как это рассчитать, элементы которых один или три, или больше не брать в расчет....

Добавлено через 2 часа 32 минуты
Есть у кого-нибудь хоть какие идеи?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:02     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #6
ну что вы нервничаете, задачка выеденного яйца не стоит:
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
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 3
#define N 5
 
void Init(int *a, int *end)
{
   if (a < end)
   {
      *a = rand() % 10 - 5;
      Init(a + 1, end);
   }
}
 
void Print(int a[M][N], int m, int n)
{
   int i, j;
   for(i = 0; i < m; ++i)
   {
      for(j = 0; j < n; ++j)
         printf("%4d", a[i][j]);
      putchar('\n');
   }
}
 
int Count(int *a, int *end, int x)
{
   return a < end ? (*a == x) + Count(a + 1, end, x) : 0;
}
 
int Search(int *a, int *end, int x)
{
   return a < end ? (*a == x) || Search(a + 1, end, x) : 0;
}
 
int Sum(int *beg, int *a, int *end)
{
   return a < end ? (Count(beg, end, *a) == 2 && !Search(beg, a - 1, *a)) * (*a) + Sum(beg, a + 1, end) : 0;
}
 
int main()
{
   int a[M][N];
   srand(time(NULL));
   Init(*a, *a + M*N);
   Print(a, M, N);
   printf("sum = %d\n", Sum(*a, *a, *a + M*N));
   return 0;
}
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:10  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #7
Поясните пожалуйста код... Что передается в функцию Sum()?

Добавлено через 1 минуту
Возможно реализовать таким образом
передача в функцию указателя на массив *Arr и его размеры M и N
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:10     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #8
лучше в таком варианте. здесь выводятся все требуемые элементы и находится их сумма:
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
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 3
#define N 5
 
void Init(int *a, int *end)
{
   if (a < end)
   {
      *a = rand() % 10 - 5;
      Init(a + 1, end);
   }
}
 
void Print(int a[M][N], int m, int n)
{
   int i, j;
   for(i = 0; i < m; ++i)
   {
      for(j = 0; j < n; ++j)
         printf("%4d", a[i][j]);
      putchar('\n');
   }
}
 
int Count(int *a, int *end, int x)
{
   return a < end ? (*a == x) + Count(a + 1, end, x) : 0;
}
 
int Search(int *a, int *end, int x)
{
   return a < end ? (*a == x) || Search(a + 1, end, x) : 0;
}
 
int main()
{
   int i, a[M][N], sum = 0;
   srand(time(NULL));
   Init(*a, *a + M*N);
   Print(a, M, N);
   for(i = 0; i < M*N; ++i)
      if (Count(*a, *a + M*N, *(*a + i)) == 2 && !Search(*a, *a + i, *(*a + i)))
      {
          printf("%d\n", *(*a + i));
          sum += *(*a + i);
      }
   printf("sum = %d\n", sum);
   return 0;
}
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:16  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #9
А можно еще предусмотреть подсчет этих пар, их количество, в данном случае = 2.

Добавлено через 1 минуту
Можете коменты в ключевых моментах подписать....
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:17     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #10
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<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 3
#define N 5
 
void Init(int *a, int *end)
{
   if (a < end)
   {
      *a = rand() % 10 - 5;
      Init(a + 1, end);
   }
}
 
void Print(int a[M][N], int m, int n)
{
   int i, j;
   for(i = 0; i < m; ++i)
   {
      for(j = 0; j < n; ++j)
         printf("%4d", a[i][j]);
      putchar('\n');
   }
}
 
int Count(int *a, int *end, int x)
{
   return a < end ? (*a == x) + Count(a + 1, end, x) : 0;
}
 
int Search(int *a, int *end, int x)
{
   return a < end ? (*a == x) || Search(a + 1, end, x) : 0;
}
 
int main()
{
   int i, a[M][N], sum = 0, count = 0;
   srand(time(NULL));
   Init(*a, *a + M*N);
   Print(a, M, N);
   for(i = 0; i < M*N; ++i)
      if (Count(*a, *a + M*N, *(*a + i)) == 2 && !Search(*a, *a + i, *(*a + i)))
      {
          printf("%d\n", *(*a + i));
          sum += *(*a + i);
          ++count;
      }
   printf("count = %d\n", count);
   printf("sum = %d\n", sum);
   return 0;
}
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:27  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #11
Вот функция Print предельна понятна. Остальные накручены, код на мой непрофессиональный взгляд трудно прочитать.

Добавлено через 1 минуту
Единственное что понятно вы очень любите рекурсию
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:30     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #12
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
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 3
#define N 5
 
// заполнение матрицы случайными числами
void Init(int *a, int *end)
{
   if (a < end)
   {
      *a = rand() % 10 - 5;
      Init(a + 1, end);
   }
}
 
// вывод на экран
void Print(int a[M][N], int m, int n)
{
   int i, j;
   for(i = 0; i < m; ++i)
   {
      for(j = 0; j < n; ++j)
         printf("%4d", a[i][j]);
      putchar('\n');
   }
}
 
// количество элементов со значением x с адреса a до end
int Count(int *a, int *end, int x)
{
   return a < end ? (*a == x) + Count(a + 1, end, x) : 0;
}
 
// поиск элемента со значением x с адреса a до end
int Search(int *a, int *end, int x)
{
   return a < end ? (*a == x) || Search(a + 1, end, x) : 0;
}
 
int main()
{
   int i, a[M][N], sum = 0, count = 0;
   srand(time(NULL));
   Init(*a, *a + M*N);
   Print(a, M, N);
   for(i = 0; i < M*N; ++i)
      if (Count(*a, *a + M*N, *(*a + i)) == 2 && !Search(*a, *a + i, *(*a + i)))
      {
          printf("%d\n", *(*a + i));
          sum += *(*a + i);
          ++count;
      }
   printf("count = %d\n", count);
   printf("sum = %d\n", sum);
   return 0;
}
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:33  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #13
C++
1
*(*a + i)
Поясните пожалуйста эту запись
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:37     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #14
Если все строки матрицы расположить в одну строчку, то получится одномерный массив размера M*N.
*(*a + i) - i-й элемент полученного одномерного массива.
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
15.06.2013, 20:40  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #15
А для чего это? Почему не реализовать обычный двумерный массив?
А тогда вот это что
C++
1
2
*a + M*N
*a + i
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
15.06.2013, 20:46     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #16
в этом случае будете с ним нудно париться, с полученным одномерным намного проще алгоритм записывается, видите какая короткая программа получилась.

Добавлено через 4 минуты
*a + i - адрес i-го элемента в большом одномерном массиве

вам же в другом разделе другое решение этой задачи предоставили.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 06:29     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их)
Еще ссылки по теме:

Двумерная матрица. Разместить сначала положительные элементы, а за ними - все остальные C++
В двумерном массиве заменить все четные элементы на минимальный элемент матрицы C++
В двумерном массиве найти элементы, что введет пользователь и потом эти элементы сплюсовать и вывести C++

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

Или воспользуйтесь поиском по форуму:
Bugrimov
 Аватар для Bugrimov
4 / 4 / 0
Регистрация: 18.11.2012
Сообщений: 118
16.06.2013, 06:29  [ТС]     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их) #17
Мне бы хотелось понимать, что происходит...
Вот мои изыскания, хотелось бы доработать...
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
/* Вычисление среднее арифметическое парных отриц. элементов */
double ArithAverage(int **Matr, int n, int m) 
{
    int summ = 0;   // Сумма
    int cr = 0;     // Количество отрицательных пар
     
    for(int i = 0; i < n; i++) 
    {
        for(int j = 0; j < m; j++) 
        {
            if(Matr[i][j] < 0)
            {   
                int count = 1;
                for(int x = 0; x < n; x++)
                {
                    for(int y = 0; y < m; y++)
                    {
                        
                        if(Matr[i][j] == Matr[x][y] && i != x && j != y)
                            count++;
                    }
                
                    if(count == 2)
                    {
                        summ += Matr[i][j];
                        cr++;
                    }
                }
            }
        }
    }
return (summ/cr);
}
Добавлено через 21 минуту
Дайте пожалуйста совет по коду.

Добавлено через 1 час 9 минут
Нужен совет знающих людей.

Добавлено через 8 часов 5 минут
Кто-нибудь сталкивался с таким
Yandex
Объявления
16.06.2013, 06:29     Двумерная матрица на С++ (найти все парные элементы в двумерном массиве и сложить их)
Ответ Создать тему
Опции темы

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