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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Мне нужно написать код, "который находит среднее арифметическое всех элементов матрицы
и сумму элементов тех строк, где есть отрицательный элемент в главной диагонали". Вот сам код я написал, он работает верно, но нужно переделать его с использованием указателей. Я вообще придерживаюсь принципа "Работает? Не трогай!", но всё-таки смог разобраться, как объявлять массив через эти самые указатели. Однако не могу понять, как к элементам обращаться и с ними взаимодействовать. Помогите, пожалуйста
 Комментарий модератора 
П.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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2019, 23:34
Ответы с готовыми решениями:

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

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

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

14
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.10.2019, 00:02
Antisovenok, то, что сделали Вы - это не двумерный массив.
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 00:04  [ТС]
Azazel-San, неожиданно. Ну не двумерный массив, так матрица?..
Не суть. Подскажите лучше, как это переделать через указатели. Буду благодарен.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
15.10.2019, 00:06
Antisovenok, смотря что вы вкладываете в понятие матрицы )
Так что у вас не получается?
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 00:17  [ТС]
Azazel-San, у меня не получается переделать код, что я написал -в код, где используется указатель при действиях с элементами массива.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.10.2019, 00:41
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  [ТС]
Yetty, а, забыл указать, что у меня по условию квадратная матрица.

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

Добавлено через 1 минуту
Цитата Сообщение от Yetty Посмотреть сообщение
cout << setw(2) << *(*(a+i)+j) << " ";
Yetty, и что такое сетв2?..
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 00:50
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
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.10.2019, 00:51
Antisovenok, сразу условие сообщить не получилось ? если квадратная, замените все m на n, ввод только
n оставьте
Цитата Сообщение от Antisovenok Посмотреть сообщение
я не понял, что это за "ранд" и %. Что это значит?
обычное заполнение матрицы случайными (рандомными) числами - чтобы не заполнять матрицу с клавиатуры

setw - выравнивает матрицу при выводе на экран
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 01:11
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  [ТС]
Цитата Сообщение от 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
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
15.10.2019, 01:21
Кстати, Antisovenok, что бы окончательно порушить ваш мозг, посмотрите Как использовать указатели в двухмерном массиве. Это другой подход к созданию матрицы. Там на С, но для С++ такой подход вполне приемлем. (Если malloc() и free() мозолят глаза, можно переделать на new/delete[] - суть не поменяется. А можно "по-взрослому" завернуть это в класс.)
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 01:26  [ТС]
Yetty, понял, спасибо большое, буду дальше учить матчасть. Сложно, блин.

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

Решение

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

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

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

Цитата Сообщение от Antisovenok Посмотреть сообщение
А теперь непосредственно к коду
Сообщение от L0M
Code
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];
* * * * * * }
* * * * }
* * }
Все элементы главной диагонали имеют равные индексы. Чем грех не воспользоваться.
Если я правильно понял, то Вы суммируете элементы главной диагонали? Так мне нужна сумма элементов строки, куда входит отрицательный элемент главной диагонали.
Неправильно поняли.
Во внешнем цикле я прохожу сразу по элементам главной диагонали. И только по ним. Это гарантирует равенство индексов: a[i][i]. Вложенный цикл (который накапливает сумму элементов в строках матрицы) запускается, если найден отрицательный элемент в главной диагонали.

Добавлено через 12 минут
Цитата Сообщение от Antisovenok Посмотреть сообщение
Я поступил на радиотехнический факультут и профиль у меня - физика. Что происходит и что я тут делаю, а?..
У каждого свои недостатки (с)
0
1 / 1 / 0
Регистрация: 14.10.2019
Сообщений: 31
15.10.2019, 02:17  [ТС]
L0M, ахахаххаха, "у каждого свои недостатки", верно подмечено)
Ладно, спасибо Вам большое за наиболее полный ответ и потраченное на меня время. Книги взял на заметку, продолжу грызть гранит науки, так сказать, ведь хоть и сложно, но на самом деле очень интересно. Добра Вам)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2019, 02:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru