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

Choinka w C - problem

Object Storage Arubacloud
0 głosów
864 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez MrReus Nowicjusz (140 p.)

Witam, muszę stworzyć choinkę wyglądającą mniej więcej tak (zdjęcie poniżej), ze skalującym się pniem i z możliwością podania ilości poziomów. Po kilku nieudanych próbach udało mi się stworzyć coś takiego, niestety nie mogę dojść do tego jak po podaniu ilości poziomów zostaną one prawidłowo stworzone, ponieważ raz to działa raz nie np. gdy podaję 5 program tworzy 5 poziomów, natomiast gdy chcę 10 poziomów, program tworzy ich mniej, oraz jak zostawić jedynie podstawę ostatniego(dolnego) i pierwszego(górnego) poziomu.

#include <stdio.h> 
#include <stdlib.h> 


void poziomy(int f, int n, int toth)
{
	int i, j, k = 2 * toth -2;


	for (i = 0; i < f -1 ; i++)
		k--;

	for (i = f   ; i < n; i++)
	{

		for (j = 0; j < k; j++)
		{
			printf(" ");
		}
		for (j = 1; j <= (2 * i - 1); j++)
		{

			if (i == k || j == 1 || j == (2 * i - 1))
			{
				printf("*");
			}
			else if (i == n - 1 )
		    {
				printf("*");
			}
			else if (f == 1 &&( n == (i +1)))
			{
				printf("*");
			}
		
			else
			{
				printf(" ");
			}

		}
		
		k = k - 1;

		printf("\n");
	}
}

void choinka(int h)
{
	int a = h * 3;
	int start = 1, stop = 0, diff = 3;
    while (stop < a + 1) 
	{
	    stop = start + diff;
		poziomy(start, stop, a);
		diff++;
		start = stop - 2;
	}
}
void pien(int n)
{
	int a = n* 3;
	int i, j, k = 2 * a - 4;

	for (i = 1; i <= a / 3; i++) {

		for (j = 0; j < k; j++)
			printf(" ");

		for (j = 1; j <= 6; j++)
			printf("#");

		printf("\n");
	}
}
int main()
{

	int ht=6;
	
	choinka(ht);
	pien(ht);

	return 0;
}

1 odpowiedź

0 głosów
odpowiedź 20 stycznia 2020 przez Mya Bywalec (2,790 p.)

Muszę przyznać, że postarałeś się o to by Twój kod był trudny w interpretacji. Powinieneś używać zdecydowanie bardziej oczywistych nazw zmiennych, bo tak wiele pojedynczych liter potrafi namieszać w głowie. laugh Szczególnie jeśli chcesz by ktoś pomógł ci rozwiązać problem, powinieneś ułatwić mu zrozumienie Twojego toku myślenia (oczywiście dla ciebie kod jest zrozumiały, bo sam go napisałeś).

Weź pod uwagę, że z punktu widzenia kompilatora, nie ma absolutnie, żadnej różnicy w tym jak nazywasz zmienne, więc po co utrudniać sobie życie.

Do rzeczy:

Żeby zawsze wyświetlać poprawną liczbę trójkątów, powinieneś inaczej obliczać a (liczbę wierszy do narysowania):

int a = 2 + (h * (h + 1)) / 2;

Jeśli chodzi o rysowanie podstawy trójkąta: możesz wprowadzić sobie dodatkową zmienną do procedury poziomy, która będzie określać czy należy narysować podstawę (np. typu bool):

void poziomy(int f, int n, int toth, bool podstawa)

a następnie w if-ie z lini nr 27 sprawdzać, czy ta wartość wynosi true.

komentarz 20 stycznia 2020 przez MrReus Nowicjusz (140 p.)
Gdy pisałem kod było mi wygodniej używać krótkich zmiennych, a teraz niestety san się gubię. Jeśli chodzi o poprawną liczbę trójkątów obliczenie a pomogło, a co do rysowania podstawy jak powinno wyglądać określanie czy należy rysować podstawę?
komentarz 20 stycznia 2020 przez Mya Bywalec (2,790 p.)

Twoja koncepcja na rozwiązanie tego zadania wydaje mi się dość nieintuicyjna (nie koniecznie zła, ale nieintuicyjna). Raczej bardziej oczywistym rozwiązaniem byłoby wydzielenie funkcji rysującej poszczególne trójkąty, a nie poszczególne linie.

Przyjrzałam się twojemu kodowi i wygląda na to, że nie ma potrzeby wprowadzać dodatkowej zmiennej. Wystarczy zmodyfikować if-a z linii 27.:

else if (i == n - 1 && (n == 4 || n == toth + 1))

Podstawa pierwszego trójkąta to zawsze linia 3., a ostatnia jest zapisana w toth.

 

komentarz 20 stycznia 2020 przez MrReus Nowicjusz (140 p.)
Na początku chciałem zrobić coś podobnego, ale miałem minimalnie inny warunek i nie działało poprawnie, ale teraz wszystko jest w porządku. Dziękuję Ci bardzo za pomoc, ale ciekawi mnie, czy można zmodyfikować ten program tak, żeby podać szerokość(w gwiazdkach) pierwszego trójkąta?

Podobne pytania

0 głosów
0 odpowiedzi 829 wizyt
pytanie zadane 4 listopada 2021 w Java przez Rafał Masny Obywatel (1,700 p.)
0 głosów
3 odpowiedzi 1,141 wizyt
pytanie zadane 24 stycznia 2020 w C i C++ przez rysiek5555 Początkujący (300 p.)
0 głosów
1 odpowiedź 7,099 wizyt
pytanie zadane 21 grudnia 2017 w PHP przez MakaBresk Obywatel (1,060 p.)

92,615 zapytań

141,465 odpowiedzi

319,776 komentarzy

61,997 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!

...