[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



Отговори



7

а това е чертежът.


CircleAndRectangleCircleAndRectangle


от hpashev (170 точки)


0
хм... аз Top = 1 го разбирам като горната дълга страна на правоъгълника и височината - от нея -2 - до -1 по Y...дали грешно го разбирам?!
А пък условието на същата задача в учебника съвсем ме обърка:
Напишете програма, която проверява дали дадена точка О (x, y) е вътре в окръжността К ((0,0), 5) и едновременно с това извън право­ъгълника ((-1, 1), (5, 5). Пояснение: правоъгълникът е зададен чрез координатите на горния си ляв и долния си десен ъгъл.

от anonymous (0 точки)

0
горен ляв връх на правоъгълника е с координати (-1;1)..според мен не ти е правилен чертежа.

от zhelyazkovn (2949 точки)



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

от AsenVal (3487 точки)


7

Първо чертежа ти е грешен, не си схванал условието, началото на горна лява точка ти е (1,-1), което ти е четвърти квадрант.


от Prophian (1234 точки)


0
Благодаря за коментара. Основно това ми беше въпросът. Видях подобна задача в книгата Въведение в програмирането със C# на стр. 164 зад 9. Разликата е в това че в задачата от книгата е казано „правоъгълника К ((-1,1),(5,5)). Пояснение: правоъгълникът е зададен чрез координати на горният си ляв и долният си десен ъгъл.” Докато в нашето условие пише rectangle R(top=1, left=-1, width=6, height=2). Предположих че „top=1 и left=-1” означават координатите на началната точка а width=6 и height=2 с колко нарастват съответно височината и ширината на правоъгълникът. Е сега поне след като съм направил задачата винаги мога да сменя условието.

от hpashev (170 точки)

0
Не съм съгласен спред мен „top=1 и left=-1” е точка с кординати (-1,1) top е координата по y, a left е по x

от AsenVal (3487 точки)



23

Всеки може да разбере условието по различен начин - аз например мисля, че дадените координата top=1  се отанся за горната страна на правоъгълника и т.н.. Независимо как сме разбрали условието важно е да се научим да определяме дали дадени координато изпълнават дадено условие, независимо какво в то  :)

Добавих възможност за използване на числа от тип с плаваща точка decimal.

И моето решение се получи малко дълго с няколко вложение иф:

Условие: Write an expresion that checkes for given point (x,y), if it is within the circle, K((1,1),3)  and out of the rectangular R (top=1,left=-1,width=6,height=2);

using System;

namespace _09.Circle_and_rectangle_check_within_point
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal x, y;
            Console.Write("Please enter coordinate x= ");
            x = Convert.ToDecimal(Console.ReadLine());
            Console.Write("Please enter coordinate y= ");
            y = Convert.ToDecimal(Console.ReadLine());
            {
                if (((x - 1) * (x - 1) + (y - 1) * (y - 1)) <= 9)
                {
                    Console.WriteLine("The point is in the circle");
                    if ((x < (-1)) || (x > 5))
                        {
                        Console.WriteLine("The point is outside the rectangle");
                        }
                    else
                    if (y > 1 || y < (-1))
                        {
                            Console.WriteLine("The point is outside the rectangle");
                        }
                    else
                     if (((x > (-1)) || (x < 5)) && (y < 1 || y > (-1)))
                         {
                           Console.WriteLine("The point is IN the rectangle");
                         }
 
                }
                else
                {
                    Console.WriteLine("The point is OUT the circle");
                    if ((x < (-1)) || (x > 5))
                    {
                        Console.WriteLine("The point is outside the rectangle");
                    }
                    else
                    if (y > 1 || y < (-1))
                        {
                            Console.WriteLine("The point is outside the rectangle");
                        }
                    else
                     if (((x > (-1)) || (x < 5)) && (y < 1 || y > (-1)))
                     {
                                Console.WriteLine("The point is IN the rectangle");
                     }
                }
            }
        }
    }
}

 


от v.kostadinov (135 точки)


0
Ето така го разбирам и аз!

от zhelyazkovn (2949 точки)

0
Да, така е правилното!

от paci1234 (15 точки)



0
Аз така го реших, само с две проверки. Питането ми към по вещите е дали правилно съм си подредил кода и какво мога да подобря
using System; using CommonFunctions; //класс който си написах с метод за валидиране на данни
class PointPositionTowardsCircleAndRect { public class rectangele { public int width,height,topLeftX,topLeftY; public rectangele(int Width = 6, int Height =2, int TopLeftX = -1, int TopLeftY = 1) { this.width = Width; this.height = Height; this.topLeftX = TopLeftX; this.topLeftY = TopLeftY; } public void printRectangle() { Console.WriteLine("Rectangle width is {0}".PadLeft(10), this.width); Console.WriteLine("Rectangle height is {0}", this.height); Console.WriteLine("Top of rectangle is x[{0}]y[{1}]", this.topLeftX, this.topLeftY); }
}
public class point { public int X, Y; public point(int x = 1, int y = 0) { this.X = x; this.Y = y; } public void printPoint() { Console.WriteLine("Point A = x[{0}]y[{1}]" , this.X, this.Y); } }
public class circle { public int X, Y,Radius; public circle(int x = 1, int y = 1, int radius = 3) { this.X = x; this.Y = y; this.Radius = radius; } public void printCircle() { Console.WriteLine("Circle K( ({0},{1}), {2})", this.X, this.Y, this.Radius); } }
static void Main(string[] args) { rectangele Rectangle = new rectangele(); point PointA = new point(); circle Circle = new circle(); int UserChoice; string message = "Enter \"1\" to work with your data or \"2\" to work with default data"; CmnFuncs.validateInput(out UserChoice, message); while (UserChoice !=1 || UserChoice !=2) { Console.WriteLine("Invalid choise! 1 or 2 accepted, or ctrl+C to terminate."); CmnFuncs.validateInput(out UserChoice, message); }
CmnFuncs.validateInput(out UserChoice, message); if (UserChoice == 1) { message = "Enter top of rectangle "; CmnFuncs.validateInput(out Rectangle.topLeftY, message); message = "Enter left side of rectangle"; CmnFuncs.validateInput(out Rectangle.topLeftX, message); message = "Enter height of rectangle"; CmnFuncs.validateInput(out Rectangle.height, message); message = "Enter width of rectangle"; CmnFuncs.validateInput(out Rectangle.width, message); message = "Enter circle center X"; CmnFuncs.validateInput(out Circle.X, message); message = "Enter circle center Y"; CmnFuncs.validateInput(out Circle.Y, message); message = "Enter circle Radius"; CmnFuncs.validateInput(out Circle.Radius, message); message = "Enter pointA X"; CmnFuncs.validateInput(out PointA.X, message); message = "Enter pointA Y"; CmnFuncs.validateInput(out Circle.Y, message); }
Rectangle.printRectangle(); PointA.printPoint(); Circle.printCircle();
isPointOutOfRectangle(Rectangle, PointA,true); isPointInCircle(Circle, PointA,true); }
public static bool isPointOutOfRectangle(rectangele Rect, point Point, bool Print = false) { //checks if given point is outside the rectangle if (((Point.X <= Rect.topLeftX) && (Point.X >= Rect.width)) || ((Point.Y >= Rect.topLeftY) && (Point.Y <= Rect.height))) { if (Print) { Console.WriteLine("Point is out or on border of rectangle"); } return true; } else { if (Print) { Console.WriteLine("Point is in the rectangle"); } return false; } }
public static bool isPointInCircle(circle Circle, point Point, bool Print= false) { int cathetusA = Point.X - Circle.X; int cathetusB = Point.Y - Circle.Y;
//distance between two points is the hypotenuse of rectangular triangle int distancePow2 = (int)(Math.Pow(cathetusA, 2) + Math.Pow(cathetusB, 2));
if (distancePow2 < (int)Math.Pow(Circle.Radius, 2)) { if (Print) { Console.WriteLine("Defined point is in the defined circle"); } return true; } else { if (Print) { Console.WriteLine("Defined point is NOT in the defined circle"); } return false; } } }

от N_Kolev (194 точки)


0
като ги затворя функциите в студиото изглежда много компактно

от N_Kolev (194 точки)

0
+1... Кодът е добре, но има различни формални правила за подреждането:
1. Ако се следва "Камилската" конвенция, то - имената на класовете и обекти започват с главна буква, а - имената на методите започват с малка буква.
Като че ли Майкрософт не са почитатели на "Камилската" конвенция?
Е това е въпрос на вътрешно-фирмени стандарти и на второ място са личните предпочитания.
2. Методът Main се обикновенно се оставя последен.
3. Е добре е в Main да направиш стандартна проверка: if (isPointOutOfRectangle(Rectangle, PointA, false) isPointInCircle(Circle, PointA, false))
4. Малко повече коментар не е излишен, примерно поне условието на решаваната задача.
Харесва ми!

от kiril.ilarionov (1482 точки)



0

Подкрепям apache_bg, че това е чертежът. 

Ето го и решението ми: http://pastebin.com/2ec6bvAh

Първо проверявам, дали точката е в окръжността, после разделям окръжността на 3 проверки спрямо y и намирам дали точката изпълнява условието.


от georgi.ivanov (3261 точки)


31

Колеги, не знам защо се мъчите да пишете толкова дълъг код за такава проста проверка. В моето решение просто съм направил два булеви израза (единият проверява дали точката е в окръжността, а другият - дали е в правоъгълника) и според тях програмата си избира output-а. Ето ви пример:

 

static void Main()
    {
        Console.Write("Enter a value for x: ");
        double x = double.Parse(Console.ReadLine());
        Console.Write("Enter a value for y: ");
        double y = double.Parse(Console.ReadLine());
        bool intheCircle = ((x - 1) * (x - 1) + (y - 1) * (y - 1)) <= 9;
        bool intheRectangle = ((-1 <= x) && (x <= 5)) && ((-1 <= y) && (y <= 1));
        Console.Write("The point is ");
        Console.Write(intheCircle ? "within the circle and " : "outside of the circle and ");
        Console.WriteLine(intheRectangle ? "within the rectangle." : "outside of the rectangle.");
    }
 
Edit: И аз подкрепям на apache_bg интерпретацията на задачата. :)

от hatrox (0 точки)


0
колкото по засукано толкова повече шанса за грешка се увеличава ... :+) иначе за по-големите кодове май се налага http://www. pastebin.com

от ludmil.d (490 точки)

0
Според мен, най - доброто решение е това, което се изразява по най - достъпният и прост начин. Сложното решение не е признак за интелигентност. Съгласен съм с apache_bg по отношение на параметрите.

от kostadin79 (15 точки)


0

 

И аз съм го начертал като apache_bg.Ето и решението.
 
static void Main()
    {
        float x;
        Console.WriteLine("Enter X ");
        x = float.Parse(Console.ReadLine());
        float y;
        Console.WriteLine("Enter Y ");
        y = float.Parse(Console.ReadLine());
        byte xCenter = 1;
        byte yCenter = 1;
        byte radius = 3;
        sbyte x1Rectangle = -1;
        byte y1Rectangle = 1;
        byte x2Rectangle = 5;
        sbyte y2Rectangle = -1;
        float distance;
        distance =(float)Math.Sqrt((xCenter - x)*(xCenter - x) + (yCenter - y)*(yCenter - y));
        if (distance <= radius)
        {
            Console.Write("The point is within the circle ");
 
            if ((x <= x2Rectangle && x >= x1Rectangle) && (y >= y2Rectangle && y <= y1Rectangle))
            {
                Console.WriteLine("and within the rectangle!");
            }
            else
            {
                Console.WriteLine("and out of the rectangle!");
            }
        }
        else
        {
            Console.Write("The point is out of the circle ");
            if ((x <= x2Rectangle && x >= x1Rectangle) && (y >= y2Rectangle && y <= y1Rectangle))
            {
                Console.WriteLine("and within the rectangle!");
            }
            else
            {
                Console.WriteLine("and out of the rectangle");
            }
        }
    }
}



1

Да, и на мен ми отне малко време да разбера условието за правоъгълника:))) Съгласна съм с чертежа на ''apache_bg'', под "top" и "botom" трябва да се разбират y-координатите, a "right"  и "left" са съответно x-координатите. Това означава че правоъгълникът има координати на горен ляв ъгъл (x=-1; y=1).

Харесвам решението на "adrianmg", но аз съм направила резултатът да излиза съответно ''true" или "false" само когато зададените координати отговарят едновременно и на двете условия (едновременно вътре в кръга и извън очертанията на правоъгълника), като точките попадащи в контура на очертанията на правоъгълника според мен също трябва да са "false".

Това е кода:

//Task 9 , lecture "Operators-Expressions-and-Statements"
using System;

class PointWithinCircle
{
    static void Main()
    {
        double x;
        double y;
        bool doubleValue;
        Console.WriteLine("Check if a given point (x,y) is within the circle K((0,0),5) and out of the rectangle R(top=1, left=-1, width=6, height=2).");
        do
        {
            Console.Write("Enter a number for 'x': ");
            string xValue = Console.ReadLine();
            if (double.TryParse(xValue, out x))
            {
                doubleValue = true;
            }
            else
            {
                doubleValue = false;
                Console.WriteLine("Invalid character!");
            }
        } while (!doubleValue);

        do
        {
            Console.Write("Enter a number for 'y': ");
            string yValue = Console.ReadLine();
            if (double.TryParse(yValue, out y))
            {
                doubleValue = true;
            }
            else
            {
                doubleValue = false;
                Console.WriteLine("Invalid character!");
            }
        } while (!doubleValue);


        bool inCircle = ((x - 1) * (x - 1) + (y - 1) * (y - 1)) <= 9;
        bool outRectangle = ((-1 > x) || (x > 5)) || ((-1 > y) || (y > 1));
        Console.Write("The result is: ");
        Console.WriteLine((inCircle && outRectangle)?"True":"False");
    }
}
 

 


от gal.mojo (37 точки)


10

Ето и моето семпло решение :)

 

using System;
class CircleAndRectangle
{
    static void Main()
    {
        Console.WriteLine("Enter X :");
        double x = double.Parse(Console.ReadLine());
        Console.WriteLine("Enter Y :");
        double y = double.Parse(Console.ReadLine());
        bool inCircle = (x-1) * (x-1) + (y-1) * (y-1) <= 9;
        bool inRectangle = ((x > -1)&&(x < 5))&&((y > -1)&&(y < 1));
        if (inCircle == true && inRectangle==false)
            Console.WriteLine("The point is within the circle and out of the rectangle");
 
    }
}
 

 


от chavdarmitev (237 точки)