3339|7

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

俺的C习题(7)——这其实也是个没啥技术含量的 [复制链接]

如题,没啥技术含量,不过,我记得我最初对这个题目很是蛋疼。
为何?
全在于理解上出了问题。
我以为,这个题的奥义是要实现在一组元素上任意顺序的四则运算符。
不过这也不难,当时我考虑的方法是。
做一个和数据元素一样长或者小一个单位的数组,用来存储代表运算符+、-、*、/ 的四个数值,然后,定义一个函数指针,在调用时,用0 1 2 3 分别代表这四个运算符。
然后只要改变这个运算符数组,就可以任意确定新的运算顺序。

不过当时不知道怎么回事,写的挺啰嗦。
后来理清思路后,就重新写了一次,现在回头看,真是简单。

  1. /*
    定义几个函数原型:如下的前四个。
    array_op()函数的参数是:要运算的数组、数组元素数目以及一个函数指针,该函数
    指针指向的函数定义了在连续几个元素上进行的操作。在实现array_op()函数时,将
    subtract()函数传送为第三个参数,subtract()函数会用交替符号组合这些元素。因此,对
    于有4个元素X1、X2、X3、X4的数组,subtract()函数会计算X1-X2+X3-X4/的值
    */

    #include<stdio.h>
    #include<malloc.h>

    double add(double a,double b);
    double subtract(double a,double b);
    double multiply(double a,double b);
    double array_op(double array[],int size,double (*pfun)(double,double));
    void GetArray(double *array,char);

    int main(void)
    {
    double *array = NULL;
    char size = 0;
    char i;
    double sum =0.0;

    printf("How many number you want?\n");
    scanf("%d",&size);

    //动态分配内存
    array = (double *)malloc(size * sizeof(double));

    if(array == NULL)
    {
    printf("Error occur memory allocating.\nThe program will shut down right now.\n");
    return -1;
    }
    GetArray(array,size);

    for(i = 0;i < size;i++)
    printf("%.2lf\t",array[i]);
    printf("\n");

    if(size % 2) //奇数?其实,这一部分应该放在array_op()里?
    {
    sum = array[size - 1] + array_op(array,size - 1,subtract);
    }
    else
    sum = array_op(array,size,subtract);

    //release memory
    free(array);

    printf("The result above is %.3lf\n",sum);

    return 0;
    }

    double add(double a,double b)
    {
    return a + b;
    }

    double subtract(double a,double b)
    {
    return a - b;
    }

    double multiply(double a,double b)
    {
    return a * b;
    }

    double array_op(double array[],int size,double (*pfun)(double,double))
    {
    char i = 0;
    double sum = 0.0;

    for(i = 0;i < (char)size / 2; i++)
    sum += pfun(array[2 * i],array[2 * i + 1]);

    return sum;

    }

    void GetArray(double *array,char size)
    {
    char i = 0;

    printf("Press the first number:\n");
    for(i = 0;i < size ;i++)
    {
    if(i != 0)
    printf("Go on,press\n");
    scanf("%lf",&(array[i]));
    }
    printf("Pressing has been finished.\n");
    }
复制代码

此帖出自编程基础论坛

最新回复

我也被搅晕了,下午写的那个 1.0-(2.0-3.0)-(4.0-5.0)-(6.0-7.0)-(8.0-9.0)-(10.0-11.0)又想当然了. 刚才谈得奇偶问题时,一下又想到应该是这样 11.0-(10.0-(...........-(2-1))))))) 这样下午那版程程序是对的,是我反而改错了.  详情 回复 发表于 2012-1-15 21:03
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 

看看答案,忽然有点晕.......

是的,因为从输出来看,我真的是想得太多了——但我总觉得答案和题目对不上。

  1. /* Exercise 9.2 Implementing arithmetic and array functions */
    #include <stdio.h>

    double add(double a, double b); /* Returns a+b */
    double subtract(double a, double b); /* Returns a-b */
    double multiply(double a, double b); /* Returns a*b */
    double array_op(double array[], int size, double (*pfun)(double,double));


    int main(void)
    {
    double array[] = {11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0};

    int length = sizeof array/sizeof(double);

    /*俺缺了个标准的输出*/
    printf("The value of:\n");
    for(int i = 0 ; i< length ; i++)
    {
    printf("%.2lf%s", array[i], (i<length-1?" + ":"\n"));
    }
    printf(" is %.2lf\n", array_op(array,length,add));

    printf("\nThe value of:\n");
    for(int j = 0 ; j < length ; j++)
    {
    printf("%.2lf%s", array[j], (j<length-1?((j%2 == 0) ?" - ":" + "):"\n"));
    }
    printf(" is %.2lf\n", array_op(array, length, subtract));

    printf("\nThe value of:\n");
    for(int k = 0 ; k < length ; k++)
    {
    printf("%.2lf%s", array[k], (k<length-1?" * ":"\n"));
    }
    printf(" is %.2lf\n", array_op(array, length, multiply));
    return 0;
    }

    /* Function to calculate a+b */
    double add(double a, double b)
    {
    return a+b;
    }

    /* Function to calculate a-b */
    double subtract(double a, double b)
    {
    return a-b;
    }

    /* Function to calculate a*b */
    double multiply(double a, double b)
    {
    return a*b;
    }

    /* Function to apply an operation, pfun, between successive pairs of elements */
    double array_op(double array[], int size, double (*pfun)(double,double))
    {
    double result = array[size-1];
    int i = 0;
    /* Work from last to first to accommodate alternating signs for subtract */
    for(i = size-1 ; i>0 ; i--)
    result = pfun(array[i-1], result);
    return result;
    }
复制代码

4.jpg (42.9 KB, 下载次数: 0)

4.jpg
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

44

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
上午大概看一下眼,发现辛昕贴的程序完全和和事先给出的题意不搭界,还没来得及回贴,
下午辛昕又贴出了个修正版,觉得还是有问题,其实辛昕完全没有写出题目是啥,就开始编程序
所以我也无法给出辛昕写的程序到底对还是不对,从程序的流程来看,计算的结果是:
array[lenght-1]运算符(array[lenght-2]运算符[lenght-3])运算符.................
也就是 1.0-(2.0-3.0)-(4.0-5.0)-(6.0-7.0)-(8.0-9.0)-(10.0-11.0)
但是输出时为啥不这样写而输出成11.0-10.0+9.0-8.0........(尽管结果是一样的)
在上午的版本中,还考虑了输入个数的奇偶问题,下午的也消失了.
比如,如果是偶数个数时,结果是 1.0-2.0,而程序输出成了2.0-1.0 is -1.0了.
此帖出自编程基础论坛
 
个人签名能力越大,责任越大;知道越多,未知更多
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 

回复 板凳 能圈就圈 的帖子

第一个程序是我自己写的。
第二个程序是我网上下载的参考答案。
我当时完全傻眼了。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 

题目就在第一个程序最开始的几句注释里

定义几个函数原型:如下的前四个。
array_op()函数的参数是:要运算的数组、数组元素数目以及一个函数指针,该函数 指针指向的函数定义了在连续几个元素上进行的操作。
在实现array_op()函数时,将 subtract()函数传送为第三个参数,subtract()函数会用交替符号组合这些元素。因此,对 于有4个元素X1、X2、X3、X4的数组,subtract()函数会计算X1-X2+X3-X4/的值

我想,它的本意是说,在这个位置,因为它是取相邻的两个做减法操作,结果就变成了 带括号那种效果?
就是说,这本来只是一个 说明,却被我当成了题目。
晕!

我想,你说的那个应该才是最符合题意的。
只是我一直没意识到 减括号里减,会变成 加
[ 本帖最后由 辛昕 于 2012-1-15 18:26 编辑 ]
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
在上午的版本中,还考虑了输入个数的奇偶问题,下午的也消失了.


因为不用了。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

44

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 6楼 辛昕 的帖子

我也被搅晕了,下午写的那个 1.0-(2.0-3.0)-(4.0-5.0)-(6.0-7.0)-(8.0-9.0)-(10.0-11.0)又想当然了.
刚才谈得奇偶问题时,一下又想到应该是这样
11.0-(10.0-(...........-(2-1)))))))
这样下午那版程程序是对的,是我反而改错了.
此帖出自编程基础论坛
 
个人签名能力越大,责任越大;知道越多,未知更多
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 
嘿嘿,下午那版是参考答案。
主要是我理解出错了,把你也带下去了。罪过罪过。。。。。。。

现在想想,虽然语法方面说不上精通,但也算是比较熟悉。
但在理解方面很成问题.......
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表