Loading...
ivandm5 avatar ivandm5 17 Точки

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

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

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

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

0
StefkaVasileva avatar StefkaVasileva 250 Точки

Започни с разделянето на ромба на две части и за всяка от тях използвай цикъл.
 Моят подход при решаването на тези задачи е първоначално да проверя колко реда спрямо 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 49 Точки

Имаш меко казано, адски странен подход към тази задача... Но да кажем че основно имаш 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 328 Точки

Ето примерно решение и от мен. Накратко: създаваме един стринг от "* ", които се повтарят 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.