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

Что не так с рекурсией

08.06.2020, 21:04. Показов 3212. Ответов 8

Студворк — интернет-сервис помощи студентам
Ругается на строку
C++
1
output(a, x, recY(x));
Полный текст программы:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <conio.h>
#include <locale.h> 
#define n 5
using namespace std;
 
void input_kl(int a[n][n])
{
    printf("Введите элементы матрицы A:\n");
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
}
 
void input_f(int a[n][n])
{
    int i, j, k;
    FILE* fp;
    fp = fopen("C:\\Users\\Admin\\Desktop\\inp.txt", "r");
    k = 0;
    for (i = 0; i < n && !feof(fp); i++)
    {
        for (j = 0; j < n && !feof(fp); j++)
        {
            fscanf(fp, "%d", &a[i][j]);
            k++;
        }
    }
    fclose(fp);
    if (k < n * n)
    {
        //k=n*n-k;
        printf("matrica nepolnaja, wwedite %d elementa \n", n * n - k);
        for (i = k; i < n; i++)
            for (j = j; j < n; j++)
                scanf("%d", &a[i][j]);
    }
}
 
//
// пример обработки матрицы
//
int* arrayX(int(*a)[n], int* x, void (*pfunc)(int[n][n]))
{
    pfunc(a);
    for (int i = 0; i < n; ++i)
    {
        x[i] = 0;
        for (int j = 0; j < n; ++j)
        {
            if (a[i][j] < 0)             //  Исправление только здесь
            {                           //  Исправление только здесь
                x[i] = a[i][j];   //  Исправление только здесь
                break;                //  Исправление только здесь 
            }                           //  Исправление только здесь
        }
    }
    return x;
}
 
void recY(int x[], int* array, int arraySize, int& y, int position = 0)
{
    if (position == arraySize) {
        y = -1;
        return;
    }
    if (*(array + position) < 0) {
        y = *(array + position);
        return;
    }
    recY(x, array, arraySize, y, ++position);
}
 
void output(int a[n][n], int* x, int y)
{
    FILE* fp;
    fp = fopen("C:\\Users\\Admin\\Desktop\\inp.txt", "w");
    fprintf(fp, "Матрица A:\n");
    printf("Mатрица A:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
            fprintf(fp, "%d ", a[i][j]);
        }
        printf("\n");
        fprintf(fp, "\n");
    }
    fprintf(fp, "Massiv X:\n");
    printf("Massiv X:\n");
    for (int i = 0; i < n; i++)
    {
        fprintf(fp, "%d ", x[i]);
        printf("%d ", x[i]);
    }
    fclose(fp);
}
 
int main()
{
   setlocale( LC_ALL, "Rus" ); 
   int a[n][n], x[n], c;
   void (*pfunc)(int[n][n]);
       do
       {
           printf("Vvod matrici A:\n1-s klaviaturi\n2-iz faila\n");
                scanf("%d",&c);
       }
           
   while (c != 1 && c != 2);
   // Присваивание указателю адреса одной их функций:
   switch (c)
   {
   case 1: pfunc = &input_kl;
       break;
   case 2: pfunc = &input_f;
       break;
   }
   arrayX(a, x, pfunc);
   output(a, x, recY(x));
   int y;
   std::cout << "Y : " << y << '\n';
   return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.06.2020, 21:04
Ответы с готовыми решениями:

Подскажите что с рекурсией не так
помогите пожалуйста дописать программу условие вычислить используя рекурсию sqrt(8-sqrt(8+sqrt(8-sqrt(8-sqrt(8+ ... знаки перед...

Что не так с кодом? ( пытаюсь понять, что не так? )
Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е...

Пример, подтверждающий что не любую итерацию можно заменить рекурсией
Как известно(по некоторым источникам :) ) любую рекурсию можно представить в виде цикла, но не наоборот. Так вот, надо придумать пример,...

8
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
08.06.2020, 21:11
вот как объявлено для компилятора выглядит output
Цитата Сообщение от konfetti Посмотреть сообщение
void output(int[][], int*, int)

Цитата Сообщение от konfetti Посмотреть сообщение
output(a, x, recY(x));
а это выражение (где вы его вызываете) выглядит вот так
(int[][], int*), поскольку recY это функция которая не возвращает значений, вот и "too few arguments in function call"
1
0 / 1 / 0
Регистрация: 17.12.2019
Сообщений: 131
08.06.2020, 21:20  [ТС]
как это правильно исправить?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,243
08.06.2020, 22:06
Цитата Сообщение от AndryS1 Посмотреть сообщение
вот как объявлено для компилятора выглядит output
void output(int[][], int*, int)
Нет, в С++ нет никакого [][]. output объявлено как

C++
1
void output(int (*)[n], int *, int)
Добавлено через 2 минуты
Цитата Сообщение от konfetti Посмотреть сообщение
как это правильно исправить?
Это у вас надо спрашивать. Зачем вы запихали выражение типа void туда, где требуется int? Чего вы хотели этим добиться?
1
0 / 1 / 0
Регистрация: 17.12.2019
Сообщений: 131
08.06.2020, 22:25  [ТС]
То есть необходимо переделать в int?
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
08.06.2020, 22:36
Цитата Сообщение от konfetti Посмотреть сообщение
То есть необходимо переделать в int?
необходимо понять как ваш код должен работать, что с такой записью сложно
1
0 / 1 / 0
Регистрация: 17.12.2019
Сообщений: 131
08.06.2020, 22:40  [ТС]
необходимо определить величину Y, как индекс первого отрицательного элемента массива X. программа должна содержать рекурсивную функцию определения в соответствии с заданием величины Y.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
09.06.2020, 03:42
Лучший ответ Сообщение было отмечено konfetti как решение

Решение

konfetti, икс в функции лишний
вывод y сделан неверно.
поражает контраст между относительно большим для новичка кодом и абсолютным непониманием того как работает функция recY
C++
1
2
3
int y;
 recY(x, n, y);//первый аргумент убрать в объявлении recY
output(a, x,y);
1
0 / 1 / 0
Регистрация: 17.12.2019
Сообщений: 131
09.06.2020, 12:39  [ТС]
Спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2020, 12:39
Помогаю со студенческими работами здесь

И так, что не так с моим запросом на добавление записи в таблицу?
$sql = 'INSERT INTO product ' . '(name, code, price, category_id, brand, availability,' . 'description,...

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

вот задача на рекурсию, с рекурсией я сделал её , а как без неё .что-то написал, но не всегда работает. спасибо заранее
program Projectrec; {$APPTYPE CONSOLE} uses SysUtils; var x,i,m,a,c,sum,n,mm,gg:integer; function g(m:integer):integer; ...

сегодня так можно сказать праздник так что...
простите меня за все пожалуйста!!!

Что в коде ни так? while не работает так, как ожидаю
Написанный код, как я думаю, должен выдавать цифры от 0 до 1000, столбиком. Но выдает начиная от 702 до 1000. Что ни так понимаю, где...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru