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

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

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

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
#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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2016, 12:56
Ответы с готовыми решениями:

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

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

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

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

14
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
09.06.2016, 13:47 2
КсенияФокина, рекурсивная функция - это как-то так;
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  [ТС] 3
а чем она от обычной отлиачется?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
09.06.2016, 15:05 4
КсенияФокина, ну, например.
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  [ТС] 5
В рекурсивную функцию обязательно должно входит условие? т.е. она не может просто при вызове начать выполнять то что прописано в ее теле если не будет условия?
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 09:06 6
КсенияФокина, нет. У рекурсивной функции где-то в теле есть вызов себя же. То есть, обычная функция может просто выполняться, а может вызывать в своём теле какую-то другую функцию, но не себя. У рекурсивной же обязательно должен быть в теле вызов себя, на то она и рекурсивная. Она будет вызывать себя до определённого момента, который мы определим логикой программы, а потом будет возвращаться из всех вызовов. То есть, если наша функция называется, например, rec_func, то рекурсивной она будет тогда и только тогда, когда в её теле есть вызов функции rec_func.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 09:09  [ТС] 7
Я попробовала забить вашу рекурсивную функцию-что бы понять как она работает, поменять в ней что то , но она не работает(( на втором return выдает ошибку..
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 09:14 8
КсенияФокина, странно, у меня всё работало. Какая ошибка, на какую строчку жалуется?

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

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

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

Добавлено через 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  [ТС] 11
Спасибо за помощь. Для начала я решила не забивать 25,28,43 и 45 строчку. Если я правильно понимаю то это выделение памяти и ее удаление. Но без нее после ввода массива выдавало ошибку, о том что память не может быть read, потом я все таки забила эти строчки и теперь на строчке 25 он пишет мне, что time неизвестный идентификатор.
0
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
10.06.2016, 10:06 12
КсенияФокина, попробуйте подключить библиотеку ctime или time.h.
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 12:16  [ТС] 13
Спасибо за помощь. Для начала я решила не забивать 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 14
КсенияФокина, Вы вводите данные после того, как память выделена?
0
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 18
10.06.2016, 15:00  [ТС] 15
Сейчас сделала без выделения памяти, выдает ошибку что память не может быть 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
10.06.2016, 15:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2016, 15:00
Помогаю со студенческими работами здесь

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

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

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

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


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

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