1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
1

Если число отрицательных элементов матрицы превышает число положительных, увеличить каждый её элемент на величину среднего арифметического её элем-ов

29.05.2013, 22:53. Показов 2693. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Вот задание: Если число отрицательных элементов матрицы превышает число положительных, увеличить каждый её элемент на величину среднего арифметического её элементов. Выделить функции для ввода/вывода массивов и решения задачи.

Задание, по сути, пустячное, но я совсем недавно начала изучать С++, поэтому многого не понимаю. К задаче этой накорябала вот что:

Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
int main()
{
 unsigned int n,m;
 std::cout<<"Please input the number of lines: ";
 scanf("%d", &n);
 std::cout<<"Please input the number of columns: ";
 scanf("%d", &m);
 const size_t N = 10;
 const size_t M = 10;
 
 std::cout<<"Please input some elements: \n";
 int matrix[N][M];
 for (int i = 0; i < n; i++)
     for (int j = 0; j < m ; j++)
         scanf("%d", &matrix[i][j]);
         
 std::cout<<"\n";
 std::cout<<"Here is your array: \n";
 for(int i=0; i<n; i++)
 {
  for(int j=0; j<m; j++)
  printf("%4d", matrix[i][j]);
  printf("\n");
  }
 
 unsigned int pos=0,neg=0;
 for(int i=0; i<n; i++)
 {
 for(int j=0; j<m; j++)
 if (matrix[i][j]<0) {neg++;}
 else {pos++;}
 }
 
 int sum=0;
 for(int i=0; i<n; i++)
 {
 for(int j=0; j<m; j++)
 sum=sum+matrix[i][j];
 }
 float mean=sum/n/m;
 
 std::cout<<"\n";
 if (neg>pos)
 {
 for(int i=0; i<n; i++)
 {
 for(int j=0; j<m; j++)
 matrix[i][j]=matrix[i][j]+mean;
 }
 std::cout<<"Number of negative elements in the array is greater than number of the positive ones. Let us change our array: \n";
 for(int i=0; i<n; i++)
 {
  for(int j=0; j<m; j++)
  printf("%10d", matrix[i][j]);
  printf("\n");
  }
 }
 else {std::cout<<"Number of positive elements in the array is greater than number of the negative ones.\n";}
 
  system("pause");
  return(0);
}


Код ещё совсем сырой: нуль считается числом положительным, а также пока не прописала, что делать, если количество положительных и отрицательных элементов равно; функции не выделяла. Потому что возникла небольшая проблема: среднее арифметическое программа вычисляет, а вот при попытке увеличить на него каждый элемент матрицы выдаёт какую-то ересь. Подскажите, пожалуйста, в чём может быть проблема.
Буду также очень благодарна за любую конструктивную критику и полезные советы.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2013, 22:53
Ответы с готовыми решениями:

Если сумма положительных элементов матрицы превышает абсолютную величину суммы отрицательных, увеличить на значение каждый элемент
Разработать алгоритм и программу нисходящим способом, предполагая матрицу А из 5 строк и 5 столбцов...

Увеличить каждый элемент матрицы А на величину среднего арифметического всех ее элементов
Если число отрицательных элементов матрицы А(5х5) превышает число положительных, то увеличить...

Подсчитать число элементов матрицы, значения которых меньше среднего арифметического значений элементов матриц
Дана прямоугольная матрица А(n * m). Подсчитать число элементов матрицы, значения которых меньше...

Если отрицательных элементов матрицы больше, чем положительных, увеличить элементы на среднее арифметическое
Задание. матрица 5 на 5 Если число отрицательных элементов матрицы превышает число...

13
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
29.05.2013, 23:15 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
void task(int **mass,unsigned int N, unsigned int M)
{
     int count = 0; //бинаправленный счетчик ([+] [+] и [-] [-]  = 0; [+] и [-] [-] [-] = -2; [+] [+] [+] [+] [+] и [-] = 4)
     int sum = 0;   //сумма
     for(unsigned int i = 0; i < N;i++)
     {
         for(unsigned int j = 0; j < M;j++)
         {
              if(mass[i][j]<0){ count--; }
              else{ count++; }
              sum+=mass[i][j];
         }
     }
     sum /= M*N ;
     if(count < 0)
     {
         for(unsigned int i = 0; i < N;i++)
         {
             for(unsigned int j = 0; j < M;j++)
             {
                  mass[i][j]+=sum;
             }
         }
     }
}
На вход подаешь массив mass размера M на N
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
30.05.2013, 00:08  [ТС] 3
Эмм, ругается на вторую строчку Вашего кода: "Declaration syntax error".
Скорее всего, где-то напортачила я.

Не по теме:

Про счётчик идея просто шикарная, просто до гениальности, спасибо. Никогда раньше с таким не сталкивалась, позаимствую.

0
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
30.05.2013, 18:07 4
Dev c++ компилирует. Видимо в вашей IDE свои строгие условия на объявление функций. Просто исправьте эту синтаксическую ошибку.
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
30.05.2013, 21:26  [ТС] 5
Цитата Сообщение от eocron Посмотреть сообщение
в вашей IDE свои строгие условия на объявление функций
У меня борландовский Билдер... Какие, по Вашему мнению, там могут быть дополнительные условия (дабы мне знать, что конкретно править)? Перечитала ещё раз своё пособие по языку, перепроверила код - странно, вроде ничего криминального. Может, мне стоит в какой-то другой среде попробовать? Хотя бы и в Dev С++...
0
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
30.05.2013, 22:08 6
Возможно была забыта скобка. Советую выложить исходник, чем гадать.
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
30.05.2013, 23:04  [ТС] 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
 void task(int **mass,unsigned int N, unsigned int M)
{ 
     int count = 0;
     int sum = 0;
     for(unsigned int i = 0; i < N;i++)
     {
         for(unsigned int j = 0; j < M;j++)
         {
              if(mass[i][j]<0){ count--; }
              else{ count++; }
              sum+=mass[i][j];
         }
     }
     sum /= M*N ;
     if(count < 0)
     {
         for(unsigned int i = 0; i < N;i++)
         {
             for(unsigned int j = 0; j < M;j++)
             {
                  mass[i][j]+=sum;
             }
         }
 
 
     }
}
 
 task(matrix, n,m);
  for(int i=0; i<n; i++)
     {
      for(int j=0; j<m; j++)
              printf("%10d", matrix[i][j]);
              printf("\n");
      }
Жалуется на скобку, с которой тело функции начинается.

Не по теме:

Если обнаружите какие-то дикие ошибки, пожалуйста, сделайте скидку на дилетантство.

0
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
31.05.2013, 10:38 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
 
 
void task(int **mass,unsigned int N, unsigned int M)
{ 
     int count = 0;
     int sum = 0;
     for(unsigned int i = 0; i < N;i++)
     {
         for(unsigned int j = 0; j < M;j++)
         {
              if(mass[i][j]<0){ count--; }
              else{ count++; }
              sum+=mass[i][j];
         }
     }
 
     sum = sum/(int)(M*N) ;
 
     if(count < 0)
     {
         for(unsigned int i = 0; i < N;i++)
         {
             for(unsigned int j = 0; j < M;j++)
             {
                  mass[i][j]+=sum;
             }
         }
 
 
     }
}
 
void print(int **mass,unsigned int N, unsigned int M)
{
     for(unsigned int i = 0; i < N;i++)
     {
         for(unsigned int j = 0; j < M;j++)
         {
              cout<<mass[i][j]<<'\t';
         }
         cout<<'\n';
     }
}
 
int main()
{
    int **M=new int*[3];
    for(int i=0;i<4;i++)
    {
            M[i]=new int[4];
    }
    
    srand(time(0));            
    for(unsigned int i = 0; i < 3;i++)
    {
         for(unsigned int j = 0; j < 4;j++)
         {
              M[i][j] = rand()%200 - 100;
         }
    }
          
    print(M,3,4);
    cout<<"_______________________"<<endl;      
    task(M,3,4);
    print(M,3,4);
    cin.get();
}
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
31.05.2013, 20:27  [ТС] 9
Ну не весь, естессно. Просто выложила значимый, по моему мнению, его кусок.

Сегодня утром поняла, на что ругается компилятор: просит ставить точку с запятой после объявления функции. Исправила - снова начал на что-то жаловаться.

Спасибо за Ваш вариант кода, правда, сейчас пишу на бегу - нет времени ни опробовать его, ни подкорректировать собственный.
0
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
06.06.2013, 23:00  [ТС] 10
Кое-что переделала, но в 16 строке - выход за пределы массива, не знаю, как исправить.

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
#include <iostream>
 
 
using namespace std;
 
void task(int **mass,unsigned int N, unsigned int M)
{
int count = 0;
int sum = 0;
unsigned int n,m;
 
for(unsigned int i = 0; i < n;i++)
{
    for(unsigned int j = 0; j < m;j++)
    {
    if(mass[i][j]<0){ count--; }
    else{ count++; }
    sum+=mass[i][j];
    }
}
 
sum /= m*n ;
if(count < 0)
{
    for(unsigned int i = 0; i < n;i++)
    {
        for(unsigned int j = 0; j < m;j++)
        {
        mass[i][j]+=sum;
        }
    }
}
}
 
int main()
{
 unsigned int n,m;
 std::cout<<"Please input the number of lines: ";
 scanf("%d", &n);
 std::cout<<"Please input the number of columns: ";
 scanf("%d", &m);
 
 std::cout<<"Please input some elements: \n";
 
 int **matrix=new int*[n];
 for (unsigned int i = 0; i < n; i++) matrix[i] = new int[m];
 
 for (unsigned int i = 0; i < n; i++)
 
     for (unsigned int j = 0; j < m ; j++)
         scanf("%d", &matrix[i][j]);
 
 std::cout<<"\n";
 std::cout<<"Here is your array: \n";
 for(unsigned int i=0; i<n; i++)
 {
  for(unsigned int j=0; j<m; j++)
  printf("%4d ", matrix[i][j]);
  printf("\n");
  }
 
 
 
 
 task(matrix, n,m);
 
 std::cout<<"\n";
 std::cout<<"The task is done: \n";
 
 for(unsigned int i=0; i<n; i++)
 {
      for(unsigned int j=0; j<m; j++)
              printf("%10d", matrix[i][j]);
              printf("\n");
 }
 system("pause");
 return(0);
}
0
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
06.06.2013, 23:35 11
Вы в 10-ой строке определяете переменные n,m. Ошибка состоит в том, что в них лежит мусор, вы им ничего не присваиваете. Решение: дописать "n = N; m = M;"

Не понятно зачем вам вообще понадобилось определять новые переменные, чем вас не устраивали входные аргументы N и M?
Так же в C++ принято использовать "cin>>n;" вместо "scanf("%d",&n);".
1
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
07.06.2013, 00:27  [ТС] 12
Цитата Сообщение от eocron Посмотреть сообщение
зачем вам вообще понадобилось определять новые переменные
- я лопух, решаю все задачи методом научного тыка.
Цитата Сообщение от eocron Посмотреть сообщение
Так же в C++ принято использовать "cin>>n;" вместо "scanf("%d",&n);".
- а это принципиально в данном конкретном случае? Или банально запись проще (что само по себе уже является аргументом). Мне на будущее, чтобы в следующий раз понимать, что делаю.

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
 
using namespace std;
 
void task(int **mass,unsigned int N, unsigned int M)
{
int count = 0;
int sum = 0;
 
for(unsigned int i = 0; i < N;i++)
{
    for(unsigned int j = 0; j < M;j++)
    {
    if(mass[i][j]<0){ count--; }
    else{ count++; }
    sum+=mass[i][j];
    }
}
 
sum /= M*N;
if(count < 0)
{
    for(unsigned int i = 0; i < N;i++)
    {
        for(unsigned int j = 0; j < M;j++)
        {
        mass[i][j]+=sum;
        }
    }
    std::cout<<"The matrix has been changed:\n";
}
}
 
int main()
{
 unsigned int n,m;
 std::cout<<"Please input the number of lines: ";
 scanf("%d", &n);
 std::cout<<"Please input the number of columns: ";
 scanf("%d", &m);
 
 std::cout<<"Please input some elements: \n";
 
 int **matrix=new int*[n];
 for (unsigned int i = 0; i < n; i++) matrix[i] = new int[m];
 
 for (unsigned int i = 0; i < n; i++)
 
     for (unsigned int j = 0; j < m ; j++)
         scanf("%d", &matrix[i][j]);
 
 std::cout<<"\n";
 std::cout<<"Here is your array: \n";
 for(unsigned int i=0; i<n; i++)
 {
  for(unsigned int j=0; j<m; j++)
  printf("%4d ", matrix[i][j]);
  printf("\n");
  }
 
 task(matrix, n,m);
 
 std::cout<<"\n";
 std::cout<<"The task is done: \n";
 
 for(unsigned int i=0; i<n; i++)
 {
      for(unsigned int j=0; j<m; j++)
              printf("%10d", matrix[i][j]);
              printf("\n");
 }
 system("pause");
 return(0);
}


Гляньте на скриншот, пожалуйста - где я снова напортачила?
Миниатюры
Если число отрицательных элементов матрицы превышает число положительных, увеличить каждый её элемент на величину среднего арифметического её элем-ов  
0
Кактус
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
07.06.2013, 10:17 13
C++
1
sum = sum / (int)(N*M) ;
исправьте вот так.

Почему использовать cin? Потому что он элементарно удобнее, он более абстрактный и вам не нужно знать тип и что вбивать в scanf(). С проблемами scanf можно познакомится при работе unsigned long long int, Где начинаются танцы с бубнами. В cin такого нет. К тому же cin позволяет избежать некоторых противных ошибок переполнения буффера, совместимости, а так же сократить размер кода в некоторых местах путем перегрузки оператора >> (чаще всего очень существенно).
1
1 / 1 / 1
Регистрация: 09.11.2012
Сообщений: 82
07.06.2013, 19:01  [ТС] 14
Спасибо. В принципе, проблему решила утром "самотужки", опять же методом научного тыка. Не так, как Вы предложили, но тоже работает.
0
07.06.2013, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2013, 19:01
Помогаю со студенческими работами здесь

Матрицы. Подсчитать число столбцов, среднее арифметическое элементов которых меньше среднего арифметического всех элементов
В матрице А(6,6) подсчитать число столбцов, среднее арифметическое элементов которых меньше...

В масиве а(10) определить число элементов меньших 5, и число элементов , больше среднего арифметического
В масиве а1,а2,а3...а10 определить число элементов меньших 5, и число элементов , больше среднего...

Массив: подсчитать число столбцов, среднее арифметическое элементов которых меньше среднего арифметического всех элементов матрицы.
В матрице A(6, 6) подсчитать число столбцов, среднее арифметическое элементов которых меньше...

В матрице найти число элементов главной диагонали, меньших среднего арифметического всей матрицы
всем привет. учусь на программиста. 1 курс. помогите, пожалуйста, решить задачи. я сам пытаюсь,...

Найти номера тех столбцов матрицы, сумма элементов которых превышает заданную величину, и число таких столбцов
Для матрицы из 3 строк и 7 столбцов отпечатать номератех слобцов, сумма элементов которых превышает...

Найти число отрицательных, число нулевых и число положительных элементов массива
Я далека от программирования. Учусь вообще на фил.факе и на последнем году учебы нам преподнесли...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru