利用select函數(shù)可以完成非阻塞通信,它可以在用戶指定的時(shí)間內(nèi)監(jiān)聽一些句柄(文件描述符?)(一個(gè)句柄就是你給一個(gè)文件,設(shè)備,套接字(socket)或管道的一個(gè)名字, 以便幫助你記住你正處理的名字, 并隱藏某些緩存等的復(fù)雜性。),當(dāng)readfds或writefds中映象的文件可讀或可寫或超時(shí),本次select()就結(jié)束返回。程序員利用一組系統(tǒng)提供的宏在select()結(jié)束時(shí)便可判斷哪一文件可讀或可寫。
。
函數(shù)原型:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
ndfs:select監(jiān)視的文件句柄數(shù),視進(jìn)程中打開的文件數(shù)而定,一般設(shè)為你要監(jiān)視各文件
中的最大文件號(hào)加一。
readfds:select監(jiān)視的可讀文件句柄集合。
writefds: select監(jiān)視的可寫文件句柄集合。
exceptfds:select監(jiān)視的異常文件句柄集合。
timeout:本次select()的超時(shí)結(jié)束時(shí)間。
函數(shù)返回值:
0表示超時(shí)
-1表示出錯(cuò)
正數(shù)表示文件可讀或可寫
相關(guān)的宏:
FD_ZERO(fd_set *fdset):清空f(shuō)dset與所有文件句柄的聯(lián)系。
FD_SET(int fd, fd_set *fdset):建立文件句柄fd與fdset的聯(lián)系。
FD_CLR(int fd, fd_set *fdset):清除文件句柄fd與fdset的聯(lián)系。
FD_ISSET(int fd, fd_set *fdset):檢查fdset聯(lián)系的文件句柄fd是否可讀寫,當(dāng)>0表示可讀寫。
select只能監(jiān)聽文件描述符(file descriptors),文件指針是不行的。通過(guò)int fileno(FILE* fp)函數(shù)可以完成文件指針到文件描述符的轉(zhuǎn)換。
#include<stdlib.h>
#include<string.h>
#include<sys/time.h>
#include<sys/types.h>
#include<unistd.h>
int main(){
int fno = fileno(stdin);
// 得到sdtin的文件描述符
fd_set fdR;
struct timeval timeout = {.tv_sec = 10, .tv_usec = 0};
FD_ZERO(&fdR);
FD_SET(fno, &fdR);
char str[64];
int goOn = 1;
while(goOn){
printf("goOning

switch(select(fno + 1, &fdR, NULL, NULL, &timeout)){
case -1:
printf("select fail\n");
goOn = 0;
break;
case 0:
printf("select end\n");
goOn = 0;
break;
default:
scanf("%s", str);
printf("str=%s\n", str);
}
}
}
代碼片段1:在指定時(shí)間內(nèi)讀取stdin的數(shù)據(jù)。
代碼片段2:服務(wù)器在一定時(shí)間內(nèi)接收子節(jié)點(diǎn)發(fā)來(lái)的數(shù)據(jù)報(bào)。
…


…


fd_set fdR;
struct timeval timeout = {tv_sec:10, tv_usec:0};// 等待接收一定時(shí)間之后結(jié)束
int goOn = 1;
FD_ZERO(&fdR);
FD_SET(sockfd, &fdR);
while(goOn){
switch(select(sockfd + 1, &fdR, NULL, NULL, &timeout)){
case -1:
printf("select fail\n");
goOn = 0;
break;
case 0:
printf("select timeout\n");
goOn = 0;
break;
default:
// 正常情況,讀取信息
if((numbytes = recvfrom(sockfd, &cdt, sizeof(cdt), 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1){
printf("recvfrom fail\n");
}
}
參閱:
http://www.tuicool.com/articles/Rfeaie
脫氧核糖核酸即常說(shuō)的DNA,是一類帶有遺傳信息的生物大分子。它由4種主要的脫氧核苷酸(dAMP、dGMP、dCMT和dTMP)通過(guò)磷酸二酯鍵連接而成。這4種核苷酸可以分別記為:A、G、C、T。
DNA攜帶的遺傳信息可以用形如:AGGTCGACTCCA.... 的串來(lái)表示。DNA在轉(zhuǎn)錄復(fù)制的過(guò)程中可能會(huì)發(fā)生隨機(jī)的偏差,這才最終造就了生物的多樣性。
為了簡(jiǎn)化問(wèn)題,我們假設(shè),DNA在復(fù)制的時(shí)候可能出現(xiàn)的偏差是(理論上,對(duì)每個(gè)堿基被復(fù)制時(shí),都可能出現(xiàn)偏差):
1. 漏掉某個(gè)脫氧核苷酸。例如把 AGGT 復(fù)制成為:AGT
2. 錯(cuò)碼,例如把 AGGT 復(fù)制成了:AGCT
3. 重碼,例如把 AGGT 復(fù)制成了:AAGGT
如果某DNA串a(chǎn),最少要經(jīng)過(guò) n 次出錯(cuò),才能變?yōu)镈NA串b,則稱這兩個(gè)DNA串的距離為 n。
例如:AGGTCATATTCC 與 CGGTCATATTC 的距離為 2
你的任務(wù)是:編寫程序,找到兩個(gè)DNA串的距離。
【輸入、輸出格式要求】
用戶先輸入整數(shù)n(n<100),表示接下來(lái)有2n行數(shù)據(jù)。
接下來(lái)輸入的2n行每2行表示一組要比對(duì)的DNA。(每行數(shù)據(jù)長(zhǎng)度<10000)
程序則輸出n行,表示這n組DNA的距離。
例如:用戶輸入:
3
AGCTAAGGCCTT
AGCTAAGGCCT
AGCTAAGGCCTT
AGGCTAAGGCCTT
AGCTAAGGCCTT
AGCTTAAGGCTT
則程序應(yīng)輸出:
1
1
2
結(jié)題思路:參閱百度百科http://baike.baidu.com/view/2020247.htm
代碼如下:













































在很多軟件中,輸入拼音的首寫字母就可以快速定位到某個(gè)詞條。比如,在鐵路售票軟件中,輸入: “bj”就可以定位到“北京”。怎樣在自己的軟件中實(shí)現(xiàn)這個(gè)功能呢?問(wèn)題的關(guān)鍵在于:對(duì)每個(gè)漢字必須能計(jì)算出它的拼音首字母。
GB2312漢字編碼方式中,一級(jí)漢字的3755個(gè)是按照拼音順序排列的。我們可以利用這個(gè)特征,對(duì)常用漢字求拼音首字母。
GB2312編碼方案對(duì)每個(gè)漢字采用兩個(gè)字節(jié)表示。第一個(gè)字節(jié)為區(qū)號(hào),第二個(gè)字節(jié)為區(qū)中的偏移號(hào)。為了能與已有的ASCII編碼兼容(中西文混排),區(qū)號(hào)和偏移編號(hào)都從0xA1開始。
我們只要找到拼音a,b,c,...x,y,z 每個(gè)字母所對(duì)應(yīng)的GB2312編碼的第一個(gè)漢字,就可以定位所有一級(jí)漢字的拼音首字母了(不考慮多音字的情況)。下面這個(gè)表給出了前述信息。請(qǐng)你利用該表編寫程序,求出常用漢字的拼音首字母。
a 啊 B0A1
b 芭 B0C5
c 擦 B2C1
d 搭 B4EE
e 蛾 B6EA
f 發(fā) B7A2
g 噶 B8C1
h 哈 B9FE
j 擊 BBF7
k 喀 BFA6
l 垃 C0AC
m 媽 C2E8
n 拿 C4C3
o 哦 C5B6
p 啪 C5BE
q 期 C6DA
r 然 C8BB
s 撒 C8F6
t 塌 CBFA
w 挖 CDDA
x 昔 CEF4
y 壓 D1B9
z 匝 D4D1
【輸入、輸出格式要求】
用戶先輸入一個(gè)整數(shù)n (n<100),表示接下來(lái)將有n行文本。接著輸入n行中文串(每個(gè)串不超過(guò)50個(gè)漢字)。
程序則輸出n行,每行內(nèi)容為用戶輸入的對(duì)應(yīng)行的漢字的拼音首字母。
字母間不留空格,全部使用大寫字母。
例如:
用戶輸入:
3
大家愛科學(xué)
北京天安門廣場(chǎng)
軟件大賽
則程序輸出:
DJAKX
BJTAMGC
RJDS
結(jié)題思路:
C語(yǔ)言中的一個(gè)漢字占兩個(gè)字節(jié)(兩個(gè)char),我們只需把這兩個(gè)字節(jié)對(duì)應(yīng)的int型數(shù)字算出來(lái),然后到編碼表里去比較即可。計(jì)算該數(shù)字時(shí)要用到移位,與,或等位運(yùn)算操作。
代碼如下:

















































































1949年的國(guó)慶節(jié)(10月1日)是星期六。
今年(2012)的國(guó)慶節(jié)是星期一。
那么,從建國(guó)到現(xiàn)在,有幾次國(guó)慶節(jié)正好是星期日呢?
不多說(shuō)了,直接上代碼:





























截取JDK文檔中的一部分,感覺(jué)這些東西我以后會(huì)用到。
字符類 | |
---|---|
[abc] | a、b 或 c(簡(jiǎn)單類) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](減去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](減去) |
Greedy 數(shù)量詞 | |
---|---|
X? | X,一次或一次也沒(méi)有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超過(guò) m 次 |
這些目前來(lái)說(shuō)夠用啦。
【編程題】(滿分21分)
Excel是最常用的辦公軟件。每個(gè)單元格都有唯一的地址表示。比如:第12行第4列表示為:“D12”,第5行第255列表示為“IU5”。
事實(shí)上,Excel提供了兩種地址表示方法,還有一種表示法叫做RC格式地址。 第12行第4列表示為:“R12C4”,第5行第255列表示為“R5C255”。
你的任務(wù)是:編寫程序,實(shí)現(xiàn)從RC地址格式到常規(guī)地址格式的轉(zhuǎn)換。
【輸入、輸出格式要求】
用戶先輸入一個(gè)整數(shù)n(n<100),表示接下來(lái)有n行輸入數(shù)據(jù)。
接著輸入的n行數(shù)據(jù)是RC格式的Excel單元格地址表示法。
程序則輸出n行數(shù)據(jù),每行是轉(zhuǎn)換后的常規(guī)地址表示法。
例如:用戶輸入:
2
R12C4
R5C255
則程序應(yīng)該輸出:
D12
IU5
結(jié)題思路:字符串處理,26進(jìn)制轉(zhuǎn)換。特別注意26要被轉(zhuǎn)換成Z,因?yàn)锳表示的是1而不是0。
代碼如下:
(代碼實(shí)現(xiàn)了兩種格式的互換問(wèn)題)
















































































某少年宮引進(jìn)了一批機(jī)器人小車??梢越邮茴A(yù)先輸入的指令,按指令行動(dòng)。小車的基本動(dòng)作很簡(jiǎn)單,只有3種:左轉(zhuǎn)(記為L(zhǎng)),右轉(zhuǎn)(記為R),向前走若干厘米(直接記數(shù)字)。
例如,我們可以對(duì)小車輸入如下的指令:
15L10R5LRR10R20
則,小車先直行15厘米,左轉(zhuǎn),再走10厘米,再右轉(zhuǎn),...
不難看出,對(duì)于此指令串,小車又回到了出發(fā)地。
你的任務(wù)是:編寫程序,由用戶輸入指令,程序輸出每條指令執(zhí)行后小車位置與指令執(zhí)行前小車位置的直線距離。
【輸入、輸出格式要求】
用戶先輸入一個(gè)整數(shù)n(n<100),表示接下來(lái)將有n條指令。
接下來(lái)輸入n條指令。每條指令只由L、R和數(shù)字組成(數(shù)字是0~100之間的整數(shù))
每條指令的長(zhǎng)度不超過(guò)256個(gè)字符。
程序則輸出n行結(jié)果。
每條結(jié)果表示小車執(zhí)行相應(yīng)的指令前后位置的直線距離。要求四舍五入到小數(shù)后2位。
例如:用戶輸入:
5
L100R50R10
3LLL5RR4L12
LL
100R
5L5L5L5
則程序輸出:
102.96
9.06
0.00
100.00
0.00
模擬機(jī)器人行走即可,用數(shù)字表示機(jī)器人的方向,向上為0,向右為1,下為2,左為3。設(shè)初始狀態(tài)機(jī)器人方向?yàn)?,則遇到R就將當(dāng)前方向加1,遇到L將當(dāng)前方向減1。x軸向右增大,y軸向上增大。
代碼如下:





































































看這個(gè)算式:
☆☆☆ + ☆☆☆ = ☆☆☆
如果每個(gè)五角星代表 1 ~ 9 的不同的數(shù)字。
這個(gè)算式有多少種可能的正確填寫方法?
173 + 286 = 459
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675
以上都是正確的填寫法!
注意:
111 + 222 = 333 是錯(cuò)誤的填寫法!
因?yàn)槊總€(gè)數(shù)字必須是不同的!
也就是說(shuō):1~9中的所有數(shù)字,每個(gè)必須出現(xiàn)且僅出現(xiàn)一次!
結(jié)題思路:
排列1~9,寫出符合條件的結(jié)果。
代碼如下:



































求第100002個(gè)素?cái)?shù)。(2是第一個(gè)素?cái)?shù))
結(jié)題思路:素?cái)?shù)篩法
代碼如下:


































| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
31 | 1 | 2 | 3 | 4 | 5 | 6 | |||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 | 31 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
常用鏈接
隨筆分類(111)
- C語(yǔ)言(3)
- DP(9)
- Java筆記(1)
- Java基礎(chǔ)練習(xí)(25)
- 安卓(1)
- 本科畢設(shè)(1)
- 博弈(1)
- 大數(shù)(7)
- 回溯(2)
- 排序(10)
- 暑期培訓(xùn)周賽(3)
- 數(shù)據(jù)結(jié)構(gòu)(7)
- 數(shù)論(1)
- 水題(8)
- 圖論(24)
- 網(wǎng)選訓(xùn)練(8)
隨筆檔案(127)
- 2014年3月 (1)
- 2013年7月 (10)
- 2013年5月 (1)
- 2013年4月 (11)
- 2013年3月 (8)
- 2012年10月 (1)
- 2012年9月 (12)
- 2012年8月 (38)
- 2012年7月 (14)
- 2012年6月 (2)
- 2012年5月 (8)
- 2012年4月 (6)
- 2012年3月 (6)
- 2012年2月 (4)
- 2011年8月 (5)
friends
最新評(píng)論

- 1.?re: 線段樹
-
是這個(gè)樣子的,所以在OJ有時(shí)候“卡住”了也不要太灰心,沒(méi)準(zhǔn)真的不是自己的原因呢。
加油,祝你好運(yùn)啦! - --小鼠標(biāo)
- 2.?re: 線段樹
- 對(duì)于編程競(jìng)賽來(lái)說(shuō),Java所需時(shí)間一般為C/C++的兩倍。合理的競(jìng)賽給Java的時(shí)間限制是給C/C++的兩倍。
- --傷心的筆
- 3.?re: poj1273--網(wǎng)絡(luò)流
- 過(guò)來(lái)看看你。
- --achiberx
- 4.?re: (轉(zhuǎn))ubuntu11.10無(wú)法啟動(dòng)無(wú)線網(wǎng)絡(luò)的解決方法
- 膜拜大神。。查了一個(gè)下午資料終于在這里解決了問(wèn)題。。神牛說(shuō)的區(qū)域賽難道是ACM區(qū)域賽。。?
- --Hang
- 5.?re: 快速排序、線性時(shí)間選擇
- 博主,謝謝你的文章。你的方法可以很好的處理分區(qū)基準(zhǔn)在數(shù)組中重復(fù)的情況,書上的方法遇到這種輸入會(huì)堆棧溢出。書上給出了解釋但給的方法貌似不簡(jiǎn)潔。
- --lsxqw2004