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
coaster avatar coaster 412 Точки

Много писане падна за тази 11-та задача - Number As Words, и ще ми е жал да не я пусна тук, просто за споделяне на още една идея, въпреки че вероятно никой не се е излъгал да я направи по такъв lame начин. Тук видях различни варианти - с методи, с масиви и т.н., наистина много интересни решения, дори ме е малко яд на себе си, но карай... свърши тя :D

Решение:
NumberAsWords

1
mantodeus avatar mantodeus 17 Точки

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

 

1. Problem 1 - Exchange If Greater

2. Problem 2 - Bonus Score

3. Problem 3 - Check for a Play Card

4. Problem 4 - Multiplication Sign

5. Problem 5 - The Biggest of Three Numbers

6. Problem 6 - The Biggest of Five Numbers

7. Problem 7 - Sort 3 Numbers with Nested Ifs

8. Problem 8 - Digit As Word

9. Problem 9 - Play with Int, Double and String

10. Problem 10 - Beer Time

11/12. Soon

 

 

0
RoYaL avatar RoYaL Trainer 6849 Точки

За сега ще изкоментирам само 1вата задача, че ми направиха впечатление две неща:

 

- Първото е, че официалниат език в програмирането е Английски. Променливи с имена "numeroUno" или "nomerEdno" не са приемливи

- Второто е, че виждам излишна ELSE конструкция и код написан два пъти:

Това по-долу се принтира и ако се влезе в ИФ блока и ако не се влезе. И принтира едни и същи променливи. Не може ли да бъде извън иф-а и всъщност да няма ELSE?

Console.WriteLine("Numbers are {0} {1}", numberUno, numberDos);

1
mantodeus avatar mantodeus 17 Точки

Приемам забележката за имената на променливите, принципно ги наименовам правилно, написах първата по време на курса набързо и не й обърнах внимание.

За if блока не съм съгласен - ако влезе вътре разменя стойностите на променливите, ако първата е по-голяма от втората като се ползва трета междинна, това си е елементарно. Ако условието не е изпълнено принтира стойностите, както са подадени.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Добре, ще го обясня така :)

 

 

int x = 1;

int y = 2;

 

if (y == 2)

{

   x = 8;

}

Console.WriteLine(x);

 

Какво става тук? Ако "Y" е 2, хикс ще стане 8. После ще принтира 8. Ако "Y" не е 2, хикс ще остане 1. После ще принтира 1. Такъв е и твоят случай. Искаш да кажеш, че е по-добре да сложа WriteLine-а във иф блока и после в else блок отново?

 

 

0
RoYaL avatar RoYaL Trainer 6849 Точки

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

 

В отговор на:

 

------

coaster

Хитро решение, харесва ми. Тези от нас, които се сетят за този метод на масивите, ще спестят прилично количество редове код. Всъщност за всичко в С# си има методи и можем да си улесним работата доста, ако ги знаем, а ако не - пишем по 300 реда код за някакви все още малки задачки.. :)

Аз направих тази задача със switch case конструкцията, работи вярно, но е ненужно дълга: CheckForAPlayCard. Ще потърся и още начини, благодаря за тази "подсветка"!

 

------

 

Няма как да се "сетиш" за някой метод, ако не го знаеш :) Вариантите са два, когато си начинаещ - или да си страхотен теоретик, да си изчел една-две книжки по въпроса и после като почнеш да кодиш, фотографската памет да ти казва какво си прочел, или да ползваш гугъл :)

 

Признавам, в случая може би имам предимство, тъй като съм писал на PHP малко и знам, че там има in_array знаеш може би какво търся :) Но със C# се сблъсквам за пръв път, и честно казано повечето решения, които правя и не се налага да имат няколко стотин иф-а съм ги търсил в гугъл. Търсил съм какъв е най-лесният вариант да сумираш елементи в масив, да ги умножиш, да намериш нещо от масив и прочие неща, за да си облекча работата.

 

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

 

Когато за пръв път се сблъсках с програмиране, направих 2 неща с яко цикли и иф-ове и почна да ми писва - и започнах да търся още тогава, когато не знаеш какво са масиви, аджеба, няма ли по-лесен начин да се опрости този хамалски труд. А да ви кажа със всяка година назад във времето информацията се намираше все по-трудно, дори и при наличието на интернет :) В момента е песен, с 99% от проблемите с които ще се сблъскаме/те, вече хората са се сблъскали и са показали оптималните решения за това.

 

Просто смятам, че след 2рата решена задача с разтегливо решение от ифове и цикли е време да почне да се изпреварват нещата, които се преподават на лекциите. Или поне от момента, в който ви стане лесно и пишете ифове и цикли без да се замисляте за синтаксиса.

 

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

0
ViValDam avatar ViValDam 15 Точки

За тези които си ги знаят кандишъналите - няма нужда да ги упражняват с иф и суитч- на за нас начинаещитеsmile ,чудесни задачи - всеки ден усещам, как напредвам и ми става по-лесно - вече правя целите  домашни за малко повече от 1 ден докато в началото ми отнемаха по няколко дена !

 

Аз лично , не се ровя из интернет , за готови решения , а си ги правя сама, като ползвам учебника на Наков (английския) и любимата ми страница дотНетПърлс !

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

 

 

 

1
ViValDam avatar ViValDam 15 Точки

Пускам моята 10 задача и тук , защото поразгледах, и никой не я е направил като мен ,пък и много от решенията дават грешки, а моето решение си е авторско и не използва готовите конструкции на ДейтТайм smile освен разбира се форматът му.

Console.WriteLine("Want to have a beer with me? Let's meet at the bar! At what time ?\n");
string wantBeerS = Console.ReadLine();
DateTime wantBeerDT;

if (DateTime.TryParse(wantBeerS, out wantBeerDT))
{
//AM working time
string barsOpenAMS = "12:00 AM";      //midnight 00:00 in 24h system
string barsClousedAMS = "03:00 AM";   // 03:00 in 24h system
DateTime barsOpenAMDT = DateTime.Parse(barsOpenAMS);
DateTime barsClousedAMDT = DateTime.Parse(barsClousedAMS);

//PM working time
 string barsOpenPMS = "01:00 PM";        //13:00 
 string barsClousedPMS = "11:49 PM";     //23:49 
DateTime barsOpenPMDT = DateTime.Parse(barsOpenPMS);
DateTime barsClousedPMDT = DateTime.Parse(barsClousedPMS);

if (wantBeerDT >= barsOpenPMDT && wantBeerDT <= barsClousedPMDT)
{
      //bars open PM-time
      Console.WriteLine("\nbeer time\n");
}
else if (wantBeerDT >= barsOpenAMDT && wantBeerDT < barsClousedAMDT)
{
     //bars open  AM-time
     Console.WriteLine("\nbeer time\n");
}
else //bars are closed
{
      Console.WriteLine("\nnon-beer time\n");
}
}
else //invalid input for time
{
      Console.WriteLine("\ninvalid time\n"); 
}

1
t.kanchev avatar t.kanchev 25 Точки

Това е моето рещение на 10 задача.

 

 

 

using System;
using System.Globalization;

class BeerTime
{
static void Main()
{
Console.WriteLine("Enter a time in format “hh:mm tt”\n(an hour in range [01...12], a minute in range [00…59] and AM / PM designator)\nFor example 01:00 PM");
string UserInput = Console.ReadLine();
DateTime ParseResult;

if (DateTime.TryParseExact(UserInput, "hh:mm tt", new CultureInfo("en-US"), DateTimeStyles.None, out ParseResult))
{
DateTime UserInputTime = DateTime.Parse(UserInput);

string tt = UserInputTime.ToString("tt");
int hour = int.Parse(UserInputTime.ToString("hh"));
int minute = int.Parse(UserInputTime.ToString("mm"));

if (tt == "AM" && hour >= 0 && hour <= 2 && minute >= 0 && minute <= 59)
{
Console.WriteLine("Beer Time");
}
else if (tt == "PM" && hour >= 1 && hour <= 12 && minute >= 0 && minute <= 59)
{
Console.WriteLine("Beer Time");
}
else
{
Console.WriteLine("Non-beer time");
}
}
else
{
Console.WriteLine("invalid time");
}
}
}

0
ViValDam avatar ViValDam 15 Точки

р  Т Канчев

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

Със събиране и изваждане и без Систем Глобализейшън surprised

 

Това TryParseExact по какво се различава от TryParse? Не съм го виждала до сега .

 

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

 

Ето я моята задача 11 , с малките и големите букви - работеща безпогрешно , но бая дълга yell ,ама то идва от многото   switch statements и от правилното им форматиране .wink

 

http://pastebin.com/rhw91xKz

 

Външният цикъл  while си го слагам за да не рестартирам за всяка стойност програмата - да не се чудиш за какво е пък това smile

 

 

 

1
t.kanchev avatar t.kanchev 25 Точки

При твоето решение когато въведеш 13:00 РМ примерно или 14,15 и тн РМ не ти дава invalid time.

TryParseExact съм го използвал, тъй като позволява да зададеш точно формата, в който да парсне въведеното време, и така когато въведеш различно време от това което е посочено в условието дава invalid time.

0
ViValDam avatar ViValDam 15 Точки

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

Ако пък я е решил - здраве да е !smile

 

Console.Write("Enter a = ");
double a = double.Parse(Console.ReadLine());


Console.Write("Enter b = ");
double b = double.Parse(Console.ReadLine());

 

bool isGreater = a > b;

if (isGreater == true)
{
     Console.WriteLine(b + " " + a);
}
else
{
     Console.WriteLine(a + " " + b);
}

1
RoYaL avatar RoYaL Trainer 6849 Точки

Тя не е решена така, защото не е такова условието - искаше се да се разменят стойностите на променливите, а не реда на принтиране:))))

0
ViValDam avatar ViValDam 15 Точки

Роял, а как според теб как проверявам, без стойности , кое е по-голямото число?

Картинки ли проверявам, коя е по-голяма от другата ?

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

Супер си е решението ! 

Ти все бързаш, да правиш заключения , ама ми харесваш , защото мислиш и расъждаваш !smile

0
RoYaL avatar RoYaL Trainer 6849 Точки

Аз ли греша, или идеята беше да се ПРИСВОЯТ стойности на А и на Б разменени :) т.е. А да стане Б и Б да стане А. Не е пред мен условието, но така съм запомнил? :)

1
arsoman avatar arsoman 419 Точки

Предлагам решение само с 4 If-a! Ако някой е предложил подобно, моля за извинение, не съм гледал всички постове.

Решение на 6-та задача с 4 IFs

0
Cocolino avatar Cocolino 36 Точки

Като сме тръгнали да намаляваме if-овете, ето моето решение с един: http://pastebin.com/4ycskn25 cheeky

0
14/06/2015 20:30:16
ViValDam avatar ViValDam 15 Точки

 

Вярно е че задачата е в темата е за условни оператори и се очаква решение с if , но така стана много джиджано решението wink

Булевите променливи все повече ми харесват - вършат много работа и то бързо.

1
ViValDam avatar ViValDam 15 Точки

Ето я и моята 12 задача:

int sum ;
bool found = false;
int[] number = new int[5];

//reading input

for (int i = 0; i < 5; i ++)
{
     Console.Write("\n\nEnter a value for number " + (i+1) + " : ");
     number[i] = int.Parse(Console.ReadLine());
}
Console.WriteLine();

//creating the sums

for (int onStart = 0; onStart < 5; onStart ++)
{
     sum = 0; //seting every time sum to 0, befor starting to calculate the next sum of numbers
     for (int onEnd = onStart; onEnd < 5; onEnd ++)
     {
           //suming
            sum = sum + number[onEnd]; 
            if (sum == 0)
           {
                found = true;
                //printig the zero subset 
                Console.WriteLine();
                for (int i = onStart; i < onEnd; i++)
                {
                      Console.Write("{0} + ", number[i] );
                }
                Console.Write(number[onEnd]);
                Console.Write(" = 0\n\n");
            }
      }
}
if (found == false)
{
     Console.WriteLine();
     Console.WriteLine("no zero subset\n\n");

}

 

 

1
moonlight avatar moonlight 0 Точки

Моята версия на Problem 9. Play with Int, Double and String

 

Много се старах и мисля, че проверките ми най-накрая работят :)

 

class PlayWithIntDoubleStr
{
static void Main()
{
Console.WriteLine("Please choose a type:");
Console.WriteLine("1 --> int");
Console.WriteLine("2 --> double");
Console.WriteLine("3 --> string");
string userChoice = Console.ReadLine();
int choice;

while ((!(int.TryParse(userChoice, out choice))) || ((choice == 0) || (choice > 3)))
{
Console.Write("Invalid choice. Enter a valid number from 1 to 3:");
userChoice = Console.ReadLine();
}

switch (choice)
{
case 1:
Console.WriteLine("You choose to play with \"Integer\"");
Console.Write("Now enter an integer number: ");
string userInt = Console.ReadLine();
int uIntChoice;
while (!(int.TryParse(userInt, out uIntChoice)))
{
Console.Write("Invalid choice. Enter a valid number: ");
userInt = Console.ReadLine();
}
uIntChoice++;
Console.WriteLine("Your integer number was increased by one and now its value is " + uIntChoice);
break;
case 2:
Console.WriteLine("You choose to play with \"Double\"");
Console.Write("Now enter an number of type \"Double\": ");
string uDoub = Console.ReadLine();
double uDoubChoice;
while (!(double.TryParse(uDoub, out uDoubChoice)))
{
Console.Write("Invalid choice. Enter a valid number of type \"Double\": ");
uDoub = Console.ReadLine();
}
uDoubChoice++;
Console.WriteLine("Your number was increased by one and now its value is " + uDoubChoice);
break;
case 3:
Console.WriteLine("You choose to play with \"String\"");
Console.Write("Now enter some symbols of your choice: ");
string userStr = Console.ReadLine();
Console.WriteLine("Your string was a little bit modified and now looks like that: {0}*", userStr);
break;

default:
break;
}

 

0
ViValDam avatar ViValDam 15 Точки

 Още едно решение на 1 задача, с метода  Math.Max () ,които сравнява 2 променливи и връща , като резултат, по-голямата от тях.

Има и метод MathMin(), който пък връща по-малката от двете променливи.

{
     Console.Write("a = ");
     int a = int.Parse(Console.ReadLine());


     Console.Write("a = ");
     int b = int.Parse(Console.ReadLine());


     int greater = Math.Max(a, b);
     Console.WriteLine(greater ==a ? b+" "+a : a+" "+b);

}

1
Vasilsk avatar Vasilsk 109 Точки

Забелязах една грешка,която я има при всички,които са си постнали решенията в тази тема(или поне при тези, чиито решения гледах). На 5 и 6 задача с намирането на най-голямото число, задачата не показва нищо ако 2 или повече числа са равни. Гледам,че някои са използвали накрая:

else {

Console.WriteLine(numberFive);

}

По този начин кода работи за примерите от домашното(справка 4-тото и 5-тото число са равни и най-големи), но ако първото и второто число например са равни и са най-големи, кода няма да покаже кое е най-голямото. Това се оправя като на всяко сравнение се добави и знак за равно "=", т.е. ">=".

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