【问题标题】:How can I return multiple values without using arrays or pointers or structures? [duplicate]如何在不使用数组、指针或结构的情况下返回多个值? [复制]
【发布时间】:2021-12-07 02:29:42
【问题描述】:

我们获得了将十进制转换为二进制和八进制的源代码。这是我将使用函数 Dec2BinOct() 来返回转换后的十进制值的源代码。

#include<stdio.h>
int main()
{
    unsigned long n, place=1, bin=0, r, o=0, place2=place;  
    printf("Conversion: Decimal to binary and octal.\n");
    printf("Enter number: ");
    scanf("%lu", &n);
    printf("%lu is ", n);
           
    for(unsigned long g = n; g != 0; place = place * 10)  {  
        r = g % 2;    
        bin = bin + (r * place);
        g = g / 2;  
    }  
    
    printf("%lu in Binary Form. \n", bin);
                
    printf("%lu is ", n);
    while (n != 0) {
        o = o + (n % 8) * place2;
        n =   n / 8;
        place2 = place2 * 10;
    }
    printf("%lu in Octal Form.\n\n", o);
    return 0;
}

我们的任务是为我们的作业应用函数,并且需要使用前面所述的函数 Dec2BinOct(),但我们的老师告诉我们这是最低要求的函数。经过这么多尝试,我似乎没有得到正确的程序。我只是需要一些帮助,这是明天到期的。感谢您的所有帮助

【问题讨论】:

  • C 中不存在多值的概念,你可以使用一些你列举的结构来实现它。
  • 为了返回多个值,您需要指针(作为函数的参数或作为返回类型,如果它们有足够长的生命周期),或者是一个结构(通过值作为返回类型,或通过引用作为函数的参数)。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • Dec2BinOct 函数到底是什么?我们无权访问您的家庭作业。

标签: c function return-value return-type


【解决方案1】:

如果您想要多个值而不是一次,您可以概括这两个操作并提供一个数字应转换为的基数:

unsigned long Dec2AnotherBase(unsigned long n, int base){
    unsigned long place=1, result=0;
    for(; n; place*=10, n/=base) 
        result += n % base * place;
    return result;
}

在您的主要功能中,您将循环替换为:

bin=Dec2AnotherBase(n, 2);
o=Dec2AnotherBase(n, 8);

我还稍微简化了您的代码。这是我所做的:

  • bin=bin+(r*place)place=place*10 替换为更短的bin+=r*placeplace*=10
  • 消除了 r 变量,因为它只使用了一次(也不需要在 % 周围使用括号,因为 % 运算符的优先级与 * 相同,并且从左到右进行评估)。
  • 使用 , 运算符将 g=g/2 移动到增量语句中。
  • 删除了循环中不再需要的大括号,简化为单个语句。
  • 删除了g,因为它是不必要地创建的(您可以直接对n 进行操作,因为它已经是传递给函数的变量的副本)。
  • 有争议: 将条件中的n!=0 替换为n,因为每个非零值都会隐式转换为逻辑真。

【讨论】:

  • 在将g != 0 替换为g 时,这很糟糕,最好是清晰而不是简洁。许多专业的代码风格拒绝这样的表达。阅读代码比编写代码要多得多,不要将一秒钟的打字换成几分钟的思考。
  • 这真的很有帮助呵呵呵呵。非常感谢!
猜你喜欢
  • 2021-02-04
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2010-12-21
  • 2015-08-03
  • 1970-01-01
  • 2015-08-25
  • 2019-06-22
相关资源
最近更新 更多