[C#] Домашно Operators and Expressions - 9 задача


6

 

Не съм сигурен дали разбрах правилно задачата (9 от - Operators and Expressions) но това успях да направя. Ако някой е разбрал нещо друго моля да пише.

 

namespace System
{
    class PointIsWithinCircleOutOfRectangle
    {
        static void Main()
        {
            Console.Title = "Is the Point within a circle K( (1,1), 3) and out of rectangle R(top=1, left=-1, width=6, height=2)?";
 
            Console.WriteLine("Please enter a value X.");
            string valueX = string.Empty;
            valueX = Console.ReadLine();
            double valueXint = 0;
 
            Console.WriteLine("Please enter a value Y.");
            string valueY = string.Empty;
            valueY = Console.ReadLine();
            double valueYint = 0;
 
            bool correctValueX = double.TryParse(valueX, out valueXint);
            bool correctValueY = double.TryParse(valueY, out valueYint);
 
            if (correctValueX && correctValueY)
            {
                Console.WriteLine("Your point is with coordinates " + valueXint + " and " + valueYint);
                valueXint = valueXint - 1;
                valueYint = valueYint - 1;
                if (9 >= (Math.Pow(valueXint, 2) + (Math.Pow(valueYint, 2)))) //is the point in a circle K
                {
                    if ((valueXint >= -2) && (valueXint <= 4) && (valueYint >= 0) && (valueYint <= 2)) // is the point in rectangle R but not in circle K
                    {
                        Console.WriteLine("The point is in a circle K((1,1), 3) and is in a rectangle R(top=1, left=-1, width=6, height=2)");
                    }
                    else
                    {
                        Console.WriteLine("The point is in a circle K((1,1), 3) and not in a rectangle R(top=1, left=-1, width=6, height=2)");
                    }
                }
                else if ((valueXint >= -2) && (valueXint <= 4) && (valueYint >= 0) && (valueYint <= 2)) // is the point in cirkle K but not in rectangle R
                {
                    Console.WriteLine("The point is in a rectangle R(top=1, left=-1, width=6, height=2) and not in a circle K((1,1), 3)");
                }
                else
                {
                    Console.WriteLine("The point is not in circle K((1,1), 3) and in not in a rectangle R(top=1, left=-1, width=6, height=2)");
                }
            }
            else
            {
                Console.WriteLine("Wrong values.");
            }
        }
    }
}
 
 
 
Edit: Промяна на заглавието спрямо правилата - http://forums.academy.telerik.com//15664CircleAndRectangleCircleAndRectangle



Отговори



1
Ето го и моето решение от няколко прости реда.Начинаеща съм и приемам всякакви коментари и збележки.
http://pastebin.com/NuA5zKjJ



0

Здравей, Светлана,

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

Проверката ти дали точката принадлежи на кръга е абсолютна вярна. Обаче проверката дали точката НЕ Е в праноъгълника е сгрешена. Може би това се дължи на донякъде подвеждащото условие на задачата. Действителната картина на разположението на правоъгълника в координатната система можеш да намериш на стр.6 от тази тема.

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

(< 1 || y > -1) && x < -1

с

> -1 || x > 1

Това де факто ти дава отсичане по горната и лявата стени на правоъгълника.

 

Относно стилът на писане:

1. Прекалено дълъг булев израз обикновено го прави трудно четим. Аз например използвах две булеви променливи - една за принадлежност на кръга и втора - за принадлежност на правоъгълника.

2. Описателни имена на променливите. Простото "result" не говори нищо на колегата, който чете кода. За булева променлива обикновено се използват имена от рода на isWithinCircle, belongsToCircle  и пр.

3. Вторият резултат от проверката:

""The given point is  not within the circle and outside of the rectangle.""

Звучи подвеждащо. Може да се изтълкува като че точката едновременно не е в кръга и е извън правоъгълника. Вариантите са два: или да разпишеш останалите три случая или да ползваш нещо от рода на "The given point is either outside the circle or within the rectangle or both."

4. Проверявай входящите данни за да избегнеш случаи, в които програмата ти гръмва просто защото потребителят не е съобразил и е чукнал запетая вместо десетична точка или нещо от сорта. Това се постига много лесно с употреббата на TryParse вместо Parse:

 

Console.Write("Enter X coordinate of the point: ");
string strX = Console.ReadLine();
if (! double.TryParse(strX, out x))
{
       Console.WriteLine("Incorrect input!");
}
else
{ .... }
 
 
5. Добавянето на коментари на някои ключови места от програмата също е желателно. Предполагам, че в случая липсват тъй като си искала да представиш самия алгоритъм.
 
 
Надявам се, че съм бил поне малко полезен :-)
 
Симеон

от STzvetkov (1330 точки)


0
Благодаря за коментара наистина е доста изчерпателен :) Правих задачата по чертежа от страница 1 и може би от там идва и грешката.Ще я разгледам пак. Начинаеща съм и има много още да уча:) така че приемам всякакви препоръки и забележки. Още веднъж благодаря за коментара.



0

Колеги бих искал да споделя моето решение на задача 9 от темата"Оператори и изрази". Няма да се хваля но при положение , че се занимавам с програмиране от 3-4 седмици и програмата работи...а бях на кота нула като започнах, това си е постижение. Ето и линк към решението:

http://pastebin.com/rh0QdA7C

Ще приема всякакви положителни и отрицателни коментари.


от Владимир Миланов (0 точки)


0
Чертежа не съм го качил , но ще поясня, че правоъгълника се намира спрямо окръжността отчасти в 1,2,3 квадрант и обхваща целия четвърти квадрант.

от Владимир Миланов (0 точки)

0
В условието на задачата има лека грешка вместо долния десен ъгъл да има координати (5,5), правилното е при горен ляв ъгъл (-1,1) долния десен ъгъл логично е да бъде (5,-5).

от Владимир Миланов (0 точки)


0

Здравейте,

моля за коментар и върху моето решение на задачата:

http://pastebin.com/ANAxJVe5

Дали не пропускам нещо или е валидно?

Благодаря предварително!


от toc (0 точки)