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
XmUrF avatar XmUrF 363 Точки

За Problem 1 доста си поиграх да го направя да сверява дали числата са цели или дробни. Не изглежда сложно като решение ама докато се сетя бая мислене падна. Тук е решението.

0
HPetrov avatar HPetrov 822 Точки

Програмата ти работи единствено при случаите когато въвеждаш цели числа. При дробни не им разменя стойността, и ако въведеш някакви стрингове също ги принтира. Пробвай просто с една проста проверка дали първото е по голяма от 2рото и ако да -> разменяй и принтирай. Но ползвай double.Parse -> така ще ти работи нормално и със цели числа и с дробни ;)

0
XmUrF avatar XmUrF 363 Точки

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

 

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

3
TodorovH avatar TodorovH 216 Точки

Съветвам те когато слагаш имена на променливи да започваш всяка следваща дума с главна буква, че в началото се чудих какво по дяволите е aisint и bisint! laughing

А виж ако бяха така aIsInt  и bIsInt друго щеше да е, а и е по правилата да се започват с малка буква и всяка следваща дума да започва с главна, ако името на променливата се състои от няколко думи!

Ето ти моето решение, което проверява за десетична запетая!

ExchangeIfGreater

1
alexxdim94 avatar alexxdim94 33 Точки

* Грешно решение *

0
ZvetanIG avatar ZvetanIG 907 Точки

Не ти работи кода, за всички часове дава "Invalid time!".

Грешката ти идва от този ред.

DateTime time = DateTime.ParseExact(Console.ReadLine(), "hh:mm tt", null);

Последният параметър ти е null и това ти хвърля изключение.   На таво място трябва да има променлива от тип CultureInfo.

 

Разгледай мойто решение: http://pastebin.com/TUBED7Ge

 

Когато използваш 

try

{}

catch (Exception)

{ }

компилатора не ти дава грешките и ти не може да разбереш какво става.

 

1
alexxdim94 avatar alexxdim94 33 Точки

Нямах идея, че е възможно да се зададе start time и end time, както си направил ти. Тотално съм я о*кал! laughing Махам решението, ще го направя по подобен начин на твоя! Благодаря!

0
dim4o avatar dim4o 288 Точки

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

0
XmUrF avatar XmUrF 363 Точки

Интересно решение си измислил. То по принцип с масив и вградената функция Math.Max става още по-бързо и лесно, но в условието е казано да не ползваме този вариант, явно идеята на измислилите задачата е изрично да ни накарат да тренираме If-else комбинациите, в случая използвайки nested ifs.

0
dim4o avatar dim4o 288 Точки

Ето я зад. 7 с вложени if. Много вложени. Иначе - да, идеята е да не изпозлваме готови методи, а да си правим живота интересен smile

0
kyamaliev avatar kyamaliev 209 Точки

И аз доста се чудих, ама в крайна сметка Math.Max не сортира нищо, просто ти казва кое е по-голямото. Поне така си мисля. Други на това мнение?

Иначе аз съм я решил само с if-ове, понеже това е идеята на задачата.

0
G.Burlakova avatar G.Burlakova 36 Точки

Решение на NumberAsWords. Проверките за валиден формат и интервал съм решила да се правят докато не се получи правилното число. И вместо switch съм използвала if-вове и търсене в масиви от стрингове за да се открие правилната дума, съответстваща на цифрата. Надявам се да е полезно решението и много моля за коментари, ако има някакви грешки. :)

1
mantodeus avatar mantodeus 17 Точки

Едно алтернативно решение без if на Пета задача, което е абсолютно приложимо и за 6та. Знам че трябва да е с if-ове за да се упражнят, но просто не се сдържах - като може да се напише с 1 ред, защо да пишем 10...

 

 

0
kittenlina avatar kittenlina 9 Точки

@rosenrusev: За първа задача не съм съгласна, че условието или третата проверка са объркани. По-скоро има уловка в задачата въведените променливи да се сравняват като Integers (цели числа), въпреки, че входа може да бъде и с дробни числа. Така например ако се парснат като float или double, но се сравнят с разлика >1, всички тестове ще работят коректно. Ето как може да стане това:

double a = double.Parse(Console.ReadLine());
double b = double.Parse(Console.ReadLine());

if (a-b>1)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
Console.WriteLine("{0} {1}",a,b);

 

0
rosenrusev avatar rosenrusev 175 Точки

Когато направих това, което ме посъветва се появи грешка (ако използвам тип double):

Operator '^' cannot be applied to operands of type 'double' and 'double'

и грешка (ако използвам тип float):

Operator '^' cannot be applied to operands of type 'float' and 'f'loat .

0
kittenlina avatar kittenlina 9 Точки

Да, прав си rosenrusev, така няма да стане, но може да се пробва да се парсне входа към Int и само ако е true (т.е. ако числата са от тип Integer, а не друг тип) да се сравнят техните стойности. Това отговаря и на условието: "Write an if-statement that takes two integer variables a and b and exchanges their values if the first one is greater than the second one." Ако числата не са от тип integer, просто принтираме а & b така, както са подадени ("As a result print the values a and b, separated by a space."). Ето това вече работи:

Console.WriteLine("Enter two variables: ");
var firstNumber = Console.ReadLine();
var secondNumber = Console.ReadLine();
int a;
int b;

if (int.TryParse(firstNumber, out a) && int.TryParse(secondNumber, out b))
{
a = int.Parse(firstNumber);
b = int.Parse(secondNumber);

if (a>b)
{
var swap = "";
swap = firstNumber;
firstNumber = secondNumber;
secondNumber = swap;
}
}
Console.WriteLine(firstNumber + " " + secondNumber);

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

0
XmUrF avatar XmUrF 363 Точки

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

1
dim4o avatar dim4o 288 Точки

Аз приемем, че 3:00 am не е бирено време. Вие как го разбирате ? Реших задачата по два начина. В първия използвам мтода split на string класа, а във второто решение използвам методите на DateTime. 

0
XmUrF avatar XmUrF 363 Точки

Ами да, съгласно примерите 3:00 am не е бирено време :). Първия момент го бях включил, тъй като видях, че 1:00 pm е включено като бирено време, но после видях, че в друг пример 3:00 am вече е извън часовия пояс :).

0
dim4o avatar dim4o 288 Точки

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

0
milen8204 avatar milen8204 296 Точки

Има логика 3:00 АМ да не е защото няма как да изпиеш бирата за секунди :).

1
oconne avatar oconne 113 Точки

ROSENRUSEV, може ли да провериш 6-та задача  "The Biggest of Five Numbers", мисля че алгоритама гърми на следният инпут: 4,4,4,4,1. Въобще на всеки инпут от рода а,а,а,а,х   където  х<а. Много бързах и ме извини ако съм в грешка.

0
Mitaka avatar Mitaka 45 Точки

Ето ги и моите решения, без звездичкте :) цък

 

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