• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem ze zrozumieniem kodu

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez szymi666 Bywalec (2,020 p.)

witam otóż czytam właśnie książkę S.Praty "Język C++ Szkoła programowania" i jest tam przykład na wyjaśnienie rekurencje w wielu wywołaniach jednak siedzę i analizuje kod dobrych kilka godzin jednak nie potrafię go zrozumieć.Czy może ktoś spróbować mi przybliżyć wyjaśnienie tego kodu z góry dziekuję.

#include <iostream>

const int Len = 66;
const int Divs = 6;
void subdivide (char ar[],int low,int high,int level);
int main(){
	char ruler[Len];
	int i;
	for(i=1;i<Len-2;i++)
	ruler[i]= ' ';
	ruler[Len-1] = '\0';
	int max = Len - 2;
	int min=0;
	ruler[min]=ruler[max]= '|';
	std::cout<<ruler<<std::endl;
	for(i=1;i<= Divs;i++)
	{
		subdivide(ruler,min,max,i);
		std::cout<<ruler<<std::endl;
		for(int j=1;j<Len-2;j++)
		ruler[j]=' ';
	}
	return 0;
} 
void subdivide (char ar[],int low,int high,int level)
{
	if(level==0)
	  return;
	  int mid = (high+low)/2;
	  ar[mid] = '|';
	  subdivide(ar,low,mid,level-1);
	  subdivide(ar,mid,high,level-1);
}

 

2 odpowiedzi

0 głosów
odpowiedź 30 marca 2016 przez criss Mędrzec (172,590 p.)
wybrane 30 marca 2016 przez szymi666
 
Najlepsza

subdivide "dzieli" tablice na mniejsze części. Ilość mniejszych części jest podawana w argumencie level. "Dzieli" w cudzysłowie bo dzielenie polega tylko na zamienieniu środkowego wyrazu z zakresu komórek tablicy (zakres jest podawany w argumentach low oraz high) na '|'. Najpierw funkcja "dzieli" sobie tablice na 2 części, następnie rekurencyjne dzieli obydwie połowy na kolejne połowy (połowy połowy) i tak dalej aż do jednego z rekurencyjnych wywołan zostanie przekazany argument level równy 0.

komentarz 30 marca 2016 przez szymi666 Bywalec (2,020 p.)

Dziękuje już rozumiem jednak mam jeszcze jedno pytanie mianowicie czy ta funkcja mogła by wyglądać tak

void subdivide (char ar[],int low,int high,int level)
{
while(mid>0)
{
    if(level==0)
      return;
      int mid = (high+low)/2;
      ar[mid] = '|';
 mid=level;
}
}

 

komentarz 30 marca 2016 przez szymi666 Bywalec (2,020 p.)
dobra nieważne nieprzyznaje sie do tego co napisałem xd mój mózg dziś nie pracuje
komentarz 30 marca 2016 przez criss Mędrzec (172,590 p.)
No niee. Po pierwsze warunek pętli: mid > 0. Na końcu pętli przypisujesz mid = level, a level w twoim kodzie nigdzie się nie zmienia. Więc pętla będzie trwać w nieskonczoność (jesli level != 0) albo w ogóle sie nie wykona (jesli level == 0).

To przypisanie: mid = level. Kompletnie bez sensu. Nie wiem co chciałeś tym osiągnąć.

Także pętla raz wstawi '|' w środkowy element, a potem przez całą wieczność będzie wpisywać '|' w ar[level].

Zależy nam na tym, żeby kolejne części były dzielone na jeszcze mniejsze części, więc aż prosi się o rekurencje i bez niej się raczej nie obejdzie.

Edit: to dobrze, że się nie przyznajesz.. :P
0 głosów
odpowiedź 30 marca 2016 przez szymi666 Bywalec (2,020 p.)
A dokładnie rzecz biorąc to funkcji subdivide.

Podobne pytania

+1 głos
4 odpowiedzi 501 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez kacperoo7 Nowicjusz (200 p.)
0 głosów
7 odpowiedzi 2,046 wizyt
pytanie zadane 16 września 2015 w Algorytmy przez emSon Stary wyjadacz (10,480 p.)
0 głosów
1 odpowiedź 917 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...