Mar 23

zz do...while(0)的妙用 不指定

felix021 @ 2009-3-23 12:50 [IT » 程序设计] 评论(3) , 引用(0) , 阅读(5369) | Via 本站原创
最近在看xen/extra/mini-os的代码的时候发现了n多do{ooxx}while(0)的东东,有点诡异,于是搜了一下,茅厕顿开,嗯。

zz from http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html (貌似是个MVP的Blog阿,膜拜)

--

在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。

1. do...while(0)消除goto语句。
通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源,我们的代码可能是这样:
version 1
Mar 15
BFS @ 2009-03-14
A,搜索,没做。
B,搜索,没做。
C,计算几何,没做。
D,加密算法,Boluor没做完。
E,模拟,Sandy写的,trick是需要先判断下一个走的人是谁(B/W)。
F,表达式的计算,我之前没有看题目,但是扫了一下,觉得应该很简单,回头写一下,应该不难吧。
G,计算几何,超简单的一个等比方程解一下;trick在于两个int加起来以后会OverFlow。
H,字符串处理,数据量很小,不要Trie,用map+set搞定。
I,没看。
J,DP,Sandy推出一个方程,和他讨论了一下,就被拖到机房去,然后他写了AC了。

oak真是相当的不堪阿,sigh。

--

党员活动室确实很适合看电影,音效非常好。

--

贴上我写的代码:
Mar 12
简单写一下吧:
1. 自定义一个struct t,是set里要放的东西。
2. 定义一个仿函数cmper (仿函数functor,其实就是一个重载了operator()用于比较前述struct的类)。
3. 使用这样的语句: set<struct t, cmper> a; 来定义一个包含struct t的set容器。
4. 使用则样的语句: set<struct t, cmper>::iterator ap; 来定义一个对应的迭代器。

@ 2009-03-16补充:其实重载 bool operator < 也可以,就不需要仿函数了。

具体代码如下:
#include<iostream>
#include<set>
using namespace std;

struct t{  //set里的东西
    int i;  //可以再增加其他内容,为了简单只写了一个
    t(){i = 0;}          //构造函数
    t(int _i):i(_i){}    //构造函数
    friend inline ostream & operator <<(ostream &os, const t & a){  //重定向operator <<,纯粹是为了方便输出
        return (os << a.i);
    }
};

class cmper{  //仿函数
public:
    bool operator()(const t &a, const t &b)const{ //重载operator ()
        return a.i < b.i;
    }
};

set<t, cmper> a;  //定义一个set

int main(){
    a.insert(t(3));
    a.insert(t(1));
    a.insert(t(2));
    set<t, cmper>::iterator ap; //定义一个迭代器
    for (ap = a.begin(); ap != a.end(); ap++){ //遍历
        cout << (*ap) << endl;
    }
    return 0;
}

//重载example
struct t{
    int i;
    bool operator < (const t & a)const{
        return i < a.i;
    };
};
Mar 12
有两个版本,都很有意思。如果觉得看英文版郁闷,可以对照着google翻译看“中文版”:
http://translate.google.com/translate?prev=hp&hl=en&js=y&u=http%3A%2F%2Fwww.felix021.com%2Fblog%2Fread.php%3F1503&sl=en&tl=zh-CN&history_state0=

-------------------------------------------------------------

version 1 zz from http://topic.csdn.net/u/20070114/01/ee02dfed-511b-419a-91fe-89917726354a.html 7楼

  One day a Novice came to the Master.
  "Master, " he said, "How is it that I may become a Writer of Programs? ".
  The Master looked solemnly at the Novice.
  "Have you in your possession a Compiler of Source Code? " the Master asked.
  "No, " replied the Novice. The Master sent the Novice on a quest to the Store of Software.

  Many hours later the Novice returned.
  "Master, " he said, "How is it that I may become a Writer of Programs? ".
  The Master looked solemnly at the Novice.
  "Have you in your possession a Compiler of Source Code? " the Master asked.
  "Yes, " replied the Novice.
  The Master frowned at the Novice.
  "You have a Compiler of Source. What now can prevent you from becoming a Writer of Programs? ".
Mar 9

POJ 不指定

felix021 @ 2009-3-9 16:43 [IT » 程序设计] 评论(2) , 引用(0) , 阅读(5063) | Via 本站原创
前些天从某网站下载到了POJ的程序(不是源码) ( @ http://www.dssz.com/250473.html )
要1个积分的。1个积分要1个大洋的。一次性最少充10个积分的。于是我就少了10个大洋。于是就down到了POJ。
down下来是12MB,解压后大几十MB,发现里面带有一个3.4.2版的gcc,40+MB,Orz。去掉那个gcc打包,2MB。
在自己机器上架起来了。Windows(XP) + Tomcat(5.5.27) + JDK(6)。可以正常运行。
反正某一次我去申请了,填了个表,但是PKU那边根本没回复。
刚刚到POJ上面去看了一遍,貌似以前的申请已经被通过了,再次点开那个页面就可以下载了,我囧。
下载下来一看,12.9MB,gcc还是3.4.2。原来是我浪费了10个大洋。

down下来的包里面有一个license.txt,全英文的(真无聊。。),之前down下来懒得看
这回直接贴到translate.google.com,然后看到超搞笑的翻译:

引用
...the source code of the Software.  ----  ...源代码的软件

引用
5. LIMITATION OF LIABILITY
In no event will PKU ACM Team be liable for any damages, including but not limited to any loss of revenue, profit, or data, however caused, directly or indirectly, by the Software or by this Agreement. 
5 。责任限制
在任何情况下,北京大学计算机小组须承担任何赔偿,包括但不限于任何损失的营业收入,利润,或数据,但是造成的直接或间接的软件或通过本协定。

看来那个站点还是违反的这个license的,嗯。

看到第六点:
引用
6. DISTRIBUTION
No distribution is to be made of the Software by the Licensee.  The Licensee may make one copy of the Software for backup purpose only.
//Google的翻译
6 。分布
没有分配将软件由持牌人。持牌人可一复制的软件,如备份用途。


看来还是不允许随便流传的。。。
Mar 8

whuacm - oak - warmupII 不指定

felix021 @ 2009-3-8 23:56 [IT » 程序设计] 评论(2) , 引用(0) , 阅读(4583) | Via 本站原创
今天下午在实验室一个人做的。
一共写了5题,3AC,1WA,1没交。

A, Problem 1398 - Stock Exchange
最长递增自序列。因为是n <= 100000的数据量,所以显然N^2的程序是不行的,
google到了一个Nlog(N)的程序,基本上看懂了,自己写了一遍,AC,顺便贴在后面吧。

B, Problem 1399 - Sky Code
不会,嗯。完全没思路。我讨厌纯数学题=.=

C, Problem 1400 - Perfect Election
暴力写了个,没过样例,于是没交。
——2SAT问题,合取,析取,范式,DFS,强联通分量。晚上跑步的时候feli说的。不很懂,详见Baidu Or Google

D, Problem 1401 - Lucky Cities
没看,貌似图论,想必是不会。

E, Problem 1402 - Build Your Home
顺序(顺时针或者逆时针)给出多边形(不一定是凸多边形)的顶点,求面积。
用三角形的方法写了一个,WA了。后来张文说他用的梯形写的,AC了,于是改了一下,我也AC了。
看来还是要注意,sqrt尽量少用,嗯。代码也贴后面吧。

F, Problem 1403 - Quick Answer
并查集,看起来不难阿,代码也写得蛮快,就TMD的总是wa,我郁闷。回头学习下别人的代码吧。。WA的代码就不贴了
@2009-03-09 AC了,我的思路是基本上是正确的,有2个小错
  a. 输入有点小问题;因为题目的输入数据有一些trailing space,囧。
  b. q x y,当x==y的时候输出的是NO。
  代码也附在后面吧,我不会标准的并查集写法,这是按自己的想法写的。

G, 没看。

H, Problem 1406 - Internet Service Providers
纯数学题,蛮简单,代码贴后面,不写什么了。

I,  Problem 1405 - GCD Determinant
没做,看群里的说法,也是纯数学题=.= 貌似是把欧拉函数乘起来就好了,不要算行列式,嗯。

Mar 8

uva - 2191 - Potentiometers 不指定

felix021 @ 2009-3-8 01:32 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(4174) | Via 本站原创
抽象题意:给出最多200,000个不超过1000的非负整数,对最多200,000次以下两类操作进行处理
1.  M x y   ——求第x到第y个整数之间的所有整数的和。
2.  S x v   ——将第x个整数的值置为v。

显然,硬搞要TLE的,稍微想了一下,就知道应该用线段树(或者树状数组?)来完成。
关于线段树可以参考 http://acm.whu.edu.cn/blog/read.php?26 以及 http://acm.whu.edu.cn/blog/read.php?51

简单的说,就是用一个平衡二叉树来存储这些东西,
每个叶节点存放一个整数(一个单位"线段"),
而每个分支节点存放的是一条"线段"

在M操作的时候,只要递归地将线段xy分割,能够在logN的时间内查询出
在S操作的时候,只要递归地找到对应的叶节点更新,并在返回的时候一层层更新涉及到的分支节点即可,也是logN。

好久没有写稍长的代码了,这个线段树的具体实现也忘得差不多了,还是去翻了一下yyt的论文。
不过这次写得顺利多了,思路比较清晰。
具体的代码为
Feb 25

How To Read C Declarations 不指定

felix021 @ 2009-2-25 16:02 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(7099) | Via 本站原创
这篇看起来忒有意思,回头有空了我翻译一下。

How To Read C Declarations

zz from http://blog.chinaunix.net/u1/36290/showart_443799.html

Even experienced C programmers have difficulty reading declarations that go beyond simple arrays and pointers. For example, is the following an array of pointers or a pointer to an array?
int *a[10];

What the heck does the following mean?
int (*(*vtable)[])();

Naturally, it's a pointer to an array of pointers to functions returning integers. ;)

This short article tells you how to read any C declaration correctly using a very simple technique. I am 99% certain that I read this in a book in the late 1980s, but I can't remember where. I doubt that I discovered this on my own (even though I've always been delighted by computer language structure and esoterica). I do remember, however, building a simple program that would translate any declaration into English.
The golden rule

The rule goes like this:
引用
    "Start at the variable name (or innermost construct if no identifier is present. Look right without jumping over a right parenthesis; say what you see. Look left again without jumping over a parenthesis; say what you see. Jump out a level of parentheses if any. Look right; say what you see. Look left; say what you see. Continue in this manner until you say the variable type or return type."

The degenerate case is:
分页: 13/22 第一页 上页 8 9 10 11 12 13 14 15 16 17 下页 最后页 [ 显示模式: 摘要 | 列表 ]