2016-12-15 85 views
-2

我对C编程和stackoverflow很新。我明天有一个中期,我在学习的时候遇到了这个问题。对于格式方面的错误,请接受我最深切的歉意。整数指针

问题:编写一个名为:divide的函数,它包含两个整数和一个整数指针。该函数应将第一个整数除以第二个整数,并将结果作为整数返回,并将余数放入由整型指针参数给出的地址中。

给定的主代码读取两个整数:a,b,并创建两个没有初始化的整数:res,rem。完成函数调用,以便res变量变为a/b,rem变量成为调用后的余数。

例子:

Input 12 5 Output 2 2 
Input 57 7 Output 8 1 

的代码,我写的是:

int divide (int a , int b); 
int divide (int a , int b) 
{ 
    int res; 
    int rem; 
    res = a/b; 
    rem = a - res * b ; 
    return res, rem; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    int res, rem; 
    res = divide(a,b); 
    printf("%d %d", res, rem); 
    return 0; 
} 

当我跑,我得到正确的价值观为资源,但REM总是等于零。我如何使用整数指针rem值? 在此先感谢。

+4

*“一个带有两个整数和一个整数指针的函数”* - 你的函数只需要两个整数。在C语言中,当你需要返回多于一个原始值时,你可以定义一个'struct'来存放这些值,或者通过指针参数返回一个或多个值。 Tldr;你的函数原型应该是'int divide(int a,int b,int * rem)'。 – Groo

+0

您可以使用标准函数[div](http://en.cppreference.com/w/c/numeric/math/div)而不是您的'divide'。你不应该做一些已经存在的东西。 – BLUEPIXY

+0

在C中,您只能返回一个值。 –

回答

1
int divide (int a , int b, int* rem) 
{ 
    int res; 
    res = a/b; 
    *rem = a - res * b ; 
    return res; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    int res, rem; 
    res = divide(a,b, &rem); 
    printf("%d %d", res, rem); 
    return 0; 
} 

这应该工作。

  1. 您不能从函数返回多个值。由于逗号运算符,return res, rem;只会返回rem。
  2. 要在调用位置看到多个值,请使用指针。
+2

我的猜测是它可能不起作用,因为你有一个名为'rem'的局部变量。 – Groo

+0

@Groo ..错过了,更正了。谢谢 – instance

+0

“你不能从函数返回多个值” - > True,但函数可以返回一个包含2个“int”值的'struct'(单个值),例如'div_t div(int numer, int denom);' – chux

0

这里的问题是,

return res, rem; 

相同

return rem; 

由于comma operator的特性,这是不是你所期望的。

你都应该

  • 指针传递给divide()功能存储rem(余数)。
  • 返回结果res
0

不能return multiple values in C 你做你的方式是只是用comma operator

有介绍的链接上的一些解决方案,您可以返回一个包含所有你想要的值结构或数组。

typedef struct your_return { 
    int res; 
    int rem; 
} division_return; 

division_return divide (int a , int b) 
{ 
    division_return ret; 
    ret.res = a/b; 
    ret.rem = a - ret.res * b; 
    return ret; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    division_return dr; 
    dr = divide(a,b); 
    printf("%d %d", dr.res, dr.rem); 
    return 0; 
} 

它不是按值传递结构,作为复制可以是昂贵的一个很好的做法,但你是新来的语言,我不想更多的复杂性添加到代码。 不幸的是,C没有references作为C++,这使得一切都变得更简单。

您也可以使用指针来更改函数内部的值。

int divide (int a , int b, int* rem) 
{ 
    int res; 
    res = a/b; 
    *rem = a - res * b ; 
    return res; 
} 
+0

但是,请注意,按值传递结构被认为是不好的做法,因为它速度很慢并且会消耗堆栈内存。 – Lundin

+0

是的,我将它添加为一个注释,我只是不想增加更多的复杂性,因为OP说他对这门语言是新手,而C没有'引用'来使它更容易。 – danielfranca

2

您也可以返回一个结构:

typedef struct 
{ 
    int quot; 
    int rem; 
} div_t; 

div_t div(int numerator, int denominator) 
{ 
    div_t result; 
    result.quot = numerator/denominator; 
    result.rem = numerator % denominator; 

    return(result); 
} 

即作为part of standard C已经实现:

7.22.6.2的divldivlldiv功能

提要

#include <stdlib.h> 
div_t div(int numer, int denom); 
ldiv_t ldiv(long int numer, long int denom); 
lldiv_t lldiv(long long int numer, long long int denom); 

说明

divldiv,和lldiv,函数计算在一个单一的操作numer/denomnumer % denom

返回

divldiv,和lldiv函数返回 div_t类型,ldiv_t的结构,和lldiv_t分别同时包含 商和余数。结构中应包含(在 订单中)成员quot(商)和rem(其余), ,其中每一个都与参数numerdenom具有相同的类型。如果结果的任何一部分不能表示,那么 行为是未定义的。

请注意,调用div()ldiv(),或可能比计算都在两个单独的操作的商和余更高效,因为大多数除法机器指令产生无论是在两个单独的寄存器中的商和余数。

+0

有意思的是,这个答案被认为是有用的。它没有回答这个问题,因为它显然忽略了这个要求:**编写一个名为:divide的函数,它包含两个整数和一个整数指针。** – Gerhardh