Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

rosenrusev avatar rosenrusev 175 Точки

[Homework] C# Basics - Conditional Statements

Здравейте,

 

Отварям тема за новото домашно.

Решенията ми ще следват едно по едно след като съм готов с всяко от тях :)

1. Problem 1 - Exchange If Greater . Използвал съм  XOR алгоритъм за размяна на стойностите на две променливи без да е необходима трета. Повече инфо тук: XOR_swap_algorithm .

Така представено решението ми работи само за целочислен тип.

В тази задача третата проверка е объркана. Трябва резултата да е 4.5 5.5 (по условие). Втората грешка в условието е, че стойностите не са целочислени (третата проверка).

2. Problem 2 - Bonus Score . Използвал съм switch-case.

3. Problem 3 - Check for a Play Card. Използвал съм switch statement.

4. Problem 4 - Multiplication Sign. Допълнителна информация към задачата Subset_sum_problem . Така написана задачата обхваща 8 случая при комбинация на всички позиции с положителна и отрицателна стойност. Използвал съм if оператори.

5. Problem 5 - The Biggest of Three Numbers . Използвал съм if-else.

6. Problem 6 - The Biggest of Five Numbers. Използвал съм 5 условия if-else.

7. Problem 7 - Sort 3 Numbers with Nested Ifs . Използвал съм if-else.

8. Problem 8 - Digit As Word . Използвал съм switch statement.

9. Problem 9 - Play with Int, Double and String . Използвал съм switch statement.

10.//TODO. Как се парсва дата и време Инфо от msdn .

11.//TODO

12.//TODO

Тагове:
35
Programming Basics
rosenrusev avatar rosenrusev 175 Точки

В задача 5 си промени променливите да не са целочислен тип, защото последните две проверки няма да ти минат от задачата :)

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

0
AntyfrizZz avatar AntyfrizZz 238 Точки

Задача 7 не ти издържа на условие a > c > b. Погледни я и ако грешката е в мен извинявай :)

 

2
Bojidar_At avatar Bojidar_At 6 Точки

За задача 7, ред 29, мисля, че трябва да: "a>c"

0
beBoss avatar beBoss 507 Точки

На PlayCard може да ползваш цикли. Тоест слагаш всичките карти дадени ти в домашното, в един масив, после го обхождаш и проверяваш всяка карта от масива съвпада ли с въведената и ако да изписваш yes, ако не No и така.

Пример:

 

string[] cards = new string[] { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };

bool found = false;
foreach (string card in cards)
{
   if (card == enteredCard)
   {
      found = true;
      break;
   }
}

if (found == true)
{
    Console.WriteLine("yes");
}
else
{
    Console.WriteLine("no");
}

или още по-лесен начин:

if (Array.IndexOf(cards, enteredCard) >= 0)
{
   Console.WriteLine("yes");
}
else
{
  Console.WriteLine("no");
}

18
ZvetanIG avatar ZvetanIG 907 Точки

beBoss супер си! Много ми харесаха решенията, които предлагаш за  3 задача.

2
beBoss avatar beBoss 507 Точки

Радвам се, че ти харесват, надявам се и да ти помагат с нещо :)

2
Matrix avatar Matrix 1092 Точки

Алгоритъмът от първата задача, доста често се налага да се използва:

Ето един алгорритъм за размяна на стойностите на две променливи a и b, като се използва трета променива, като буфер (c): http://pastebin.com/Ra2yYWp6

 

Има друг вариант за размяна, без да се използва трета буферна променлива:

int a = 3;

int b = 5;

 

// тук разменяме стойностите
a = a + b;
b = a - b;
a = a - b;

7
beBoss avatar beBoss 507 Точки

Това, какво общо имаше с тази тема?

0
milen8204 avatar milen8204 296 Точки

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

0
Matrix avatar Matrix 1092 Точки

Това не е ли темата за решения на задачите от Условни конрукции, в която поствате решенията си?

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

2
slav_02bg avatar slav_02bg 11 Точки

Да и аз сега се чудя за първата задача от Conditional Statements за третата проверка, наистина има грешка, или може би е уловка да не използваме int, а друга променлива, какво мислите, дайте съвет?

0
milen8204 avatar milen8204 296 Точки

Мисля, че хората които правят домашните са под голямо напрежение и едвам смогват да създадат материалите за домашно, все пак почват от 0. Затова е нормално някъде да има някоя техническа грешка в бързината. Ако съдя по себе си, всеки път като си прегледам решението все някъде има някоя грешчица, ту правописна, ту техническа, ту нещо съм забравил, ту съм копирал от другаде и не съм променил... и т. н. т. С две думи сигурно е грешка допусната в бързината. :)

1
Matrix avatar Matrix 1092 Точки

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

 

1
milen8204 avatar milen8204 296 Точки

@Matrix , колега нали ще ти гръмне при Parse-ването към int като подадеш число с плаваща запетая. Ако имаш предвид, че трябва да вземем само int-а как тогава резултата е  "5.5 4.5", а не "4 5" при подадени 5.5 4.5, нещо не мога да си обясня уловката. Може би за да искараме този резултат, трябва да има проверка дали подаденото число е int и ако не е int да отпечатаме това което ни е подадено. Но според мен за първа задача няма логика да има такава уловка, която трудно се схваща, би следвало да е лесна и просто да приложиш медота, за да видиш как работи.

0
Matrix avatar Matrix 1092 Точки

Здравей, колега

Първа задача не е решена коректно...  В условието се иска стойностите на "а" и "б" да бъдат разменени....Т.е. ако "а" е равно 5, а "б" е равно на 2, след това да станат а=2, б=5... Това което си направил в момента е просто да размениш последователността, с която се принтират двете променливи....Ако накрая добавиш два реда

 

Console.WriteLine(a);
Console.WriteLine(b);

 

Ще видиш, че стойностите им не са разменени

0
Fundamentalen avatar Fundamentalen 133 Точки

Оправих го.

1
ZvetanIG avatar ZvetanIG 907 Точки

Едно решение на 5 и 6 задача.   По принцип алгоритъмът работи за неограничен брой променливи, ако използваме цикъл и масив.

http://pastebin.com/tP6HNvXe

Идеята е следната: Използва се буферна променлива, в която се съхранява най-голямата стойност.   Всяко число се сравнява с буферната променлива и ако е по-голямо от нея се променя стойността на buffer  с по-голямото число. Така всяко следващо число го сравняваме с най-голямото от предходните.

 

2
garbuchev avatar garbuchev 18 Точки

Ето и едно решение на 12-та задача без да се изписват всички варианти:

P12. ZeroSubset

Понеже не съм писал обяснения по кода, това което прави е следното:

Взимаме петте числа n1, n2, n3, n4, n5.
Взимаме и пет коефициента k1, k2, k3, k4, k5,  където k може да ни е 0 или 1.

Така ако разгледаме sum = n1 * k1 + n2 * k2 + n3 * k3 + n4 * k4 + n5 * k5 може да ни даде всички възможни комбинации от сборове на n1, n2, n3, n4, n5 (като заместваме k с 0 или 1).
Затова взимаме един цикъл от 1 до 32(2 на 5-та степен). Представянето на числата от 1 до 32 в бинарен вид ни дава всички комбинации на 5 числа и заместваме k според бинарното представяне на числото.

Например вариант 6 (00110):
k1 = 0 (позиция #0), k2 = 1 (позиция #1), k3 = 1 (позиция #2), k4 = 0 (позиция #3), k5 = 0 (позиция #4).

Така цикъла ни превърта всички варианти и когато попадне на вариант sum == 0 го печата.
Проверката (counter != 2) && (counter !=4) && (counter != 8) && (counter !=16) я правя за да махна вариантите с по 1 число.

Може би трябва да се добави една проверка за пет нули.

PS: Github-a ми е ново нещо и да ме извинявате ако не съм го нагласил, както трябва.
Ако има забележки/коментари, пишете.

 

8
pencho.dobrev avatar pencho.dobrev 0 Точки

Колко "subsets" би следвало да получиш, ако въведеш пет нули? Колко получаваш?

"Вариантите с по 1 число" в смисъл ако има въведена само една нула, да не се извежда ли? Защото мисля, че ако нулата ти е първото въведено число, тя ще се изведе като "Zero subset" само с една нула.

Много ми харесва решението ти.

0
garbuchev avatar garbuchev 18 Точки

@ pencho.dobrev: този въпрос (за вариантите при повтарящи се числа и 0-ли) го зададoх на един от асистентите още като бях на лекцията и разглеждах какво имаме за домашно. Не получих отговор, който да е 100% конкретен. Затова и така съм го оставил, т.е. без да проверявам за повторения. Самото условие е: "Assume that repeating the same subset several times is not a problem."

0
p.tseperski avatar p.tseperski 21 Точки

Доста интересно решение. Аз лично не бих се сетил за такъв вариант, за това браво и евала! :) Аз го направих селската със 100 if-a :D Но ще се поуча от теб и вече ще търся и друга перспектива. ;)

0
HPetrov avatar HPetrov 822 Точки

Първите 10 задачи реших, че няма много смисъл да ги линквам понеже са по леснички и повечето хора не би трябвало да имат много проблеми с тях. Представям ви моето решение на 11 и 12-та задача:

11. NumbersAsWords

12. ZeroSubsets

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

11-та задача съм е направил малко по дълга отколкото има нужда ми се струва но се постарах каквото и число да се въведе (в определения интервал разбира се) да бъде коректно форматирано при принтирането. Това включва главни и малки букви, "and", точки и разбира се "Press any key to continue..." да бъде на нов ред. С методи кода би се съкратил доста, но не съм толкова запознат още с тях, че да ги използвам, но и мисля, че пак ще иска повече редове писано за да бъде така форматирано както искам.

За 12-та задача използвах просто наготово кода си, който бях използвал когато се упражнявах за изпит но с леки модификации. Като цяло използвам 1 прост масив, в който нареждам въведените числа, после правя няколко магии с бинарна репрезентация на конкретната комбинация на числа, която правя (колегата garbuchev малко по-нагоре е обяснил по-подробно) и после когато бита на дадена позиция е 1-ца просто добавям числото на същата позиция в масива в един List<int>. Правя проверка след всяка комбинация дали сумата е 0, и ако е -> просто принтирам данните от List-а. Заедно с тази проверка проверявам и дали листа съдържа повече от 1 число в себе си за да избегна случайте когато от комбинации от 1 число (пр. "1, 2, 3, 0, 4" или "123, 0, 3253, 21312, 2"). Добавил съм и достатъчно пояснителни коментари за допълнителни насоки ако на някой не му е ясно какво точно правя.

2
garbuchev avatar garbuchev 18 Точки

И аз горе-долу така.
Ако има значение, можеш директно да си вкараш стойност:

TimeSpan endBeertime = new TimeSpan(3, 00, 00);
TimeSpan startBeertime = new TimeSpan(13, 00, 00);

Също така май може и директно да сравняваш стойности с ">" и "<".
 
Цялото ми решение в Github.
0
milen8204 avatar milen8204 296 Точки

Моето решение на проблем 10. Използвал съм DateTime, като правя една променлива с час преди бирата и една с час след бирата като тази след бирата е с един ден по - малко от тази преди. Ако въведената дат е AM ( data.Hour < 12 ), прибавям един ден към дните на въведената датата и след това сравнявам дали моята дата е между датите преди и след.

1
nikolai4enceto avatar nikolai4enceto 1 Точки

Това е моето решение :) Помъчих се малко с тези формати, но в крайна сметка мисля, че стана сполучливо
http://pastebin.com/enbczQNx

0
23/11/2015 11:26:59
ZvetanIG avatar ZvetanIG 907 Точки

Ето и моето решение на 12 задача. Опитах се да бъда максимално кратък и ясен.

http://pastebin.com/zrUHRbHp

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.