Проблеми с задача 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
{
}
}
}
}
Здравейте. А някой може ли да обясни логиката за свързващата част на двете стъкла. В презентацията от лекцията е даден следния код за нея:
if (i == (n-1) / 2 - 1)
Console.Write(new string('|', n));
else
Console.Write(new string(' ', n));
Защо проверката за брояча е if (i == (n-1) / 2 - 1)?
Мерси предварително.
@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 (вярно)
при мен горният и долният ред са извън цикъла така в цикъла ми остават
n - 2 = row
и от там по средата между "стъклата"
проверявам ако i % 2== 0
прчатам i = row / 2; => ' | ' n - пъти
else i = row / 2 + 1; => ....
разписвам си всичко колкото мога по просто - така успявам да проследявам какво се случва в кода , та дори и да е с няколко реда по-дълъг и в случаи че имам грешка я намирам много бързо
все пак изпитът ще е само 4 часа :)
по този начин ползвам i от цикъла за реда в които ще се отпечатва връзката между стъклата а i ми е равно на 1
при четни например 4 - печатам на 2рият ред
при нечетните на следващия
Здравейте, моля за помощ.При вход 3 конзолата принти (https://pastebin.com/KsgMcg3C) :
****** ******
*////* *////*
*////*|||*////*
****** ******
вместо
вход
изход
3
****** ******
*////*|||*////*
****** ******
https://pastebin.com/RusiQE5h - ето корегирания код ако средата между "стъклата" не отговаря по условие предполагам ще успееш да я наместиш или пиши ще я оправим.проблема не беше само в двата реда като го оправих спря да изписва въпросната среда.
Коригирах решението, но пак не се получва :( https://pastebin.com/YPe1iWFU
погледни отново моята поправка , печата си всичко нормално , всичко което е закомрнтирано в кода тоест зелено е излишно.
да, получи се :) Благодаря :)
A може ли да ми обясниш какво казваме с знак "?" в този ред?
var midlePart = n % 2 == 0 ? (n - 2) / 2 : (n - 2) / 2 + 1;
това е иф елс проверка нарича се още тернарен оператор , подходяща е за такива единични присвоявания например ако числото е четно го събери с нещо си ако е нечетно извади от числото нещо и така,
също работи и за тру и фолс
синтаксиса е следния -
(Условие, т.е. логическа проверка с >= <= == != ) ?(ако е вярно) : (иначе нещо си...)
ето по подробни примери
int a = 5; int b = 7; int max = a > b ? a : b ; - т.е. ако а е по-голямо макс е равно на а иначе б.
или следното Console.WriteLine(a > b ? a : b ) - отпечатва по голямото
могат и да се влагат но е много грозно и не разбираемо и не на последно място заедно с тернарните оператори немогат да се ползват
break continiue return и тнт.