Професионална програма
Loading...
+ Нов въпрос
SnaikBG avatar SnaikBG 1 Точки

Проблеми с задача 10. Слънчеви очила

Здравейте имам проблем с решаването на задачата за четане на слънчави очила по доло е моето решение всичко си се чертае както трябва освен междинната рамка на която нещо не мога да схвана логиката.

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

namespace Sunglasses
{
    class Program
    {
        static void Main(string[] args)
        {
            int glassesSize = int.Parse(Console.ReadLine());

            if (glassesSize >= 3 && glassesSize <= 100)
            {
                for (int currentRow = 1; currentRow < glassesSize + 1; currentRow++)
                {
                    string space = string.Concat(Enumerable.Repeat(" ", glassesSize).ToArray());
                    string asterix = string.Concat(Enumerable.Repeat("*", glassesSize * 2).ToArray());
                    string italic = string.Concat(Enumerable.Repeat("/", 2 * glassesSize - 2).ToArray());
                    string straight = string.Concat(Enumerable.Repeat("|", glassesSize).ToArray());

                    if (currentRow == 1 || currentRow == glassesSize)
                    {
                        Console.WriteLine("{0}{1}{0}", asterix, space);
                    }
                    else if (currentRow == (glassesSize -1 ) / 2 - 1)
                    {
                        Console.WriteLine("{0}{1}{0}{2}{0}{1}{0}", "*", italic, straight);
                    }
                    else
                    {
                        Console.WriteLine("{0}{1}{0}{2}{0}{1}{0}", "*", italic, space);
                    }
                }
            }
            else
            {

            }
        }
    }
}

 

0
Programming Basics
Plamen27 avatar Plamen27 599 Точки
Best Answer

Ето фикс именно на твоя код:

http://pastebin.com/xWqDWZdy

Обаче аз като цяло бих препоръчал друг подход към решението, но нямам време да го разписвам.

Да и ползвай за код по-дълъг от 15 реда (pravila) ползвай pastebin или аналози понеже ако всички почнат да постват така ще се получават някакви чаршафи и цялостно няма да е никак приятно да се чете форума.

0
13/08/2016 16:05:37
SnaikBG avatar SnaikBG 1 Точки

Благодаря, и се извинявам за постването на кода, не бях чел правилата :)

0
Plamen27 avatar Plamen27 599 Точки

:) В правилата също пише как е прието да се благодари на форума. :)

0
Martin999 avatar Martin999 5 Точки

ето го моето решение , доста си играх и стигнах до отг :D

http://pastebin.com/WqrUnPH3

0
09/10/2016 22:01:17
dakata avatar dakata 26 Точки

Аз се постарах да я реша чрез използване на вложени цикли: http://pastebin.com/fEhgUnhd

0
petqpetrova avatar petqpetrova 0 Точки

Здравейте. А някой може ли да обясни логиката за свързващата част на двете стъкла. В презентацията от лекцията е даден следния код за нея: 

if (i == (n-1) / 2 - 1)

      Console.Write(new string('|', n));

   else

      Console.Write(new string(' ', n));

Защо проверката за брояча е if (i == (n-1) / 2 - 1)?

Мерси предварително.

 

0
MartinBG avatar MartinBG 3113 Точки

@petqpetrova

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

Според дадените примери към задачата, свързващата част се намира в центъра (n / 2) при нечетно входно число (n) и един ред по-нагоре от центъра (n / 2 - 1), при четен вход.

Примери:

n = 3

center = 3 / 2 = 1 (при целочислено делене се губи дробната част), т.е. свързващата част ще е на втория ред (редовете се броят от 0: 0, 1, 2 ....)

n = 4

center = 4 / 2 - 1 = 2 - 1 = 1 , т.е. и в този случай сързващата част ще е на втория ред.

 

Примерен код за намиране на реда:

center = n / 2;

if (n % 2 == 0) { center--; }

 

Аз лично предпочитам по-компактното записване:

center = n / 2 - ((n % 2 == 0) ? 1 : 0);

 

EDIT:

Това уравнение също би трябвало да работи и е най-близо до предложеният от Вас код:

center = (n + 1) / 2 - 1;

 

Проверка:

n = 3 : (3 + 1) / 2 - 1 = 4 / 2 - 1 = 2 - 1 = 1 (вярно)

n = 4 : (4 + 1) / 2 - 1 = 5 / 2 - 1 = 2 - 1 = 1 (вярно)

 

 

 

0
02/03/2017 14:21:36
spzvtbg avatar spzvtbg 582 Точки

при мен горният и долният ред са извън цикъла  така в цикъла ми остават

 n - 2 =  row

и от там  по средата между  "стъклата" 

проверявам ако i % 2== 0 

прчатам i = row / 2; => ' | ' n - пъти

else i = row / 2  + 1; =>  ....

разписвам си всичко колкото мога по просто - така успявам да проследявам какво се случва в кода , та дори и да е с няколко реда по-дълъг и в случаи че имам грешка я намирам много бързо

все пак изпитът ще е само 4 часа :)

 

0