2005年12月29日 测测你自己 - Test Yourself
测测你自己
From The Joel on Software Translation Project
当我要去宾州开始我的第一年大学生活时,我认为自己已经是非常好的程序设计师。靠完全自学,我用Turbo Pascal写了两套系统...一个是小型工厂的存货系统,另一个是能对以色列一个最大的面包工厂的生产线做排程。
直到期中考我才了解我并不是如自己想的一样聪明。某些考题我完全搞砸了,因为我还是不了解指针(pointers)跟递回(recursion).
不是对某人怀恨在心,我将这些期中考题与你分享...看看你是否能做的比我大一还好。
1a. (MIT-Scheme) 使用以下函数
(define (accumulate combiner null-value l) (if (null? l) null-value (combiner (car l) (accumulate combiner null-value (cdr l)))))
实现平方和, 就是计算一串数字平方的加总,例如
(sum-of-squares '(1 2 3 4 5))
应为55.
(解答请反白全选下列的文字栏:)
(define (sum-of-squares l) (accumulate (lambda (x y) (+ (* x x) y)) 0 l))
1b. (JavaScript) 好吧,也许Scheme不是你擅长的,这个问题跟1a一样,只是是用JavaScript.
使用以下函数
function accumulate(combiner, nullValue, l) { if (l.length == 0) return nullValue; var first = l.shift(); return combiner(first, accumulate(combiner, nullValue, l)); }
实现平方和, 就是计算一串数字平方的加总,例如
sumOfSquares([1,2,3,4,5])
应为55.
(解答请反白全选下列的文字栏:)
function sumOfSquares(lst) { return accumulate(function(x,y){return x*x+y}, 0, lst); }
2. (ANSI C) 以下列格式写一个C的程序:
#include <stdio.h> int main(int argc, char **argv) { ??? }
使得它在编译之后,可以如下执行
% ./a.out could harold eat eight salami elephants
而它会印出每个参数的第一个字母(在这个例子,是"cheese").
(解答请反白全选下列的文字栏:)
#include <stdio.h> int main(int argc, char** argv) { int i; for (i=1; i<argc; i++) { putchar(argv[i][0]); } putchar('\n'); return 0; }
3. (ANSI C) 底下的C程序输出是什么?
#include <stdio.h> char *fn(int i, char *s) { while (i) { s++; i--; } return s; } int main(int argc, char** argv) { int a = 2; static char c[] = "test"; printf("%s\n", fn(a,c)); return 0; }
(解答请反白全选下列的文字栏:)
st (followed by a newline)
想要更多的程序设计挑战,请见TopCoder.