免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 29667 | 回复: 36
打印 上一主题 下一主题

[C] 思考题:语言是工具?重要是思想?那如何表达思想?(修改版) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-24 19:11 |显示全部楼层 |倒序浏览
本帖最后由 OwnWaterloo 于 2011-10-24 22:34 编辑

标题
懂的同学应该明白,标题既想切题,又想不剧透,真心不好取…… 有什么建议么?

语言
给出一些代码既可以让题目表述更准确,又可以避免一些不必要的分歧,使讨论更集中。
既然这里是C/C++板块,自然用C描述比较合适。 但讨论不一定局限于C/C++。
不是都在追求所谓的语言只是工具么?

背景
与图形相关的程序的一些片段,不妨设

点定义如下:

  1. typedef struct {
  2.       int x,y;
  3. } point;
复制代码
目前程序需要处理圆形与矩形。将来可能会增加更多的需要处理的图形。
定义如下:

  1. typedef struct {
  2.       point  center;
  3.       double radius;
  4. } circle;

  5. typedef struct {
  6.       int top,bottom,left,right;
  7. } rect;
复制代码
两点间距离以及圆形与矩形的中心计算已经实现:

  1. double distance(point p,point q);
  2. point center_of_circle(circle const* c) { return c->center; }
  3. point center_of_rect(rect const* r)
  4. {
  5.       point p;
  6.       p.x = (r->left + r->right)/2;
  7.       p.y = (r->top + r->bottom)/2;
  8.       return p;
  9. }
复制代码
问题1
在思考以下问题的同时请考虑软件演化时可能会需要处理更多的图形。

1.1. 设计一个函数R: double R(? x);
计算图形x的中心到原点的距离

1.2. 设计一个函数D: double D(? x,? y);
计算图形x,y中心之间的距离

1.3. 设计一个函数P: double P(? x,? y,? z);
计算图形x,y,z的中心构成的三角形(假设输入保证构成三角形)的周长


====== ====== 分割线:两个新增问题 ====== ======
原准备另开一贴的, 不过貌似这贴也不挤, 就放这了。


问题2: 设计一个函数 double distance(? x,? y); 求两图形上最近两点之间的距离

例:
若两圆相切或相交,则最近两点(可能存在多对)间距离为0。
若两圆相离,则最近两点是连接两圆心的线段与两圆的的两个交点之间的距离。

  1. double distance_of_circle(circle const* a,circle const* b)
  2. {
  3.       double d = distance(a->center,b->center);
  4.       double s = a->radius + b->radius;
  5.       return d>s? d-s: 0;
  6. }
复制代码
同样,还有矩形与矩形、圆形与矩形的距离计算

  1. double distance_of_rect(rect const* a,rect const* b);
  2. double distance_of_circle_rect(circle const* c,rect const* r);
复制代码
问题3: 设计一个函数 double intersection(? x,? y,? z); 求三图形交集的面积。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2011-10-24 19:35 |显示全部楼层
回复 2# zylthinking

你想多了……  我是不知道标题应该怎么取合适…… 所以就搞了个噱头……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2011-10-24 19:36 |显示全部楼层
回复 3# nketc

图灵完备的要求太低太低了……
若按图灵完备的要求评价语言,没多少不是冗余的

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2011-10-24 21:54 |显示全部楼层
本帖最后由 OwnWaterloo 于 2011-10-24 22:09 编辑
别J8扯什么图灵完备,我脑残,学不了那么深奥的东西。

我就问你,你不是在1楼扯什么计算圆形和矩形呢么?

linux系统中,计算这些图形的东西都放在了pixman这个库中,pixman里的一些主要函数,你懂么???
塑料袋 发表于 2011-10-24 21:27


我不懂,并且我并不认为我目前需要去懂

是否了解自己了解的知识去评价他人,你认为科学吗?
我知道你不懂C++,LISP。但我不会因为你不懂C++或LISP而认为你一无是处。
我猜你也不知道如何用C实现闭包、如何在Windows上实现位置无关DLL。同样,不会因此就认为你是什么所谓的牛鬼蛇神。


其实这个问题本来是为你设置的。为你这位06年就对linux的vfs有5成(如你所说,按Linus Torvalds的成色)理解的同学。
也如我所预见,即使问你也是对牛弹琴而已,你根本不明白题目的意义所在。
并且,我已经降低了难度,最后的炸弹还没抛出来。


记得看过大湿的一帖,说他为了看SICP还回去学夹逼定理,泰勒级数之类的,应该不至于不知道提取抽象这种东西。还是说书白看了
tempname2 发表于 2011-10-20 09:26

若此事非虚,我是真难理解看了SICP:
不懂scheme
不懂lambda演算
不懂词法作用域
不懂闭包
而去搞什么夹逼定理,泰勒级数……

真是白看了。知道什么叫买椟还珠吗?


一法通,则万法皆通。
塑料袋 发表于 2011-10-23 13:56

这是建立在有合理的思维方式的基础上。
我认为你还真不配这句话。
按你这种学习方式,学到的只能是万般知识,依葫芦画瓢的本事而已。


欧阳锋和黄药师,总是互相有些苦恼的吧。。淡定,淡定。。
AD8018 发表于 2011-10-21 09:27

真把我给贬低了。


PS: 我算是明白了,你在CU上就不是为了讨论问题的。
将自己不懂的讨论当作牛鬼蛇神。
而只要讨论中有一点自己熟练的方面就抓住机会显摆
你就那么的空虚寂寞冷吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2011-10-24 22:31 |显示全部楼层
弱弱的问一句,r->left,r->right,r->top,r->bottom,不都是point类型吗?他们怎么相加的?怎么最后等到了int类型?
rover12421 发表于 2011-10-24 22:15


我的错…… 随手写错了……  已经更正,并添加了新的问题。
感谢指出~

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2011-10-24 22:43 |显示全部楼层
回复 13# X-Hawk

原帖已经修改,新增加了两个问题。
应该把沙发抢掉用来update的……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2011-10-24 23:26 |显示全部楼层
回复 15# pmerofc

我猜…… 可能与你反对谭浩强的理由类似?

先不论OO思想是否只是不必要的重发明,它不全是糟糕的东西。
但许多人只会用这个,而且认为必须用这个,无论它是否合适。
另外许多人都只会其形而不会其神。


于是就批呗。一来劲了就不批到死不罢休不痛快呗。
于是,可能就矫枉过正了……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2011-10-25 23:30 |显示全部楼层
语言就是思想,两者互为表里。没有思想当然没有语言,但没有语言也没有思想。自然语言是这样,编程语言也是这样。
狗气球 发表于 2011-10-25 08:29


受教了……

既然说到伪娘……
伪娘(或者真娘也行……)自称"僕"时,那种味道真的很难在其他语言中简炼的表达出来……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2011-10-25 23:31 |显示全部楼层
回复 22# pmerofc

那就是我的错觉了……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2011-10-26 12:19 |显示全部楼层
本帖最后由 OwnWaterloo 于 2011-10-26 12:51 编辑

回复 30# mirnshi

要不我再出个题目?

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, char* argv[])
  4. {
  5.       FILE* ifile = fopen(argv[1], "rb");
  6.       FILE* ofile = fopen(argv[2], "wb");

  7.       unsigned char* key = (unsigned char*)argv[3];
  8.       size_t len = strlen(argv[3]);

  9.       unsigned char S[256];
  10.       int i,j,c;
  11.       for (i=0; i<256; ++i) S[i] = i;
  12.       for (i=0, j=0; i<256; ++i)
  13.       {
  14.             unsigned k;
  15.             j = (j+key[i%len]+S[i]) % 256;
  16.             k = S[i]; S[i] = S[j]; S[j] = k;
  17.       }
  18.       i = j = 0;

  19.       for (; c=getc(ifile), c!=EOF; )
  20.       {
  21.             unsigned k, byte;
  22.             i = (i+1) % 256;
  23.             j = (j+S[i]) % 256;
  24.             k = S[i]; S[i] = S[j]; S[j] = k;

  25.             byte = S[ (S[i]+S[j]) % 256 ];
  26.             putc(c ^ byte, ofile);
  27.       }

  28.       fclose(ofile);
  29.       fclose(ifile);

  30.       return 0;
  31. }
复制代码
上面的代码是用rc4算法对文件(argv[1])加密,存储到文件(argv[2])中。
rc4算法: http://en.wikipedia.org/wiki/RC4
第1个循环对应文中的 The key-scheduling algorithm (KSA), 根据key初始化一个数组。
第2个循环对应文中的 The pseudo-random generation algorithm (PRGA) , 从数组中产生一个byte流,将byte流与文件流逐个异或得到密文。


算法细节不是重点。现在的问题是,上面代码只是一个程序,如何将它设计为一个可供其他程序复用的
同样, 我们只是想表达 rc4 算法的思想, 语言不限。

====== 补充 ======
rc4算法包括如何通过key初始化一个数组,以及如何通过该数组产生一个byte流。

而上面的代码在产生byte流的同时,也同时进行了不属于rc4算法本身的操作 —— 与文件流异或。
如何将rc4算法从这个算法的使用中剥离出来? 使该算法可以复用。比如加密字符串什么的。

i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256
    j := (j + S[ i ]) mod 256
    swap values of S[ i ] and S[j]
    K := S[(S[ i ] + S[j]) mod 256]
    output K
endwhile

这就是产生byte流的算法。
但是,我就明说了,C语言没法直接表达这一算法/思想。 注意那个 output K。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP