Narysowanie sześciu wersji trójkątów za pomocą gwiazdek

0

Mam problem, mam do narysowania 6 wersji trójkątów za pomocą gwiazdek z klawiatury...

2 pierwsze poszły łatwo 3 i 4 stanowią problem...

Mam narysować trójkąt dla dowolnego n z zakresu 1-15 gdzie n to ilośc lini poziomych...

Program napisałem na podstawie przykładu z rysowaniem rombu przedstawionego i wyjaśnionego przez pana furious programming - za co bardzo dziękuję.

Niestety nie działa prawidłowo... Rysuje trójkąt ale w momencie przekręcenia licznika na wartość 0 lub ujemną przestaje rysować mi spacje - oczywiste
Nie wiem jak rozwiązać ten problem :(

//  *
// ***
//*****


program Zadanie_c;

Var
  n:byte;
  menu:byte;
  gwiazdki:byte;
  linia:byte;
Label
  rst;
begin
  rst:
  gwiazdki:=1;
  linia:=1;
   WriteLn('Podaj ilosc poziomow trojkata (zakres 1-15)');
   ReadLn(n);
   if (n>=1) and (n<=15) then
   begin
    Write('Rysuje trojkat dla n rownego ');
    WriteLn(n);
     WriteLn('');

     while linia <= n do
        begin
          WriteLn(StringOfChar(' ', (n - gwiazdki) div 2), StringOfChar('*', gwiazdki)); //tu mam problem n-gwiazdki - tak przynajmniej myślę...
          gwiazdki += 2;
          linia += 1;
        end;


      WriteLn('');
    WriteLn ('1-uruchom ponownie');
    WriteLn ('2-zakoncz');
    ReadLn(menu);
      if (menu=1) then
       begin
       goto rst;
       end
      else
       begin
       end
   end
  ELSE
   begin
    WriteLn('Podano wartosc z poza zakresu!');
    ReadLn();
    goto rst;
   end
end.
                                                                  
 

Efekt niestety wygląda tak:
user image

Bardzo proszę o podpowiedz jak wyliczać ilość spacji w kolejnych liniach, najprościej jak się da ;)

0

Zobacz na krótki przykład:

var
  LSize, LStars, LSpace: Integer;
begin
  Write('Size: ');
  ReadLn(LSize);

  LStars := 1;
  LSpace := LSize div 2;

  while LStars <= LSize do
  begin
    WriteLn(StringOfChar(' ', LSpace), StringOfChar('*', LStars));
    LStars += 2;
    LSpace -= 1;
  end;

  ReadLn();
end.

Liczbę gwiazdek należy inkrementować o 2, natomiast liczbę spacji dekrementować o 1 - obie czynności wykonywać w każdej iteracji; Dodatkowo zobacz sobie na warunek działania pętli While;

Przykładowe wyjście:

Size: 7
   *
  ***
 *****
*******

Jeżeli podawana liczba z klawiatury ma oznaczać wysokość figury, a nie jej szerokość, kod trzeba będzie zmodyfikować, dlatego że obliczenia będą zupełnie inne.

0

podawana zmienna odpowiada wysokości figury ilości lini w programie...
Niestety nie mam pomysłu jak to zrobić...

Tzn moj kod rysuje odpowiednią ilość lini ale nie wiem jak teraz te spacje liczyć...

0

No dobrze, masz przykład takiego kodu:

var
  LHeight, LSpace, LStars: Integer;
begin
  Write('Height: ');
  ReadLn(LHeight);

  LSpace := LHeight - 1;
  LStars := 1;

  while LHeight > 0 do
  begin
    WriteLn(StringOfChar(' ', LSpace), StringOfChar('*', LStars));

    LStars += 2;
    LSpace -= 1;
    LHeight -= 1;
  end;

  ReadLn();
end.

Przykład wyjścia:

Height: 7
      *
     ***
    *****
   *******
  *********
 ***********
*************

Czyli wszystko gra; Dorób sobie więcej zabezpieczeń, dlatego że podawana z klawiatury liczba musi być nieparzysta; Do tego celu możesz wykorzystać funkcję Odd, operator Mod lub And - jak wolisz.

0

Dziękuję, już sobie to analizuje co i jak działa ;)

0

OK udało się i działa z moim menu (wymagane w zadaniu)

Teraz mam inny problem z kolejnym zadaniem

Musze narysować to samo "do góry nogami"

 
*****
 ***
  *

Początkowa ilość spacji wyniesie więc 0 i zmienia się o +1 z każdym przejściem pętli (nowej lini)
Ilość gwiazdek maleje o -2 co linię (pętle)

ALE jak wyznaczyć początkową wartość 1 lini gwiazdek? Mam do dyspozycji tylko wysokość trójkąta podaną przez użytkownika?

Matematyka nigdy nie była najbliższa mi nauką...

//*****
// ***
//  *


program Zadanie_d;

Var
  menu:byte;
  n:byte;
  gwiazdki:byte;
  spacje:byte;
Label
  rst;
begin
  rst:
   WriteLn('Podaj ilosc poziomow trojkata (zakres 1-15)');
   ReadLn(n);
   spacje:=0;
   gwiazdki:=??????; //<= no tutaj nie mam pojęcia jak to policzyć
   if (n>=1) and (n<=15) then
   begin
    Write('Rysuje trojkat dla n rownego ');
    WriteLn(n);
     WriteLn('');

     while n>0 do
        begin
          WriteLn(StringOfChar(' ', spacje), StringOfChar('*', gwiazdki));
    gwiazdki-=2;
    spacje+=1;
    n-=1;
        end;


      WriteLn('');
    WriteLn ('1-uruchom ponownie');
    WriteLn ('2-zakoncz');
    ReadLn(menu);
      if (menu=1) then
       begin
       goto rst;
       end
      else
       begin
       end
   end
  ELSE
   begin
    WriteLn('Podano wartosc z poza zakresu!');
    ReadLn();
    goto rst;
   end
end.                               
 
0
gwiazdki := n * 2 - 1;

A w pętli robisz odwrotnie niż w poprzednim przykładzie - inkrementujesz spacje, dekrementujesz gwiazdki;

Write i Writeln to nie są zwykłe procedury (tak samo jak Read i Readln), to dynamicznie generowane zestawy instrukcji, w zależności od danego kontekstu; Mogą przyjmować dowolną ilość argumentów wielu typów (ciągi, liczby, zmienne plikowe itd.) oraz dodatkowe informacje (np. formatowanie liczb zmiennoprzecinkowych, wyrównanie pól itd.);

Dlatego też ten kod:

Write('Rysuje trojkat dla n rownego ');
WriteLn(n);
WriteLn('');

możesz śmiało zapisać w jednej instrukcji:

WriteLn('Rysuje trojkat dla n rownego ', n, #10);

Przy czym zapis #10 oznacza wstawienie znaku LF, czyli znaku nowej linii (samo LF wystarczy).

0

WOW!

 
gwiazdki := n * 2 - 1;

Proszę powiedz tylko jak Ty to zrobiłeś
Szukam wzorów na wyliczanie boków itp ale nie znalazłem nic odpowiedniego...
Tzn jak wyliczyć podstawę tego trójkąta z jakiego wzoru/twierdzenia to przekształciłeś?

0

Narysuj sobie kilka figur w notatniku dla różnych n i sam na to wpadniesz :]

Liczba spacji przed wierzchołkiem jest równa połowie podawanej wysokości trójkąta; A że wysokość czy długość podstawy musi być nieparzysta to aby trójkąt wyszedł równy, trzeba wyśrodkować wierzchołek, czyli odjąć 1; natomiast liczba gwiazdek to prawie dwukrotność podanej liczby; Prawie, bo podawana liczba jest nieparzysta, więc mnożymy ją przez 2 i odejmujemy 1;

Wypisz sobie kilka wyników tego wzoru dla różnych n, np. dla n równego 1, 3, 5 i 7, a zrozumiesz.

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