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

Piramida z gwiazdek w C#

Object Storage Arubacloud
0 głosów
4,107 wizyt
pytanie zadane 27 maja 2018 w C# przez Krzysiek Kowalczyk Początkujący (360 p.)
edycja 3 czerwca 2018 przez Krzysiek Kowalczyk

Witam. 

Uczę się C# z http://rbwhitaker.wikidot.com/c-sharp-tutorials. Dotarłem do tematu pętli (rozdział 11). Zasady działania znam.

Jako, że nie wykonałem samodzielnie zadania a spojrzałem do ściągi, to mi teraz głupio. Dlatego postanowiłem utworzyć generator piramidy z danych wprowadzonych przez użytkownika (ilość stopni, oraz z jakiego znaku ma się składać)

Wszystko fajnie śmiga, ale chcę też wprowadzić opcję stawiania piramidy na głowie (żeby zamiast :

     *     
    ***    
   *****   
  *******
 *********
***********

wyszło:

***********
 *********
  *******
   *****
    ***
     * 

I tak kombinując nasmarowałem coś takiego:

namespace generator_piramid
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Generator Piramid 1.0");
            Console.WriteLine("Ile ma mieć stopni?");
            int ilosc = int.Parse(Console.ReadLine());
            Console.WriteLine("A z czego ma być zrobiona?");
            char znak = char.Parse(Console.ReadLine());
            Console.WriteLine("Ostatnie pytanie: normalna czy odwrócona?");
            string input =Console.ReadLine();
            switch (input.ToLower())
 case "normalna":
                    Console.WriteLine("Wybrałeś normalną:");
            {
  for (int rzad = 0; rzad < ilosc; rzad++)
                    {
                        for (int przestrzen = ilosc - rzad; przestrzen > ilosc; przestrzen--)
                        {
                            Console.Write(" ");
                        }

                        for (int kolumna = 0; kolumna < (2 * rzad + 1); kolumna++)
                        {
                            Console.Write(znak);
                        }

                        Console.WriteLine();
                    }
                    Console.WriteLine("Zakończono obliczanie.");
                    Console.ReadKey();
                    break;

                case "odwrócona":
                    Console.WriteLine("Płyniesz pod prąd? Oto Twoja 'KONSTRUKCJA':");
                    for (int rzad = 0; rzad < ilosc; rzad++)
                    {

                        for (int przestrzen = ilosc + rzad; przestrzen > ilosc; przestrzen--) // jeśli rzad > to odejmujemy jeśli < dodajemy
                        {
                            Console.Write(" ");
                        }

                        for (int rzad= 11; kolumna > (2 * rzad - 2); kolumna--) // w przypadku budowania normalnej wartość kolumny dałem na 0 i kolumna++ 
                        {                                                      // w przypadku odwrotności, wartość kolumny( kolumna--)
                            Console.Write(sign);
                        }
                        Console.WriteLine();
                    }
                    Console.WriteLine("Zakończono obliczanie!");
                    Console.ReadKey();
                    break;
                default:
                    Console.WriteLine("Jesteś pewien co robisz?");
                    Console.WriteLine("Policz jeszcze raz i wróć");
                    break;
            }
            Console.ReadKey();
        }
        }
}

I tak jak podaje ilość rzędów dla normalnej piramidy to wszystko cacy. Za to z tą na odwrót są cyrki. Wyświetla mi do połowy a później same puste linijki (tak by zadeklarowana ilość się zgadzała).

Siedze nad tym juz 5 dzien i męczy mnie to strasznie. Jestem wdzięczny za wszelkie porady.

Pozdrawiam :)

3 odpowiedzi

+1 głos
odpowiedź 3 czerwca 2018 przez rafal.budzis Szeryf (85,260 p.)

Odwróciłeś nie tą pętle. Skopiuj całą normalną jeszcze raz : 

for (int rzad = 0; rzad < ilosc; rzad++)
                    {
                        for (int przestrzen = ilosc - rzad; przestrzen > ilosc; przestrzen--)
                        {
                            Console.Write(" ");
                        }
 
                        for (int kolumna = 0; kolumna < (2 * rzad + 1); kolumna++)
                        {
                            Console.Write(znak);
                        }
 
                        Console.WriteLine();
                    }

i zmień tylko główną pętle 

for (int rzad = ilosc; rzad > 0; rzad--)

Problemem odwróconej w Twoim przykładzie może być to ze masz pętle z zmienną rzad a w środku niej też masz zmienną rzad trzeba na to uważać.

0 głosów
odpowiedź 3 czerwca 2018 przez Krzysiek Kowalczyk Początkujący (360 p.)
edycja 4 czerwca 2018 przez Krzysiek Kowalczyk

Przepisałem kod, zmieniłem główną pętlę. Ale teraz po wpisaniu wartości i zatwierdzeniu obie piramidy zamienily się w schodki (wszystko wyrównało się do lewej). A dziwne, bo jak skopiowalem kod ze strony z zadaniem to wszystko wraca do normy. Nie wiem czemu, po podmianie nazw zmiennych tak sie dzieje.

Edit:

Tak kombinowałem z tym kodem, że się sam pogubiłem. Przeoczyłem parę miejsc. Widać okulary mi są już potrzebne :D

 @rafal612b dzięki za pomoc. I przepraszam za zamieszanie.

0 głosów
odpowiedź 3 czerwca 2018 przez spokojny Nałogowiec (28,630 p.)

Może ten kod coś Ci podpowie, jest od Javy, sprawdzałem na openjdk 10 i działa dobrze.

public class Pyramid {
    public static void main(String[] args) {
        int max = 70;
        if(args.length>0) // jeśli podany został argument
            try // próba sparsowania go
            {
                max = Integer.parseInt(args[0]);
            }
            catch(NumberFormatException e)
            {}
        // zaczynamy, szerokość początkowa będzie zależna od tego, czy max jest podzielne przez 2
        for(int szer = max%2; szer<=max; szer+=2)
        {
            // obliczamy skąd zacząć rysować piramidkę
            int start = max/2 - szer/2;
            // następnie "przesuwamy" się w to miejsce
            for(int i=0; i<start;i++)
                System.out.print(' ');
            // ...i zaczynamy rusować daszek
            System.out.print('/');

            // wypełniamy gwiazdkami o odpowiednią szerokość
            for(int i=0; i<szer; i++)
                System.out.print('*');
            // zamykamy daszkiem i nowa linia
            System.out.println('\\');
        }
    }
}

 

komentarz 4 czerwca 2018 przez MP Nowicjusz (100 p.)

Cześć Krzysiek

Analizując Twój kod i porównując wynik z tym co narysowałeś (piramidy) to i w obu przypadkach nie uzyskałeś tego co chciałeś.

Zerknij na kod a w szczególności pętle. Porównaj je ze swoimi.

W razie problemów jestem do dyspozycji.

 

static void Main(string[] args)
        {
            Console.WriteLine("Generator Piramid 1.0");

            Console.WriteLine("Ile ma mieć stopni?");
            int ilosc = int.Parse(Console.ReadLine());

            Console.WriteLine("A z czego ma być zrobiona?");
            char znak = char.Parse(Console.ReadLine());

            Console.WriteLine("Ostatnie pytanie: normalna(1) czy odwrócona(2) ?");
            string input = Console.ReadLine();

            switch (input.ToLower())
            { 
                case "1":
                Console.WriteLine("Wybrałeś normalną:");
                    {
                        for (int rzad = 0; rzad < ilosc; rzad++)
                        {

                            for (int przestrzen = ilosc - rzad; przestrzen > 0 ; przestrzen--)
                            {
                                Console.Write(" ");
                            }

                            for (int kolumna = 0; kolumna < (2 * rzad + 1); kolumna++)
                            {
                                Console.Write(znak);
                            }

                            Console.WriteLine();
                        }
                        Console.WriteLine("Zakończono obliczanie.");
                        Console.ReadKey();
                        break;
                    }

                case "2":
                    Console.WriteLine("Płyniesz pod prąd? Oto Twoja 'KONSTRUKCJA':");
                    {
                        for (int rzad = ilosc; rzad > 0; rzad--)
                        {

                            for (int przestrzen = rzad; przestrzen < ilosc  ; przestrzen++)
                            {
                                Console.Write(" ");
                            }

                            for (int j = (2 * rzad - 1); j > 0 ; j--)
                            {
                                Console.Write(znak);
                            }

                            Console.WriteLine();
                        }
                        Console.WriteLine("Zakończono obliczanie!");
                        Console.ReadKey();
                        break;
                    }
                default:
                Console.WriteLine("Jesteś pewien co robisz?");
                Console.WriteLine("Policz jeszcze raz i wróć");
                break;
            }
            Console.ReadKey();
        }

 

 

Podobne pytania

0 głosów
2 odpowiedzi 5,405 wizyt
pytanie zadane 4 listopada 2018 w C i C++ przez assassin Gaduła (3,260 p.)
0 głosów
1 odpowiedź 2,988 wizyt
pytanie zadane 31 października 2016 w C# przez am49 Początkujący (420 p.)
0 głosów
1 odpowiedź 1,359 wizyt
pytanie zadane 5 listopada 2018 w PHP przez Pawelczak22 Nowicjusz (180 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

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

...