有什么方法可以用C巧妙地制作一个函数,使其在不同的参数值中执行不同的功能?

问题描述 投票:0回答:1

😄

我必须创建2个结构,即矩形和椭圆形,其中矩形结构包含其长度和宽度,而椭圆形结构包含其半短轴和半长轴的长度。然后,我必须创建一个具有上述两个结构作为其成员的联合Shape。然后,我必须创建一个公共函数'area',该函数计算并集的面积(根据传递给该函数的参数,是矩形还是椭圆形)。我目前使用菜单驱动的方法和切换用例(问题后面的代码)处理了上述问题。

我想创建一个以联合作为参数并根据联合中存储的结构计算面积的智能函数。

CODE

typedef struct rect{
    int l,b;
}r;
typedef struct oval{
    int x,y;
}o;
union shape{
    r r1;
    o o1;
}sh;
void area(int a);
void main()
{
    int ch;
    int a;
    printf(" 1.Area of rect\n 2.Area of oval\n 3.EXIT");
    while(1){
        printf("\nEnter your choice: ");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1:a=0;
                area(a);
                break;
            case 2:a=1;
                area(a);
                break;
            default:printf("BYE\n");
                return;
        }
    }
}
void area(int a)
{
    if(a==0){
        printf("Enter Length and Breadth: ");
        scanf("%d %d",&sh.r1.l,&sh.r1.b);
        int ar=sh.r1.l*sh.r1.b;
        printf("%d",ar);
    }
    else if(a==1){
        printf("Enter x and y of Oval: ");
        scanf("%d %d",&sh.o1.x,&sh.o1.y);
        float ar=sh.o1.x*sh.o1.y;
        printf("%.2f",ar*3.14);
    }
}

谢谢!

c gcc struct shapes unions
1个回答
0
投票

[user3386109已在评论中或(希望)在答案中描述了最安全的解决方案。我非常建议使用该方法。

但是,还有另一种选择,基于跟踪隐式表示哪种类型的联合表示。 (我已经在这里描述的概念How to verify if a void pointer (void *) is one of two data types?。)>

联合基本上告诉编译器,它可能是这种类型,或者明确地表明,此变量/类型的编译器并不比程序员了解得更好(否则通常是这种情况)。因此,如果程序员指示编译器访问该联合成员或该联合成员,则编译器将相信它与最后写入的内容匹配。

在这种情况下,程序员必须比编译器了解更好

。即这与程序员很容易误解联合的相反,而不是“我不需要知道那里的类型”。这意味着“我必须在每个点都知道其中有什么,因为我需要告诉编译器。”

现在使用变量的另一部分来跟踪存储的内容(由user3386109描述)的概念使得该职责非常值得承担。但是,如果您不遵循这种方法,那么知识可以而且必须仍然在其他地方。例如,您可以将所有椭圆形存储在一个数组中,并将所有矩形存储在另一个数组中。从语法上讲,两者是相同的,但您只会用椭圆形阵列做椭圆形的事情,而只能用矩形阵列进行椭圆形的事情。我选择此示例是因为它很容易理解,但是我承认它没有太多实际意义,因为那样的话,为这两种类型使用并集类型没有任何好处。但是,它确实说明了类型信息在某处但隐式存在以及以某种形式存储的可能性在执行时间和内存消耗方面可能更有效率的可能性。

稍微复杂一些的数据结构(包含您的形状结构)可能更有意义。例如,用于气球的结构将包含形状的几何信息,并且永远不会质疑它是椭圆形(旋转椭圆形)还是矩形(方形框),也不会描述墙中的部分墙壁毫无疑问,这是一个需要纸张的房间。

© www.soinside.com 2019 - 2024. All rights reserved.