c语言入门问题

albert48 2017-06-01 08:55:46
大家都知道函数返回值可以返回数据给调用者,也有必要掌握使用指针变量作为函数参数充当函数返回值的方法。请你帮助叮当定义形如下面的函数: fun(int a, int b, int *sum, int *diff, int *product, float *divide)
   在主函数中,输入两个整数a和b,然后调用此函数计算数学上的a + b、a - b、a * b和a / b四种运算的值,四种运算的结果通过函数的后四个参数返回主函数;最后在主函数中,输出这四种运算的值。除法运算要求小数点后必须保留2位有效数字(四舍五入),不足补零。
#include<stdio.h>
int main()
{
int a,b,*sum,*diff,*product;
float *divide;
scanf("%d %d",&a,&b);
void fun(int a,int b,int *sum,int *diff,int *product,float *divide);
fun(a,b,sum,diff,product,divide);
printf("%d %d %d %f",*sum,*diff,*product,*divide);
return 0;
}
void fun(int a,int b,int *sum,int *diff,int *product,float *divide)
{
*sum=a+b;
*diff=a-b;
*product=a*b;
*divide=a*1.0/b;
}
这有什么错吗
...全文
393 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-06-02
  • 打赏
  • 举报
回复
引用 8 楼 albert48 的回复:
引用 6 楼 cfjtaishan 的回复:
[quote=引用 3 楼 albert48 的回复:] [quote=引用 1 楼 ipqtjmqj 的回复:] *在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。
那该怎么改呀
#include<stdio.h>

void fun(int a,int b,int *sum, int *diff, int *product, float *divide);

int main()
{
    int a, b, sum, diff, product;
    float divide;
    scanf("%d%d", &a, &b);

    fun(a, b, &sum, &diff, &product, ÷);
    printf("%d %d %d %f", sum, diff, product, divide);
    return 0;
} 
void fun(int a, int b, int *sum, int *diff, int *product, float *divide)
{
    *sum  =a + b;
    *diff = a - b;
    *product = a * b;
    *divide = a * 1.0 / b;
}
注意函数声明放在main函数之外; 函数声明放在函数内,这是很old的风格了,不建议继续沿用;将来做项目的时候,函数可能会有成百上千个,都写到函数内,那么函数的可读性和可理解性就不是很好了吧。对于接口函数可以放到头文件里,内部函数建议放在源文件的上方。 若要理解指针作为参数的问题,建议看一下变量,函数在内存中的存储位置,生命周期等等信息[/quote] 为什么啊a,b前面都没有& 而sum前用&[/quote] 参数分为传入参数和传出参数;a,b是传入参数,其他的是传出参数;传出参数是要在自定义函数执行结束后将对传出参数的修改带出,因此需要传地址&。
albert48 2017-06-02
  • 打赏
  • 举报
回复
引用 6 楼 cfjtaishan 的回复:
引用 3 楼 albert48 的回复:
[quote=引用 1 楼 ipqtjmqj 的回复:] *在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。
那该怎么改呀
#include<stdio.h>

void fun(int a,int b,int *sum, int *diff, int *product, float *divide);

int main()
{
    int a, b, sum, diff, product;
    float divide;
    scanf("%d%d", &a, &b);

    fun(a, b, &sum, &diff, &product, ÷);
    printf("%d %d %d %f", sum, diff, product, divide);
    return 0;
} 
void fun(int a, int b, int *sum, int *diff, int *product, float *divide)
{
    *sum  =a + b;
    *diff = a - b;
    *product = a * b;
    *divide = a * 1.0 / b;
}
注意函数声明放在main函数之外; 函数声明放在函数内,这是很old的风格了,不建议继续沿用;将来做项目的时候,函数可能会有成百上千个,都写到函数内,那么函数的可读性和可理解性就不是很好了吧。对于接口函数可以放到头文件里,内部函数建议放在源文件的上方。 若要理解指针作为参数的问题,建议看一下变量,函数在内存中的存储位置,生命周期等等信息[/quote] 为什么啊a,b前面都没有& 而sum前用&
kidults 2017-06-02
  • 打赏
  • 举报
回复
函数要返回多个值的话(因为一个函数只能有一个返回值),只能将参数作为引用或者指针类型进行传递
自信男孩 2017-06-01
  • 打赏
  • 举报
回复
#include<stdio.h>

void fun(int a, int b, struct result *pret);

struct result {
    int sum;
    int diff;
    int product;
    float divide;
};
int main()
{
    int a, b;
    struct result ret;
    scanf("%d%d", &a, &b);

    fun(a, b, &ret);
    printf("%d %d %d %f", ret.sum, ret.diff, ret.product, ret.divide);
    return 0;
} 
void fun(int a, int b, struct result *pret)
{
    pret->sum  =a + b;
    pret->diff = a - b;
    pret->product = a * b;
    pret->divide = a * 1.0 / b;
}
对于参数较多时(超过5个),建议使用结构体或联合体;因为参数较多时,会降低函数的执行效率; 参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢,另一方面,参数的数目少,程序就显得精练、简洁,这有助于检查和发现程序中的错误。因此,通常应该尽可能减少参数的数目,如果一个函数的参数超过4个,你就应该考虑一下函数是否编写得当;
自信男孩 2017-06-01
  • 打赏
  • 举报
回复
引用 3 楼 albert48 的回复:
引用 1 楼 ipqtjmqj 的回复:
*在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。
那该怎么改呀
#include<stdio.h>

void fun(int a,int b,int *sum, int *diff, int *product, float *divide);

int main()
{
    int a, b, sum, diff, product;
    float divide;
    scanf("%d%d", &a, &b);

    fun(a, b, &sum, &diff, &product, ÷);
    printf("%d %d %d %f", sum, diff, product, divide);
    return 0;
} 
void fun(int a, int b, int *sum, int *diff, int *product, float *divide)
{
    *sum  =a + b;
    *diff = a - b;
    *product = a * b;
    *divide = a * 1.0 / b;
}
注意函数声明放在main函数之外; 函数声明放在函数内,这是很old的风格了,不建议继续沿用;将来做项目的时候,函数可能会有成百上千个,都写到函数内,那么函数的可读性和可理解性就不是很好了吧。对于接口函数可以放到头文件里,内部函数建议放在源文件的上方。 若要理解指针作为参数的问题,建议看一下变量,函数在内存中的存储位置,生命周期等等信息
ipqtjmqj 2017-06-01
  • 打赏
  • 举报
回复
第2种是内存分配在堆上

#include<stdio.h>
#include <stdlib.h>
int main()
{
int a,b,*sum,*diff,*product;
float *divide;
sum = (int *)malloc(sizeof(int));
diff = (int *)malloc(sizeof(int));
product = (int *)malloc(sizeof(int));
divide = (float *)malloc(sizeof(float));
scanf("%d %d",&a,&b);
void fun(int a,int b,int *sum,int *diff,int *product,float *divide);
fun(a,b,sum,diff,product,divide);
printf("%d %d %d %.2f",*sum,*diff,*product,*divide);
free(sum);
free(diff);
free(product);
free(divide);
return 0;
 } 
void fun(int a,int b,int *sum,int *diff,int *product,float *divide)
{
*sum=a+b;
*diff=a-b;
*product=a*b;
*divide=a*1.0/b;
}
ipqtjmqj 2017-06-01
  • 打赏
  • 举报
回复
引用 3 楼 albert48 的回复:
引用 1 楼 ipqtjmqj 的回复:
*在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。
那该怎么改呀
两种办法,一是下面这种,内存分配在栈上,用取地址操作符&传参

#include<stdio.h>
int main()
{
int a,b,sum,diff,product;
float divide;
scanf("%d %d",&a,&b);
void fun(int a,int b,int *sum,int *diff,int *product,float *divide);
fun(a,b,&sum,&diff,&product,÷);
printf("%d %d %d %.2f",sum,diff,product,divide);
return 0;
 } 
void fun(int a,int b,int *sum,int *diff,int *product,float *divide)
{
*sum=a+b;
*diff=a-b;
*product=a*b;
*divide=a*1.0/b;
}
albert48 2017-06-01
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
*在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。
那该怎么改呀
albert48 2017-06-01
  • 打赏
  • 举报
回复
那需要怎么改呀
ipqtjmqj 2017-06-01
  • 打赏
  • 举报
回复
*在指针中有两种含义,一是用来声明指针,二是解引用运算符,解引用时,需要指针指向的内存是有效的。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧