Лице на правоъгълник в равнината - домашна работа
Здравейте ,
имам проблем с компилирането на една от задачите .
Ста въпрос за задача 8 - Лице на правоъгълник в равнината
Във Visual Studio след компилиране получавам търсения резултат , но в judge.softuni.bg ми дава грешка.
Къде греша ?
var a = double.Parse(Console.ReadLine());
var b = double.Parse(Console.ReadLine());
double area = a * b;
double perimeter = 2 * (a + b);
Console.WriteLine(area);
Console.WriteLine(perimeter);
Съгласен съм колега.
Не знам видеото на коя лекция си гледал(ако си дистанционна, като мен), но в това, което аз гледах също не беше обърнато внимание на Math.Max и Math.Min. Оставам с впечатлението, че на упражненията се казват неща, които на лекциите не се обясняват. И да, много е гадно, че упражненията не се записват.
Всъщнот задачата е много готина и с цел точно да ни подсети за тези фукции като math.abs/max/min. За това са дадени и отрицателни стойности-за да видиш, че изхода не ти излиза и да те подсети от къде идва проблема. Но за тези, които се бъхтим сами вкъщи(или поне за някои, като мен) е малко по-трудно.
Аз гледам на Ивайло Димитров. Определено му харесвам подхода и как води. Не се оплаквам. Просто като онлайн, както повечето колеги в такъв тип обучение, съчетаваме още 1000 неща, и като се нагласих да си правя домашните от упражненията установих, че половината неща въобще нямам идея как да станат, пердвид, че не сме ги минавали. Като гледам и следващата задача "Конзолен междувалутен конвертор" - се използват IF-ове, което ще се разглежда другата седмица.
Да и аз него го гледам.
Ами да и аз така си помислих. Просто няма как да го направиш с 4 валути без if.
Прегледах пак презентацията от 8ми и if няма.
А тогава у мен назрява въпроса, защо имаме домашно върху нещо, което не е взето на лекция, а ще се вземе на 15.09 и защо срокът за него е едва до 16.09?
Колеги, гледам сме на едно и също ниво с вас - тепърва започваме да учим програмиране, онлайн сме, та даже гледаме един и същ лектор.
Относно сроковете: всяка събота взимаме лекция и към нея имаме домашни. Всяка неделя имаме упражнения и домашни към нея. Та, домашните от лекцията в събота трябва да са готови в срок от 7 дни, тоест до другата събота, същотото е и с упражненията - взимаме ги в неделя и до другата неделя трябва да сме готови с домашните. Та относно задачата, която дискутирате за валутите, точно вчера по нея написах един коментар с подробно обяснение как я реших, като се стремях да не използвам if-еlse конструкция, нито swich case и т.н., защото по график още не сме ги изучили и гледам с минимални знания да реша задачата, без да използвам неща, които все още не сме взели.
В самото начало на курса ни пообясниха за MSDN документацията (но повече за нея пише в книгата на Наков http://www.introprogramming.info/wp-content/uploads/2018/07/CSharp-Principles-Book-Nakov-v2018.pdf ), в чиято библиотека има каквото на човек му трябва за всякакви видове езици, но специално за dictionary (в задачката ми) изрових от http://www.tutorialsteacher.com/csharp/csharp-dictionary.
Вкарваме dictionary (досущ речник), въвеждаме в него типове променливи и техните стойности и ги съхраняваме(в случая валутите и курсовете им), след което ги изписваме на конзолата в 3 отделни реда (в първия въвеждаме число, втория е за 1вата валута, от която преобразуваме във 2рата и съответно самата 2ра валута, в която искаме да видим крайния резултат) и печатим на конзолата, като си подполагаме със F2 да закръгли до втората запетая. В Judge ми даде 100/100.
namespace Currency_Converter
{
class Currency_Converter
{
static void Main(string[] args)
{
double money = double.Parse(Console.ReadLine());
string firstCurrency = Console.ReadLine();
string secondCurrency = Console.ReadLine();
Dictionary<string, double> dict = new Dictionary<string, double>()
{ {"BGN", 1} , {"USD", 1.79549} , {"EUR", 1.95583} , {"GBP", 2.53405} };
double result = money * (dict[firstCurrency] / dict[secondCurrency]);
Console.WriteLine($"{result:F2} {secondCurrency}");
}
}
}
А относно dict - може да промените името му на currencies например или както пожелаете, но аз реших да го оставя така.
Надявам се да съм била полезна. Късмет!
Въпросната задача я пропуснах. Иначе елегантно решение на "IttyBitty".
Поздрави!
Моя код е по-скоро за графата "как да не го правим", но исках да не използвам твоя и същевременно да използвам взетото към момента за if-else. Да, голяма хамалогия е. Освен, че не са наименувани възможно най-добре, по-скоро мисля, че логиката би била интересна на някой. Ако намери грешка да се обърне към Judge- 100/100. :) Аз имам своите съмнения, но ще ги оставя тайна за сега :)))
Иначе-безспорно, твоя код е много "фин".
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CurencyConverter
{
class Program
{
static void Main(string[] args)
{
double sum = double.Parse(Console.ReadLine());
string exchangeFrom = Console.ReadLine(); //BGN,USD,EUR,GBP
string exchangeTo = Console.ReadLine(); //BGN,USD,EUR,GBP
double toBgn = 1;
double bgnToUsd = 1.79549;
double bgnToEur = 1.95583;
double bgnToGbp = 2.53405;
////BGN
if (exchangeFrom == "BGN" && exchangeTo != "EUR" && exchangeTo != "GBP") //BGN-USD
{
Console.WriteLine(Math.Round(sum / bgnToUsd, 2));
}
else if (exchangeFrom == "BGN" && exchangeTo != "USD" && exchangeTo != "GBP") //BGN-EUR
{
Console.WriteLine(Math.Round(sum / bgnToEur, 2));
}
else if (exchangeFrom == "BGN" && exchangeTo != "USD" && exchangeTo != "EUR") //BGN-GBP
{
Console.WriteLine(Math.Round(sum / bgnToGbp, 2));
/////USD
}
else if (exchangeFrom == "USD" && exchangeTo != "EUR" && exchangeTo != "GBP") //USD-BGN
{
Console.WriteLine(Math.Round(sum * bgnToUsd, 2));
}
else if (exchangeFrom == "USD" && exchangeTo != "BGN" && exchangeTo != "GBP") //USD-EUR
{
Console.WriteLine(Math.Round(sum * bgnToUsd / bgnToEur, 2));
}
else if (exchangeFrom == "USD" && exchangeTo != "BGN" && exchangeTo != "EUR") //USD-GBP
{
Console.WriteLine(Math.Round(sum * bgnToUsd / bgnToGbp, 2));
}
//////EUR
else if (exchangeFrom == "EUR" && exchangeTo != "USD" && exchangeTo != "GBP") //EUR-BGN
{
Console.WriteLine(Math.Round(sum * bgnToEur, 2));
}
else if (exchangeFrom == "EUR" && exchangeTo != "BGN" && exchangeTo != "GBP") //EUR-USD
{
Console.WriteLine(Math.Round(sum * bgnToEur / bgnToUsd, 2));
}
else if (exchangeFrom == "EUR" && exchangeTo != "BGN" && exchangeTo != "USD") //EUR-GBP
{
Console.WriteLine(Math.Round(sum * bgnToEur / bgnToGbp, 2));
}
////GBP
else if (exchangeFrom == "GBP" && exchangeTo != "USD" && exchangeTo != "GBP") //GBP-BGN
{
Console.WriteLine(Math.Round(sum * bgnToGbp, 2));
}
else if (exchangeFrom == "GBP" && exchangeTo != "BGN" && exchangeTo != "EUR") //GBP-USD
{
Console.WriteLine(Math.Round(sum * bgnToGbp / bgnToUsd, 2));
}
else if (exchangeFrom == "GBP" && exchangeTo != "BGN" && exchangeTo != "USD") //GBP-EUR
{
Console.WriteLine(Math.Round(sum * bgnToGbp / bgnToEur, 2));
}
}
}
}
Сещам се, поне за 2 хипотези в които тази логика няма да работи, но в конкретния случай, явно върши работа. Макар, че межу това да напиша 20 реда и 3 реда, бих предпочел 3те, еснествено.
Да, и аз обмислих същия вариянт, но ми се струваше твърде дълго, а гледам да избягвам да пиша подобни кодове. Иначе браво, върши работа кода на Nlzlatkov.
Нещо не виждам частта от коментара ти за toyshop. И на мен ми гърми, а в visual работи. Но явно нещо грешно имплементираме условието. Според мен разковничето е в if-a, т.е. каква ще напишем в него. Че if-a е свързан с това, дали играчките са 50, повече или по-марко, това е ясно. Пробвах да вкарам променливите в if-else, пробвах извън и като цяло упоритж не гледах видеото, макар, че когато се решиш да го прегледам установих, че не сме я решили. С моето взех 60/100.
Да, тъкмо попитах за Toy Shop къде бъркам и точно след това си намерих грешката и просто edit-нах коментара. :D Иначе бях изпуснала едното "=" на втория if, където пресмятах дали ще стигнат парите за ваканцията. Даваше ми още в самото начало 90/100 и доста упорито търсех грешката. Вече е 100 от 100. Ето и моя код: https://pastebin.com/32Wh0wAS (тук не съм добавила все още равното при изчисленията дали печалбата ще стигне за ваканцията и ако да, да изпише "Yes, ...! "). Мисля, че пиша що-годе четливи кодове.
Първо въвеждам в конзолата входните данни, после написвам цените на всяка играчка на отделен ред, пресмятам всички спечелени пари като умножавам всяка една играчка с нейната цена и ги събирам. След това смятам всички играчки общо, въвеждам променливата discount (отстъпка) и пиша, че е равна на 0, защото след това от if-а се променя стойността на отстъпката и трябва да я използвам по-нататък в кода, а не да "живее" само в if-а. След това смятам крайната печалба, наема (той задължително се вади, не е нужден if за него), също и печалбата (profit) и накрая използвам втория if, където ако печалбата е по-голяма ИЛИ РАВНА! (за това равно говорех, че съм изпуснала :D) да изпише на конзолата, че парите стигат, else, че не достигат. :D
Здравейте колеги, относно задачата с лицето на правоъгълника стигнах до задънена улица и честно казано като човек който няма опит, немога да разбера какво не е наред. Програмата работи, вади значи до втория след десетичната запетая, но.... тука идва голямото НО , закръгля ... , а не трябва ..
var x1 = double.Parse(Console.ReadLine());
var y1 = double.Parse(Console.ReadLine());
var x2 = double.Parse(Console.ReadLine());
var y2 = double.Parse(Console.ReadLine());
var lenght = Math.Abs(x1 - x2);
var weight = Math.Abs(y1 - y2);
var area = Math.Round(lenght * weight);
var perimeter = Math.Round(2 * (lenght + weight));
Console.WriteLine($"{area:f2}");
Console.WriteLine($"{perimeter:f2}");
Не моля за правилно решение, а за разяснение къде бъркам , и какво трябва да се случи, ако ще дори само насока :)
Здравей,
Нямам условие на задачата... Nе разбирам, защо ползаваш двойно закръгляване на еднакви суми:
var area = Math.Round(lenght * weight);
var perimeter = Math.Round(2 * (lenght + weight));
Console.WriteLine($"{area:f2}");
Console.WriteLine($"{perimeter:f2}");
Относно Math.Round, ако не укажеш до кой знак да се закръглява, той маха всичко след запетайката!
(вероятно точно този ефект не го искаш)
double round = Math.Round(45.67852, 2); // 45.68 - в този случай закръгляване до втори знак
Поздрави,
Иван