Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
#1

В матрице определить сумму положительных элементов и количество элементов, значение которых меньше числа Z - C++

17.05.2015, 00:09. Просмотров 291. Ответов 12
Метки нет (Все метки)

Здраствуйте!

Надо определить суму положительных элементов и кол-во элементов, значение которых меньше числа Z. Столкнулся со следующей проблемой:
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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
const int m=10;
const int n=10;
 
const int a=10;
const int b=18;
 
int suma(int x[]);
int elementi(int x[]);
 
int main()
{
 srand(time(NULL));
 int x[m][n];
 int i,j;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++) x[i][j]=random(b-a+1)+a;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 for(i=0;i<n;i++){
 printf("\n");
 for(j=0;j<m;j++)  printf(" %5d",x[i][j]);
}
 
suma(x);/////////////////////////////////////////cannot convert int(*)(10) to int*
elementi(x);
getch();
return 0;
}
 
int suma(int *x)
{
 int i,j,sum=0;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
   {if(x[i][j]>0)sum+=x[i][j];}
   printf("\n Suma=%d",sum);
   return sum;
}
 
int elementi(int *x)
{
 int k=0;
 int Z=18;
 for(j=0;j<m;j++)
 for(j=0;j<n;j++)
 if(x[i][j]<=Z)k++;
 printf("\n Kilkist elementiv=%d",k);
 return k;
}
Заранее спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 00:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В матрице определить сумму положительных элементов и количество элементов, значение которых меньше числа Z (C++):

В матрице А (mxn) найти найти сумму элементов по колонкам, значения которых по модулю меньше заданного числа К - C++
a) задать значения элементов массива при объявления переменных; b) значения элементов массива ввести с клавиатуры....

Найти количество ненулевых элементов и сумму элементов, значения которых меньше 2 - C++
Найти кол-во ненулевых элементов и сумму элементов , значения которых меньше 2 .Вывести найденную сумму и кол-во (Если они не...

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

Найти количество элементов массива, значение которых меньше 5 - C++
Дан массив размерностью 20 найти количество элементов значение каторых меньше 5. Вот что у меня вышло #include &lt;iostream.h&gt; #include...

Определить сумму положительных значений всех элементов и количество элементов с отрицательными значениями - C++
Здрасте всем, помогите, пожалуйста, написать код для задачи Дан массив b0, b1, b2,…, bn-1. Определить сумму положительных значений всех...

Количество элементов, значение которых меньше среднего арифметического в массиве - C++
Здравствуйте, почему-то не срабатывает нахождение количества элементов, значение которых меньше среднего арифметического. Задача:...

12
valner
1 / 1 / 6
Регистрация: 16.05.2015
Сообщений: 34
17.05.2015, 00:15 #2
int suma(int *x)
Нужно написать
C
1
int suma(int **x)
так как Вы передаете в функцию двумерный массив
0
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 11:57  [ТС] #3
valner, как бы указатель, на указатель?

Добавлено через 2 минуты
valner, все равно та же ошибка

Добавлено через 5 минут
valner, престало выбивать ошибку, когда я сделал следующее:
C++
1
2
int suma(int x[][10]);
int elementi(int x[][10]);
А можна было еще как-то это записать?
0
valner
1 / 1 / 6
Регистрация: 16.05.2015
Сообщений: 34
17.05.2015, 12:02 #4
C++
1
2
3
int suma(int**x);
 
int suma(int x[][]);
Эти тоже будут работать
0
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 12:16  [ТС] #5
valner, к сожалению, не работает(

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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
const int m=10;
const int n=10;
 
const int a=10;
const int b=18;
 
int suma(int **x);
int elementi(int **x);
 
int main()
{
 srand(time(NULL));
 int x[m][n];
 int i,j;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++) x[i][j]=random(b-a+1)+a;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 for(i=0;i<n;i++){
 printf("\n");
 for(j=0;j<m;j++)  printf(" %5d",x[i][j]);
}
 
suma(x);///////////////////////////////////////////////////////////////////////////// выбивает cannot convert int(*)(10) to int**
elementi(x);
getch();
return 0;
}
 
int suma(int **x)
{
 int i,j,sum=0;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
   {if(x[i][j]>0)sum+=x[i][j];}
   printf("\n Suma=%d",sum);
   return sum;
}
 
int elementi(int **x)
{
 int k=0,i,j;
 int Z=18;
 for(j=0;j<m;j++)
 for(i=0;i<n;i++)
 if(x[i][j]<=Z)k++;
 printf("\n Kilkist elementiv=%d",k);
 return k;
}
Добавлено через 1 минуту
valner, и несоответствие типов в том же рядке
0
Даценд
Модератор
Эксперт .NET
4038 / 3877 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
17.05.2015, 12:21 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от valner Посмотреть сообщение
int suma(int**x);
Это только если многомерный массив создан динамически. Да и количество строк и столбцов как-то передать нужно. Хотя для этого здесь глобальные константы. Но для универсальности лучше без них.
Массив без констант:
C++
1
2
3
4
5
6
7
8
int m, n;
cout << "Enter count of rows";
cin >> m;
cout << "Enter count of columns";
cin >> n;
int **x=new int *[m];
for (int i=0; i<m; i++) 
    x[i]=new int[n];
Заголовок функции:
C++
1
int suma(int** x, int m, int n);
Вызов функции:
C++
1
suma(x, m, n);
1
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 12:34  [ТС] #7
Даценд, может вопрос очень нелепый, но все же. Опять выбивает ошибку, Вы не могли бы отредактировать код?

Заранее благодарю!

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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
const int a=10;
const int b=18;
 
int suma(int** x, int n, int m);
int elementi(int** x, int n, int m);
 
int main()
{
 srand(time(NULL));
 int n, m;
 printf("\n Vvedit kilkist radkiv: ");
 scanf("%d",&n);
 printf("\n Vvedit kilkist stovpciv: ");
 scanf("%d",&m);
 int **x=new int *[m];
 for (int i=0; i<m; i++)
    x[i]=new int[n];
 
 int i,j;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++) x[i][j]=random(b-a+1)+a;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 for(i=0;i<n;i++){
 printf("\n");
 for(j=0;j<m;j++)  printf(" %5d",x[i][j]);
}
 
suma(x, n, m);
elementi(x, n, m);
getch();
return 0;
}
 
int suma(int **x)
{
 int i,j,n,m,sum=0;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
   {if(x[i][j]>0)sum+=x[i][j];}
   printf("\n Suma=%d",sum);
   return sum;
}
 
int elementi(int **x)
{
 int k=0,i,j,n,m;
 int Z=18;
 for(j=0;j<m;j++)
 for(i=0;i<n;i++)
 if(x[i][j]<=Z)k++;
 printf("\n Kilkist elementiv=%d",k);
 return k;
}


linker error suma(int**, int , int) referenced from D:\\......
0
Даценд
Модератор
Эксперт .NET
4038 / 3877 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
17.05.2015, 12:39 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В определении функции сигнатура должна быть как и в объявлении, т.е. не
Цитата Сообщение от craftyperson Посмотреть сообщение
int suma(int **x)
а
C#
1
2
3
4
int suma(int** x, int n, int m)
{
//реализация
}
1
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 13:35  [ТС] #9
Даценд, огромное Вам спасибо) работает)

Добавлено через 40 минут
Даценд, извините за бейспокойстов, если вопрос глупый, но если я захочу переделать цикл прохода по массиву через указатель, то это будет выглядеть:

C++
1
2
int** ptr=x;
 for(;ptr<((ptr+n)+m)+1;ptr++)
или нет?

.....................................................................
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<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
const int a=18;
const int b=10;
 
int suma(int** x, int n, int m);
int elementi(int** x, int n, int m, int Z);
 
int main()
{
 srand(time(NULL));
 int n, m, Z;
 printf("\n Vvedit kilkist radkiv: ");
 scanf("%d",&n);
 printf("\n Vvedit kilkist stovpciv: ");
 scanf("%d",&m);
 printf("\n Vvedit chislo Z: ");
 scanf("%d",&Z);
 
 int **x=new int *[m];
 for (int i=0; i<m; i++)
    x[i]=new int[n];
 
 int i,j;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++) x[i][j]=rand()%a-b;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 for(i=0;i<n;i++){
 printf("\n");
 for(j=0;j<m;j++)  printf(" %5d",x[i][j]);
}
 
suma(x, n, m);
elementi(x, n, m, Z);
getch();
return 0;
}
 
int suma(int** x, int n, int m)
{
 int i,j,sum=0;
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
   {if(*(*(x+i)+j)>0)sum+=*(*(x+i)+j);}
   printf("\n\n Suma= %d",sum);
   return sum;
}
 
int elementi(int** x, int n, int m, int Z)
{
 int k=0,i,j;
 for(j=0;j<m;j++)
 for(i=0;i<n;i++)
 if(*(*(x+i)+j)<=Z)k++;
 printf("\n\n Kilkist elementiv= %d",k);
 return k;
}
Добавлено через 54 секунды
Даценд, я имею ввиду, проход по массиву в самой функцие
0
Даценд
Модератор
Эксперт .NET
4038 / 3877 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
17.05.2015, 13:43 #10
Нет не так, потому что условие
(ptr<((ptr+n)+m)+1)
будет всегда выполняться.
А зачем? И почему решили отказаться от x[i][j]?
0
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 14:04  [ТС] #11
Даценд, по правде говоря, меня бы устроил и первый вариант, но поставленное задание подразумевает, после создания массива работать с ним через указатели

Добавлено через 16 минут
Даценд, помогите, пожалуйста, реализовать эту часть кода. Искал в интернете, не могу найти похожего.
0
Даценд
Модератор
Эксперт .NET
4038 / 3877 / 1953
Регистрация: 20.04.2015
Сообщений: 7,042
17.05.2015, 14:13 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ясно. Но это не значит, что и параметрами цикла for должны быть указатели. Думаю, достаточно использовать вместо x[i][j] конструкцию *(*(x+i)+j).
А чтобы исправить ошибку, которая появляется, если число строк не равно числу столбцов, разберитесь, где нужно использовать n, а где m. (По древней традиции m - строки, n - столбцы).
1
craftyperson
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 27
17.05.2015, 23:56  [ТС] #13
Даценд, ок, учту Ваши поправки. спасибо за совет.
0
17.05.2015, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2015, 23:56
Привет! Вот еще темы с ответами:

Определить количество элементов значение которых больше среднего арифметического всех элементов - C++
пределить количество элементов значение которых больше среднего арифметического всех элементов

Найти сумму элементов массива значения которых меньше заданного числа - C++
Дан одномерный массив 6 элементов. Найти сумму элементов массива значения которых меньше 0.25 Массив x-{3.5,-6.3,2.1,0.1,5.1,-2.1}

В массиве определить количество элементов, у которых оба соседних элемента меньше данного - C++
Дан массив, состоящий из целых чисел. Напишите программу, которая в данном массиве определит количество элементов, у которых два соседних...

Найти для каждого массива количество элементов, значение которых меньше среднего между минимальным... - C++
• Для выполнения всех расчетов использовать несколько функций, каждая из которых выполняет отдельную задачу:  ввод данных;  печать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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