Проблем с задачка 6.Ромбче от звездички - Софтуерен университет

Проблем с задачка 6.Ромбче от звездички - Софтуерен университет

+ Нов въпрос
ivandm5 avatar ivandm5 17 Точки

Проблем с задачка 6.Ромбче от звездички

Здравейте на всички подготвям се за изпита на 20 ноември за основи на програмирането. Като гледам лекциите онлайн и след това си решавам задачките. Но проблема е, че забих на тази задача и гледам 5 пъти различни лектори лекции на тази тема как решават задачата и не мога логически сам да седна и да структурирам for циклите и да си измисля вариант за решение на задачат. Забих на нея и съм до там. Някой ще даде ли идея какво да правя. 

Тагове:
VanessaShopping avatar VanessaShopping 48 Точки

Дай код-а да видим какво си направил и по възможност и условието на задачата за да не го търсим :)

0
StefkaVasileva avatar StefkaVasileva 259 Точки

Започни с разделянето на ромба на две части и за всяка от тях използвай цикъл.
 Моят подход при решаването на тези задачи е първоначално да проверя колко реда спрямо n трябва да принтирам- в този случай горната част на ромба ще е n на брой реда, а долната n-1. След това проверявам всеки символ по какъв начин спрямо n-променя своя брой.
За пример взимаме n със стойност 4. На първият ред има n-1 на брой интервала , които със всеки следващ ред намаляват с 1. За тази цел в една променлива записваме техният брой (първоначално той ще бъде 3) и на всяка итерация на цикъла ще намаляваме нейната  стойност с еденица. Това което за мен беше малко по трудно е по какъв начин да принтирам "* ",  след дълго мислене забелязах че имаме зависимост между номера на реда и колко пъти се среща  "*  ". На пътвия ред имаме един път "* ", на втория два пъти т.е "* * "  и т.н.  до n. Това означава, че ти трябва твори цикъл, които ще започва от 0  до реда-1  т.е ако сме например на 2 ред той ще се се повтори 2 пъти и съответно ще принтираме два пъти стринга "* " .  

При втората част прилагаш абсолютно същата логика, само че на обратно. Цикълът вместо да започва от 1 ще започва от n-1 до 1. И за вторият цикъл с който принтираш "* "  ще зашочва от реда до 1.

1
31/10/2016 12:12:21
KonstantinLupov avatar KonstantinLupov 34 Точки

Добра практика.

1
ivandm5 avatar ivandm5 17 Точки

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RombusOfStars
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            for (int rowsss = n; rowsss >= 1; rowsss--)
            {
                for (int cols = rowsss - 1; cols > 0; cols--)
                {
                    Console.Write(" ");

                }
                for (int colss = 1; colss <= n; colss++)
                {
 
                        Console.Write(" *");
 
                     
                    

                }
                Console.WriteLine();
            }
            for (int rowsss = 1; rowsss <= n; rowsss++)
            {
                for (int cols = 1; cols <= rowsss - 1; cols++)
                {
                    Console.Write(" ");

                }
                for (int colss = n; colss >= rowsss + 1; colss--)
                {

                    Console.Write(" *");


                }
                Console.WriteLine();

            }
            Console.WriteLine();
        }
    }
}
 

Тука долния ред стана ама първия ред го омотах не мога 30 мин да направя нищо.

0
29/10/2016 13:59:35
dmaknev avatar dmaknev 46 Точки

Имаш меко казано, адски странен подход към тази задача... Но да кажем че основно имаш 2-3 грешки:

0. Почвам от 0, защото не съм сигурен дали мога с пълно право да нарека това грешка, но буквално всичко ти е на обратно, ама толкова всичко и толкова на обратно, че по някаква случайност грешката е вярна и е сработило на половина...(даже не е и на половина, а една идея по-малко, защото средния ред няма как да ти се получи с такъв алгоритъм, освен ако не го извадиш извън него...) Но реших да не се тормозя с кривата ти логика, а тръгнах от това че все пак нещо работи...

1. Обърнах правилно долната част така че да е ОК и отгоре, а именно вложените форове да са точно същите и в двете части, нямам идея защо си ги правил различни? И ето как трябва да изглежда горната част, като забележи, че е с 1 итерация ои-малко, не до 1, а до 2, за да не дублираме средния ред:

            for (int rowsss = n; rowsss >= 2; rowsss--)
            {
                for (int cols = 1; cols <= rowsss - 1; cols++)
                {
                    Console.Write(" ");
                }
                for (int colss = n; colss >= rowsss + 1; colss--)
                {
                    Console.Write("* ");

                }
                Console.WriteLine();
            }

2. Другия проблем е, че печаташ с " *" и поради това няма как за средния ред да имаш 0 интервала в началото, а до колкото си спомням беше така по условие? Т.е. там се почва от звездичка, а и да имаше как, то звездичката няма да има как да се отпечата в така зададения от теб доста смахнат алгоритъм... :P (освен както казах, ако намалим и долната страна с 1 и отпечатаме отделно средния ред, но няма смисъл, щом може да се вкара в алгоритъма без да се усложнява излишно...) А именно, просто печатай с "* " и си го поправи и долу, както съм го дал горе.

3. И тъй като не го проверявам в джъджа, чак накрая когато проверих за 1 и 2, защото едва ли ще ти работи за тях така... забелязах, че всъщност грешката е още по-голяма и печаташ с по 1 ред по-малко всеки път, независимо от входа... И понеже както споменах в началото, не съм осмислял алгоритъма ти, а и ме мързи да мисля кой знае колко в 2-3 през нощта... И не стана да го оправя с просто добавяне на 1 ред... Оставям това на теб ;)

А ето ти и по-адекватното(според мен) решение на тази задача, така както съм го направил преди няколко седмици, когато съм бил на твоето място ;)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rhombus_of_Stars
{
    class Program
    {
        static void Main(string[] args)
        {

            int n = int.Parse(Console.ReadLine());

            if (n > 0) Console.WriteLine(new string(' ', n - 1) + "*" + new string(' ', n - 1));

            for (int i = 1; i < n; i++)
            {
                Console.Write(new string(' ', n - i - 1));
                for (int k = 0; k < i; k++)
                {
                    Console.Write("* ");
                }
                Console.Write("*");
                Console.WriteLine(new string(' ', n - i - 1));
            }

            for (int i = n - 2; i > 0; i--)
            {
                Console.Write(new string(' ', n - i - 1));
                for (int k = 0; k < i; k++)
                {
                    Console.Write("* ");
                }
                Console.Write("*");
                Console.WriteLine(new string(' ', n - i - 1));
            }
            if (n != 1) Console.WriteLine(new string(' ', n - 1) + "*" + new string(' ', n - 1));
        }
    }
}

0
ivandm5 avatar ivandm5 17 Точки

Здравей, мерси за коментара и за това, че си споделил твоето решение различно е интересно и по различен начин.
След доста гледане тестване и гледане направих от моя код да изкара в judge системата 100%
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RombusOfStars
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int rows = n;
            for (int currentRow = 0; currentRow < rows; currentRow++)
            {
                for (int currentCol = 0; currentCol < n - (currentRow + 1); currentCol++)
                {
                    Console.Write(" ");   
                }
                for (int curennt = 0; curennt < currentRow + 1; curennt++)
                {
                    Console.Write("* ");
                }
                Console.WriteLine();
                 
            }
 
            for (int rowsss = 1; rowsss <= n; rowsss++)
            {
                for (int cols = 1; cols <= rowsss - 1; cols++)
                {
                    Console.Write(" ");

                }
                for (int colss = n; colss >= rowsss + 1; colss--)
                {

                    Console.Write(" *");


                }
                Console.WriteLine();

            }
            Console.WriteLine();
        }
    }
}
 

 

1
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Ето примерно решение и от мен. Накратко: създаваме един стринг от "* ", които се повтарят n на брой пъти. За целта използваме new string() с произволен символ, който после заместваме с помощта на функцията Replace(). После с два for-цикъла отпечатваме горната и долната част, като на всеки ред се слагат определен брой интервали (отново с new string()) и определен брой '* ', които взимаме с помощта на функцията Substring(). Успех със задачата!

using System;

class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        string s = new string('o', n).Replace("o","* ");
        for (int i = 0; i < n; i++)
            Console.WriteLine($"{new string(' ', n-i-1)}{s.Substring(0, 2*i+1)}");
        for (int i = n-2; i>=0; i--)
            Console.WriteLine($"{new string(' ', n-i-1)}{s.Substring(0, 2 * i + 1)}");
    }
}

 

0
dakata avatar dakata 26 Точки

Решение чрез използване на цикли:

for (int i = 1; i <= input; i++)
{
    for (int spaces = 0; spaces < input - i; spaces++) Console.Write(" ");
    for (int stars = 0; stars < i; stars++) Console.Write("* ");
    for (int spaces = 0; spaces < input - i; spaces++) Console.Write(" ");
    Console.WriteLine();
}
for (int i = input - 1; i > 0; i--)
{
    for (int spaces = 0; spaces < input - i; spaces++) Console.Write(" ");
    for (int stars = i; stars > 0; stars--) Console.Write("* ");
    for (int spaces = 0; spaces < input - i; spaces++) Console.Write(" ");
    Console.WriteLine();
}

 

0