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

Рекурсивная функция, определяющая сумму элементов главной диагонали матрицы

09.06.2016, 12:56. Показов 2824. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня. Есть задание на лр-написать рекурсивную функцию, определяющую сумму элементов, лежащих на главной диагонали квадратной матрицы. Я написала программу, но в строчке вызова функции она выводит ошибку. Пожалуйста посоветуйте что исправить и вообще функция что я написала является рекурсивной? Прочитав в учебнике Т.А. Павловской где написан об этих функциях один абзац мне не совсем понятно. Т.е. Рекурсивная функция это функция которая вызывает саму себя, ну так и обычная функция вызывает саму себя, чего то я запуталась, если не трудно объясните на пальцах их различие. Заранее спасибо!
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
#include <iostream>
#include <stdlib.h>
using namespace std;
int fun(int a[5][5])
{
    int Massiv [5][5],i,j,sum=0;
for (i=0; i<5;i++)
        for (j=0; j<5;j++)
sum=Massiv[0][0]+Massiv[1][1]+Massiv[2][2]+Massiv[3][3]+Massiv[4][4]+Massiv[5][5];
cout<<sum;
        return sum;
}
int main ()
{
    int i,j,Massiv[5][5];
    cout<<"vvedite 9 elementov masssiva cherez probel\n";
        for (i=0; i<5;i++)
        for (j=0; j<5;j++)
        cin>> Massiv [i][j];
        cout <<"Ishodnii massiv\n";
        cout<<" \n";
for (i=0; i<5;i++)
{
    for (j=0; j<5;j++)
    cout <<Massiv [i][j]<<"\t";
        cout <<" \n";
cout <<" \n";
}
{
fun (Massiv[5][5]);
}
 return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2016, 12:56
Ответы с готовыми решениями:

Найти сумму элементов матрицы, расположенных выше главной диагонали и ниже побочной диагонали
не соображу В среде MS Visual C++ разработать программу, которая формирует матрицу размером n х n (значение n вводится с клавиатуры) и...

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

Найти сумму всех элементов главной диагонали матрицы, и сумму всех отрицательных элементов побочной диагонали
15. Найти сумму всех элементов главной диагонали матрицы P(10*10) и сумму всех отрицательных элементов побочной диагонали.

14
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
09.06.2016, 13:47
КсенияФокина, рекурсивная функция - это как-то так;
C++
1
2
3
4
5
6
7
rec_func(int a)
{
    int b;
    //Какой-то код
    rec_func(b);
    //Какой-то код
}
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
09.06.2016, 14:26  [ТС]
а чем она от обычной отлиачется?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
09.06.2016, 15:05
КсенияФокина, ну, например.
C++
1
2
3
4
5
6
7
8
9
int normal_func(int *a, int len)
{
    int sum = 0;
    for (int i = 0; i < len; ++i)
    {
        sum += a[i];
    }
    return sum;
}
Это обычная функция, она просто в цикле посчитает значение суммы и вернёт его.

C++
1
2
3
4
5
6
7
int rec_func(int pos, int *a, int len)
{
    if (pos == len)
        return 0;
    else
        return a[pos] + rec_func(pos + 1, a, len);
}
Это рекурсивная функция. Она вызовется и посмотрит, на какой позиции находится. Увидит, что в начале, поэтому вызовет себя же, но уже с позицией на один больше. Так она будет себя вызывать, пока не обнаружит, что дошла до конца, после чего вернёт 0. После этого программа перейдёт в предпоследний вызов, потом выполнит сложение и перейдёт в предпредпоследний вызов и так далее.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 09:01  [ТС]
В рекурсивную функцию обязательно должно входит условие? т.е. она не может просто при вызове начать выполнять то что прописано в ее теле если не будет условия?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 09:06
КсенияФокина, нет. У рекурсивной функции где-то в теле есть вызов себя же. То есть, обычная функция может просто выполняться, а может вызывать в своём теле какую-то другую функцию, но не себя. У рекурсивной же обязательно должен быть в теле вызов себя, на то она и рекурсивная. Она будет вызывать себя до определённого момента, который мы определим логикой программы, а потом будет возвращаться из всех вызовов. То есть, если наша функция называется, например, rec_func, то рекурсивной она будет тогда и только тогда, когда в её теле есть вызов функции rec_func.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 09:09  [ТС]
Я попробовала забить вашу рекурсивную функцию-что бы понять как она работает, поменять в ней что то , но она не работает(( на втором return выдает ошибку..
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 09:14
КсенияФокина, странно, у меня всё работало. Какая ошибка, на какую строчку жалуется?

Добавлено через 3 минуты
КсенияФокина, у меня и сейчас всё работает. Если что, это не решение вашей задачи, я написал для одномерного массива просто как пример, а не для диагонали матрицы.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 09:36  [ТС]
Вот так понятнее, теперь осталось только реализовать это на практике)

Добавлено через 6 минут
Нет ругаться перестала) теперь она работает но вызов функции не происходит, я в конце программы просто написала fun, понимаю что еще параметры нужно в скобках прописать, но что именно за параметры, до меня никак не дойдет)

Добавлено через 1 минуту
Я понимаю что это не решение) Но мне хоть понять, вот еще вопрос возник а зачем объявлять параметр а типом int*-это как указатель?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 09:39
КсенияФокина, в с++ массивы реализуются указателем на первый элемент массива, а в квадратных скобках мы показываем, насколько далеко надо от него отступить, так мы и получаем доступ к другим элементам.

Добавлено через 41 секунду
А вот Ваша программа, тут и обычной функцией сумма подсчитывается, и рекурсивной.
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
#include <iostream>
 
using namespace std;
 
int normal_diag_sum(int **a, int len)
{
    int sum = 0;
    for (int i = 0; i < len; ++i)
    {
        sum += a[i][i];
    }
    return sum;
}
 
int rec_dial_sum(int pos, int **a, int len)
{
    if (pos == len - 1)
        return a[len - 1][len - 1];
    else
        return a[pos][pos] + rec_dial_sum(pos + 1, a, len); //Вот из-за этой строчки функция и будет рекурсивная: она вызывает себя же.
}
 
int main()
{
    srand(time(0)); //Для корректной генерации случайных чисел.
    int len = 5;
    int **a; //Объявление двумерного массива
    a = new int*[len]; //Выделение памяти для строк
    for (int i = 0; i < len; ++i)
    {
        a[i] = new int[len]; //Выделение памяти для столбца
        for (int j = 0; j < len; ++j)
        {
            a[i][j] = rand() % 10; //Присвоение элементу случайного значения
            cout << a[i][j] << " "; //Вывод
        }
        cout << endl;
    }
    cout << "By normal func: " << normal_diag_sum(a, len) << endl;
    cout << "by recursive func: " << rec_dial_sum(0, a, len) << endl;
    for (int i = 0; i < len; ++i)
    {
        delete[] a[i]; //Освобождение памяти столбцов
    }
    delete[] a; //Освобождение памяти строк
    return 0;
}
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 09:59  [ТС]
Спасибо за помощь. Для начала я решила не забивать 25,28,43 и 45 строчку. Если я правильно понимаю то это выделение памяти и ее удаление. Но без нее после ввода массива выдавало ошибку, о том что память не может быть read, потом я все таки забила эти строчки и теперь на строчке 25 он пишет мне, что time неизвестный идентификатор.
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 10:06
КсенияФокина, попробуйте подключить библиотеку ctime или time.h.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 12:16  [ТС]
Спасибо за помощь. Для начала я решила не забивать 25,28,43 и 45 строчку. Если я правильно понимаю то это выделение памяти и ее удаление. Но без нее после ввода массива выдавало ошибку, о том что память не может быть read, потом я все таки забила эти строчки и теперь на строчке 25 он пишет мне, что time неизвестный идентификатор.

Добавлено через 7 минут
Добавила #include <time.h> программа компилируеться, но после того как я забиваю массив выводит ошибку что память не может быть written
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 12:20
КсенияФокина, Вы вводите данные после того, как память выделена?
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 15:00  [ТС]
Сейчас сделала без выделения памяти, выдает ошибку что память не может быть read, еще до того как начинаю забивать массив, то есть ctrl+f5 и сразу вылазиет окошко с ошибкой..
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
#include <iostream>
#include <stdlib.h>
using namespace std;
int rec_diag_sum (int pos,int **a, int len)
{
if (pos==len-1)
return a [len-1][len-1];
else
return a[pos][pos] +rec_diag_sum(pos + 1, a, len);
}
int main ()
{
    int len=5;
        int **a;
    cout<<"vvedite 25 elementov masssiva cherez probel\n";
        for (int i=0; i<len;++i)
        for (int j=0; j<len;++j)
        cin>> a[i][j];
        cout <<"Ishodnii massiv\n";
        cout<<" \n";
for (i=0; i<len;++i)
{
    for ( int j=0; j<len;++j)
    cout << a[i][j]<<"\t";
        cout <<" \n";
cout <<" \n";
}
    cout<<"diagonal"<<rec_diag_sum (0,a,len);
for (i=0; i<len;++i);
 return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.06.2016, 15:00
Помогаю со студенческими работами здесь

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

Вычислить сумму элементов матрицы над главной диагональю под главной диагональю и на главной диагонали
Даны матрицы А(4,3) и В(3,5). Для каждой матрицы вычислить сумму элементов над главной диагональю под главной диагональю и на главной...

Найти сумму элементов главной диагонали матрицы
Нужно сделать простую работу по с++. Найти сумму элементов главной диагонали матрицы, только чтобы числа вводились с клавиатуры. Заранее...

Найти сумму элементов главной диагонали матрицы
Реализуйте с помощью цикла while подсчет суммы элементов главной диагонали после вывода заполненного массива в виде таблицы. И 2 варианта...

Найти сумму элементов главной диагонали матрицы
Дана матрица действительных чисел размера n×m. Если элементы матрицы упорядочены по убыванию, найти сумму элементов главной диагонали...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru