С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
1

Найти среднее арифметическое всех элементов матрицы

14.10.2019, 23:34. Показов 12236. Ответов 14

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Мне нужно написать код, "который находит среднее арифметическое всех элементов матрицы
и сумму элементов тех строк, где есть отрицательный элемент в главной диагонали". Вот сам код я написал, он работает верно, но нужно переделать его с использованием указателей. Я вообще придерживаюсь принципа "Работает? Не трогай!", но всё-таки смог разобраться, как объявлять массив через эти самые указатели. Однако не могу понять, как к элементам обращаться и с ними взаимодействовать. Помогите, пожалуйста
 Комментарий модератора 
П.5.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
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");
    int i, j, n, num;
    double s, sr;
    cout << "\nВведите кол-во строк и столбцов n: ";
    cin >> n;
    double **a = new double *[n];
    for (j = 0; j < n; j++) {
        a[j] = new double[n];
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            cout << "\n Введите a[i][j]: ";
            cin >> a[i][j];
        }
    }
    s = 0; sr = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            sr = sr + a[i][j];
        }
    }
    sr = sr / (n * n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if ((i == j) && (a[i][j] < 0)) {
                num = i;
                for (j = 0; j < n; j++) {
                    s = s + a[num][j];
                }
            }
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            cout.width(3);
            cout << a[i][j];
        }
        cout << "\n";
    }
 
    if (s == 0) { cout << "\n В главной диаонали нет отрицательных элементов."; }
    else { cout << "\n Сумма элементов строки S= " << s; }
    cout << "\n Среднее арифметическое Sr= " << sr;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2019, 23:34
Ответы с готовыми решениями:

Найти среднее арифметическое всех положительных элементов матрицы
Найти среднее арифметическое все положытельных элементов матрицы A.

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

Найти среднее арифметическое Sro всех отрицательных элементов матрицы
Найти среднее арифметическое Sro всех отрицательных элементов матрицы {aij}, где i = j = 1, ..., 4.

Массив: Найти среднее арифметическое из всех положительных элементов этой матрицы
Привет всем) пожалуйста решите пару задач по теме массивы)) очень надо сдать эти задачи) а сроки...

14
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.10.2019, 00:02 2
Antisovenok, то, что сделали Вы - это не двумерный массив.
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 00:04  [ТС] 3
Azazel-San, неожиданно. Ну не двумерный массив, так матрица?..
Не суть. Подскажите лучше, как это переделать через указатели. Буду благодарен.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.10.2019, 00:06 4
Antisovenok, смотря что вы вкладываете в понятие матрицы )
Так что у вас не получается?
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 00:17  [ТС] 5
Azazel-San, у меня не получается переделать код, что я написал -в код, где используется указатель при действиях с элементами массива.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.10.2019, 00:41 6
Antisovenok, главная диагональ есть не только у квадратной матрицы
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    srand((int)time(0));
    int n, m;
    cout << "n="; cin >> n;
    cout << "m="; cin >> m;
    
      double **a = new double*[n], sum, avg=0.0; 
    for (int i = 0; i < n; i++)
       a[i]=new double[m];
    
    for (int i = 0; i < n; i++)
    {
        sum=0.0;
    for (int j = 0; j < m; j++)
    {
    *(*(a+i)+j)=rand()%19 - 9;
    sum+=*(*(a+i)+j);
    cout << setw(2) << *(*(a+i)+j) << " ";
    }
    avg+=sum;
    if (*(*(a+i)+i)<0.0) cout << "  sum=" << sum;
    cout << "\n";
    }
    
    avg=avg/(n*m);
    
    cout << "avg=" << avg << "\n"; 
 
    for (int i = 0; i < n; i++)
    delete[]a[i];
    delete[]a;
    
system("pause");
return 0; 
}
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 00:48  [ТС] 7
Yetty, а, забыл указать, что у меня по условию квадратная матрица.

Добавлено через 1 минуту
Цитата Сообщение от Yetty Посмотреть сообщение
*(*(a+i)+j)=rand()%19 - 9;
Yetty, однако я не понял, что это за "ранд" и %. Что это значит?

Добавлено через 1 минуту
Цитата Сообщение от Yetty Посмотреть сообщение
cout << setw(2) << *(*(a+i)+j) << " ";
Yetty, и что такое сетв2?..
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 00:50 8
Antisovenok, во-первых, ваша программа с ошибкой. В строках 32-34 вы сбиваете переменную цикла j из цикла в строке 29.

Фрагмент (строки 28-37) может выглядеть так:
C++
1
2
3
4
5
6
7
8
9
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if ((i == j) && (a[i][j] < 0)) {
                for (int k = 0; k < n; k++) {
                    s = s + a[i][k];
                }
            }
        }
    }
При этом отпадает необходимость в переменной num.

Но на самом деле, всё ещё проще:
C++
1
2
3
4
5
6
7
    for (i = 0; i < n; i++) {
        if ((a[i][i] < 0)) {
            for (int k = 0; k < n; k++) {
                s = s + a[i][k];
            }
        }
    }
Все элементы главной диагонали имеют равные индексы. Чем грех не воспользоваться.

Во-вторых, вас не учили освобождать память, занятую динамическими массивами?
В конце программы надо написать:
C++
1
2
3
    for (j = 0; j < n; j++)
        delete[] a[j];
    delete[] a;
Цитата Сообщение от Antisovenok Посмотреть сообщение
нужно переделать его с использованием указателей
Я вам подобную манипуляцию с одной программой уже сделал (Указатель в С++ (Я чайник, так что не кусайтесь, пожалуйста)).

Давайте вы как-то поднапряжётесь и сделаете это сами?

В качестве "информации к размышлению" можете принять следующее:

1. В вашем случае, a, типа double** - это указатель на массив указателей на массив double. Т.е. по адресу, хранящемуся в a располагается массив адресов, по которым располагаются массивы строк матрицы. Т.е. a - это массив массивов. (Для иллюстрации посмотрите строки 11-13 вашего кода. А ещё лучше посмотрите под отладчиком как работает этот кусок и где и как будет изменяться содержимое памяти в строках 11-20.)

2. Если double** pa = a, то *p - это адрес начала первой (нулевой) строки матрицы. Соответственно, после p++, *p будет содержать начала второй строки матрицы. И т.д. Т.е. операторы -- и ++ будут перемещать указатель pa по строкам матрицы вверх или вниз.

3. Если double* pra = *pa, то pra - это адрес начала строки матрицы, а *pra - это первый (нулевой) элемент строки матрицы. Соответственно, операторы -- и ++ будут перемещать указатель pra по строке влево или вправо.

4. Ну и наконец классика адресной арифметики: выражение *(*(a + i) + j) эквивалентно выражению a[i][j]. Советую разобраться почему.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.10.2019, 00:51 9
Antisovenok, сразу условие сообщить не получилось ? если квадратная, замените все m на n, ввод только
n оставьте
Цитата Сообщение от Antisovenok Посмотреть сообщение
я не понял, что это за "ранд" и %. Что это значит?
обычное заполнение матрицы случайными (рандомными) числами - чтобы не заполнять матрицу с клавиатуры

setw - выравнивает матрицу при выводе на экран
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 01:11 10
Yetty, кто-то недавно меня укорял в нелояльности к новичкам?

Antisovenok, setw() - это манипулятор из <iomanip>. Устанавливает ширину поля для вывода следующего значения. Следующие фрагменты эквивалентны:
C++
1
2
3
4
cout.width(3);
cout << n;
// и
cout << setw(3) << n;
Описание rand() и, там же, смотрите сразу srand().
1
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 01:19  [ТС] 11
Цитата Сообщение от L0M Посмотреть сообщение
вас не учили освобождать память, занятую динамическими массивами
L0M, так, во-первых, скажу, что меня ничему не учили и похоже, что даже не пытаются. Я тут сижу уже четвертую неделю почти сам учу этот язык, потому что ни на лекциях, ни на практике по информатике в моем ВУЗе либо вообще толком не объясняют, либо, хм, я просто очень глупый, что не могу по презентации понять, как работают те или иные элементы языка. Я, как типичный представитель поколения егэ, учил Паскаль на информатике для того, чтобы, собственно, сдать егэ. А тут внезапно пришлось переучиваться, да ещё и через указатель какой-то, назначение которого вроде и понятно, но У МЕНЯ НЕТ НИКАКИХ ВНЯТНЫХ ПРИМЕРОВ его использования, что вовсе лишает меня возможности понимания работы указателя, ведь теория ничто без практики.

Цитата Сообщение от L0M Посмотреть сообщение
Давайте вы как-то поднапряжётесь и сделаете это сами?
Во-вторых, я и поднапрягся, написал код, но абсолютно не понимаю, как использовать здесь указатель.
За одномерный массив Вам спасибо, в прошлом моём вопросе Вы мне помогли, но двумерный массив - это более сложная структура и пока что все мои попытки тщетны, потому что я просто не понимаю - что, как и зачем.
Именно поэтому я нахожусь на данном форуме. Чтобы от более опытных людей узнать свои ошибки и просто понять что-то новое. В остальном, спасибо Вам за более подробные подпункты, я постараюсь разобраться...

А теперь непосредственно к коду
Цитата Сообщение от L0M Посмотреть сообщение
for (i = 0; i < n; i++) {
* * * * if ((a[i][i] < 0)) {
* * * * * * for (int k = 0; k < n; k++) {
* * * * * * * * s = s + a[i][k];
* * * * * * }
* * * * }
* * }
Все элементы главной диагонали имеют равные индексы. Чем грех не воспользоваться.
Если я правильно понял, то Вы суммируете элементы главной диагонали? Так мне нужна сумма элементов строки, куда входит отрицательный элемент главной диагонали.
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 01:21 12
Кстати, Antisovenok, что бы окончательно порушить ваш мозг, посмотрите Как использовать указатели в двухмерном массиве. Это другой подход к созданию матрицы. Там на С, но для С++ такой подход вполне приемлем. (Если malloc() и free() мозолят глаза, можно переделать на new/delete[] - суть не поменяется. А можно "по-взрослому" завернуть это в класс.)
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 01:26  [ТС] 13
Yetty, понял, спасибо большое, буду дальше учить матчасть. Сложно, блин.

Добавлено через 1 минуту
L0M, боже мой, это что за вундервафля? Я поступил на радиотехнический факультут и профиль у меня - физика. Что происходит и что я тут делаю, а?..
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 02:02 14
Лучший ответ Сообщение было отмечено Antisovenok как решение

Решение

Цитата Сообщение от Antisovenok Посмотреть сообщение
во-первых, скажу, что меня ничему не учили и похоже, что даже не пытаются
Это нормальная ситуация. (Привет Министерству образования!) Привыкайте.
Цитата Сообщение от Antisovenok Посмотреть сообщение
Я тут сижу уже четвертую неделю почти сам учу этот язык
А вот это вы молодец. Потому что другие, посмотрите по темам, желают получить только готовое решение, оставив получение знаний "на потом".
Цитата Сообщение от Antisovenok Посмотреть сообщение
учил Паскаль на информатике для того, чтобы, собственно, сдать егэ. А тут внезапно пришлось переучиваться, да ещё и через указатель какой-то
Классический Паскаль я уже почти совсем не помню. Но даже там есть нечто типа varname^. А в более продвинутых диалектах (Object Pascal, Delphi) - там точно есть.
Цитата Сообщение от Antisovenok Посмотреть сообщение
У МЕНЯ НЕТ НИКАКИХ ВНЯТНЫХ ПРИМЕРОВ
Могу только посоветовать почитать книжки. Например, Керниган, Ритчи Язык программирования С. Помнится там указателям и адресной арифметике уделено достаточно много материала.

В "современном" С++ взят курс на отказ от адресной арифметики. Типа небезопасно. "Использовать только в крайних случаях". Но на самом деле, указатели (суть, адрес в памяти, где лежат данные) и адресная арифметика - одно из базовых понятий программирования. Даже если язык скрывает эти вещи, то в нетривиальных ситуациях будет ещё хуже: придётся лезть в места для того не предназначенные, что бы выяснить почему эта херь неправильно работает. А там дизассемблированный код и, да, адреса в памяти, где лежат данные. Так что лучше с указателями разобраться.

Цитата Сообщение от Antisovenok Посмотреть сообщение
написал код, но абсолютно не понимаю, как использовать здесь указатель
Ну да, я тоже не понимаю зачем. Видимо в учебных целях, что бы вы поняли, что индексная нотация и работа через указатели взаимозаменяемы. Однако индексная нотация гораздо более человекочитаема. А компилятор генерирует одинаковый код для *(*(a + i) + j) и a[i][j].

Цитата Сообщение от Antisovenok Посмотреть сообщение
А теперь непосредственно к коду
Сообщение от L0M
Код
for (i = 0; i < n; i++) {
* * * * if ((a[i][i] < 0)) {
* * * * * * for (int k = 0; k < n; k++) {
* * * * * * * * s = s + a[i][k];
* * * * * * }
* * * * }
* * }
Все элементы главной диагонали имеют равные индексы. Чем грех не воспользоваться.
Если я правильно понял, то Вы суммируете элементы главной диагонали? Так мне нужна сумма элементов строки, куда входит отрицательный элемент главной диагонали.
Неправильно поняли.
Во внешнем цикле я прохожу сразу по элементам главной диагонали. И только по ним. Это гарантирует равенство индексов: a[i][i]. Вложенный цикл (который накапливает сумму элементов в строках матрицы) запускается, если найден отрицательный элемент в главной диагонали.

Добавлено через 12 минут
Цитата Сообщение от Antisovenok Посмотреть сообщение
Я поступил на радиотехнический факультут и профиль у меня - физика. Что происходит и что я тут делаю, а?..
У каждого свои недостатки (с)
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 02:17  [ТС] 15
L0M, ахахаххаха, "у каждого свои недостатки", верно подмечено)
Ладно, спасибо Вам большое за наиболее полный ответ и потраченное на меня время. Книги взял на заметку, продолжу грызть гранит науки, так сказать, ведь хоть и сложно, но на самом деле очень интересно. Добра Вам)
0
15.10.2019, 02:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2019, 02:17
Помогаю со студенческими работами здесь

Массив: Найти среднее арифметическое из всех положительных элементов заданной матрицы.
Найти среднее арифметическое из всех положительных элементов этой матрицы. Получить новую матрицу...

Найти индекс первого элемента, превосходяшего среднее арифметическое всех элементов матрицы
Взаданой матрице Δ(N,N) найти индекс первого элемента превосходяшего среднее арифметическое всех...

Найти сумму всех положительных элементов массива и среднее арифметическое всех элементов
Помогите написать программу: Дан массив A. Найти сумму всех положительных элементов массива и...

Определить среднее арифметическое всех отрицательных элементов матрицы
Для заданной матрицы A(n, m) определить среднее арифметическое всех отрицательных элементов.В...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru