Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
L29
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 34
1

Отладить рекурсию

08.12.2014, 17:59. Просмотров 804. Ответов 12
Метки нет (Все метки)

Не запускается программа
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 <vcl.h>
#pragma hdrstop
#include<math.h>
#include<stdio.h>
#include "oo.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
   void tria(float xA,float yA,float xB,float yB,float xC,
float yC,int n)
{
float xP,yP,xQ,yQ,xR,yR;
if(n>0)
 { xP=(xB+xC)/2;yP=(yB+yC)/2;
 xQ=(xC+xA)/2;yQ=(yC+yA)/2;
 xR=(xA+xB)/2;yR=(yA+yB)/2;
 Form1->Canvas->MoveTo(xP,yP);Form1->Canvas->LineTo(xQ,yQ);
 Form1->Canvas->LineTo(xR,yR);Form1->Canvas->LineTo(xP,yP);
 tria(xA,yA,xR,yR,xQ,yQ,n-1);
 tria(xB,yB,xP,yP,xR,yR,n-1);
 tria(xC,yC,xQ,yQ,xP,yP,n-1);
   }
 }
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{  int n;
 int xA,yA,xB,yB,xC,yC,X_max,Y_max;
 X_max=500;Y_max=300;
 printf("\Глубина рекурсии(например 7):");
 scanf("%d",&n);
 //zaggraf();
 xA=0;yA=Y_max;xB=X_max;yB=Y_max;xC=0;yC=0;
 Form1->Canvas->MoveTo(xA,yA);Form1->Canvas->LineTo(xB,yB);
 Form1->Canvas->LineTo(xC,yC);Form1->Canvas->LineTo(xA,yA);
 tria(xA,yA,xB,yB,xC,yC,n);
 
/* endgr();*/
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2014, 17:59
Ответы с готовыми решениями:

Отладить программу
У нас дан однонаправленный список, добавили кнопку удаления последнего...

немогу отладить программу
#include &lt;iostream.h&gt; #include &lt;vcl.h&gt; #pragma hdrstop #pragma argsused int...

Помогите пожалуйста отладить код в Builder6
//--------------------------------------------------------------------------- ...

Задача 8 ферзей, модифицировать код, убрав рекурсию
#include&lt;iostream&gt; #include&lt;stdio.h&gt; using namespace std; const int...

Переделать рекурсию по аргументу в рекурсию по значению
эта рекурсия по аргументу, заменяющая Y на число, равное глубине вложения Y в...

12
gumi250
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
09.12.2014, 01:44 2
чего пишет? printf и scanf в оконном приложении это так задумано?
0
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
09.12.2014, 12:46 3
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void tria(float xA,float yA,float xB,float yB,float xC,float yC,int n)
{
float xP,yP,xQ,yQ,xR,yR;
if(n>0)
 { xP=(xB+xC)/2;yP=(yB+yC)/2;
 xQ=(xC+xA)/2;yQ=(yC+yA)/2;
 xR=(xA+xB)/2;yR=(yA+yB)/2;
 Form1->Canvas->MoveTo(xP,yP);Form1->Canvas->LineTo(xQ,yQ);
 Form1->Canvas->LineTo(xR,yR);Form1->Canvas->LineTo(xP,yP);
 tria(xA,yA,xR,yR,xQ,yQ,n-1);
 tria(xB,yB,xP,yP,xR,yR,n-1);
 tria(xC,yC,xQ,yQ,xP,yP,n-1);
   }
 }
 //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int n=7;
 int xA,yA,xB,yB,xC,yC,X_max,Y_max;
 X_max=500;Y_max=300;
 
 xA=0;yA=Y_max;xB=X_max;yB=Y_max;xC=0;yC=0;
 Form1->Canvas->MoveTo(xA,yA);Form1->Canvas->LineTo(xB,yB);
 Form1->Canvas->LineTo(xC,yC);Form1->Canvas->LineTo(xA,yA);
 tria(xA,yA,xB,yB,xC,yC,n);
}
//---------------------------------------------------------------------------
0
Миниатюры
Отладить рекурсию  
L29
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 34
12.12.2014, 13:23  [ТС] 4
gunslinger, а если мне нужно построить с помощью рекурсии или фрактала(я точно не поняла) модельный треугольник? то как это сделать?
Сделала так, оказалось не правильно
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include<math.h>
#include<stdio.h>
#include "oo.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
   void tria(float xA,float yA,float xB,float yB,float xC,
float yC)
{
float xP,yP,xQ,yQ,xR,yR;
 xP=xB+xC;yP=yB+yC;
 xQ=xC+xA;yQ=yC+yA;
 xR=xA+xB;yR=yA+yB;
 Form1->Canvas->MoveTo(xP,yP);Form1->Canvas->LineTo(xQ,yQ);
 Form1->Canvas->LineTo(xR,yR);
 
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
tria(237.5,87.5,212.5,37.5,187.5,87.5);
tria(275,87.5,225,87.5,225,37.5);
tria(225,125,275,100,225,75);
tria(225,162.5,225,112.5,275,112.5);
tria(187.5,112.5,212.5,162.5,237.5,112.5);
tria(150,112.5,200,112.5,200,162.5);
tria(200,75,150,100,200,125);
tria(200,37.5,200,87.5,150,87.5);
}
//---------------------------------------------------------------------------
Должно получчиться как на рисунке
0
Миниатюры
Отладить рекурсию  
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
12.12.2014, 14:51 5
Я тоже не понимаю. Что за модельный треугольник?
Тебе нужна фигура, как на картинке. Так твой код ее и рисует.
Или нужно сделать с помощью рекурсии? Или фрактал построить на основе фигуры?
Если ты не знаешь, что требуется, почему другие должны быть в курсе, как делать?
Тут вроде нет участников "Битвы экстрасенсов" (жена иногда смотрит, я подобной ерундой не занимаюсь).
0
L29
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 34
12.12.2014, 15:00  [ТС] 6
gunslinger, Извините за неясность. Мне требуется чтоб программа рисовала фигуру как на рисунке с помощью рекурсии или фрактала. Как Вы видите из примера моей программы,там нет того чего нужно. А я не понимаю как с помощью рекурсии или фрактала нарисовать данную фигуру.
Если Вам не сложно, могли бы Вы мне помочь?
0
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
13.12.2014, 15:01 7
Рекурсия (как такую фигуру нарисовать "с помощью фрактала", я так и не понял):
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
void tria(float x, float y, float r, float dif1, float dif2, int i)
{
  // расстояние от центра фигуры до конца наклонной линии (НЛ)
  float dif3 = sqrt((r+dif2)*(r+dif2)+dif1*dif1);
  // длина половины диагонали (расстояние от центра до внешнего угла или конца "прямой" линии, далее ПЛ)
  float R = sqrt(2.)*(r+dif2);
 
  if (i > 0)
  {
    for (int j = -1; j <= 1; j += 2)
    {
      // переходим в начало НЛ
      Form1->Canvas->MoveTo(x+sin(i*M_PI/2)*r, y-cos(i*M_PI/2)*r);
      // рисуем НЛ
      Form1->Canvas->LineTo(x+sin((i*2+j*dif1/dif2)*M_PI/4)*dif3, y-cos((i*2+j*dif1/dif2)*M_PI/4)*dif3);
      // рисуем ПЛ
      Form1->Canvas->LineTo(x+sin((i*2+j)*M_PI/4)*R, y-cos((i*2+j)*M_PI/4)*R);
    }
    tria(x, y, r, dif1, dif2, i-1);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  tria(200, 200, 25, 25, 50, 4);
}
где
x, y - координаты центра фигуры,
r - расстояние от центра фигуры до внутренних углов,
dif1 и dif2 - смещения по осям при рисовании наклонной линии (ширина и высота),
i - глубина рекурсии (здесь всегда равна 4).

Только линии получаются не совсем "ровные". Возможно, из-за параметров фигуры (хотя рисовал вроде так, как у тебя; при некоторых значениях все нормально) или еще чего (округления, например, или смещения при проведении линий).
Название: a1dd4018e5665a29aa4eb16b460b7748.jpg
Просмотров: 84

Размер: 4.9 Кб

Либо оставь, как есть, либо замени 4-ую строку на
C++
1
  float R = sqrt(2.)*(r+dif2)-2;
но это уже "подгон". Лучше тогда параметры подобрать так, чтобы рисовалось ровно.
0
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
13.12.2014, 16:23 8
Немного исправил (dif - длина "прямой" линии):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void tria(float x, float y, float r, float dif1, float dif2, float dif, int i)
{
  float dif3 = sqrt((r+dif2)*(r+dif2)+dif1*dif1);
  float R = sqrt(2.)*(dif+dif1);
 
  if (i > 0)
  {
    for (int j = -1; j <= 1; j += 2)
    {
      Form1->Canvas->MoveTo(x+sin(i*M_PI/2)*r, y-cos(i*M_PI/2)*r);
      Form1->Canvas->LineTo(x+sin((i*2+j*dif1/dif2)*M_PI/4)*dif3, y-cos((i*2+j*dif1/dif2)*M_PI/4)*dif3);
      Form1->Canvas->LineTo(x+sin((i*2+j)*M_PI/4)*R, y-cos((i*2+j)*M_PI/4)*R);
    }
    tria(x, y, r, dif1, dif2, dif, i-1);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  tria(200, 200, 25, 25, 50, 49, 4);
}
Рисует вроде нормально.
P.S.: возможно, нужно изменять код отрисовки, чтобы не допускать "искажений" в общем случае (если это реально сделать, с полной уверенностью сказать не могу).
1
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
13.12.2014, 17:32 9
Пытаясь "выровнять" линии, сделал два вывода:
1) в общем случае линии "прямыми" не получаются, все зависит от параметров;
2) иногда выходят достаточно интересные фигуры.

Отладить рекурсию


Код такой (beams - количество "лучей"; можно "поиграться" с параметрами):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void tria(float r, float dif1, float dif2, int i, int beams)
{
  int x = Form1->ClientWidth/2;
  int y = Form1->ClientHeight/2;
  float dif3 = sqrt((r+dif2)*(r+dif2)+dif1*dif1);
  float R = sqrt(2.)*(r+dif2);
 
  if (i > 0)
  {
    for (int j = -1; j <= 1; j += 2)
    {
      Form1->Canvas->MoveTo(x+sin(i*M_PI/beams*2)*r, y-cos(i*M_PI/beams*2)*r);
      Form1->Canvas->LineTo(x+sin((i*2+j*dif1/dif2)*M_PI/beams)*dif3, y-cos((i*2+j*dif1/dif2)*M_PI/beams)*dif3);
      Form1->Canvas->LineTo(x+sin((i*2+j)*M_PI/beams)*R, y-cos((i*2+j)*M_PI/beams)*R);
    }
    tria(r, dif1, dif2, i-1, beams);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  tria(50, 80, 60, 5, 7);
}
0
L29
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 34
13.12.2014, 18:39  [ТС] 10
gunslinger, а можете на рисунке отметить что есть что? а то так не очень пойму

Добавлено через 11 минут
gunslinger, я поняла уже где что, но не понимаю как высчитываются координаты? откуда синусы и косинусы?
0
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
14.12.2014, 12:42 11
Используется обычная геометрия. sin и cos нужны для вычисления "проекций" линий на координатные оси в зависимости от угла наклона этих линий (чтобы знать, на сколько смещаться по осям при рисовании).
0
L29
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 34
19.12.2014, 21:55  [ТС] 12
gunslinger, помогите пожалуйста составить мне блок-схему данной программы. А то я не понимаю как это сдклать с рекурсией
0
gunslinger
случайный прохожий
1290 / 812 / 319
Регистрация: 20.07.2013
Сообщений: 2,287
20.12.2014, 00:17 13
Блок-схемы не рисую. Что касается оформления в случае рекурсии, то, полагаю, нужно использовать блок "вызов функции" (если такой есть или аналог) с измененным значением параметра.
0
20.12.2014, 00:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2014, 00:17

Отладить код
Есть программа в которой нужно прочесть строку, посчитать количество повторений...

Отладить программу
Помогите пожалуйста, сегодня надо сдать программу. Нужно отладить мой код. Вот...

Отладить программу
Доброго времени суток. Помогите, пожалуйста, отладить программу. Задание...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru