2007/8

刘洋啊,刘洋~!

哎,今天不能不说一下刘洋兄了!我彻底被他折服了!大家可能不知道,刘洋兄的拖拉能力是非常惊人的!

刘洋兄其人虽胖,但肢体行动还不迟缓,踢球从来都不掉队,可没想到做起事来是如此拖拖拉拉。有时,分配给他的一些事,按他的能力本来一天搞定不成什么问题,可我们一天后几乎总是看不出他有什么搞定的迹象,甚至两三天之后仍然看不到!实在忍无可忍时就发邮件问问他到底在干嘛?!可他总是不急不慢,斯斯文文地回答:“这些天我有事没去实验室。”或者“哎,别提了!又帮同学&#%@去了!”我不得不承认,这种回答非常巧妙!想说他几句吧,可人家确实有事,你也不好说什么!不说吧,可他拖得我们实在不爽,让我们在这干着急!这一招太狠了,让我们进退两难,欲说不能,欲言又止!不服不行!

哎,刘洋啊,刘洋……我该说你什么好呢?

Brackets, too

If a is legal, (a), {a}, [a] are legal;
If a and b are both legal, ab is legal.

You are given a string S with length of n. Assume that Si(1 <= i <= n) is the i-th character of S. Your task is to find out whether there is a k(1 <= k <= n) that SkSk+1Sk+2…SnS1S2…Sk-1 is legal.

Input
There are several test cases. The first line contains an integer N. Then N test cases follows. In each test case, there is an only line that contains S. The length of S will not be larger than 1000. There are only (, ), {, }, [, ] in S.

Output
For each test case, output a single line “YES” (without quotation marks) if there is such a k, or “NO” (without quotation marks) otherwise.

Sample Input
3
}()[]{
}([)]{
()][

Sample Output
YES
NO
YES

! /usr/bin/env python

import string, sys

def exchange_str(str, i):
str1 = str[0:i]
str2 = str[i:]
return str2+str1

def is_legal(str):
if(len(str)==0):
return 1
if(len(str)==1):
return 0

if(str[0]=='('):
    i = string.find(str, ")")
    if(i==-1):
        return 0
    elif(i==len(str)-1):
        return is_legal(str[1:len(str)-1])
    else:
        return is_legal(str[0:i+1]) and is_legal(str[i+1:len(str)])
if(str[0]=='['):
    i = string.find(str, "]")
    if(i==-1):
        return 0
    elif(i==len(str)-1):
        return is_legal(str[1:len(str)-1])
    else:
        return is_legal(str[0:i+1]) and is_legal(str[i+1:len(str)])
if(str[0]=='{'):
    i = string.find(str, "}")
    if(i==-1):
        return 0
    elif(i==len(str)-1):
        return is_legal(str[1:len(str)-1])
    else:
        return is_legal(str[0:i+1]) and is_legal(str[i+1:len(str)])

n = string.atoi(sys.stdin.readline())
while(n!=0):
str = sys.stdin.readline()
str = str[0:len(str)-1]
tmp = “”
legal = 0;
for i in range(0, len(str)):
tmp = exchange_str(str, i)

    #print "==&gt;"+tmp+"n"
    if(is_legal(tmp)):
        legal = 1
        break
if(legal==1):
    print "YES"
else:
    print "NO"
n-=1

Brackets

Given a string consisting of brackets of two types find its longest substring that is a regular brackets sequence.

Input

There are mutiple cases in the input file.
Each case contains a string containing only characters ‘(’ , ‘)’ , ‘[’ and ‘]’ . The length of the string does not exceed 100,000.
There is an empty line after each case.

Output

Output the longest substring of the given string that is a regular brackets sequence.
There should be am empty line after each case.

Sample Input

([(]()]

([)]

Sample Output

[()]

include

include

include

include

using namespace std;

class Substr{
private:
int from;
int length;
string s;
bool ispair(char a, char b)
{
if(a ==’(‘ && b == ‘)’)
return true;
else if(a == ‘[‘ && b == ‘]’)
return true;
else
return false;
}
void calculate()
{
int max = 0;
int len = 0;
const char* p = this->s.c_str();
stack vc;

    do
    {
        if(!vc.empty() &amp;&amp; ispair(vc.top(),*p)){
            vc.pop();
            len++;
        } else {
            if(len &gt; max){
                max = len;
                from = p-this-&gt;s.c_str();
                length = len*2;
                from -= length;
            }
            len = 0;
            vc.push(*p);
        }
    }while(*p++);
}

public:
Substr(string str)
{
s = str;
from = 0;
length = 0;
}
void print()
{
calculate();
cout<<s.substr(from, length)<<endl;
cout<>s){
Substr ss(s);
ss.print();
}
return 0;
}

翠花儿,上代码~!

无意(确实是无意)间写了这么一个程序,它既没调用里面的打印”hello!”的函数,也没使用循环,却是无限循环地打印”hello!”!这个程序是不可移植的,在Win上应该不行,在Linux上可能也有差异。我是在FC5上编译运行的,效果不错。

include

include

void foo(char arg)
{
volatile int foo = 3;
volatile int bar = 9;
char str[8];
strcpy(str, arg);
printf(“ret=%pn”, (int
)(&foo - 1));
}

void hello()
{
printf(“hello!n”);
}
int main(void)
{
char t[32] = { 0 };
memset(t, ‘x90’, 31);
unsigned long ptr = (unsigned long )&t[20];
ptr = (unsigned long)&hello;
ptr = (unsigned long
)&t[24];
*ptr = (unsigned long)&main;
printf(“hello@%pn”, hello);
foo(t);
return 0;
}

又是一道数学题

如上图, ABDC为正方形,边长为12,E是中点。求黑色三角形BEF面积。

一看好像是我弟弟寒假作业中的一道题,当时用的是重叠面积法做的。后来发现根本不是一个题,思路都不一样,这道题是用传说中的……来做。

不会做的人就继续路过吧!小公子肯定以低调的名义表示不会做,很假,公子您的调再低点儿就成韩红了!而某位给初中生当家教的同学不知道对这道初中生的题感觉如何?人家那娃要是问您这道题您该咋回答呢?

下学期课表

因为篇幅原因和某些不可抗拒的因素,在这里只能公布我们网络0404~06班的下学期的课表。看来下学期还是和小公子刘洋兄一起上课。让我感到很爽的是周一第一节居然没课,挖哈哈哈……

这次没有任课老师的名字,貌似还没排出来。星期几没贴出来,每天四行,自己算就是了。同级同专业的其它班课程内容一样,只是顺序和教室不一样。其它班的同学如需,请留言索取。

感谢张老师!

[翻译]每个程序员都要学习C的十个理由

做人要厚道,转载请指明出处!

原文见:http://www.jubuu.com/ten-reasons-why-every-programmer-should-learn-c.html

每个程序员都应该在他的职业生涯中去学习C。好处很多,不能忽视。它不仅能带来更多的工作机会,而且还能教你更多关于计算机的东西。

1. 相对于其它编程语言(C++,Java),C是较为底层的。在更底层进行编程工作能让你进一步理解计算机,作为一个整体。

2. 设备驱动程序和操作系统都是专门用C写的。可能你从来没写过一个设备驱动程序,但是如果你需要去修改一个,该怎么办呢?

3. 如果你想找一个对单片机进行编程的工作,又怎么办呢?它们也是用C编程的。你还打算因为不想学一门新的编程语言而限制你的工作范围吗?

4. C语言程序比用其它编程语言写的程序更小更快。有时,你的程序需要速度的提升,而这通常只有C才做得到。

5. 如果你学过C,你可以学习任何现代的编程语言。背后的原因是大多数现代的编程语言都是基于C的(Java,C++,C#)。

6. 因为C已经存在很多年了,它拥有庞大的社区和集体的代码库。这就使得你可以快速有效地去实现新的算法或者函数——它们以前都被编写过。

7. C是开放源代码社区的语言。开源的宠儿Linux就是用C编写的。如果你懂得C,你就可以参与和奉献很多开源社区,比如Source Forge

8. C是唯一一门教授你指针到底是什么东西的语言。C#和Java完全跳过了这一部分。而正是指针,才给予了C威力。

9. C仍然是编程工作所需的最通用的语言。值得你花时间去掌握它。

10. 任何带有微芯片的东西都支持C。从你的微波炉到手机,C驱动着这些技术。

推荐两首歌

最近发现若干首很好听的歌曲,在这里推荐两首,估计听过的人不多。

一首是Charlene Burris的《I HAVE NEVER BEEN TO ME》,歌曲中饱含幽怨,描述了一个女人的沧桑经历,是在劝告别人,但又似乎是在劝告自己。她说自己虽然到过所谓的快乐“天堂”,却从来没未找到过自我,希望别人不要再重蹈她的覆辙。里面独白的那段尤其好,摘录如下:

Hey
You know what paradise is
It’s a lie
A fantasy we create about people
And places as we’d like them to be
But you know what truth is
It’s that little baby you’re holding
And it’s that man you fought with this morning
The same one you’re going to make love with tonight
That’s truth
That’s love
另一首是三位帅妞唱的,叫《Nothing in the world》,不多说了,自己听听看就知道。

[翻译]C的影响力

(译者注:这是非常好的一篇短文,是我见过的论述C语言影响力最好的文章,特此翻译过来,和大家一起分享。同时也作为我写的书中第一章的一部分。 原文见:http://ripplingbrainwaves.blogspot.com/2007/07/c-reflections.html

[做人要厚道,转载请指明出处!]

C在我的记忆中占据着重要的地位,因为它是我学过的真正通用而且具有专业扩展性的语言之一。我被一些人的想法吓到了,他们说希望学习计算机编程的诫条和技巧,但除了C的名气外却对它一无所知。

让那种想法变得吓人的原因是C持续增长的至关重要性。就像人类历史是当前文明和文化成型的看不见但又普遍的因素一样,C(尤其是用C/C++写的软件)是当前软件开发生态系统中看不见但又普遍的内在因素。给我一个操作系统,编译器,集成开发环境,Java虚拟机,设备驱动程序,我会给你指出C的影响力。

C的集中性和有效性直接来自于它的这种能力——不仅能那么紧密地映射到执行它的机器,而且能让程序员从极痛苦的实际硬件(寄存器,内存分段,字节序,操作码)的细节中抽象出来。实际上,C/C++编译器在弥补这个缺口上已经变得非常成熟了,一个不专业的程序员尝试自己去做这些甚至会降低优化的水平。我知道C的替代品已经出来了(通常和C差别并不大),但C自身的成功看起来已经把它固定为其生境中默认的选择了。

然而,用C/C++做实际的工作经常要当心机器结构和问题领域结构之间的平衡。考虑到“我需要密切地贴近机器工作”,因此选择C/C++;或者,考虑到“啊,把全部这些步骤都写出来太气人了”,因此逃离标准库或者众多其它的库中的一个,这都不需要花多长时间。我很惊讶,完善的内置字符串支持究竟缺乏到何种程度才导致某种用途的C的替代语言崛起。还有,缺乏成熟的内置数据结构,比如链表和映射,它们应该太广泛了,以至于不该提起。我陷入丢失堆栈跟踪,因为一些未捕捉的异常,甚至一些异常抛出。一些库或工具包为程序员提供了如此全面的函数和宏的封装,以至于感觉结果好像是一种方言(智能指针?向量?),这并不让人惊讶。

自然而然,折衷就是任何给定的程序中都不要使用这些外部的库或者语言特性,开销和复杂度也不是强制性的。而且,使用把程序员和机器联系起来的一种语言在某些方面是令人满意的。这种语言有大量的根据证明程序是为计算机,不是“理论的图灵机”,而写的:指针——只不过是有组织的一组变量单元的结构体,引用内存地址而不是对象的变量,以多种方式解释内存内容的能力,作弄内存的void*函数。它当然可能诡异,而且有时甚至很容易导致错误,但是“无用信息输入,无用信息输出”的原则始终适用。很多人在这方面比我更有经验,更熟练。

对我来说,C是象征性的编程语言,因为它巧妙地连接了人类思想和机器计算。那些能编写高效C代码的人也是能跨越两个领域的人。过分尝试让C代码更像人类思维,程序就可能会运行很糟糕。过分尝试为机器而裁减C代码,程序就可能变成难以扩展的,魔鬼般地神秘的一团。去学C/C++吧!人们喜欢说Lisp是如何激发灵感的。思想和机器在C代码中的混合可能会产生相似的灵感。至少,你可能会更加感激编译器/解释器实际上在为你做的工作。如果没有别的,只有读通C/C++的能力也是务实的,因为它仍然存活在企业和遗留的代码中。C/C++在开源世界中碰巧也是非常重要的,多亏了gcc这个东西,你可能听说过它(在我使用Gentoo的时候,gcc可能是CPU周期的最大消耗者)。

为什么void main是愚蠢的?

a) 最直接的回答:因为标准就是这么规定的。C99第5.1.2.2.1节“Program startup”
中明确规定好了的,不服不行。当然了,您要写不可移植的C就得另说了。

b) main函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出;
返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。在Win下
你可能觉得这并不重要,但请想想Unix/Linux下面那些依靠程序“返回值”工作的
脚本和Makefile!

c) main函数被认为要返回int(main is supposed to return an int.)。调用main的
程序假设它会返回一个int,并且把它压栈。如果它没有返回,就有可能导致
程序崩溃!

d) 在Win上可行并不代表都可行,在所有i386上可行也不代表都可行。世界是丰富多彩
的,除了Window$和i386,还有很多系统和构架。这里有一个void main导致程序崩溃
的例子,是在ARM上的RISC OS中,见下:
http://users.aber.ac.uk/auj/voidmain.shtml

e) C++之父在其主页上这样评价void main:“这种定义从来没有在C++中出现过,也没在C中出现。” “一致的实现可能提供多种main的版本,但他们必须都是int返回类型。” “即使你的编译器接受void main,你也要避免它。”

所以,你不应该,更不能教别人,使用void main。如果你的老师上课时教给你写void main,你应该毫不犹豫地站起来告诉他/她:这样是不对的! 同理,任何讲C语言的书中带有void main的例子都是不严谨的!