第三章 陣列和字串 例題篇 演算法競賽入門經典

2021-10-03 05:49:55 字數 3352 閱讀 2843

知識點一:蛇形填數 p40

利用邊界和碰撞

#include

#include

#define max 20

int set[max]

[max]

;int

main()

for(

int i =

0;i < n;i++

)printf

("\n");

}return0;

}

知識點二:讀取字串 p43

1.scanf("%s",s)它會讀入乙個不含空格、tab和回車符的字串,存入字元陣列s。

2.fgetc(fin),它讀取乙個開啟的檔案fin,讀取乙個字元,然後返回乙個int值。如果檔案結束,fgetc將返回乙個特殊標記eof,它並不是乙個char。如果把fgetc(fin)的返回值強制轉換為char,將無法把特殊的eof和普通字元區分開。如果要從標準輸入讀取乙個字元,可以用getchar,它等價於fgetc(stdin)。

3.fgetc和getchar將讀取「下乙個字元」,因此需要知道在各種情況下,「下乙個字元」是哪個。如果用「scanf("%d",&n)」讀取整數n,則要是在輸入123後多加了乙個空格,用getchar讀取的將是這個空格;如果在「123」之後緊跟著換行,則讀取到的將是回車符「\n」。

4.這裡有個潛在的陷阱:不同作業系統的回車換行符是不一致的。windows是「\r」和「\n」兩個字元,linux是「\n」,而maxos是「\r」。如果在windows下讀取windows檔案,fgetc和getchar會把「\r」「吃掉」,只剩下「\n」;但如果要在linux下讀取同樣乙個檔案,他們會忠實地先讀取「\r」,然後才是「\n」。如果程式設計時不注意,所寫程式可能會在某個作業系統上是完美的,但在另乙個作業系統上就錯得一塌糊塗。應該避免在linux下使用windows格式的檔案,但正如前面所強調過的:應該把自己的程式寫得更魯棒,即容錯性更好。

5.fgets(buf,maxn,fin)讀取完整的一行,其中buf宣告為char buf[maxn]。這個函式讀取不超過maxn-1個字元,然後在末尾添上結束符「\0」,因此不會出現越界的情況。之所以說可以用這個函式讀取完整的一行,是因為一旦讀到回車符「\n」,讀取工作將會停止,而這個「\n」也會是buf字串中最後乙個有效字元(再往後就是字串結束符「\0」了)。只有在一種情況下,buf不會以「\n」結尾:讀到檔案結束符,並且檔案的最後乙個不是以「\n」結尾。

6.fgets也有乙個「標準輸入版」gets。遺憾的是,gets和它的「兄弟」fgets差別比較大:其用法是gets(s),沒有指明讀取的最大的字元數。這裡就出現了乙個潛在的問題:gets將不停地往s中儲存內容,而不管是否儲存得下!在c11標準裡,該函式已被正式刪除。

7.c語言並不禁止程式讀寫「非法記憶體」。例如,宣告的是char s[100],完全可以賦值s[10000]=『a』(甚至-wall也不會警告),但後果自負。

例題3-3 回文詞和映象詞(palindromes,uva401) p48

輸入乙個字串,判斷它是否為回文串以及映象串。輸入字串保證

不含數字0.所謂回文串,就是反轉以後和原串相同,如abba和madam。

所有映象串,就是左右映象之後和原串相同,如2s和3aiae。注意,並

不是每個字元在映象之後都能得到乙個合法字元。

輸入的每行包含乙個字串(保證只有上述字元。不含空白字元),

判斷它是否為回文串和映象串(共4種組合)。每組資料之後輸出乙個空

行。樣例輸入:

notapalindrome

isapalinilapasi

2a3meas

atoyota

#include

#include

#include

/* 標頭檔案ctype.h中定義的isalpha、isdigit、isprint等工具可以

用來判斷字元的屬性,而toupper、tolower等工具可以用來轉換大小寫。*/

const

char

* rev =

"a 3 hil jm o 2tuvwxy51se z 8 "

;const

char

* msg=

;charr(

char ch)

else

}int

main()

printf

("%s -- is %s.\n\n"

, s, msg[m *

2+ p]);

}return0;

}

猜數字遊戲的提示(master-mind hints,uva 340) p50

實現乙個經典「猜數字」遊戲。給定答案序列和使用者猜的序列,統計有

多少數字位置正確(a),有多少數字在兩個序列都出現過但位置不對

(b)。

輸入包含多組資料。每組輸入第一行為序列長度n,第二行是答案序列,

接下來是若干猜測序列。猜測序列全0時該資料結束。n=0時輸入結束。

樣例輸入:

41 3 5 5

1 1 2 3

4 3 3 5

6 5 5 1

6 1 3 5

1 3 5 5

0 0 0 0

101 2 2 2 4 5 6 6 6 9

1 2 3 4 5 6 7 8 9 1

1 1 2 2 3 3 4 4 5 5

1 2 1 3 1 5 1 6 1 9

1 2 2 5 5 5 6 6 6 7

0 0 0 0 0 0 0 0 0 0

0

#include

#define maxn 1010

intmain()

}if(b[0]==

0)break

;for

(int d =

0;d <=

9;d++)if

(c1 < c2)

else

}printf

(" (%d,%d)\n"

, a, b - a);}

}return0;

}

例題3-5:生成元(digit generator,uva1583) p52
#include

#include

#define maxn 100002

int ans[maxn]

;int

main()

if(ans[y]==0

|| m < ans[y])}

scanf

("%d"

,&t)

;while

(t--

)return0;

}

第三章陣列和字串下

一道典型的水題。include include include using namespace std int it 5 char its 5 acgt int main if it 0 max max it 1 it 2 it 3 b i its 0 else if it 1 max it 2 i...

第三章 字串

3 1 基本字串操作 字串是不可變的。類似以下的分片賦值是不合法的 website 3 com 報錯 3.2 字串格式化 在 的左側放置乙個字串,而右側放置希望格式化的值。format hello,s,s enough for ya?values world hot print format val...

第三章 Lua字串

字串用於表示文字。lua語言中的字串既可以表示單個字元,也可以表示一整本書籍 在 lua語言中,操作100k或者1m個字母組成的字串的程式也很常見。lua語言中的字串是一串位元組組成的序列,lua核心並不關心這些位元組究竟以何種方式編碼文字。在lua語言中,字元使用8個位元位來儲存 eight bi...