Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Rysowanie specjalnych choinek Bash  (Przeczytany 13358 razy)

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« dnia: 2011-12-19, 22:40:29 »
Witam. Chciałem Was prosić o  napisanie mi skryptu ktory będzie rysował.
W internecie jest program który tworzy je według wysokości, potrzebuje nieco inny, a nie umiem tego ogarnąc.

Jak to ma dzialać?
Drzewo składa się z 3 warstw.
Uzytkownik podaje szczerokość górnej warstwy, a program ma w zależności od wyboru generować, dalszy ciąg drzewa.

Na przykładzie wyboru np. "3" ma to wygladac tak:

http://img209.imageshack.us/img209/6366/ssssssssssssdsdddsds.png

(ewentualnie, lepiej by było jakby każda kolejna warstwa(środkowa i dolnia) nie zaczylaa sie od jednej "*" tylko od  2 "**". - Jeśli jest taka możliwość.

Z góry dziękuję! Bardzo mi pomożecie!

Aman

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #1 dnia: 2011-12-20, 07:22:56 »
Nie pomożemy.
Do nauki! To może w końcu napiszesz.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Rysowanie specjalnych choinek Bash
« Odpowiedź #2 dnia: 2011-12-20, 13:07:07 »
Skoro 3 warstwy to pętla for od k = 1 do 3 (włącznie).

W pierwszej warstwie pętla od n = 1 do W, gdzie W to podana przez użytkownika szerokość górnej warstwy.
W drugiej warstwie od 1 do W+1.
W trzeciej warstwie od 1 do W+2.
Jeśli nie zauważyłeś w tej chwili, że każdej warstwie będzie to pętla od 1 do W+k-1, to rzuć programowanie.

No to dwie zagnieżdżone pętle z głowy.

Teraz rysowanie, czyli wywołanie funkcji:
rysuj_wiersz $W $k $n

A sama funkcja rysująca wiersz:
- wcięcie na (3-k) + (W+k-1) - n = W-n+2 spacji
- "* " powtórzone n-1 razy
- i na końcu jedna "*" bez spacji

Teraz zakoduj to w Bashu, w końcu po to uczyłeś się go cały semestr...

To ci wystarczy.
- for (( k=1; k<=$1; k++ )); do ...
- parametry w funkcji to kolejno $1, $2, ...
- echo -n
- http://www.ournet.pl/kursbasha/main.html

Powodzenia. U mnie skrypt zajął 19 linii:
$ ./choinka 3
    *
   * *
  * * *
    *
   * *
  * * *
 * * * *
    *
   * *
  * * *
 * * * *
* * * * *
$ ./choinka 4
     *
    * *
   * * *
  * * * *
     *
    * *
   * * *
  * * * *
 * * * * *
     *
    * *
   * * *
  * * * *
 * * * * *
* * * * * *
PS.
Jeśli szukasz gotowca do tak prostego algorytmu, to może w ogóle zastanów się nad zmianą kierunku studiów?

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #3 dnia: 2011-12-20, 15:10:26 »
To nie studia ;) Technikum.
A to skrypt który ostatnio był na lekcji na której mnie nie było, a nie mam skąd go ogarnąc, ;x, dlatego myślałem że mi go ogarniecie bo mi coś za bardzo nie wychodzi ;)
No nic,  dzięki, to zabieram za się próby
Jakby jednak można było prosiłbym o gotowy skrypt do nauki z niego :( bo ja uczę sie na przykładach bardziej. Tak czy inaczej, dzieki.

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #4 dnia: 2011-12-20, 20:17:52 »
"wcięcie na (3-k) + (W+k-1) - n = W-n+2 spacji"
Dokładniej to tego nie ogarnolem oO

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Rysowanie specjalnych choinek Bash
« Odpowiedź #5 dnia: 2011-12-22, 11:40:14 »
(3-k) --- wcięcie warstwy
+
(W+k-1) - n --- wcięcie wiersza w warstwie

W obu ta sama zasada: maksymalna wartość pętli for minus aktualna wartość przebiegu pętli.

Po skróceniu wychodzi W-n+2, czyli nie jest zależne od warstwy (k), co możesz na swoim rysunku sam sprawdzić.

  for (( a=1; a<=$1-$3+2; a++ )); do
    echo -n " "
  done
$1 to pierwszy przekazany do funkcji rysującej wiersz parametr ($W), a $3 to trzeci ($n). Drugi $k jest nieużywany.

Zamiast funkcji możesz po prostu wstawić kod w wewnętrzną pętlę, bo kodu nie ma w niej dużo. I wtedy używać po prostu $W, $n.

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #6 dnia: 2011-12-22, 13:26:49 »
Dzięki ;). Zrobiłem to jednak innym sposobem, myśle że też tak może być, jednak
jak teraz dopisać żeby program tworzył kolejne warsztwy o 1 większe bo mój jest tylko na tą górną. Jak wyglądłaby zmieniony na to kod?


 
#!/bin/bash
row=1
until test $row -gt $1
do
        dwg=""
        tmp=0
        # początkowe wcięcie...
        while test $tmp -lt $[$1-$row]
        do
                dwg+=" "
                let tmp+=1              
        done
        tmp=0
        # gwiazdki...
        while test $tmp -lt $[2*$row-1]
        do
                if [ `expr $tmp % 2` -eq 0 ]
                then
                        dwg+="*"
                else
                        dwg+=" "
                fi
                let tmp+=1              
        done
        # na ekran...
        echo "$dwg"

        let row+=1
done

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Rysowanie specjalnych choinek Bash
« Odpowiedź #7 dnia: 2011-12-22, 16:05:30 »
Jako, że widzę, że sam próbujesz, to podsyłam rozwiązanie.
Zadanie domowe: zrozumieć ;)
#!/bin/bash
for (( k=1; k<=3; k++ )); do
    for (( n=1; n<=$1+k-1; n++ )); do
        for (( a=1; a<=$1-$n+2; a++ )); do
            echo -n " "
        done
        for (( a=1; a<=$n-1; a++ )); do
            echo -n "* "
        done
        echo "*"
    done
done
Wywaliłem tę funkcję, o której pisałem wcześniej i wstawiłem jej kod w wewnętrzną pętlę.

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #8 dnia: 2011-12-22, 16:35:54 »
Dzięki Wielki za pomoc, naprawde mi pomogłęś ;)
Teraz tylko to ogarnąc żeby zrozumieć i ok.
Wkoncu mam choinkę któej szukałem hehe
Wesołych świąt;)

Offline Robert

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2516
    • Zobacz profil
Rysowanie specjalnych choinek Bash
« Odpowiedź #9 dnia: 2011-12-22, 20:13:27 »
Tak na marginesie, ta choinka byłaby ładniejsza, gdyby te trójkąty (poza pierwszym) nie zaczynały się od jednej gwiazdki, tylko np trzech, czyli w sensie ścisłym były by trapezami.

Jak dałeś sobie rade z trójkątami, to trapezy potraktuj jako nowe wyzwanie, taki kolejny level w grze :-)
Zanim popełnisz grafomaństwo: 1 | 2 | 3
Baza RPM Jak szukać informacji

Teilor

  • Gość
Rysowanie specjalnych choinek Bash
« Odpowiedź #10 dnia: 2011-12-23, 14:14:24 »
Tak by było napewno lepiej :)
No sprubować można, ale to już bardzije hard... ;P