मुझे C # में किसी अन्य वर्ग से कॉलिंग विधियों के साथ एक समस्या हो रही है। मैं ऐसा लंबे समय से नहीं कर रहा हूं (सटीक होने के लिए 3 सप्ताह) और कॉलिंग के तरीकों के पीछे के विचार नहीं मिलते हैं। मैंने इसे आसान बनाने की कोशिश के लिए सब कुछ सार्वजनिक घोषित कर दिया है, लेकिन यह अभी मेरे लिए काम नहीं कर रहा है। सभी में किसी भी मदद की बहुत सराहना की जाएगी। यहाँ प्रश्न में कोड है, मैं एक सरल विधि का उपयोग करना चाहता हूं यदि विभिन्न सरल आकृतियों के क्षेत्र की गणना करने के लिए आउटपुट चरण में, लेकिन मुझे "यह एक वैध विकल्प नहीं है"

namespace Area_Calculator
{
    public class Area
    {
        public static int Square(int side)
        {
            int i, A;
            Console.WriteLine("Please enter the length of the side of the square");
            i = Convert.ToInt16(Console.ReadLine());
            A = i * i;
            return A;
        }
        public static int Rectangle(int width, int height)
        {
            int i, j, A;
            Console.WriteLine("Please enter the width of the rectangle");
            i = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine("Please enter the height of the rectangle");
            j = Convert.ToInt16(Console.ReadLine());
            A = i * j;
            return A;
        }
        public static double Triangle(int width, int height)
        {
            double i, j, A;
            Console.WriteLine("Please enter the width of the triangle");
            i = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Please enter the height of the triangle");
            j = Convert.ToDouble(Console.ReadLine());
            A = (.5 * i * j);
            return A;
        }
        public static double Circle(int radius)
        {
            int i;
            double A;
            Console.WriteLine("Please enter the radius of the circle");
            i = Convert.ToInt16(Console.ReadLine());
            A = (i * Math.PI);
            return A;
        }

    }
    class Program
    {

        static void Main(string[] args)
        {
            int x, i, j;
            i = 0;
            j = 0;
            Console.WriteLine("Please select what type of shape you wish to find the area of:\n1. Square\n2. Rectangle\n3. Triangle\n4. Circle\n");
            x = Convert.ToInt16(Console.ReadLine());
            Area r = new Area();
            if (x == 1)
            {
                Area.Square(i);
            }
            if (x == 2)
            {
                Area.Rectangle(j, i);
            }
            if (x == 3)
            {
                Area.Triangle(j, i);
            }
            if (x == 4)
            {
                Area.Circle(i);
            }
            else
            {
                Console.WriteLine("That is an invalid choice");
            }
            Console.ReadKey();
        }
    }
}
c#
2
Damo 13 नवम्बर 2015, 16:26

6 जवाब

सबसे बढ़िया उत्तर

आपका मुख्य मुद्दा है, दूसरों ने क्या उल्लेख किया है, अगर बयानों के बारे में। एक और बात यह है कि आप क्षेत्र की गणना करते हैं लेकिन इसे कभी भी प्रिंट नहीं करते हैं।

if (x == 1)
{
     Console.WriteLine(Area.Square(i));
} 
else if (x == 2)
{
    Console.WriteLine(Area.Rectangle(j, i));
}
else if (x == 3)
{
    Console.WriteLine(Area.Triangle(j, i));
}
else if (x == 4)
{
    Console.WriteLine(Area.Circle(i));
}
else
{
    Console.WriteLine("That is an invalid choice");
}
2
lalibi 13 नवम्बर 2015, 13:42

आप वर्तमान में हमेशा देखेंगे कि "यह एक अमान्य विकल्प है" जब तक x 4 नहीं है ... क्योंकि अंतिम if / `बाकी सभी से डिस्कनेक्ट किया गया है।

आप इसे इस तरह else if उपयोग करने के लिए बदल सकते हैं:

if (x == 1)
{
    ...
}
else if (x == 2)
{
    ...
}
else if (x == 3)
{
    ...
}
else if (x == 4)
{
    ...       
}
else
{
    ...
}

... लेकिन switch कथन का उपयोग करना सरल होगा:

switch (x)
{
    case 1:
        ...
        break;
    case 2:
        ...
        break;
    case 3:
        ...
        break;
    case 4:
        ...
        break;
    default:
        ...
        break;
}

यह बेहतर है कि मैं x पर एक साधारण चयन के आधार पर, "डिफ़ॉल्ट रूप से" शाखा के साथ अगर x ज्ञात मूल्यों में से कोई भी नहीं है, तो "मैं इन शाखाओं में से एक को निष्पादित करना चाहता हूं।" "

7
Jon Skeet 13 नवम्बर 2015, 13:30

प्रारंभ में, आपको अपने स्टेटमेंट को थोड़ा बदलना होगा, जैसे नीचे:

if (x == 1)
{
    Area.Square(i);
}
else if (x == 2)
{
    Area.Rectangle(j, i);
}
else if (x == 3)
{
    Area.Triangle(j, i);
}
else if (x == 4)
{
    Area.Circle(i);
}
else
{
    Console.WriteLine("That is an invalid choice");
}

ऐसा करने पर, आपको वह संदेश मिलेगा जो आपको सभी मामलों में पता चलता है, जहां x 4 नहीं है, बाकी मामलों में भी 1, 2 और 3।

0
Christos 13 नवम्बर 2015, 13:31

यदि x 4 के बराबर है, तो आपका कोड जाँच रहा है, अन्यथा अन्य ब्लॉक में कोड का उपयोग कर रहा है।

यह हर बार चलाया जाएगा जब तक x = 4!

इसके बजाय यह प्रयास करें:

    x = Convert.ToInt16(Console.ReadLine());
    Area r = new Area();

    if (x == 1)
    {
        Area.Square(i);
    }
    else if (x==2)
    {
        Area.Rectangle(j, i);
    }
    else if (x == 3)
    {
        Area.Triangle(j, i);
    }
    else if (x==4)
    {
        Area.Circle(i);
    }
    else
    {
        Console.WriteLine("That is an invalid choice");
    }

या इससे भी बेहतर:

x = Console.ReadLine();

switch x
{
  case "1":
    Area.Square(i);
    break;

  case "2":
    Area.Rectangle(j, i);
    break;

  case "3":
    Area.Triangle(j, i);
    break;

  case "4":
    Area.Circle(i);
    break;

  default:
    console.WriteLine("That is an invalid choice");
    break;
}
0
Karl Gjertsen 13 नवम्बर 2015, 13:43

समस्या आपके if कथन के साथ है, आपको if के बजाय else if का उपयोग करने की आवश्यकता है:

if (x == 1)
{
    Area.Square(i);
}
else if (x==2)
{
    Area.Rectangle(j, i);
}
else if (x == 3)
{
    Area.Triangle(j, i);
}
else if (x==4)
{
    Area.Circle(i);
}
else
{
    Console.WriteLine("That is an invalid choice");
}

समस्या का उपयोग करते समय यदि यह है कि यह बहुत अंतिम हो गया है और else सत्य था, तो यह "यह एक अमान्य विकल्प है" मुद्रित होगा।

और आपके कार्यान्वयन पर कुछ नोट्स ...

आपके मुख्य कार्यक्रम में, r ऑब्जेक्ट, r का अनावश्यक होना, क्योंकि आप कहीं भी r का उपयोग नहीं करते हैं।

Area विधियों में से सभी मान (जो आप पास करते हैं) में लेते हैं, लेकिन फिर उन्हें पूरी तरह से अनदेखा करते हैं और फिर से मूल्यों के लिए पूछते हैं। मैं या तो विधियों से पैरामीटर निकालूंगा, या उपयोगकर्ता को मुख्य कार्यक्रम में पूछूंगा और मूल्यों में पास करूंगा। प्रत्येक अलग गणना के लिए इनपुट लॉजिक को if स्टेटमेंट के अंदर डाला जा सकता है। अंतिम, आप फ़ंक्शन के रिटर्न मान के साथ कुछ भी नहीं करते हैं, इसलिए आप उपयोगकर्ता को क्षेत्र प्रदर्शित नहीं करते हैं। उदाहरण के लिए, आपको इसे लिखने के लिए अपने कार्यों को संपादित करने की आवश्यकता है:

Console.WriteLine("The square area is {0}", Area.Square());

यदि कथन के अंदर, या क्योंकि आप गणना में उपयोगकर्ता इनपुट कर रहे हैं, तो आप प्रत्येक Area विधि में एक समान रेखा रख सकते हैं।

0
Ron Beyer 13 नवम्बर 2015, 13:43
enum AreaEnum
{
    Square,
    Rectangle,
    Triangle,
    Circle,
};

class Program
{
    static void Main(string[] args)
    {


        Console.WriteLine("Please select what type of shape you wish to find the area of:\n1. Square\n2. Rectangle\n3. Triangle\n4. Circle\n");
        int x = Convert.ToInt16(Console.ReadLine());
        AreaEnum myValueAsEnum = (AreaEnum)x;
        Calculate(myValueAsEnum);

    }

    static double Calculate(AreaEnum a)
    {
        int x, i, j;
        i = 0;
        j = 0;
        Area area = new Area();

        switch (a)
        {
            case AreaEnum.Square:
                {
                 return Area.Square(i);
                }

            case AreaEnum.Rectangle:
                {
                    return Area.Rectangle(j, i);
                }

            case AreaEnum.Triangle:
                {
                    return Area.Triangle(j, i);
                }

            case AreaEnum.Circle:
                {
                    return Area.Circle(i);
                }

            default:
                {
                    Console.WriteLine("That is an invalid choice");
                    return 0;

                }
        }
    }


}
0
André Monteiro 13 नवम्बर 2015, 14:09