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

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

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

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

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

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

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

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

Кликните здесь для просмотра всего текста
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);
}


Код ещё совсем сырой: нуль считается числом положительным, а также пока не прописала, что делать, если количество положительных и отрицательных элементов равно; функции не выделяла. Потому что возникла небольшая проблема: среднее арифметическое программа вычисляет, а вот при попытке увеличить на него каждый элемент матрицы выдаёт какую-то ересь. Подскажите, пожалуйста, в чём может быть проблема.
Буду также очень благодарна за любую конструктивную критику и полезные советы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2013, 22:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Если число отрицательных элементов матрицы превышает число положительных, увеличить каждый её элемент на величину среднего арифметического её элем-ов (C++):

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

Массив: Напечатать номер каждой строки, в которой второй элемент меньше среднего арифметического элементов этой строки, и число таких строк. - C++
Дана матрица А(m,n). Напечатать номер каждой строки, в которой второй элемент меньше среднего арифметического элементов этой строки,...

Матрицы. Необходимо найти значение среднего арифметического строк матрицы, исключая нулевые, в случае, если строка имеет отрицательный элемент(ы) - C++
Добрый день уважаемые форумчане! На днях возник вопрос, как найти среднее арифметическое строк, исключая нулевые элементы, если там есть...

Подсчитайте число и сумму положительных, число и произдведение отрицательных элементов заданного массива - C++
Подсчитайте число и сумму положительных, число и произдведение отрицательных элементов заданного массива A.

Подсчитать число и сумму положительных, число и произведение отрицательных элементов заданного массива - C++
1. Подсчитать число и сумму положительных, число и произведение отрицательных элементов заданного массива A(N).

Определить число положительных и число отрицательных элементов в массиве - C++
В произвольно заданном одномерном массиве определить число положительных и число отрицательных элементов. Сформировать новый массив из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
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
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
30.05.2013, 00:08  [ТС] #3
Эмм, ругается на вторую строчку Вашего кода: "Declaration syntax error".
Скорее всего, где-то напортачила я.

Не по теме:

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

eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
30.05.2013, 18:07 #4
Dev c++ компилирует. Видимо в вашей IDE свои строгие условия на объявление функций. Просто исправьте эту синтаксическую ошибку.
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
30.05.2013, 21:26  [ТС] #5
Цитата Сообщение от eocron Посмотреть сообщение
в вашей IDE свои строгие условия на объявление функций
У меня борландовский Билдер... Какие, по Вашему мнению, там могут быть дополнительные условия (дабы мне знать, что конкретно править)? Перечитала ещё раз своё пособие по языку, перепроверила код - странно, вроде ничего криминального. Может, мне стоит в какой-то другой среде попробовать? Хотя бы и в Dev С++...
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
30.05.2013, 22:08 #6
Возможно была забыта скобка. Советую выложить исходник, чем гадать.
Locust
1 / 1 / 0
Регистрация: 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");
      }
Жалуется на скобку, с которой тело функции начинается.

Не по теме:

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

eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
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();
}
Locust
1 / 1 / 0
Регистрация: 09.11.2012
Сообщений: 82
31.05.2013, 20:27  [ТС] #9
Ну не весь, естессно. Просто выложила значимый, по моему мнению, его кусок.

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

Спасибо за Ваш вариант кода, правда, сейчас пишу на бегу - нет времени ни опробовать его, ни подкорректировать собственный.
Locust
1 / 1 / 0
Регистрация: 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);
}
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
06.06.2013, 23:35 #11
Вы в 10-ой строке определяете переменные n,m. Ошибка состоит в том, что в них лежит мусор, вы им ничего не присваиваете. Решение: дописать "n = N; m = M;"

Не понятно зачем вам вообще понадобилось определять новые переменные, чем вас не устраивали входные аргументы N и M?
Так же в C++ принято использовать "cin>>n;" вместо "scanf("%d",&n);".
Locust
1 / 1 / 0
Регистрация: 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);
}


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

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

Вывести на экран номера столбцов матрицы, сумма которых превышает заданную величину, и число таких столбцов - C++
Всем привет!:) Прошу помощи в написании программы, а точнее доведении ее до ума. Условие следующее: Для матрицы из 3 строк и 7 столбцов...

Из всех положительных элементов вычесть элемент с номером k1, из всех отрицательных — число N - C++
Дан массив вещественных чисел: Из всех. положительных элементов вычесть элемент с номером k1, из всех отрицательных — число N. Нулевые...

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

Из всех положительных элементов массива вычесть элемент с номером k[l], из всех отрицательных - число n - C++
Дан массив вещественных чисел из всех положительных элементов вычесть элемент с номером k, из всех отрицательных — число п. Нулевые...


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

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

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