Софтуерно Инженерство
Loading...
+ Нов въпрос
JOHNY avatar JOHNY 197 Точки

[Homework] Programming Basics - Primitive Data Types and Variables - Problem {8} - IsoscelesTriangle - търсено решение (цикъл)

Привет колеги,

Първо ще се обърна към модераторите - моля, НЕ заключвайте тази тема! Съгласно правилата използвах търсачката, прегледах всички (дублирани и незаключени теми) и най-прясната е ТАЗИ. Тя е от две страници, в които има различни кодове, предложения, хипотези и т.н. Пускайки това решение там смятам, че ще е объркващо за всеки новобранец да се рови из различните варианти и да разбере какво точно се случва (и малко код е много за нас, а много е ужасно МНОГО). В края на темата е зададен въпрос за решение с цикъл, но явно никой не го е направил, защото липсва отговор. 

Още веднъж - най-учтиво Ви моля, с оглед на горното и с желание за дискусия да не заключвате темата ако предизвиква интерес. Обещавам, че в противен случай лично ще я заключа и ще си посипя главата с пепел (същият триъгълник, но с по-подходящи символи примерно). Надявам се, че 9-тата тема със същото заглавие ще се радва на липсата на катинар като останалите 8. Благодаря Ви предварително!

 

И така...

Видях, че хората са питали за решение с цикъл.

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

  1. Не познавам операторите и командите;
  2. Стори ми се интересно да може да се развива, тоест триъгълника да не е просто с 5 символа за основа, а с 15, 50 или колкото ми се струва забавно в момента;
  3. Мързи ме да пиша много и почти повтарящи се редове, които отговарят на т.2.

Кодът може да видите ТУК, като на всеки ред съм описал какво точно правя.

Ако на някой не му е ясно, алгоритъмът е следния:

  • Задавам си символа, който ще принтвам (по условието на задачата е в случая, но може да си го смените с нещо интересно за Вас);
  • Задавам си променливи "a","b" и "c", като използвам "a" за интервалите в триъгълника, "b"  - за интервалите отляво на триъгълника, а "c" - за броя печатане на символи в основата. //Бонус за развитие- лесно можем да поискаме от потребителя от колко символа да е триъгълника. Проверка за числа и хоп - ето ти желано от него триъгълниЩЕ.
  • Принтвам си върха ( в конкретния код ръчно е поставен на мястото си, но мога да го барна, така че да е автоматично поставен (n на брой интервали, в зависимост от броя редове), както правя с интервалите по-долу);
  • Започвам цикъл, в който намалявам интервалите "b" вляво от триъгълника с по 1 (за да върви както трябва), увеличавам "а" с 2 (логично за да се разширява в двете посоки, тоест "a"=2 х стъпката на "b"). Печатам всеки ред, докато "a" не стане 11 (толкова съм си избрал като пример, но спокойно може да променяте стойностите "а" и "b" едновременно и до 1000000);
  • След приключването на цикъла принтвам основата, като броя символи е с 2 повече от стойността на a (един отляво и един отдясно за да прилича на триъгълник изобщо);
  • Потупвам се по рамото, самопрегръщам се и компилирам.

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

Бих възприел с удоволствие подобрения в стил "нулево ниво", тоест не преписваме, не крадем и използваме само "елементарни" и преподавани оператори. Високо ще оценя отделеното от Вас време и за по-сложни решения, но предупреждавам, че вероятно няма да ги разбера.

Благодаря предварително на всички отзовали се!

 

P.S. Хрумна ми и друго решение за цикъла, при което ще избегнем цикъл в цикъл. Печатаме половината триъгълник и огледалото му (триъгълника е равнобедрен, разделете го мислено по височината му - условно печатаме string a - лявата половина, който е зададен и string -a - дясната половина). За съжаление нямам нужните познания, това е само хипотеза.

1
Основи на програмирането 08/04/2015 23:32:26
angeldown avatar angeldown 7 Точки

"

  • Започвам цикъл, в който намалявам интервалите "b" вляво от триъгълника с по 1 (за да върви както трябва), увеличавам "а" с 2 (логично за да се разширява в двете посоки, тоест "a"=2 х стъпката на "b"). Печатам всеки ред, докато "a" не стане 11 (толкова съм си избрал като пример, но спокойно може да променяте стойностите "а" и "b" едновременно и до 1000000);"

Логиката ти е правилна до частта "...до 1000000"

С големи числа ще си развалиш фигурата/фигурите, които изписваш. Трябва да се ограничаваш с размерите на екрана или прозореца в който принтваш. Помисли за лесен начин по който можеш да си центрираш фигура в дадена област. Ако срещнеш затруднение, попитай и ще ти подскажем :)

0
JOHNY avatar JOHNY 197 Точки

Прав си на 100% за красотата , говоря теоретично, а не като графичен дизайнер.:)

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

Относно питането - мислех, че съм питал още в първия пост, но ето - питам те - дай моля те свежата идея, която така любезно пропусна в предишния си отговор.tongue-out

Благодаря!

1
angeldown avatar angeldown 7 Точки

Заповядай.

Да предположим, че имаш да центрираш нещо (фигура, текст) в прозорец (екран) със широчина 100 единици (примерно). Широчината на нещото ти е 40 едници (примерно) , тогава намиране на началната ти точка х ще ти бъде  (100 - 40)/2 .

Сега можеш сам да се опиташ да намериш началната точка на нещо със широчина 30 едници, ако нещото трябва да бъде разположено в интервал с начало 20 и край 70, който е част от прозорец (примерно) със широчина (0 - 100). :)

Ако пак ти трябва помощ, питай.

0
JOHNY avatar JOHNY 197 Точки

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

Прегледах учебната програма и май съвсем скоро ще минем и през това. Изнервя ме опцията да създам алгоритъм за секунди, но да не мога да го кажа с код, но и това ще мине.:) 

Да те прехвърля и в друга посока? Една от задачите,  е да се разменят взаимно стойностите на две числа. И това направих с цикъл (+/- 1 със стъпка разликата между двете). Замислих се обаче какво би било при 3,4 и повече числа, когато се четат от конзолата и са производни. Мислех да намеря сбора на четирите и да ги движа (две средни към две крайни при 4 числа), докато сбора не е отново еднакъв. На 5-тата секунда се сетих, че 9 и 6 е 15, при първа стъпка 8 и 7 пак е 15 и ето, че имаме грешен отговор. Решение може би би било да се вземе сбора от четирите числа и НОК, след което да почне движението им както го описах и да се прави проверка за сбор и НОК едновременно. Подозирам, че може и да има частни случаи, но не съм готов веднага да напиша кода и проверя. Виждам, че си на "ти" с математиката, а и със C#. Ако ти се занимава и провериш дали хипотезата е вярна, ще почерпя с удоволствие.:)

Между другото - какво мислиш за принтване на "огледален образ" в едно с нормалния (постскриптума на първия пост)? Възможно ли е и как да се получи? Ще работи добре при правилни/симетрични фигури от всякакъв тип.:)

 

1
09/04/2015 00:33:55
enevlogiev avatar enevlogiev 1169 Точки

Поздравления за задачата колега, ако си отворен към малко офф-топик хинтове: в Pastebin може да зададеш Syntax Highlighting да е за C# : )

3
JOHNY avatar JOHNY 197 Точки

Прости ми невежеството - поправено е.laughing

1
i.alidzhikov avatar i.alidzhikov 63 Точки

Имаш задачата да чертаеш по конзолата. На изпита по Основи на програмирането ще имаш задача, в която се иска да чертаеш по конзолата и която ще бъде много по-брутална. Като цяло задачите за чертане са много приятни и веднъж научиш ли ги, няма да имаш грижи. Сега ще ти опиша какво трябва да направиш при подобен тип задачи. Първо трябва да определиш кои от редовете ти са ститични (т.е нямат обща връзка със съседните си) и кои са нестатични (т.е имат зависимост със някой от съседните редове). При статичните редове трябва да използваш метода WriteLine(), а при нестатичните - да въртиш цикъл. И може би най-важното нещо е да определиш зависимостта във всеки отделен ред и в броя повторенията на нестатичните редове. ТУК (15:52) ще видиш как се прилага този подход. Без него просто няма как да си решиш трета задача от изпита. Прилагам и моето решение на IsoscelecTriangle, което е с цикъл и работи без проблем за произволни положителни нечетни числа. Имам няколко забележки към теб. Използвай Console.OutputEncoding = Encoding.Unicode;, за да можеш да печаташ наистина Copyright символа. Именувай си променливите със смислени имена, избягвай имена от сорта на "a", "b", "c" и избягвай наличието на висящи литерали (например какво е това a != 11, какво е това 11?). Ако имаш въпроси, ще се радвам да помогна. : )

1
JOHNY avatar JOHNY 197 Точки

Привет!

Благодаря за съветите и критиките (основателни са).

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

Играх си през dotnetfiddle ( с XP съм на този комп), а там за съжаление Console.OutputEncoding = Encoding.Unicode; не се възприема. Затова и го няма в кода.

Утре (след лекциите) ще прегледам твоето решение и препоръчания клип (през телефон съм в момента и не е практично) и ще питам конкретно ако нещо не ми е ясно.

Благодаря за идеите и споделеният ти проект. Лека вечер от мен!

1
JOHNY avatar JOHNY 197 Точки

Привет отново!

Видях кода ти за триъгълника и определено ми харесва как си го направил. НАистина - отне ми доста време за да вдяна идеята, но отва е заради липсата ми на познания. Решението е чудесно и изглежда перфектно. Браво!

Колкото до задачата с очилата, ето и моето решение.

Изградено е на базата на това, че :

  • Чертаем най-горната част от рамката и най-долната (аналогично на основата на триъгълника);
  • Чертаем рамката и стъклата с изключение на първия и последния ред (вече ги имаме);
  • Чертаем "моста".

В решението си заложих на цикъл (ех, тези цикли!)и малко логика. Помощ за правилното изпълнение на алгоритъма ми ползвах от Катя, за което и благодаря. Без нейна помощ резулатат щеше да е същият, но щях да загубя вероятно часове само за да намеря правилното оформяне на всеки един оператор.

Цикъла служи основно за чертаенето на стъклата и рамката, но същевременно прави проверка дали N е в средната си стойност. Ако това е така, то е време да начертаем и моста.

Изглежда ми по-просто от показаното на видеото (което ти ми изпрати) и работи абсолютно еднакво.

Ако някога решим, че искаме да използваме и четни числа за N (нечетни са за да има среден ред и равен на брой отгоре и отдолу), то нищо не ни пречи да променим САМО проверката за средата и всичко ще работи перфектно.

 

Мнение?

2
09/04/2015 20:43:55
i.alidzhikov avatar i.alidzhikov 63 Точки

Справил си се много добре. Задобравяш с всяко следващо решение. Обаче не ми беше целта да те накарам да решиш конкретно тази задача. След линка бях сложил (15:52), с което исках да ти кажа да превъртиш до 15 минута и 52 секунди. Там Богомил демонстрира на живо как се подхожда при такъв тип задачи. Просто исках да схванеш идея, но нищо лошо, че си решил и някоя друга задача. Ако искаш да си гарантираш 500-те точки на изпита, съветът ми към теб е да изрешиш целия Judge. ; )

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

"Помощ за правилното изпълнение на алгоритъма ми ползвах" JOHNY

Искам да изкажа огромната си благодарност към JOHNY за идеите му за алгоритми!

Аз съм взела вече другаде изпита C#1 (отговарящ на C# в Basics SoftUni) с отличен, но покрай JOHNY за първи път имам чуството че реално се занимавам с програмиране - алгоритмите за решение, които предлага са светкавични, и до един са изпълними и работят! Покрай него започнах и аз да се престрашавам да измислям собствени алтернативни решения, и взе помалко да ми се получава :)

Предложи ми например да програмирам начертаването на само една половина от Isosceles Triangle, да я запазя, и после без нови изчисления да отпечатам огледално копие на първата половина - ами да, възможно е :)

Дотук стигнах до 3 различни варианта на решение:

http://pastebin.com/UVNdu1tB

http://pastebin.com/NWZsaiv3

http://pastebin.com/6ExqRke2

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

Background: впечатлена съм въз основа на 46 години живот сред програмисти - майка ми е програмистка от 1969 година, на историческия IBM System/360.

1