?? 教學--第二十一章 指針 三 實例演練與提高.htm
字號:
<P>
<P>請大家自己對比,并理解。如果覺得困難,請復習第19章關于*的用法,和指針偏移部分的內容。
<P>
<H3><A name=21.4><B>21</B>.4</A> 小王成績管理系統<SPAN lang=en-us>
V3.0</SPAN></H3>
<P>
<P><SPAN lang=en-us>3.0 </SPAN>版的最重要的改進就是:用戶可以事先指定本校的學生總數。
<P>
<P>請仔細看好。
<P>
<P>//定義一個指針,用于存入未知個數學生的成績:</P>
<P>int<SPAN lang=en-us>*</SPAN> <SPAN lang=en-us>pC</SPAN>j;</P>
<P> </P>
<P>//總成績,平均成績:</P>
<P>int zcj=0, pjcj;</P>
<P> </P>
<P><SPAN lang=en-us>//</SPAN>首先,要求用戶輸入本校學生總數<SPAN lang=en-us>:</SPAN></P>
<P><SPAN lang=en-us>int <B>xszs</B>; //</SPAN>學生總數</P>
<P><SPAN lang=en-us>cout << "</SPAN>請輸入本校學生總數<SPAN
lang=en-us>:";</SPAN></P>
<P><SPAN lang=en-us>cin >> </SPAN><B>xszs</B><SPAN
lang=en-us>;</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>//</SPAN>萬一有調皮用戶輸入不合法的總數,我們就不處理</P>
<P><SPAN lang=en-us>if (</SPAN><B>xszs</B><SPAN lang=en-us> <=
0)</SPAN></P>
<P><SPAN lang=en-us>{</SPAN></P>
<P><SPAN lang=en-us> cout <<
"</SPAN>喂,你想耍我啊?竟然輸入一個是0或負數的學生總數<SPAN lang=en-us>.</SPAN>我不干了!<SPAN
lang=en-us>" << endl;</SPAN></P>
<P><SPAN lang=en-us> return -1; //</SPAN>退出</P>
<P><SPAN lang=en-us>}</SPAN></P>
<P> </P>
<P><SPAN lang=en-us>pCj = new int[</SPAN><B>xszs</B><SPAN
lang=en-us>];</SPAN></P>
<P> </P>
<P>//仍然可以用我們熟悉的循環來實現輸入:</P>
<P>for(int i=0; i<SPAN lang=en-us> </SPAN><<SPAN lang=en-us>
</SPAN><B>xszs</B>; i++) </P>
<P>{</P>
<P> cout << "請輸入第" << i+1 << "學員的成績:";</P>
<P> cin >> <SPAN
lang=en-us>pC</SPAN>j[i]; //輸入數組中第i個元素</P>
<P> </P>
<P> //不斷累加總成績:</P>
<P> zcj += <SPAN
lang=en-us>pC</SPAN>j[i];
</P>
<P>}</P>
<P> </P>
<P>//平均成績:</P>
<P>pjcj = zcj / <B>xszs</B>;</P>
<P> </P>
<P>//輸出:</P>
<P>cout << "總成績:" << zcj << endl;</P>
<P>cout << "平均成績:" << pjcj << endl;</P>
<P> </P>
<P>//下面實現查詢:</P>
<P>int i; </P>
<P> </P>
<P>do</P>
<P>{</P>
<P> cout << "請輸入您要查詢的學生次序號(1<SPAN lang=en-us>
</SPAN>~<SPAN lang=en-us> </SPAN>" << <B>xszs</B> << "):"
;</P>
<P> cin >> i;</P>
<P> </P>
<P> if( i >= 1 && i <= <SPAN
lang=en-us><B>xszs</B></SPAN>)</P>
<P> {</P>
<P> cout << cj[i-1] << endl;
//問:為什么索引是 i-1,而不是 i ?</P>
<P> }</P>
<P> else if( i != 0)</P>
<P> {</P>
<P> cout << "您的輸入有誤!" <<
endl;</P>
<P> }</P>
<P>}</P>
<P>while(i != 0); //用戶輸入數字0,表示結束。</P>
<P> </P>
<P><FONT color=#ff0000><SPAN
lang=en-us>//</SPAN>最后,要釋放剛才分配出的內存:</FONT></P>
<P><FONT color=#ff0000><SPAN lang=en-us>delete [] pCj;</SPAN></FONT></P>
<P>......</P>
<P>
<P>請大家現在就動手,實現小王成績管理3.0版。這是本章的第一個重點。通過該程序,你應該可以記住什么叫“動態分配內存”。
<P>
<H3><A name=21.5>21.5</A> 字符<B>串</B>指針</H3>
<H4><A name=21.5.1>21<SPAN lang=en-us>.5.1</SPAN></A><SPAN lang=en-us>
</SPAN>為字符串分配指定大小的空間</H4>
<P>
<P>有必要的話,你應復習一下第16章之第6節:字符數組。
<P>
<P>假設有個老外叫<SPAN lang=en-us> "Mike"</SPAN>,以前我們用字符數組來保存,需要指定是5個字符大小的數組:
<P>
<P><SPAN lang=en-us>char name[5] = "Mike";</SPAN>
<P>
<P><SPAN lang=en-us>"Mike"</SPAN>長4個字符,為什么要5個字符的空間來保存?
這是因為計算機還需要為字符串最后多保存一個零字符:<SPAN lang=en-us>'\0'</SPAN>。用來表示字符串結束了。
<P>
<P>在學了指針以后,我們可以用字符串指針來表達一個人的姓名:
<P>
<P><SPAN lang=en-us>char* pname = "Mike";</SPAN>
<P>
<P>此時,由系統自動為<SPAN lang=en-us>pname </SPAN>分配5個字符的位置,并初始化為<SPAN lang=en-us>
"Mike"</SPAN>。 最后一個位置仍然是零字符:‘<SPAN lang=en-us>\</SPAN>0’。
<P>
<P>采用字符串的好處,同樣前面所說的,可以在程序中臨時決定它的大小(長度)。
<P>比如:
<P>
<P><SPAN lang=en-us>char* pname;</SPAN>
<P><SPAN lang=en-us>pname = new char[9]; //</SPAN>臨時分配9個字符的大小。
<P>
<P>除了要記得額外為字符串的結束符<SPAN
lang=en-us>'\0'</SPAN>分配一個位置以外,字符串指針并沒有和其它指定有太多的不同。
<P>
<P>既然講到字符串,我們就順帶講幾個常用的字符串操作函數
<P>
<H4><SPAN lang=en-us><A name=21.5.2>21.5.2</A> </SPAN>字符串常用函數</H4>
<P>
<P>字符串操作函數的聲明都包含在該頭文件:<SPAN lang=en-us> <string.h></SPAN>
<P>
<P><B><A name=21.5.2.1>21.5.2.1</A> 字符串比較</B>
<P>
<P>int strcmp(const char *s1, const char *s2);
<P>
<P>比較<SPAN lang=en-us>s1</SPAN> 和<SPAN lang=en-us> s2
</SPAN>兩個字符串,返回看哪個字符串比較大。對于字母,該比較區分大小寫
<P>返回值:
<P> <SPAN lang=en-us>< 0 </SPAN>: <SPAN lang=en-us>s1
< s2;</SPAN>
<P><SPAN lang=en-us> 0 : s1 ==
s2;</SPAN>
<P><SPAN lang=en-us> > 0 : s1 > s2;</SPAN>
<P>
<P><SPAN lang=en-us>int strcmpi(const char *s1, const char *s2);</SPAN>
<P>該函數類似于上一函數,只是對于字母,它不區分大小寫,比如它認為<SPAN lang=en-us>'A'</SPAN>和<SPAN
lang=en-us>'a'</SPAN> 是相等的。
<P>
<P>要說兩個字符串相等不相等,還好理解,比如:<SPAN lang=en-us> "Borland"</SPAN> 和<SPAN
lang=en-us> "Borlanb" </SPAN>顯然不相等。不過,字符串之間還有大小之分嗎?
<P>對于字母,采用ASCII值來一個個比較。誰先出現一個ASCII值比較大的字母,誰就是大者。比如:<SPAN lang=en-us>"ABCD"
</SPAN>比<SPAN lang=en-us> "AACD"</SPAN>大。
<P>如果一直相等,但有長短不一,那就長的大。比如:“<SPAN lang=en-us>ABCD</SPAN>” 比 “<SPAN
lang=en-us>ABC</SPAN>”。
<P>記住了,由于在ASCII表里,小寫字母比大寫字母靠后,所以小寫的反倒比大寫的大。比如:<SPAN
lang=en-us>"aBCD"</SPAN>比<SPAN lang=en-us>"ABCD"</SPAN>大啊。
<P>
<P>我這里寫個例子,看如何比較字符串:
<P>
<P><SPAN lang=en-us>#include <string.h> </SPAN>
<P><SPAN lang=en-us>#include <iostream.h></SPAN>
<P><SPAN lang=en-us>...</SPAN>
<P>
<P><SPAN lang=en-us>int reu = strcmp ("ABCD", "AACD");</SPAN>
<P>
<P><SPAN lang=en-us>if (reu > 0)</SPAN>
<P><SPAN lang=en-us> cout << "</SPAN>沒錯,<SPAN
lang=en-us> ABCD > AACD" << endl;</SPAN>
<P><SPAN lang=en-us>else </SPAN>
<P><SPAN lang=en-us> cout << "</SPAN>搞錯了吧?<SPAN
lang=en-us>" << endl;</SPAN>
<P>
<P>請大家照此例,分別比較 <SPAN lang=en-us>"ABCD" </SPAN>和<SPAN lang=en-us> "ABC"
</SPAN>、<SPAN lang=en-us> "aBCD" </SPAN>和<SPAN lang=en-us> "ABCD"</SPAN>。
<P>如果你對如何用<SPAN lang=en-us>C++ Builder</SPAN> 建立一個控制臺下的工程,請復習第二章第3節。
<P>
<P>前面說的是英文字母,對于漢字字符串的比較,大小是如何確定的呢?
<P>對于常用漢字,<SPAN
lang=en-us>Windows</SPAN>按其拼音進行排序,比如“啊”是最小的,排在最前面,而“坐”之類的,則比較大,排在后面。
<P>對于非常用的漢字,則按筆劃來排序。有關常用不常的劃分,是國家管的事,我們就不多說了。
<P>
<P>我一直在網上叫“南郁”,大家可以拿你的名字和我做一下<SPAN lang=en-us>
strcmp</SPAN>,看看誰的名字比較大。(友情提醒:名字大沒有什么好處,相反,名字大了,在各種場合里,一般是排名靠后的……)
<P>
<P><B><A name=21.5.2.2>21.5.2.<SPAN lang=en-us>2</SPAN></A> 字符串復制</B>
<P>
<P>char *strcpy(char *dest, const char *src);
<P>
<P>該函數用于將字符串<SPAN lang=en-us> src</SPAN>的內容,復制給<SPAN lang=en-us>
</SPAN>字符串<SPAN lang=en-us>dest</SPAN>。 注意,一定要保證<SPAN lang=en-us>
dest</SPAN>有足夠的空間。
<P>該函數最后返回<SPAN lang=en-us>dest.</SPAN>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -