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

Choinka w C - problem

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,048 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 1,121 wizyt
pytanie zadane 4 listopada 2021 w Java przez Rafał Masny Obywatel (1,700 p.)
0 głosów
3 odpowiedzi 1,269 wizyt
pytanie zadane 24 stycznia 2020 w C i C++ przez rysiek5555 Początkujący (300 p.)
0 głosów
1 odpowiedź 7,819 wizyt
pytanie zadane 21 grudnia 2017 w PHP przez MakaBresk Obywatel (1,060 p.)

93,439 zapytań

142,431 odpowiedzi

322,677 komentarzy

62,802 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

...