Професионална програма
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
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 3149 Точки

@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
spzvtbg avatar spzvtbg 582 Точки

по този начин ползвам i от цикъла за реда в които ще се отпечатва връзката между стъклата а i ми е равно на 1

при четни например 4 - печатам на 2рият ред

при нечетните  на следващия

 

0
maleksieva avatar maleksieva 0 Точки

Здравейте, моля за помощ.При вход 3 конзолата принти (https://pastebin.com/KsgMcg3C) :

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

*////*   *////*

*////*|||*////*

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

вместо

вход

изход

3

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

*////*|||*////*

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

0
spzvtbg avatar spzvtbg 582 Точки

https://pastebin.com/RusiQE5h  -  ето корегирания код ако средата между "стъклата" не отговаря по условие предполагам ще успееш да я наместиш или пиши ще я оправим.проблема не беше само в двата реда като го оправих спря да изписва въпросната среда.

0
maleksieva avatar maleksieva 0 Точки

Коригирах решението, но пак не се получва :( https://pastebin.com/YPe1iWFU

0
spzvtbg avatar spzvtbg 582 Точки

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

0
maleksieva avatar maleksieva 0 Точки

да, получи се :) Благодаря :)

0
maleksieva avatar maleksieva 0 Точки

A може ли да ми обясниш какво казваме с знак "?" в този ред?

var midlePart = n % 2 == 0 ? (n - 2) / 2 : (n - 2) / 2 + 1;

0
spzvtbg avatar spzvtbg 582 Точки

това е иф елс проверка нарича се още тернарен оператор , подходяща е за такива единични присвоявания например ако числото е четно  го събери с нещо си ако е нечетно извади от числото нещо и така,

също работи и за тру и фолс

синтаксиса е следния - 

(Условие, т.е. логическа проверка с >= <= == != ) ?(ако е вярно) : (иначе нещо си...)

ето по подробни примери

int a = 5;  int b = 7;   int max = a > b ?  a  :  b ; - т.е. ако а е по-голямо макс е равно на а иначе б.

или следното Console.WriteLine(a > b ?  a  :  b ) - отпечатва по голямото

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

break continiue return  и тнт.

 

 

 

0