c# i trójkąt równoramienny.

0

Witam! Mam zrobić program który rysuje trójkąt równoramienny z gwiazdek. Oczywiście użytkownik podaje z klawiatury ilość wierszy trójkąta.
I ilość tych wierszy nie może być większa niż 25.
Zrobiłem tyle :

Console.WriteLine("Program rysujący trójkąt równoramienny z ' * '");
            Console.WriteLine("Podaj liczbe wierszy");
            double a;
            a = Convert.ToDouble(Console.ReadLine());
            for (; ; )
            {
                if (a > 25)
                {
                    Console.WriteLine("Podaj liczbe mniejszą od 26");
                    a = Convert.ToDouble(Console.ReadLine());
                }
                else
                {
                    break;
                    Console.WriteLine(a);
                }
            }

Brakuje teraz pętli które by ten trójkąt rysowały. A z tym mam największy problem. Ktoś naprowadzi od czego mam zacząć?

1
Fak3r napisał(a):

Ktoś naprowadzi od czego mam zacząć?

Rozpisz sobie jak będzie wyglądać trójkąt dla 1, 2, 3, 4.

Jaki będzie odstęp (ilość spacji) środkowy między gwiazdkami w poszczególnych wierszach?
Jaki będzie odstęp (ilość spacji) od lewej krawędzi ekranu?
Góra musi zawierać jedną gwiazdkę.
Dół musi mieć gwiazdki na całą szerokość trójkąta.

0

@Spine: No dobra nawet jak sobie to rozpisze to mi dużo to nie mówi bo nie wiem jak mam przenieść całe te informacje o gwiazdkach, spacjach do pętli :/
Trójkąt dla wysokości 1 to wiadomo jedna * tylko
Natomiast dla wysokości 4

 X
XXX
XXXXX
XXXXXXX

I Spacje to chodzi o to że np. pierwszy pojedyńczy X musi być od lewej krawędzi oddalony o 4 spacje tak?

1
Fak3r napisał(a):

@Spine: No dobra nawet jak sobie to rozpisze to mi dużo to nie mówi bo nie wiem jak mam przenieść całe te informacje o gwiazdkach, spacjach do pętli :/

Wyciągnij wnioski z trójkąta, który sobie napisałeś.

Skoro dla trójkąta o wysokości n = 4, środkowy "x" jest oddalony od lewej strony ekranu o 3 spacje, następny wiersz o 2 spacje, itd. to znaczy, że zaczynasz pętlę wierszy od n - 1 (spacji), a kończysz na 0 (włącznie).
Czyli w każdym obrocie pętli wierszy na początku doklejasz (np. inną pętlą) ilość spacji zgodną licznikiem pętli wierszy.

Dalej możemy zaobserwować, że ilość X zaczyna się od 1 i w każdym wierszu jest zwiększana o 2. Więc po spacjach doklejamy "x" w ilości odpowiadającej licznikowi x'ów. (kolejną pętlą)
Licznik x'ów inicjujemy przed pętlą wierszy wartością 1 i na końcu obrotu pętli wierszy zwiększamy ten licznik o 2.

Jeszcze sprostowanie... Na początku myślałem, że ten trójkąt ma być pusty w środku, dlatego napisałem:

Jaki będzie odstęp (ilość spacji) środkowy między gwiazdkami w poszczególnych wierszach?

Twój kod jest zły, bo konwertujesz liczby na double. W tym zadaniu wystarczą Ci same liczby całkowite.

0

@Fak3r: Po pierwsze tak bardziej wizualnie ujmując masz do wyświetlenia 2 trójkąty a nie jeden i dla każdego jak napisał kolega wyżej zachodzą pewne zależności. Postaram się to tutaj rozrysować dla 4 linii i mam nadzieje że formularz nie zniekształci tego wpisu. Tak w ogóle to nie jest to dobry pomysł wysyłać coś po break'u w pętli :D

xxxx0
xxx000
xx00000
x0000000
000000000

i to jest cała wizualna analiza dla tego zadania, dla 5 wierszy. Oczywiście tam gdzie są X powinny być spacje...
Zależności już zostały opisane. Są różne sposoby ale ja bym to zrobił na początku tak ze w pętli warunkowej if
sprawdzającej ilość podanych wierszy zawarł bym pętle zliczającą for dla każdego wiersza. Oczywiście w tej pętli będą potrzebne kolejne
dwie pętle for - jedna dla spacji druga dla *. Wewnątrz tej dla gwiazdek kolejny if sprawdzający czy jest to pierwsze przejscie pętli czy kolejne.
Jeśli pierwsze to wyświetli jedną *. Jeśli kolejne to dwie *

if - sprawdza ilosc wierszy

1

Jako, że nigdy nie pisałem takiego programiku, postanowiłem nadrobić zaległości...

using System;

public class Gotowiec4Programmers
{
	public static void Main()
	{
		int n;
		
		do {
			Console.WriteLine("Podaj liczbe wierszy");
			n = Int32.Parse(Console.ReadLine());
			
			if (n > 25)
			{
				Console.WriteLine("Podaj liczbe mniejszą od 26");
			}
			else
			{
				break;
			}
		} while (true);
		
		for (int i = n-1, j = 1; i >= 0; i--, j+=2)
		{
			for (int k = 0; k < i; k++) {
				Console.Write(" ");
			}
			
			for (int k = 0; k < j; k++) {
				Console.Write("X");
			}
			
			Console.WriteLine();
		}
		
		Console.WriteLine("\nWięcej...\nhttps://4programmers.net/Forum/C_i_.NET/350534-c_i_trojkat_rownoramienny?p=1755448");
	}
}
1

@Spine: Fajny przykład na to że można najprostszy program napisać na różne sposoby. Mi wyszło tak...

 for (int i = 1; i <= a; i++)
            {
                for (int j = i; j <= a - 1; j++)
                {
                    Console.Write(d);
                }

               
                for (int k = i + a  ; k > a  ;)
                {

                    if (k == i + a)
                    {
                        Console.Write(b);
                    }
                    else
                    {
                        Console.Write(b);
                        Console.Write(b);
                    }

                    k--;
                }

                Console.WriteLine();

            }

1 użytkowników online, w tym zalogowanych: 0, gości: 1