﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-嵌入式-文章分类-面试、笔试题</title><link>http://www.cnitblog.com/zouzheng/category/4671.html</link><description>要像阿甘一直向前奔跑！</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 04:56:47 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 04:56:47 GMT</pubDate><ttl>60</ttl><item><title>ASCII 非打印控制字符</title><link>http://www.cnitblog.com/zouzheng/articles/40286.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Fri, 29 Feb 2008 02:32:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/40286.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/40286.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/40286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/40286.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/40286.html</trackback:ping><description><![CDATA[ASCII 表上的数字 0&#8211;31 分配给了控制字符，用于控制像打印机等一些外围设备。例如，12 代表换页/新页功能。此命令指示打印机跳到下一页的开头。 <br><img style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://office.microsoft.com/global/images/bluedrop.gif" onload="javascript:if(this.width>500)this.style.width=500;" border=0>ASCII 非打印控制字符表 <br>
<table border=1>
    <tbody>
        <tr>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
            <td></td>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
        </tr>
        <tr>
            <td>0</td>
            <td>00</td>
            <td>空</td>
            <td></td>
            <td>16</td>
            <td>10</td>
            <td>数据链路转意</td>
        </tr>
        <tr>
            <td>1</td>
            <td>01</td>
            <td>头标开始</td>
            <td></td>
            <td>17</td>
            <td>11</td>
            <td>设备控制 1</td>
        </tr>
        <tr>
            <td>2</td>
            <td>02</td>
            <td>正文开始</td>
            <td></td>
            <td>18</td>
            <td>12</td>
            <td>设备控制 2</td>
        </tr>
        <tr>
            <td>3</td>
            <td>03</td>
            <td>正文结束</td>
            <td></td>
            <td>19</td>
            <td>13</td>
            <td>设备控制 3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>04</td>
            <td>传输结束</td>
            <td></td>
            <td>20</td>
            <td>14</td>
            <td>设备控制 4</td>
        </tr>
        <tr>
            <td>5</td>
            <td>05</td>
            <td>查询</td>
            <td></td>
            <td>21</td>
            <td>15</td>
            <td>反确认</td>
        </tr>
        <tr>
            <td>6</td>
            <td>06</td>
            <td>确认</td>
            <td></td>
            <td>22</td>
            <td>16</td>
            <td>同步空闲</td>
        </tr>
        <tr>
            <td>7</td>
            <td>07</td>
            <td>震铃</td>
            <td></td>
            <td>23</td>
            <td>17</td>
            <td>传输块结束</td>
        </tr>
        <tr>
            <td>8</td>
            <td>08</td>
            <td>backspace</td>
            <td></td>
            <td>24</td>
            <td>18</td>
            <td>取消</td>
        </tr>
        <tr>
            <td>9</td>
            <td>09</td>
            <td>水平制表符</td>
            <td></td>
            <td>25</td>
            <td>19</td>
            <td>媒体结束</td>
        </tr>
        <tr>
            <td>10</td>
            <td>0A</td>
            <td>换行/新行</td>
            <td></td>
            <td>26</td>
            <td>1A</td>
            <td>替换</td>
        </tr>
        <tr>
            <td>11</td>
            <td>0B</td>
            <td>竖直制表符</td>
            <td></td>
            <td>27</td>
            <td>1B</td>
            <td>转意</td>
        </tr>
        <tr>
            <td>12</td>
            <td>0C</td>
            <td>换页/新页</td>
            <td></td>
            <td>28</td>
            <td>1C</td>
            <td>文件分隔符</td>
        </tr>
        <tr>
            <td>13</td>
            <td>0D</td>
            <td>回车</td>
            <td></td>
            <td>29</td>
            <td>1D</td>
            <td>组分隔符</td>
        </tr>
        <tr>
            <td>14</td>
            <td>0E</td>
            <td>移出</td>
            <td></td>
            <td>30</td>
            <td>1E</td>
            <td>记录分隔符</td>
        </tr>
        <tr>
            <td>15</td>
            <td>0F</td>
            <td>移入</td>
            <td></td>
            <td>31</td>
            <td>1F</td>
            <td>单元分隔符</td>
        </tr>
    </tbody>
</table>
<p><font color=#ff6600 size=4>ASCII 打印字符</font> <br>数字 32&#8211;126 分配给了能在键盘上找到的字符，当您查看或打印文档时就会出现。数字 127 代表 DELETE 命令。 <br><img style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://office.microsoft.com/global/images/bluedrop.gif" onload="javascript:if(this.width>500)this.style.width=500;" border=0>ASCII 打印字符表 <br>
<table border=1>
    <tbody>
        <tr>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
            <td width=10></td>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
        </tr>
        <tr>
            <td>32</td>
            <td>20</td>
            <td>space</td>
            <td></td>
            <td>80</td>
            <td>50</td>
            <td>P</td>
        </tr>
        <tr>
            <td>33</td>
            <td>21</td>
            <td>!</td>
            <td width=10></td>
            <td>81</td>
            <td>51</td>
            <td>Q</td>
        </tr>
        <tr>
            <td>34</td>
            <td>22</td>
            <td>"</td>
            <td width=10></td>
            <td>82</td>
            <td>52</td>
            <td>R</td>
        </tr>
        <tr>
            <td>35</td>
            <td>23</td>
            <td>#</td>
            <td width=10></td>
            <td>83</td>
            <td>53</td>
            <td>S</td>
        </tr>
        <tr>
            <td>36</td>
            <td>24</td>
            <td>$</td>
            <td width=10></td>
            <td>84</td>
            <td>54</td>
            <td>T</td>
        </tr>
        <tr>
            <td>37</td>
            <td>25</td>
            <td>%</td>
            <td width=10></td>
            <td>85</td>
            <td>55</td>
            <td>U</td>
        </tr>
        <tr>
            <td>38</td>
            <td>26</td>
            <td>&amp;</td>
            <td width=10></td>
            <td>86</td>
            <td>56</td>
            <td>V</td>
        </tr>
        <tr>
            <td>39</td>
            <td>27</td>
            <td>'</td>
            <td width=10></td>
            <td>87</td>
            <td>57</td>
            <td>w</td>
        </tr>
        <tr>
            <td>40</td>
            <td>28</td>
            <td>(</td>
            <td width=10></td>
            <td>88</td>
            <td>58</td>
            <td>X</td>
        </tr>
        <tr>
            <td>41</td>
            <td>29</td>
            <td>)</td>
            <td width=10></td>
            <td>89</td>
            <td>59</td>
            <td>Y</td>
        </tr>
        <tr>
            <td>42</td>
            <td>2A</td>
            <td>*</td>
            <td width=10></td>
            <td>90</td>
            <td>5A</td>
            <td>Z</td>
        </tr>
        <tr>
            <td>43</td>
            <td>2B</td>
            <td>+</td>
            <td width=10></td>
            <td>91</td>
            <td>5B</td>
            <td>[</td>
        </tr>
        <tr>
            <td>44</td>
            <td>2C</td>
            <td>,</td>
            <td width=10></td>
            <td>92</td>
            <td>5C</td>
            <td>\</td>
        </tr>
        <tr>
            <td>45</td>
            <td>2D</td>
            <td>-</td>
            <td width=10></td>
            <td>93</td>
            <td>5D</td>
            <td>]</td>
        </tr>
        <tr>
            <td>46</td>
            <td>2E</td>
            <td>.</td>
            <td width=10></td>
            <td>94</td>
            <td>5E</td>
            <td>^</td>
        </tr>
        <tr>
            <td>47</td>
            <td>2F</td>
            <td>/</td>
            <td width=10></td>
            <td>95</td>
            <td>5F</td>
            <td>_</td>
        </tr>
        <tr>
            <td>48</td>
            <td>30</td>
            <td>0</td>
            <td width=10></td>
            <td>96</td>
            <td>60</td>
            <td>`</td>
        </tr>
        <tr>
            <td>49</td>
            <td>31</td>
            <td>1</td>
            <td width=10></td>
            <td>97</td>
            <td>61</td>
            <td>a</td>
        </tr>
        <tr>
            <td>50</td>
            <td>32</td>
            <td>2</td>
            <td width=10></td>
            <td>98</td>
            <td>62</td>
            <td>b</td>
        </tr>
        <tr>
            <td>51</td>
            <td>33</td>
            <td>3</td>
            <td width=10></td>
            <td>99</td>
            <td>63</td>
            <td>c</td>
        </tr>
        <tr>
            <td>52</td>
            <td>34</td>
            <td>4</td>
            <td width=10></td>
            <td>100</td>
            <td>64</td>
            <td>d</td>
        </tr>
        <tr>
            <td>53</td>
            <td>35</td>
            <td>5</td>
            <td width=10></td>
            <td>101</td>
            <td>65</td>
            <td>e</td>
        </tr>
        <tr>
            <td>54</td>
            <td>36</td>
            <td>6</td>
            <td width=10></td>
            <td>102</td>
            <td>66</td>
            <td>f</td>
        </tr>
        <tr>
            <td>55</td>
            <td>37</td>
            <td>7</td>
            <td width=10></td>
            <td>103</td>
            <td>67</td>
            <td>g </td>
        </tr>
        <tr>
            <td>56</td>
            <td>38</td>
            <td>8</td>
            <td width=10></td>
            <td>104</td>
            <td>68</td>
            <td>h</td>
        </tr>
        <tr>
            <td>57</td>
            <td>39</td>
            <td>9</td>
            <td width=10></td>
            <td>105</td>
            <td>69</td>
            <td>i</td>
        </tr>
        <tr>
            <td>58</td>
            <td>3A</td>
            <td>:</td>
            <td width=10></td>
            <td>106</td>
            <td>6A</td>
            <td>j</td>
        </tr>
        <tr>
            <td>59</td>
            <td>3B</td>
            <td>;</td>
            <td width=10></td>
            <td>107</td>
            <td>6B</td>
            <td>k</td>
        </tr>
        <tr>
            <td>60</td>
            <td>3C</td>
            <td>&lt;</td>
            <td width=10></td>
            <td>108</td>
            <td>6C</td>
            <td>l</td>
        </tr>
        <tr>
            <td>61</td>
            <td>3D</td>
            <td>=</td>
            <td width=10></td>
            <td>109</td>
            <td>6D</td>
            <td>m</td>
        </tr>
        <tr>
            <td>62</td>
            <td>3E</td>
            <td>&gt;</td>
            <td width=10></td>
            <td>110</td>
            <td>6E</td>
            <td>n</td>
        </tr>
        <tr>
            <td>63</td>
            <td>3F</td>
            <td>?</td>
            <td width=10></td>
            <td>111</td>
            <td>6F</td>
            <td>o</td>
        </tr>
        <tr>
            <td>64</td>
            <td>40</td>
            <td>@</td>
            <td width=10></td>
            <td>112</td>
            <td>70</td>
            <td>p</td>
        </tr>
        <tr>
            <td>65</td>
            <td>41</td>
            <td>A</td>
            <td width=10></td>
            <td>113</td>
            <td>71</td>
            <td>q</td>
        </tr>
        <tr>
            <td>66</td>
            <td>42</td>
            <td>B</td>
            <td width=10></td>
            <td>114</td>
            <td>72</td>
            <td>r</td>
        </tr>
        <tr>
            <td>67</td>
            <td>43</td>
            <td>C</td>
            <td width=10></td>
            <td>115</td>
            <td>73</td>
            <td>s</td>
        </tr>
        <tr>
            <td>68</td>
            <td>44</td>
            <td>D</td>
            <td width=10></td>
            <td>116</td>
            <td>74</td>
            <td>t</td>
        </tr>
        <tr>
            <td>69</td>
            <td>45</td>
            <td>E</td>
            <td width=10></td>
            <td>117</td>
            <td>75</td>
            <td>u</td>
        </tr>
        <tr>
            <td>70</td>
            <td>46</td>
            <td>F</td>
            <td width=10></td>
            <td>118</td>
            <td>76</td>
            <td>v</td>
        </tr>
        <tr>
            <td>71</td>
            <td>47</td>
            <td>G</td>
            <td width=10></td>
            <td>119</td>
            <td>77</td>
            <td>w</td>
        </tr>
        <tr>
            <td>72</td>
            <td>48</td>
            <td>H</td>
            <td width=10></td>
            <td>120</td>
            <td>78</td>
            <td>x</td>
        </tr>
        <tr>
            <td>73</td>
            <td>49</td>
            <td>I</td>
            <td width=10></td>
            <td>121</td>
            <td>79</td>
            <td>y</td>
        </tr>
        <tr>
            <td>74</td>
            <td>4A</td>
            <td>J</td>
            <td width=10></td>
            <td>122</td>
            <td>7A</td>
            <td>z</td>
        </tr>
        <tr>
            <td>75</td>
            <td>4B</td>
            <td>K</td>
            <td width=10></td>
            <td>123</td>
            <td>7B</td>
            <td>{</td>
        </tr>
        <tr>
            <td>76</td>
            <td>4C</td>
            <td>L</td>
            <td width=10></td>
            <td>124</td>
            <td>7C</td>
            <td>|</td>
        </tr>
        <tr>
            <td>77</td>
            <td>4D</td>
            <td>M</td>
            <td width=10></td>
            <td>125</td>
            <td>7D</td>
            <td>}</td>
        </tr>
        <tr>
            <td>78</td>
            <td>4E</td>
            <td>N</td>
            <td width=10></td>
            <td>126</td>
            <td>7E</td>
            <td>~</td>
        </tr>
        <tr>
            <td>79</td>
            <td>4F</td>
            <td>O</td>
            <td width=10></td>
            <td>127</td>
            <td>7F</td>
            <td>DEL</td>
        </tr>
    </tbody>
</table>
</p>
<p><font color=#ff6600 size=4>扩展 ASCII 打印字符</font> <br>扩展的 ASCII 字符满足了对更多字符的需求。扩展的 ASCII 包含 ASCII 中已有的 128 个字符（数字 0&#8211;32 显示在下图中），又增加了 128 个字符，总共是 256 个。即使有了这些更多的字符，许多语言还是包含无法压缩到 256 个字符中的符号。因此，出现了一些 ASCII 的变体来囊括地区性字符和符号。 <br>例如，许多软件程序把 ASCII 表（又称作 ISO 8859-1）用于北美、西欧、澳大利亚和非洲的语言。 <br><img style="CURSOR: pointer" onclick=javascript:window.open(this.src); src="http://office.microsoft.com/global/images/bluedrop.gif" onload="javascript:if(this.width>500)this.style.width=500;" border=0>扩展的ASCII 打印字符表 <br>
<table border=1>
    <tbody>
        <tr>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
            <td width=10></td>
            <td>十进制</td>
            <td>十六进制</td>
            <td>字符</td>
        </tr>
        <tr>
            <td>128</td>
            <td>80</td>
            <td>&#199;</td>
            <td></td>
            <td>192</td>
            <td>C0</td>
            <td>└</td>
        </tr>
        <tr>
            <td>129</td>
            <td>81</td>
            <td>&#252;</td>
            <td width=10></td>
            <td>193</td>
            <td>C1</td>
            <td>┴</td>
        </tr>
        <tr>
            <td>130</td>
            <td>82</td>
            <td>&#233;</td>
            <td width=10></td>
            <td>194</td>
            <td>C2</td>
            <td>┬</td>
        </tr>
        <tr>
            <td>131</td>
            <td>83</td>
            <td>&#226;</td>
            <td width=10></td>
            <td>195</td>
            <td>C3</td>
            <td>├</td>
        </tr>
        <tr>
            <td>132</td>
            <td>84</td>
            <td>&#228;</td>
            <td width=10></td>
            <td>196</td>
            <td>C4</td>
            <td>─</td>
        </tr>
        <tr>
            <td>133</td>
            <td>85</td>
            <td>&#224;</td>
            <td width=10></td>
            <td>197</td>
            <td>C5</td>
            <td>┼</td>
        </tr>
        <tr>
            <td>134</td>
            <td>86</td>
            <td>&#229;</td>
            <td width=10></td>
            <td>198</td>
            <td>C6</td>
            <td>╞</td>
        </tr>
        <tr>
            <td>135</td>
            <td>87</td>
            <td>&#231;</td>
            <td width=10></td>
            <td>199</td>
            <td>C7</td>
            <td>╟</td>
        </tr>
        <tr>
            <td>136</td>
            <td>88</td>
            <td>&#234;</td>
            <td width=10></td>
            <td>200</td>
            <td>C8</td>
            <td>╚</td>
        </tr>
        <tr>
            <td>137</td>
            <td>89</td>
            <td>&#235;</td>
            <td width=10></td>
            <td>201</td>
            <td>C9</td>
            <td>╔</td>
        </tr>
        <tr>
            <td>138</td>
            <td>8A</td>
            <td>&#232;</td>
            <td width=10></td>
            <td>202</td>
            <td>CA</td>
            <td>╩</td>
        </tr>
        <tr>
            <td>139</td>
            <td>8B</td>
            <td>&#239;</td>
            <td width=10></td>
            <td>203</td>
            <td>CB</td>
            <td>╦</td>
        </tr>
        <tr>
            <td>140</td>
            <td>8C</td>
            <td>&#238;</td>
            <td width=10></td>
            <td>204</td>
            <td>CC</td>
            <td>╠</td>
        </tr>
        <tr>
            <td>141</td>
            <td>8D</td>
            <td>&#236;</td>
            <td width=10></td>
            <td>205</td>
            <td>CD</td>
            <td>═</td>
        </tr>
        <tr>
            <td>142</td>
            <td>8E</td>
            <td>&#196;</td>
            <td width=10></td>
            <td>206</td>
            <td>CE</td>
            <td>╬</td>
        </tr>
        <tr>
            <td>143</td>
            <td>8F</td>
            <td>&#197;</td>
            <td width=10></td>
            <td>207</td>
            <td>CF</td>
            <td>╧</td>
        </tr>
        <tr>
            <td>144</td>
            <td>90</td>
            <td>&#201;</td>
            <td width=10></td>
            <td>208</td>
            <td>D0</td>
            <td>╨</td>
        </tr>
        <tr>
            <td>145</td>
            <td>91</td>
            <td>&#230;</td>
            <td width=10></td>
            <td>209</td>
            <td>D1</td>
            <td>╤</td>
        </tr>
        <tr>
            <td>146</td>
            <td>92</td>
            <td>&#198;</td>
            <td width=10></td>
            <td>210</td>
            <td>D2</td>
            <td>╥</td>
        </tr>
        <tr>
            <td>147</td>
            <td>93</td>
            <td>&#244;</td>
            <td width=10></td>
            <td>211</td>
            <td>D3</td>
            <td>╙</td>
        </tr>
        <tr>
            <td>148</td>
            <td>94</td>
            <td>&#246;</td>
            <td width=10></td>
            <td>212</td>
            <td>D4</td>
            <td>&#212;</td>
        </tr>
        <tr>
            <td>149</td>
            <td>95</td>
            <td>&#242;</td>
            <td width=10></td>
            <td>213</td>
            <td>D5</td>
            <td>╒</td>
        </tr>
        <tr>
            <td>150</td>
            <td>96</td>
            <td>&#251;</td>
            <td width=10></td>
            <td>214</td>
            <td>D6</td>
            <td>╓</td>
        </tr>
        <tr>
            <td>151</td>
            <td>97</td>
            <td>&#249;</td>
            <td width=10></td>
            <td>215</td>
            <td>D7</td>
            <td>╫</td>
        </tr>
        <tr>
            <td>152</td>
            <td>98</td>
            <td>&#255;</td>
            <td width=10></td>
            <td>216</td>
            <td>D8</td>
            <td>╪</td>
        </tr>
        <tr>
            <td>153</td>
            <td>99</td>
            <td>&#214;</td>
            <td width=10></td>
            <td>217</td>
            <td>D9</td>
            <td>┘</td>
        </tr>
        <tr>
            <td>154</td>
            <td>9A</td>
            <td>&#220;</td>
            <td width=10></td>
            <td>218</td>
            <td>DA</td>
            <td>┌</td>
        </tr>
        <tr>
            <td>155</td>
            <td>9B</td>
            <td>&#162;</td>
            <td width=10></td>
            <td>219</td>
            <td>DB</td>
            <td>█</td>
        </tr>
        <tr>
            <td>156</td>
            <td>9C</td>
            <td>&#163;</td>
            <td width=10></td>
            <td>220</td>
            <td>DC</td>
            <td>▄</td>
        </tr>
        <tr>
            <td>157</td>
            <td>9D</td>
            <td>&#165;</td>
            <td width=10></td>
            <td>221</td>
            <td>DD</td>
            <td>▌</td>
        </tr>
        <tr>
            <td>158</td>
            <td>9E</td>
            <td>₧</td>
            <td width=10></td>
            <td>222</td>
            <td>DE</td>
            <td>▐</td>
        </tr>
        <tr>
            <td>159</td>
            <td>9F</td>
            <td>&#402;</td>
            <td width=10></td>
            <td>223</td>
            <td>DF</td>
            <td>▀</td>
        </tr>
        <tr>
            <td>160</td>
            <td>A0</td>
            <td>&#225;</td>
            <td width=10></td>
            <td>224</td>
            <td>E0</td>
            <td>&#945;</td>
        </tr>
        <tr>
            <td>161</td>
            <td>A1</td>
            <td>&#237;</td>
            <td width=10></td>
            <td>225</td>
            <td>E1</td>
            <td>&#223;</td>
        </tr>
        <tr>
            <td>162</td>
            <td>A2</td>
            <td>&#243;</td>
            <td width=10></td>
            <td>226</td>
            <td>E2</td>
            <td>&#915;</td>
        </tr>
        <tr>
            <td>163</td>
            <td>A3</td>
            <td>&#250;</td>
            <td width=10></td>
            <td>227</td>
            <td>E3</td>
            <td>&#960;</td>
        </tr>
        <tr>
            <td>164</td>
            <td>A4</td>
            <td>&#241;</td>
            <td width=10></td>
            <td>228</td>
            <td>E4</td>
            <td>&#931;</td>
        </tr>
        <tr>
            <td>165</td>
            <td>A5</td>
            <td>&#209;</td>
            <td width=10></td>
            <td>229</td>
            <td>E5</td>
            <td>&#963;</td>
        </tr>
        <tr>
            <td>166</td>
            <td>A6</td>
            <td>&#170;</td>
            <td width=10></td>
            <td>230</td>
            <td>E6</td>
            <td>&#181;</td>
        </tr>
        <tr>
            <td>167</td>
            <td>A7</td>
            <td>&#186;</td>
            <td width=10></td>
            <td>231</td>
            <td>E7</td>
            <td>&#964;</td>
        </tr>
        <tr>
            <td>168</td>
            <td>A8</td>
            <td>&#191;</td>
            <td width=10></td>
            <td>232</td>
            <td>E8</td>
            <td>&#934;</td>
        </tr>
        <tr>
            <td>169</td>
            <td>A9</td>
            <td>⌐</td>
            <td width=10></td>
            <td>233</td>
            <td>E9</td>
            <td>&#920;</td>
        </tr>
        <tr>
            <td>170</td>
            <td>AA</td>
            <td>&#172;</td>
            <td width=10></td>
            <td>234</td>
            <td>EA</td>
            <td>&#937;</td>
        </tr>
        <tr>
            <td>171</td>
            <td>AB</td>
            <td>&#189;</td>
            <td width=10></td>
            <td>235</td>
            <td>EB</td>
            <td>&#948;</td>
        </tr>
        <tr>
            <td>172</td>
            <td>AC</td>
            <td>&#188;</td>
            <td width=10></td>
            <td>236</td>
            <td>EC</td>
            <td>&#8734;</td>
        </tr>
        <tr>
            <td>173</td>
            <td>AD</td>
            <td>&#161;</td>
            <td width=10></td>
            <td>237</td>
            <td>ED</td>
            <td>&#966;</td>
        </tr>
        <tr>
            <td>174</td>
            <td>AE</td>
            <td>&#171;</td>
            <td width=10></td>
            <td>238</td>
            <td>EE</td>
            <td>&#949;</td>
        </tr>
        <tr>
            <td>175</td>
            <td>AF</td>
            <td>&#187;</td>
            <td width=10></td>
            <td>239</td>
            <td>EF</td>
            <td>&#8745;</td>
        </tr>
        <tr>
            <td>176</td>
            <td>B0</td>
            <td>░</td>
            <td width=10></td>
            <td>240</td>
            <td>F0</td>
            <td>&#8801;</td>
        </tr>
        <tr>
            <td>177</td>
            <td>B1</td>
            <td>▒</td>
            <td width=10></td>
            <td>241</td>
            <td>F1</td>
            <td>&#177;</td>
        </tr>
        <tr>
            <td>178</td>
            <td>B2</td>
            <td>▓</td>
            <td width=10></td>
            <td>242</td>
            <td>F2</td>
            <td>&#8805;</td>
        </tr>
        <tr>
            <td>179</td>
            <td>B3</td>
            <td>│</td>
            <td width=10></td>
            <td>243</td>
            <td>F3</td>
            <td>&#8804;</td>
        </tr>
        <tr>
            <td>180</td>
            <td>B4</td>
            <td>┤</td>
            <td width=10></td>
            <td>244</td>
            <td>F4</td>
            <td>⌠</td>
        </tr>
        <tr>
            <td>181</td>
            <td>B5</td>
            <td>╡</td>
            <td width=10></td>
            <td>245</td>
            <td>F5</td>
            <td>⌡</td>
        </tr>
        <tr>
            <td>182</td>
            <td>B6</td>
            <td>╢</td>
            <td width=10></td>
            <td>246</td>
            <td>F6</td>
            <td>&#247;</td>
        </tr>
        <tr>
            <td>183</td>
            <td>B7</td>
            <td>╖</td>
            <td width=10></td>
            <td>247</td>
            <td>F7</td>
            <td>≈</td>
        </tr>
        <tr>
            <td>184</td>
            <td>B8</td>
            <td>╕</td>
            <td width=10></td>
            <td>248</td>
            <td>F8</td>
            <td>≈</td>
        </tr>
        <tr>
            <td>185</td>
            <td>B9</td>
            <td>╣</td>
            <td width=10></td>
            <td>249</td>
            <td>F9</td>
            <td>∙</td>
        </tr>
        <tr>
            <td>186</td>
            <td>BA</td>
            <td>║</td>
            <td width=10></td>
            <td>250</td>
            <td>FA</td>
            <td>&#183;</td>
        </tr>
        <tr>
            <td>187</td>
            <td>BB</td>
            <td>╗</td>
            <td width=10></td>
            <td>251</td>
            <td>FB</td>
            <td>&#8730;</td>
        </tr>
        <tr>
            <td>188</td>
            <td>BC</td>
            <td>╝</td>
            <td width=10></td>
            <td>252</td>
            <td>FC</td>
            <td>ⁿ</td>
        </tr>
        <tr>
            <td>189</td>
            <td>BD</td>
            <td>╜</td>
            <td width=10></td>
            <td>253</td>
            <td>FD</td>
            <td>&#178;</td>
        </tr>
        <tr>
            <td>190</td>
            <td>BE</td>
            <td>╛</td>
            <td width=10></td>
            <td>254</td>
            <td>FE</td>
            <td>■</td>
        </tr>
        <tr>
            <td>191</td>
            <td>BF</td>
            <td>┐</td>
            <td width=10></td>
            <td>255</td>
            <td>FF</td>
            <td></td>
        </tr>
    </tbody>
</table>
</p>
<p><font color=#ff6600 size=4>ASCII 之外 <br></font>另一个更新的字符表称为Unicode （Unicode：Unicode Consortium 开发的一种字符编码标准。该标准采用多（于一）个字节代表每一字符，实现了使用单个字符集代表世界上几乎所有书面语言）。 因为 Unicode 表大得多，它可以表示 65,536 个字符，而 ASCII 表只能表示 128 个字符，扩展的 ASCII 表也只能表示 256 个字符。这一更大的容量使不同语言的大多数字符都能包含在同一个字符集中。 <br><br>--------------------- <br>在文档中插入 ASCII 字符 <br>注释 该功能需要 Excel、FrontPage、InfoPath、OneNote、Outlook、PowerPoint、Project、Publisher、Word 或 Visio。 <br>除了在键盘上键入字符外，您也可以使用该符号的字符代码作为键盘快捷键。例如，要插入度数符号，在按住 ALT 的同时在数字键盘上键入 0176。 <br>◆要从上面的图表中插入 ASCII 字符，在按住 ALT 的同时键入等价的十进制数字。 <br>例如，要插入度数符号，在按住 ALT 的同时在数字键盘上键入 0176。 <br><strong>注释</strong> 必须使用数字键盘来键入数字，而不是键盘。如果您的键盘需要打开 Num Lock 键才能在数字键盘上键入数字，请务必打开它。</p>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/40286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-02-29 10:32 <a href="http://www.cnitblog.com/zouzheng/articles/40286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++ 通用 Makefile </title><link>http://www.cnitblog.com/zouzheng/articles/39292.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Thu, 24 Jan 2008 12:47:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/39292.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/39292.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/39292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/39292.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/39292.html</trackback:ping><description><![CDATA[<span style="line-height: 150%;"><span style="color: green;">Generic Makefile for C/C++ Program</span>
<br>
<br><span style="font-family: courier new;">
==================================================
</span><br style="font-family: courier new;"><span style="font-family: courier new;">
Keywords: Makefile, make, Generic, C/C++
</span><br style="font-family: courier new;"><span style="font-family: courier new;">
Author: &nbsp;   whyglinux (whyglinux AT hotmail DOT com)
</span><br style="font-family: courier new;"><span style="font-family: courier new;">
Date: &nbsp; &nbsp;     2006-03-04
</span><br style="font-family: courier new;"><span style="font-family: courier new;">
==================================================
</span><br>
<br>
本文提供了一个用于对 C/C++ 程序进行编译和连接以产生可执行程序的通用 Makefile。
<br>
<p margin-bottom="" 5px="" word-spacing="" 0px="" line-height="" 150="">在使用 Makefile 之前，只需对它进行一些简单的设置即可；而且一经设置，即使以后对源程序文件有所增减一般也不再需要改动
Makefile。因此，即便是一个没有学习过 Makefile 书写规则的人，也可以为自己的 C/C++ 程序快速建立一个可工作的
Makefile。</p>
这个 Makefile 可以在 GNU Make 和 GCC 编译器下正常工作。但是不能保证对于其它版本的 Make 和编译器也能正常工作。
<br>
<br>
如果你发现了本文中的错误，或者对本文有什么感想或建议，可通过 whyglinux AT hotmail DOT com 邮箱和作者联系。
<br>
<br>
此 Makefile 的使用方法如下：
<br>
<ol type="1">
    <li>程序目录的组织
    <br>
    尽量将自己的源程序集中在一个目录中，并且把 Makefile 和源程序放在一起，这样用起来比较方便。当然，也可以将源程序分类存放在不同的目录中。
    <br>
    <br>在程序目录中创建一个名为 Makefile 的文本文件，将后面列出的 Makefile
    的内容复制到这个文件中。（注意：在复制的过程中，Makfile 中各命令前面的 Tab 字符有可能被转换成若干个空格。这种情况下需要把
    Makefile 命令前面的这些空格替换为一个 Tab。）
    <br>
    <br>
    将当前工作目录切换到 Makefile 所在的目录。目前，这个 Makefile 只支持在当前目录中的调用，不支持当前目录和 Makefile 所在的路径不是同一目录的情况。
    <br>
    <br>
    </li>
    <li>指定可执行文件
    <br>
    程序编译和连接成功后产生的可执行文件在 Makefile 中的 PROGRAM 变量中设定。这一项不能为空。为自己程序的可执行文件起一个有意义的名子吧。
    <br>
    <br>
    </li>
    <li>指定源程序
    <br>
    要编译的源程序由其所在的路径和文件的扩展名两项来确定。由于头文件是通过包含来使用的，所以在这里说的源程序不应包含头文件。
    <br>
    <br>
    程序所在的路径在 SRCDIRS 中设定。如果源程序分布在不同的目录中，那么需要在 SRCDIRS 中一一指定，并且路径名之间用空格分隔。
    <br>
    <br>在 SRCEXTS 中指定程序中使用的文件类型。C/C++
    程序的扩展名一般有比较固定的几种形式：.c、.C、.cc、.cpp、.CPP、.c++、.cp、或者.cxx（参见 man
    gcc）。扩展名决定了程序是 C 还是 C++ 程序：.c 是 C 程序，其它扩展名表示 C++
    程序。一般固定使用其中的一种扩展名即可。但是也有可能需要使用多种扩展名，这可以在 SOURCE_EXT 中一一指定，各个扩展名之间用空格分隔。
    <br>
    <br>
    虽然并不常用，但是 C 程序也可以被作为 C++ 程序编译。这可以通过在 Makefile 中设置 CC = $(CXX) 和 CFLAGS = $(CXXFLAGS) 两项即可实现。
    <br>
    <br>
    这个 Makefile 支持 C、C++ 以及 C/C++ 混合三种编译方式：
    <br>
    <ul>
        <li>如果只指定 .c 扩展名，那么这是一个 C 程序，用 $(CC) 表示的编译命令进行编译和连接。
        <br>
        </li>
        <li>如果指定的是除 .c 之外的其它扩展名（如 .cc、.cpp、.cxx 等），那么这是一个 C++ 程序，用 $(CXX) 进行编译和连接。
        <br>
        </li>
        <li>如果既指定了 .c，又指定了其它 C++ 扩展名，那么这是 C/C++ 混合程序，将用 $(CC) 编译其中的 C 程序，用 $(CXX) 编译其中的 C++ 程序，最后再用 $(CXX) 连接程序。
        <br>
        </li>
    </ul>
    <br>
    这些工作都是 make 根据在 Makefile 中提供的程序文件类型（扩展名）自动判断进行的，不需要用户干预。
    <br>
    <br>
    </li>
    <li>指定编译选项
    <br>
    编译选项由三部分组成：预处理选项、编译选项以及连接选项，分别由 CPPFLAGS、CFLAGS与CXXFLAGS、LDFLAGS 指定。
    <br>
    <br>
    CPPFLAGS 选项可参考 C 预处理命令 cpp 的说明，但是注意不能包含 -M 以及和 -M 有关的选项。如果是 C/C++ 混合编程，也可以在这里设置 C/C++ 的一些共同的编译选项。
    <br>
    <br>CFLAGS 和 CXXFLAGS 两个变量通常用来指定编译选项。前者仅仅用于指定 C 程序的编译选项，后者仅仅用于指定 C++
    程序的编译选项。其实也可以在两个变量中指定一些预处理选项（即一些本来应该放在 CPPFLAGS 中的选项），和 CPPFLAGS
    并没有明确的界限。
    <br>
    <br>
    连接选项在 LDFLAGS 中指定。如果只使用 C/C++ 标准库，一般没有必要设置。如果使用了非标准库，应该在这里指定连接需要的选项，如库所在的路径、库名以及其它联接选项。
    <br>
    <br>现在的库一般都提供了一个相应的 .pc 文件来记录使用库所需要的预编译选项、编译选项和连接选项等信息，通过 pkg-config
    可以动态提取这些选项。与由用户显式指定各个选项相比，使用 pkg-config 来访问库提供的选项更方便、更具通用性。在后面可以看到一个
    GTK+ 程序的例子，其编译和连接选项的指定就是用 pkg-config 实现的。
    <br>
    <br>
    </li>
    <li>编译和连接
    <br>
    上面的各项设置好之后保存 Makefile 文件。执行 make 命令，程序就开始编译了。
    <br>
    <br>
    命令 make 会根据 Makefile 中设置好的路径和文件类型搜索源程序文件，然后根据文件的类型调用相应的编译命令、使用相应的编译选项对程序进行编译。
    <br>
    <br>
    编译成功之后程序的连接会自动进行。如果没有错误的话最终会产生程序的可执行文件。
    <br>
    <br>
    注意：在对程序编译之后，会产生和源程序文件一一对应的 .d 文件。这是表示依赖关系的文件，通过它们 make 决定在源程序文件变动之后要进行哪些更新。为每一个源程序文件建立相应的 .d 文件这也是 GNU Make 推荐的方式。
    <br>
    <br>
    </li>
    <li>Makefile 目标（Targets）
    <br>
    下面是关于这个 Makefile 提供的目标以及它所完成的功能：
    <br>
    <ul>
        <li>make
        <br>
        编译和连接程序。相当于 make all。
        <br>
        </li>
        <li>make objs
        <br>
        仅仅编译程序产生 .o 目标文件，不进行连接（一般很少单独使用）。
        <br>
        </li>
        <li>make clean
        <br>
        删除编译产生的目标文件和依赖文件。
        <br>
        </li>
        <li>make cleanall
        <br>
        删除目标文件、依赖文件以及可执行文件。
        <br>
        </li>
        <li>make rebuild
        <br>
        重新编译和连接程序。相当于 make clean &amp;&amp; make all。
        <br>
        </li>
    </ul>
    </li>
</ol>
<br>
关于这个 Makefile 的实现原理不准备详细解释了。如果有兴趣的话，可参考文末列出的&#8220;参考资料&#8221;。
<br>
<br>
Makefile 的内容如下：
<br>
<table style="font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr style="color: #0080ff;">
            <td class="code">###############################################################################
            <br>
            #
            <br>
            # Generic Makefile for C/C++ Program
            <br>
            #
            <br>
            # Author: whyglinux (whyglinux AT hotmail DOT com)
            <br>
            # Date:&nbsp; &nbsp;2006/03/04
            <br>
            <br>
            # Description:
            <br>
            # The makefile searches in &lt;SRCDIRS&gt; directories for the source files
            <br>
            # with extensions specified in &lt;SOURCE_EXT&gt;, then compiles the sources
            <br>
            # and finally produces the &lt;PROGRAM&gt;, the executable file, by linking
            <br>
            # the objectives.
            <br>
            <br>
            # Usage:
            <br>
            #&nbsp; &nbsp;$ make&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;compile and link the program.
            <br>
            #&nbsp; &nbsp;$ make objs&nbsp; &nbsp; &nbsp; compile only (no linking. Rarely used).
            <br>
            #&nbsp; &nbsp;$ make clean&nbsp; &nbsp; &nbsp;clean the objectives and dependencies.
            <br>
            #&nbsp; &nbsp;$ make cleanall&nbsp; clean the objectives, dependencies and executable.
            <br>
            #&nbsp; &nbsp;$ make rebuild&nbsp; &nbsp;rebuild the program. The same as make clean &amp;&amp; make all.
            <br>
            #==============================================================================
            <br>
            <br>
            ## Customizing Section: adjust the following if necessary.
            <br>
            ##=============================================================================
            <br>
            <br>
            # The executable file name.
            <br>
            # It must be specified.
            <br>
            # PROGRAM&nbsp; &nbsp;:= a.out&nbsp; &nbsp; # the executable name
            <br>
            PROGRAM&nbsp; &nbsp;:=
            <br>
            <br>
            # The directories in which source files reside.
            <br>
            # At least one path should be specified.
            <br>
            # SRCDIRS&nbsp; &nbsp;:= .&nbsp; &nbsp; &nbsp; &nbsp; # current directory
            <br>
            SRCDIRS&nbsp; &nbsp;:=
            <br>
            <br>
            # The source file types (headers excluded).
            <br>
            # At least one type should be specified.
            <br>
            # The valid suffixes are among of .c, .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx.
            <br>
            # SRCEXTS&nbsp; &nbsp;:= .c&nbsp; &nbsp; &nbsp; # C program
            <br>
            # SRCEXTS&nbsp; &nbsp;:= .cpp&nbsp; &nbsp; # C++ program
            <br>
            # SRCEXTS&nbsp; &nbsp;:= .c .cpp # C/C++ program
            <br>
            SRCEXTS&nbsp; &nbsp;:=
            <br>
            <br>
            # The flags used by the cpp (man cpp for more).
            <br>
            # CPPFLAGS&nbsp; := -Wall -Werror # show all warnings and take them as errors
            <br>
            CPPFLAGS&nbsp; :=
            <br>
            <br>
            # The compiling flags used only for C.
            <br>
            # If it is a C++ program, no need to set these flags.
            <br>
            # If it is a C and C++ merging program, set these flags for the C parts.
            <br>
            CFLAGS&nbsp; &nbsp; :=
            <br>
            CFLAGS&nbsp; &nbsp; +=
            <br>
            <br>
            # The compiling flags used only for C++.
            <br>
            # If it is a C program, no need to set these flags.
            <br>
            # If it is a C and C++ merging program, set these flags for the C++ parts.
            <br>
            CXXFLAGS&nbsp; :=
            <br>
            CXXFLAGS&nbsp; +=
            <br>
            <br>
            # The library and the link options ( C and C++ common).
            <br>
            LDFLAGS&nbsp; &nbsp;:=
            <br>
            LDFLAGS&nbsp; &nbsp;+=
            <br>
            <br>
            ## Implict Section: change the following only when necessary.
            <br>
            ##=============================================================================
            <br>
            # The C program compiler. Uncomment it to specify yours explicitly.
            <br>
            #CC&nbsp; &nbsp; &nbsp; = gcc
            <br>
            <br>
            # The C++ program compiler. Uncomment it to specify yours explicitly.
            <br>
            #CXX&nbsp; &nbsp; &nbsp;= g++
            <br>
            <br>
            # Uncomment the 2 lines to compile C programs as C++ ones.
            <br>
            #CC&nbsp; &nbsp; &nbsp; = $(CXX)
            <br>
            #CFLAGS&nbsp; = $(CXXFLAGS)
            <br>
            <br>
            # The command used to delete file.
            <br>
            #RM&nbsp; &nbsp; &nbsp; &nbsp; = rm -f
            <br>
            <br>
            ## Stable Section: usually no need to be changed. But you can add more.
            <br>
            ##=============================================================================
            <br>
            SHELL&nbsp; &nbsp;= /bin/sh
            <br>
            SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
            <br>
            OBJS&nbsp; &nbsp; = $(foreach x,$(SRCEXTS), \
            <br>
            &nbsp; &nbsp; &nbsp; $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
            <br>
            DEPS&nbsp; &nbsp; = $(patsubst %.o,%.d,$(OBJS))
            <br>
            <br>
            .PHONY : all objs clean cleanall rebuild
            <br>
            <br>
            all : $(PROGRAM)
            <br>
            <br>
            # Rules for creating the dependency files (.d).
            <br>
            #---------------------------------------------------
            <br>
            %.d : %.c
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CFLAGS) $&lt;
            <br>
            <br>
            %.d : %.C
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.cc
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.cpp
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.CPP
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.c++
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.cp
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.d : %.cxx
            <br>
            &nbsp; &nbsp;@$(CC) -MM -MD $(CXXFLAGS) $&lt;
            <br>
            <br>
            # Rules for producing the objects.
            <br>
            #---------------------------------------------------
            <br>
            objs : $(OBJS)
            <br>
            <br>
            %.o : %.c
            <br>
            &nbsp; &nbsp;$(CC) -c $(CPPFLAGS) $(CFLAGS) $&lt;
            <br>
            <br>
            %.o : %.C
            <br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.cc
            <br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.cpp<br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.CPP
            <br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.c++
            <br>
            &nbsp; &nbsp;$(CXX -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.cp
            <br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            %.o : %.cxx
            <br>
            &nbsp; &nbsp;$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $&lt;
            <br>
            <br>
            # Rules for producing the executable.
            <br>
            #----------------------------------------------
            <br>
            $(PROGRAM) : $(OBJS)
            <br>
            ifeq ($(strip $(SRCEXTS)), .c)&nbsp; # C file
            <br>
            &nbsp; &nbsp;$(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
            <br>
            else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # C++ file
            <br>
            &nbsp; &nbsp;$(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)
            <br>
            endif
            <br>
            <br>
            -include $(DEPS)
            <br>
            <br>
            rebuild: clean all
            <br>
            <br>
            clean :
            <br>
            &nbsp; &nbsp;@$(RM) *.o *.d
            <br>
            <br>
            cleanall: clean
            <br>
            &nbsp; &nbsp;@$(RM) $(PROGRAM) $(PROGRAM).exe
            <br>
            <br>
            ### End of the Makefile ##&nbsp; Suggestions are welcome&nbsp; ## All rights reserved ###
            <br>
            ###############################################################################
            <br>
            </td>
        </tr>
        <tr>
            <td style="vertical-align: top;"><br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
下面提供两个例子来具体说明上面 Makefile 的用法。
<br>
<br>
<span style="color: darkred;">例一　Hello World 程序</span>
<br>
<br>
这个程序的功能是输出 Hello, world! 这样一行文字。由 hello.h、hello.c、main.cxx 三个文件组成。前两个文件是 C 程序，后一个是 C++ 程序，因此这是一个 C 和 C++ 混编程序。
<br>
</span>
<table style="color: #0080ff; font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">/* File name: hello.h
            <br>
            &nbsp;* C header file
            <br>
            &nbsp;*/
            <br>
            <br>
            #ifndef HELLO_H
            <br>
            #define HELLO_H
            <br>
            <br>
            #ifdef __cplusplus
            <br>
            extern "C" {
            <br>
            #endif
            <br>
            <br>
            &nbsp; void print_hello();
            <br>
            <br>
            #ifdef __cplusplus
            <br>
            }
            <br>
            #endif
            <br>
            <br>
            #endif
            <br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
</span>
<table style="color: #0080ff; font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">/* File name: hello.c
            <br>
            &nbsp;* C source file.
            <br>
            &nbsp;*/
            <br>
            #include "hello.h"
            <br>
            #include &lt;stdio.h&gt;
            <br>
            <br>
            void print_hello()
            <br>
            {
            <br>
            &nbsp; puts( "Hello, world!" );
            <br>
            }
            <br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
</span>
<table style="color: #0080ff; font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">/* File name: main.cxx
            <br>
            &nbsp;* C++ source file.
            <br>
            &nbsp;*/
            <br>
            #include "hello.h"
            <br>
            <br>
            int main()
            <br>
            {
            <br>
            &nbsp; print_hello();
            <br>
            <br>
            &nbsp; return 0;
            <br>
            }
            <br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
建立一个新的目录，然后把这三个文件拷贝到目录中，也把 Makefile 文件拷贝到目录中。之后，对 Makefile 的相关项目进行如下设置：
<br>
</span>
<table style="color: #0080ff; font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">PROGRAM&nbsp; &nbsp;:= hello&nbsp; &nbsp; &nbsp; # 设置运行程序名
            <br>
            SRCDIRS&nbsp; &nbsp;:= .&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 源程序位于当前目录下
            <br>
            SRCEXTS&nbsp; &nbsp;:= .c .cxx&nbsp; &nbsp; # 源程序文件有 .c 和 .cxx 两种类型
            <br>
            CFLAGS&nbsp; &nbsp; := -g&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 为 C 目标程序包含 GDB 可用的调试信息
            <br>
            CXXFLAGS&nbsp; := -g&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 为 C++ 目标程序包含 GDB 可用的调试信息
            <br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
由于这个简单的程序只使用了 C 标准库的函数（puts），所以对于 CFLAGS 和 CXXFLAGS 没有过多的要求，LDFLAGS 和 CPPFLAGS 选项也无需设置。
<br>
<br>
经过上面的设置之后，执行 make 命令就可以编译程序了。如果没有错误出现的话，./hello  就可以运行程序了。
<br>
<br>
如果修改了源程序的话，可以看到只有和修改有关的源文件被编译。也可以再为程序添加新的源文件，只要它们的扩展名是已经在 Makefile 中设置过的，那么就没有必要修改　Makefile。
<br>
<br>
<span style="color: darkred;">例二　GTK+ 版 Hello World 程序</span>
<br>
<br>
这个 GTK+ 2.0 版的 Hello World 程序可以从下面的网址上得到：http://www.gtk.org/tutorial/c58.html#SEC-HELLOWORLD。当然，要编译 GTK+ 程序，还需要你的系统上已经安装好了 GTK+。
<br>
<br>
跟第一个例子一样，单独创建一个新的目录，把上面网页中提供的程序保存为 main.c 文件。对 Makefile 做如下设置：
<br>
</span>
<table style="color: #0080ff; font-family: courier new;" align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">PROGRAM&nbsp; &nbsp;:= hello&nbsp; &nbsp; &nbsp; # 设置运行程序名
            <br>
            SRCDIRS&nbsp; &nbsp;:= .&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 源程序位于当前目录下
            <br>
            SRCEXTS&nbsp; &nbsp;:= .c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 源程序文件只有 .c 一种类型
            <br>
            CFLAGS&nbsp; &nbsp; := `pkg-config --cflags gtk+-2.0`&nbsp; # CFLAGS
            <br>
            LDFLAGS&nbsp; &nbsp;:= `pkg-config --libs gtk+-2.0`&nbsp; &nbsp; # LDFLAGS
            <br>
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody">
<br>
这是一个 C 程序，所以 CXXFLAGS 没有必要设置——即使被设置了也不会被使用。
<br>
<br>
编译和连接 GTK+ 库所需要的 CFLAGS 和 LDFLAGS 由 pkg-config 程序自动产生。
<br>
<br>
现在就可以运行 make 命令编译、./hello 执行这个 GTK+ 程序了。
<br>
<br>
参考资料：
<br>
<ol type="1">
    <li>Multi-file projects and the GNU Make utility
    <br>
    Author: George Foot
    <br>
    <a  href="http://www.elitecoders.de/mags/cscene/CS2/CS2-10.html" target="_blank">http://www.elitecoders.de/mags/cscene/CS2/CS2-10.html</a>
    <br>
    <br>
    </li>
    <li>GNU Make Manual
    <br>
    <a  href="http://www.gnu.org/software/make/manual/" target="_blank">http://www.gnu.org/software/make/manual/</a></li>
</ol>
<br></span></span><hr style="width: 100%; height: 2px;"><span style="line-height: 150%;"><span class="postbody">重要通知：<br><br>文内提供的 Makefile 内容可能有些陈旧了。请访问<br><br></span></span><a  href="http://sourceforge.net/projects/gcmakefile/" target="_blank">http://sourceforge.net/projects/gcmakefile/</a><br><span style="line-height: 150%;"><span class="postbody">&nbsp;<br>下载最新版的 Makefile。</span></span><img src ="http://www.cnitblog.com/zouzheng/aggbug/39292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-01-24 20:47 <a href="http://www.cnitblog.com/zouzheng/articles/39292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 const 限定类的成员函数</title><link>http://www.cnitblog.com/zouzheng/articles/39291.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Thu, 24 Jan 2008 12:46:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/39291.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/39291.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/39291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/39291.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/39291.html</trackback:ping><description><![CDATA[<span style="font-size: 13px; line-height: 150%;"> 类的成员函数后面加 const，表明这个函数不会对这个类对象的数据成员（准确地说是非静态数据成员）作任何改变。<br> <br>
在设计类的时候，一个原则就是对于不改变数据成员的成员函数都要在后面加 const，而对于改变数据成员的成员函数不能加 const。所以
const 关键字对成员函数的行为作了更加明确的限定：有 const 修饰的成员函数（指 const
放在函数参数表的后面，而不是在函数前面或者参数表内），只能读取数据成员，不能改变数据成员；没有 const
修饰的成员函数，对数据成员则是可读可写的。<br> <br> 除此之外，在类的成员函数后面加 const 还有什么好处呢？那就是常量（即 const）对象可以调用 const 成员函数，而不能调用非const修饰的函数。正如非const类型的数据可以给const类型的变量赋值一样，反之则不成立。<br> <br> 请看下面一个完整的例子，然后我再作一些说明。<br>
<br>
</span><span style="font-size: 13px;"><span style="font-family: courier new; color: #0080ff;">#include &lt;iostream&gt;</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> #include &lt;string&gt;</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> using namespace std; </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> class Student { </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> public: </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;Student() {} </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;Student( const string&amp; nm, int sc = 0 ) </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp; &nbsp; : name( nm ), score( sc ) {} </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;void set_student( const string&amp; nm, int sc = 0 ) </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;{ </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp; &nbsp; name = nm; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp; &nbsp; score = sc; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;} </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;const string&amp; get_name() const </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;{ </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp; &nbsp; return name; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;} </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;int get_score() const </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;{ </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp; &nbsp; return score; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;} </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> private: </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;string name; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;int score; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> }; </span><br style="font-family: courier new; color: #0080ff;"> <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> // output student's name and score </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> void output_student( const Student&amp; student ) </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> { </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;cout &lt;&lt; student.get_name() &lt;&lt; "\t"; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;cout &lt;&lt; student.get_score() &lt;&lt; endl; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> } </span><br style="font-family: courier new; color: #0080ff;">  <br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> int main() </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> { </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;Student stu( "Wang", 85 ); </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;output_student( stu ); </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> }</span><br>
<br>
</span><span style="font-size: 13px; line-height: 150%;">
设 计了一个类 Student，数据成员有 name 和 score，有两个构造函数，有一个设置成员数据函数
set_student()，各有一个取得 name 和 score 的函数 get_name() 和 get_score()。请注意
get_name() 和 get_score() 后面都加了 const，而 set_student() 后面没有（也不能有const）。<br> <br> 首先说一点题外话，为什么 get_name() 前面也加 const。如果没有前后两个 const 的话，get_name() 返回的是对私有数据成员 name 的引用，所以通过这个引用可以改变私有成员 name 的值，如<br>
<br>
</span><span style="font-size: 13px;"><span style="font-family: courier new; color: #0080ff;">&nbsp; Student stu( "Wang", 85 );</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;stu.get_name() = "Li";</span><br>
<br>
</span><span style="font-size: 13px; line-height: 150%;">
即把 name 由原来的 "Wang" 变成了 "Li"，而这不是我们希望的发生的。所以在 get_name() 前面加 const 避免这种情况的发生。<br> <br> 那么，get_name() 和 get_score() 这两个后面应该加 const的成员函数，如果没有 const 修饰的话可不可以呢？回答是可以！但是这样做的代价是：const对象将不能再调用这两个非const成员函数了。如<br>
<br>
</span><span style="font-size: 13px;"><span style="font-family: courier new; color: #0080ff;">const string&amp; get_name(); // 这两个函数都应该设成 const 型</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> int get_score();</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> void output_student( const Student&amp; student ) </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> { </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;cout &lt;&lt; student.get_name() &lt;&lt; "\t"; // 如果 get_name() 和 get_score() 是非const成员函数，这一句和下一句调用是错误的</span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> &nbsp;&nbsp;cout &lt;&lt; student.get_score() &lt;&lt; endl; </span><br style="font-family: courier new; color: #0080ff;"><span style="font-family: courier new; color: #0080ff;"> }</span><br>
<br>
</span><span style="font-size: 13px; line-height: 150%;">
由 于参数student表示的是一个对const Student型对象的引用，所以 student 不能调用非const成员函数如
set_student()。如果 get_name() 和 get_score() 成员函数也变成非const型，那么上面的
student.get_name() 和 student.get_score() 的使用就是非法的，这样就会给我们处理问题造成困难。<br> <br> 因此，我们没有理由反对使用const，该加const时就应该加上const，这样使成员函数除了非const的对象之外，const对象也能够调用它。<br><br>（</span>2004-4-10 首发于CU http://bbs.chinaunix.net/viewthread.php?tid=300602，略有删节）<img src ="http://www.cnitblog.com/zouzheng/aggbug/39291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-01-24 20:46 <a href="http://www.cnitblog.com/zouzheng/articles/39291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 堆和栈的区别</title><link>http://www.cnitblog.com/zouzheng/articles/39232.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Wed, 23 Jan 2008 07:10:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/39232.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/39232.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/39232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/39232.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/39232.html</trackback:ping><description><![CDATA[<p><font size="1"><font color="#0000ff"><strong>一、预备知识—程序的内存分配<br></strong>&nbsp;&nbsp;&nbsp; 一个由c/C++编译的程序占用的内存分为以下几个部分<br>&nbsp;&nbsp;&nbsp; 1、栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。<br>&nbsp;&nbsp;&nbsp; 2、堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。<br>&nbsp;&nbsp;&nbsp; 3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放<br>&nbsp;&nbsp;&nbsp; 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放<br>&nbsp;&nbsp;&nbsp; 5、程序代码区—存放函数体的二进制代码。</font></font></p>
<p><font size="1"><br><font color="#0000ff"><strong>例子程序<br></strong>这是一个前辈写的，非常详细<br>//main.cpp<br>int a = 0; 全局初始化区<br>char *p1; 全局未初始化区<br>main()<br>{<br>int b; 栈<br>char s[] = "abc"; 栈<br>char *p2; 栈<br>char *p3 = "123456"; 123456\0在常量区，p3在栈上。<br>static int c =0； 全局（静态）初始化区<br>p1 = (char *)malloc(10);<br>p2 = (char *)malloc(20);<br>分配得来得10和20字节的区域就在堆区。<br>strcpy(p1, "123456"); 123456\0放在常量区，编译器可能会将它与p3所指向的"123456"优化成一个地方。<br>}<br><br><br><strong><font size="3">二、堆和栈的理论知识</font></strong><br></font><strong><br><font color="#0000ff">2.1申请方式<br></font></strong><font color="#0000ff">stack:<br>由系统自动分配。 例如，声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间<br>heap:<br>需要程序员自己申请，并指明大小，在c中malloc函数<br>如p1 = (char *)malloc(10);<br>在C++中用new运算符<br>如p2 = (char *)malloc(10);<br>但是注意p1、p2本身是在栈中的。<br><br><strong>2.2申请后系统的响应</strong><br>栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。<br>堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，<br>会
遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内
存空间中的首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大
小，系统会自动的将多余的那部分重新放入空闲链表中。<br><br><strong>2.3申请大小的限制</strong><br>栈：在
Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS
下，栈的大小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的
空间较小。<br>堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。<br><br><br><strong>2.4申请效率的比较</strong><br>栈由系统自动分配，速度较快。但程序员是无法控制的。<br>堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.<br>另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。<br><br><strong>2.5堆和栈中的存储内容</strong><br>栈： 在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。<br>当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。<br>堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。<br><br><strong>2.6存取效率的比较</strong><br>char s1[] = "aaaaaaaaaaaaaaa";<br>char *s2 = "bbbbbbbbbbbbbbbbb";<br>aaaaaaaaaaa是在运行时刻赋值的；<br>而bbbbbbbbbbb是在编译时就确定的；<br>但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。<br>比如：<br>＃i nclude<br>void main()<br>{<br>char a = 1;<br>char c[] = "1234567890";<br>char *p ="1234567890";<br>a = c[1];<br>a = p[1];<br>return;<br>}<br>对应的汇编代码<br>10: a = c[1];<br>00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br>0040106A 88 4D FC mov byte ptr [ebp-4],cl<br>11: a = p[1];<br>0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br>00401070 8A 42 01 mov al,byte ptr [edx+1]<br>00401073 88 45 FC mov byte ptr [ebp-4],al<br>第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到edx中，在根据edx读取字符，显然慢了。<br><br><strong>2.7小结</strong><br>堆和栈的区别可以用如下的比喻来看出：<br>使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。<br>使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。<br><br><br><br><font size="3"><strong>windows进程中的内存结构</strong></font><br><br><br>在阅读本文之前，如果你连</font><a  href="javascript:;" onclick="tagshow(event, '%B6%D1%D5%BB');return false;"><u><strong><font color="#800080">堆栈</font></strong></u></a><font color="#0000ff">是什么多不知道的话，请先阅读文章后面的</font><a  href="javascript:;" onclick="tagshow(event, '%BB%F9%B4%A1%D6%AA%CA%B6');return false;"><u><strong><font color="#800080">基础知识</font></strong></u></a><font color="#0000ff">。<br><br>接触过</font><a  href="javascript:;" onclick="tagshow(event, '%B1%E0%B3%CC');return false;"><u><strong><font color="#800080">编程</font></strong></u></a><font color="#0000ff">的人都知道，高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢？程序又是如何使用这些变量的呢？下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明，默认都使用VC编译的release版。<br><br>首先，来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local)，静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式。先来看下面这段代码：<br><br>＃i nclude &lt;stdio.h&gt;<br><br>int g1=0, g2=0, g3=0;<br><br>int main()<br>{<br>static int s1=0, s2=0, s3=0;<br>int v1=0, v2=0, v3=0;<br><br>//打印出各个变量的内存地址<br><br>printf("0x%08x\n",&amp;v1); //打印各本地变量的内存地址<br>printf("0x%08x\n",&amp;v2);<br>printf("0x%08x\n\n",&amp;v3);<br>printf("0x%08x\n",&amp;g1); //打印各全局变量的内存地址<br>printf("0x%08x\n",&amp;g2);<br>printf("0x%08x\n\n",&amp;g3);<br>printf("0x%08x\n",&amp;s1); //打印各静态变量的内存地址<br>printf("0x%08x\n",&amp;s2);<br>printf("0x%08x\n\n",&amp;s3);<br>return 0;<br>}<br><br>编译后的执行结果是：<br><br>0x0012ff78<br>0x0012ff7c<br>0x0012ff80<br><br>0x004068d0<br>0x004068d4<br>0x004068d8<br><br>0x004068dc<br>0x004068e0<br>0x004068e4<br><br>输
出的结果就是变量的内存地址。其中v1,v2,v3是本地变量，g1,g2,g3是全局变量，s1,s2,s3是静态变量。你可以看到这些变量在内存是连
续分布的，但是本地变量和全局变量分配的内存地址差了十万八千里，而全局变量和静态变量分配的内存是连续的。这是因为本地变量和全局/静态变量是分配在不
同类型的内存区域中的结果。对于一个进程的内存空间而言，可以在逻辑上分成3个部份：代码区，静态数据区和动态数据区。动态数据区一般就是&#8220;堆栈&#8221;。&#8220;栈
(stack)&#8221;和&#8220;堆(heap)&#8221;是两种不同的动态数据区，栈是一种线性结构，堆是一种链式结构。进程的每个线程都有私有的&#8220;栈&#8221;，所以每个线程虽然
代码一样，但本地变量的数据都是互不干扰。一个堆栈可以通过&#8220;基地址&#8221;和&#8220;栈顶&#8221;地址来描述。全局变量和静态变量分配在静态数据区，本地变量分配在动态数
据区，即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。<br><br><br>├———————┤低端内存区域<br>│ &#8230;&#8230; │<br>├———————┤<br>│ 动态数据区 │<br>├———————┤<br>│ &#8230;&#8230; │<br>├———————┤<br>│ 代码区 │<br>├———————┤<br>│ 静态数据区 │<br>├———————┤<br>│ &#8230;&#8230; │<br>├———————┤高端内存区域<br><br><br>堆
栈是一个先进后出的数据结构，栈顶地址总是小于等于栈的基地址。我们可以先了解一下函数调用的过程，以便对堆栈在程序中的作用有更深入的了解。不同的语言
有不同的函数调用规定，这些因素有参数的压入规则和堆栈的平衡。windows API的调用规则和ANSI
C的函数调用规则是不一样的，前者由被调函数调整堆栈，后者由调用者调整堆栈。两者通过&#8220;__stdcall&#8221;和&#8220;__cdecl&#8221;前缀区分。先看下面这
段代码：<br><br>＃i nclude &lt;stdio.h&gt;<br><br>void __stdcall func(int param1,int param2,int param3)<br>{<br>int var1=param1;<br>int var2=param2;<br>int var3=param3;<br>printf("0x%08x\n",?m1); //打印出各个变量的内存地址<br>printf("0x%08x\n",?m2);<br>printf("0x%08x\n\n",?m3);<br>printf("0x%08x\n",&amp;var1);<br>printf("0x%08x\n",&amp;var2);<br>printf("0x%08x\n\n",&amp;var3);<br>return;<br>}<br><br>int main()<br>{<br>func(1,2,3);<br>return 0;<br>}<br><br>编译后的执行结果是：<br><br>0x0012ff78<br>0x0012ff7c<br>0x0012ff80<br><br>0x0012ff68<br>0x0012ff6c<br>0x0012ff70<br><br><br>├———————┤&lt;—函数执行时的栈顶（ESP）、低端内存区域<br>│ &#8230;&#8230; │<br>├———————┤<br>│ var 1 │<br>├———————┤<br>│ var 2 │<br>├———————┤<br>│ var 3 │<br>├———————┤<br>│ RET │<br>├———————┤&lt;—&#8220;__cdecl&#8221;函数返回后的栈顶（ESP）<br>│ parameter 1 │<br>├———————┤<br>│ parameter 2 │<br>├———————┤<br>│ parameter 3 │<br>├———————┤&lt;—&#8220;__stdcall&#8221;函数返回后的栈顶（ESP）<br>│ &#8230;&#8230; │<br>├———————┤&lt;—栈底（基地址 EBP）、高端内存区域<br><br><br>上
图就是函数调用过程中堆栈的样子了。首先，三个参数以从又到左的次序压入堆栈，先压&#8220;param3&#8221;，再压&#8220;param2&#8221;，最后压入&#8220;param1&#8221;；
然后压入函数的返回地址(RET)，接着跳转到函数地址接着执行（这里要补充一点，介绍UNIX下的缓冲溢出原理的文章中都提到在压入RET后，继续压入
当前EBP，然后用当前ESP代替EBP。然而，有一篇介绍windows下函数调用的文章中说，在windows下的函数调用也有这一步骤，但根据我的
实际调试，并未发现这一步，这还可以从param3和var1之间只有4字节的间隙这点看出来）；第三步，将栈顶(ESP)减去一个数，为本地变量分配内
存空间，上例中是减去12字节(ESP=ESP-3*4，每个int变量占用4个字节)；接着就初始化本地变量的内存空间。由于&#8220;__stdcall&#8221;调
用由被调函数调整堆栈，所以在函数返回前要恢复堆栈，先回收本地变量占用的内存(ESP=ESP+3*4)，然后取出返回地址，填入EIP寄存器，回收先
前压入参数占用的内存(ESP=ESP+3*4)，继续执行调用者的代码。参见下列汇编代码：<br><br>;--------------func 函数的汇编代码-------------------<br><br>:00401000 83EC0C sub esp, 0000000C //创建本地变量的内存空间<br>:00401003 8B442410 mov eax, dword ptr [esp+10]<br>:00401007 8B4C2414 mov ecx, dword ptr [esp+14]<br>:0040100B 8B542418 mov edx, dword ptr [esp+18]<br>:0040100F 89442400 mov dword ptr [esp], eax<br>:00401013 8D442410 lea eax, dword ptr [esp+10]<br>:00401017 894C2404 mov dword ptr [esp+04], ecx<br><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;（省略若干代码）<br><br>:00401075 83C43C add esp, 0000003C ;恢复堆栈，回收本地变量的内存空间<br>:00401078 C3 ret 000C ;函数返回，恢复参数占用的内存空间<br>;如果是&#8220;__cdecl&#8221;的话，这里是&#8220;ret&#8221;，堆栈将由调用者恢复<br><br>;-------------------函数结束-------------------------<br><br><br>;--------------主程序调用func函数的代码--------------<br><br>:00401080 6A03 push 00000003 //压入参数param3<br>:00401082 6A02 push 00000002 //压入参数param2<br>:00401084 6A01 push 00000001 //压入参数param1<br>:00401086 E875FFFFFF call 00401000 //调用func函数<br>;如果是&#8220;__cdecl&#8221;的话，将在这里恢复堆栈，&#8220;add esp, 0000000C&#8221;<br><br>聪明的读者看到这里，差不多就明白缓冲溢出的原理了。先来看下面的代码：<br><br>＃i nclude &lt;stdio.h&gt;<br>＃i nclude &lt;string.h&gt;<br><br>void __stdcall func()<br>{<br>char lpBuff[8]="\0";<br>strcat(lpBuff,"AAAAAAAAAAA");<br>return;<br>}<br><br>int main()<br>{<br>func();<br>return 0;<br>}<br><br>编
译后执行一下回怎么样？哈，&#8220;"0x00414141"指令引用的"0x00000000"内存。该内存不能为"read"。&#8221;，&#8220;非法操作&#8221;喽！
"41"就是"A"的16进制的ASCII码了，那明显就是strcat这句出的问题了。"lpBuff"的大小只有8字节，算进结尾的\0，那
strcat最多只能写入7个"A"，但程序实际写入了11个"A"外加1个\0。再来看看上面那幅图，多出来的4个字节正好覆盖了RET的所在的内存空
间，导致函数返回到一个错误的内存地址，执行了错误的指令。如果能精心构造这个字符串，使它分成三部分，前一部份仅仅是填充的无意义数据以达到溢出的目
的，接着是一个覆盖RET的数据，紧接着是一段shellcode，那只要着个RET地址能指向这段shellcode的第一个指令，那函数返回时就能执
行shellcode了。但是软件的不同版本和不同的运行环境都可能影响这段shellcode在内存中的位置，那么要构造这个RET是十分困难的。一般
都在RET和shellcode之间填充大量的NOP指令，使得exploit有更强的通用性。<br><br><br>├———————┤&lt;—低端内存区域<br>│ &#8230;&#8230; │<br>├———————┤&lt;—由exploit填入数据的开始<br>│ │<br>│ buffer │&lt;—填入无用的数据<br>│ │<br>├———————┤<br>│ RET │&lt;—指向shellcode，或NOP指令的范围<br>├———————┤<br>│ NOP │<br>│ &#8230;&#8230; │&lt;—填入的NOP指令，是RET可指向的范围<br>│ NOP │<br>├———————┤<br>│ │<br>│ shellcode │<br>│ │<br>├———————┤&lt;—由exploit填入数据的结束<br>│ &#8230;&#8230; │<br>├———————┤&lt;—高端内存区域<br><br><br>windows下的动态数据除了可存放在栈中，还可以存放在堆中。了解C++的朋友都知道，C++可以使用new关键字来动态分配内存。来看下面的C++代码：<br><br>＃i nclude &lt;stdio.h&gt;<br>＃i nclude &lt;iostream.h&gt;<br>＃i nclude &lt;windows.h&gt;<br><br>void func()<br>{<br>char *buffer=new char[128];<br>char bufflocal[128];<br>static char buffstatic[128];<br>printf("0x%08x\n",buffer); //打印堆中变量的内存地址<br>printf("0x%08x\n",bufflocal); //打印本地变量的内存地址<br>printf("0x%08x\n",buffstatic); //打印静态变量的内存地址<br>}<br><br>void main()<br>{<br>func();<br>return;<br>}<br><br>程序执行结果为：<br><br>0x004107d0<br>0x0012ff04<br>0x004068c0<br><br>可以发现用new关键字分配的内存即不在栈中，也不在静态数据区。VC编译器是通过windows下的&#8220;堆(heap)&#8221;来实现new关键字的内存动态分配。在讲&#8220;堆&#8221;之前，先来了解一下和&#8220;堆&#8221;有关的几个API函数：<br><br>HeapAlloc 在堆中申请内存空间<br>HeapCreate 创建一个新的堆对象<br>HeapDestroy 销毁一个堆对象<br>HeapFree 释放申请的内存<br>HeapWalk 枚举堆对象的所有内存块<br>GetProcessHeap 取得进程的默认堆对象<br>GetProcessHeaps 取得进程所有的堆对象<br>LocalAlloc<br>GlobalAlloc<br><br>当进程初始化时，系统会自动为进程创建一个默认堆，这个堆默认所占内存的大小为1M。堆对象由系统进行管理，它在内存中以链式结构存在。通过下面的代码可以通过堆动态申请内存空间：<br><br>HANDLE hHeap=GetProcessHeap();<br>char *buff=HeapAlloc(hHeap,0,8);<br><br>其中hHeap是堆对象的句柄，buff是指向申请的内存空间的地址。那这个hHeap究竟是什么呢？它的值有什么意义吗？看看下面这段代码吧：<br><br>#pragma comment(linker,"/entry:main") //定义程序的入口<br>＃i nclude &lt;windows.h&gt;<br><br>_CRTIMP int (__cdecl *printf)(const char *, ...); //定义STL函数printf<br>/*---------------------------------------------------------------------------<br>写到这里，我们顺便来复习一下前面所讲的知识：<br>(*注)printf函数是C语言的标准函数库中函数，VC的标准函数库由msvcrt.dll模块实现。<br>由
函数定义可见，printf的参数个数是可变的，函数内部无法预先知道调用者压入的参数个数，函数只能通过分析第一个参数字符串的格式来获得压入参数的信
息，由于这里参数的个数是动态的，所以必须由调用者来平衡堆栈，这里便使用了__cdecl调用规则。BTW，Windows系统的API函数基本上是
__stdcall调用形式，只有一个API例外，那就是wsprintf，它使用__cdecl调用规则，同printf函数一样，这是由于它的参数个
数是可变的缘故。<br>---------------------------------------------------------------------------*/<br>void main()<br>{<br>HANDLE hHeap=GetProcessHeap();<br>char *buff=HeapAlloc(hHeap,0,0x10);<br>char *buff2=HeapAlloc(hHeap,0,0x10);<br>HMODULE hMsvcrt=LoadLibrary("msvcrt.dll");<br>printf=(void *)GetProcAddress(hMsvcrt,"printf");<br>printf("0x%08x\n",hHeap);<br>printf("0x%08x\n",buff);<br>printf("0x%08x\n\n",buff2);<br>}<br><br>执行结果为：<br><br>0x00130000<br>0x00133100<br>0x00133118<br><br>hHeap
的值怎么和那个buff的值那么接近呢？其实hHeap这个句柄就是指向HEAP首部的地址。在进程的用户区存着一个叫PEB(进程环境块)的结构，这个
结构中存放着一些有关进程的重要信息，其中在PEB首地址偏移0x18处存放的ProcessHeap就是进程默认堆的地址，而偏移0x90处存放了指向
进程所有堆的地址列表的指针。windows有很多API都使用进程的默认堆来存放动态数据，如windows
2000下的所有ANSI版本的函数都是在默认堆中申请内存来转换ANSI字符串到Unicode字符串的。对一个堆的访问是顺序进行的，同一时刻只能有
一个线程访问堆中的数据，当多个线程同时有访问要求时，只能排队等待，这样便造成程序执行效率下降。<br><br>最后来说说内存中的数据对齐。所位数
据对齐，是指数据所在的内存地址必须是该数据长度的整数倍，DWORD数据的内存起始地址能被4除尽，WORD数据的内存起始地址能被2除尽，x86
CPU能直接访问对齐的数据，当他试图访问一个未对齐的数据时，会在内部进行一系列的调整，这些调整对于程序来说是透明的，但是会降低运行速度，所以编译
器在编译程序时会尽量保证数据对齐。同样一段代码，我们来看看用VC、Dev-C++和lcc三个不同编译器编译出来的程序的执行结果：<br><br>＃i nclude &lt;stdio.h&gt;<br><br>int main()<br>{<br>int a;<br>char b;<br>int c;<br>printf("0x%08x\n",&amp;a);<br>printf("0x%08x\n",&amp;b);<br>printf("0x%08x\n",&amp;c);<br>return 0;<br>}<br><br>这是用VC编译后的执行结果：<br>0x0012ff7c<br>0x0012ff7b<br>0x0012ff80<br>变量在内存中的顺序：b(1字节)-a(4字节)-c(4字节)。<br><br>这是用Dev-C++编译后的执行结果：<br>0x0022ff7c<br>0x0022ff7b<br>0x0022ff74<br>变量在内存中的顺序：c(4字节)-中间相隔3字节-b(占1字节)-a(4字节)。<br><br>这是用lcc编译后的执行结果：<br>0x0012ff6c<br>0x0012ff6b<br>0x0012ff64<br>变量在内存中的顺序：同上。<br><br>三个编译器都做到了数据对齐，但是后两个编译器显然没VC&#8220;聪明&#8221;，让一个char占了4字节，浪费内存哦。<br><br><br><strong><font size="3">基础知识：</font></strong><br>堆
栈是一种简单的数据结构，是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶，另一端称为栈底，对堆栈的插入和删除操作被称
为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中，POP指令实现出栈操作，PUSH指令实现入栈操作。CPU的ESP寄存器存放
当前线程的栈顶指针，EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址，当CPU执行完当前的指令后，从
EIP寄存器中读取下一条指令的内存地址，然后继续执行。 </font></font></p>
<p>&nbsp;&lt;br&gt;</p>
<p>堆（Heap）栈（Stack） </p>
<p><strong>1、内存分配方面：</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 堆：一般由<strong>程序员</strong>分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式是类似于链表。可能用到的关键字如下：<strong>new</strong>、<strong>malloc</strong>、<strong>delete</strong>、<strong>free</strong>等等。 </p>
<p>&nbsp;&nbsp;&nbsp; 栈：由<strong>编译器</strong>(Compiler)自动分配释放，存放<strong>函数的参数值</strong>，<strong>局部变量</strong>的值等。其操作方式类似于数据结构中的栈。 </p>
<p><strong>2、申请方式方面：</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 堆：需要程序员自己申请，并指明大小。在c中malloc函数如p1 = (char *)malloc(10)；在C++中用new运算符，但是注意p1、p2本身是在栈中的。因为他们还是可以认为是局部变量。 </p>
<p>&nbsp;&nbsp;&nbsp; 栈：由系统自动分配。 例如，声明在函数中一个局部变量 int b；系统自动在栈中为b开辟空间。 </p>
<p><strong>3、系统响应方面：</strong> </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>堆：操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，会遍历该链表，寻找第一个空间大
于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分
配的大小，这样代码中的delete语句才能正确的释放本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重
新放入空闲链表中。 </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢出。 </p>
<p><strong>4、大小限制方面：</strong> </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>堆：是<strong>向高地址扩展</strong>的数据结构，是<strong>不连续</strong>的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中<strong>有效的虚拟内存</strong>。由此可见，堆获得的空间比较灵活，也比较大。 </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>栈：在Windows下, 栈是<strong>向低地址扩展</strong>的数据结构，是一块<strong>连续</strong>的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是<strong>系统预先规定好</strong>的，在WINDOWS下，栈的大小是固定的（是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。 </p>
<p><strong>5、效率方面：</strong> </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>堆：是由new分配的内存，一般速度比较慢，而且<strong>容易产生内存碎片</strong>，不过用起来最<strong>方便</strong>，另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。 </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>栈：由系统自动分配，速度较快。但程序员是<strong>无法控制</strong>的。 </p>
<p><strong>6、存放内容方面：</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 堆：一般是在堆的头部用一个字节存放堆的大小。<strong>堆中的具体内容有程序员安排。</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 栈：在函数调用时第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的<strong>地址</strong>然后是函数的各个参数，在大多数的C编译器中，<strong>参数是由右往左入栈</strong>，然后是函数中的局部变量。 <strong>注意: 静态变量是不入栈的</strong>。当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，<strong>程序由该点继续运行</strong>。 </p>
<p><strong>7、存取效率方面：</strong> </p>
<p><strong>&nbsp;&nbsp;&nbsp; </strong>堆：char *s1 = "Hellow Word"；是在<strong>编译时</strong>就确定的； </p>
<p>&nbsp;&nbsp;&nbsp; 栈：char s1[] = "Hellow Word"； 是在<strong>运行时</strong>赋值的；用数组比用指针速度要快一些，因为指针在底层汇编中需要用edx寄存器中转一下，而数组在栈上直接读取。</p><img src ="http://www.cnitblog.com/zouzheng/aggbug/39232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-01-23 15:10 <a href="http://www.cnitblog.com/zouzheng/articles/39232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>volatile关键字的作用</title><link>http://www.cnitblog.com/zouzheng/articles/38719.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Thu, 10 Jan 2008 13:20:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/38719.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/38719.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/38719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/38719.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/38719.html</trackback:ping><description><![CDATA[volatile提醒编译器它后面所定义的变量随时都有可能改变，因此编译后的程序每次需要存储或读取这个变量的时候，都会直接从变量地址中读取数据。如果没有volatile关键字，则编译器可能优化读取和存储，可能暂时使用寄存器中的值，如果这个变量由别的程序更新了的话，将出现不一致的现象。下面举例说明。在DSP开发中，经常需要等待某个事件的触发，所以经常会写出这样的程序：<br>short flag;<br>void test()<br>{<br>do1();<br>while(flag==0);<br>do2();<br>}这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改，这个程序可能是某个硬件中断服务程序。例如：如果某个按钮按下的话，就会对DSP产生中断，在按键中断程序中修改flag为1，这样上面的程序就能够得以继续运行。但是，编译器并不知道flag的值会被别的程序修改，因此在它进行优化的时候，可能会把flag的值先读入某个寄存器，然后等待那个寄存器变为1。如果不幸进行了这样的优化，那么while循环就变成了死循环，因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值，就需要定义为如下形式：<br>volatile short flag;<br>需要注意的是，没有volatile也可能能正常运行，但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常，但是release版本却不能正常的问题。所以为了安全起见，只要是等待别的程序修改某个变量的话，就加上volatile关键字。<br><br><font color=#009999>C语言void及void指针深层探索<br></font><font color=#000000>1.概述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文将对void关键字的深刻含义进行解说，并详述void及void指针类型的使用方法与技巧。<br><br>　　2.void的含义<br>　　void的字面意思是&#8220;无类型&#8221;，void *则为&#8220;无类型指针&#8221;，void *可以指向任何类型的数据。<br><br>　　void几乎只有&#8220;注释&#8221;和限制程序的作用，因为从来没有人会定义一个void变量，让我们试着来定义：<br><br><br>void a;<br><br>　　这行语句编译时会出错，提示&#8220;illegal use of type 'void'&#8221;。不过，即使void a的编译不会出错，它也没有任何实际意义。<br><br>　　void真正发挥的作用在于：<br>　　（1） 对函数返回的限定；<br>　　（2） 对函数参数的限定。<br><br>　　我们将在第三节对以上二点进行具体说明。<br><br>　　众所周知，如果指针p1和p2的类型相同，那么我们可以直接在p1和p2间互相赋值；如果p1和p2指向不同的数据类型，则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 <br><br>　　例如：<br>float *p1;<br>int *p2;<br>p1 = p2;<br><br>　　其中p1 = p2语句会编译出错，提示&#8220;'=' : cannot convert from 'int *' to 'float *'&#8221;，必须改为：<br>p1 = (float *)p2;<br><br>　　而void *则不同，任何类型的指针都可以直接赋值给它，无需进行强制类型转换：<br>void *p1;<br>int *p2;<br>p1 = p2;<br><br>　　但这并不意味着，void *也可以无需强制类型转换地赋给其它类型的指针。因为&#8220;无类型&#8221;可以包容&#8220;有类型&#8221;，而&#8220;有类型&#8221;则不能包容&#8220;无类型&#8221;。道理很简单，我们可以说&#8220;男人和女人都是人&#8221;，但不能说&#8220;人是男人&#8221;或者&#8220;人是女人&#8221;。下面的语句编译出错：<br>void *p1;<br>int *p2;<br>p2 = p1;<br><br>　　提示&#8220;'=' : cannot convert from 'void *' to 'int *'&#8221;。<br><br>3.void的使用<br><br>　　下面给出void关键字的使用规则：<br>　　规则一 如果函数没有返回值，那么应声明为void类型<br><br>　　在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如：<br>add ( int a, int b )<br>{<br>return a + b;<br>}<br>int main(int argc, char* argv[])<br>{<br>printf ( "2 + 3 = %d", add ( 2, 3) );<br>}<br><br>　　程序运行的结果为输出：<br>　　2 + 3 = 5<br>　　这说明不加返回值说明的函数的确为int函数。<br><br>　　林锐博士《高质量C/C++编程》中提到：&#8220;C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生&#8221;。可是编译器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确，所以不能寄希望于编译器会做严格的类型检查。<br><br>　　因此，为了避免混乱，我们在编写C/C++程序时，对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值，一定要声明为void类型。这既是程序良好可读性的需要，也是编程规范性的要求。另外，加上void类型声明后，也可以发挥代码的&#8220;自注释&#8221;作用。代码的&#8220;自注释&#8221;即代码能自己注释自己。<br><br>　　规则二 如果函数无参数，那么应声明其参数为void<br><br>　　在C++语言中声明一个这样的函数：<br>int function(void)<br>{<br>return 1;<br>}<br><br>　　则进行下面的调用是不合法的：<br>function(2);<br><br>　　因为在C++中，函数参数为void的意思是这个函数不接受任何参数。<br><br>　　我们在Turbo C 2.0中编译：<br>＃i nclude "stdio.h"<br>fun()<br>{<br>return 1;<br>}<br>main()<br>{<br>printf("%d",fun(2));<br>getchar();<br>}<br><br>　　编译正确且输出1，这说明，在C语言中，可以给无参数的函数传送任意类型的参数，但是在C++编译器中编译同样的代码则会出错。在C++中，不能向无参数的函数传送任何参数，出错提示&#8220;'fun' : function does not take 1 parameters&#8221;。<br><br>　　所以，无论在C还是C++中，若函数不接受任何参数，一定要指明参数为void。<br><br>　　规则三 小心使用void指针类型<br><br>　　按照ANSI(American National Standards Institute)标准，不能对void指针进行算法操作，即下列操作都是不合法的：<br>void * pvoid;<br>pvoid++; //ANSI：错误<br>pvoid += 1; //ANSI：错误<br>//ANSI标准之所以这样认定，是因为它坚持：进行算法操作的指针必须是确定知道其指向数据类型大小的。<br>//例如：<br>int *pint;<br>pint++; //ANSI：正确<br><br>　　pint++的结果是使其增大sizeof(int)。<br><br>　　但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定，它指定void *的算法操作与char *一致。<br><br>　　因此下列语句在GNU编译器中皆正确：<br>pvoid++; //GNU：正确<br>pvoid += 1; //GNU：正确<br><br>　　pvoid++的执行结果是其增大了1。<br><br>　　在实际的程序设计中，为迎合ANSI标准，并提高程序的可移植性，我们可以这样编写实现同样功能的代码：<br>void * pvoid;<br>(char *)pvoid++; //ANSI：正确；GNU：正确<br>(char *)pvoid += 1; //ANSI：错误；GNU：正确<br><br>　　GNU和ANSI还有一些区别，总体而言，GNU较ANSI更&#8220;开放&#8221;，提供了对更多语法的支持。但是我们在真实设计时，还是应该尽可能地迎合ANSI标准。<br><br>　　规则四 如果函数的参数可以是任意类型指针，那么应声明其参数为void *<br><br>　　典型的如内存操作函数memcpy和memset的函数原型分别为：<br>void * memcpy(void *dest, const void *src, size_t len);<br>void * memset ( void * buffer, int c, size_t num );<br><br>　　这样，任何类型的指针都可以传入memcpy和memset中，这也真实地体现了内存操作函数的意义，因为它操作的对象仅仅是一片内存，而不论这片内存是什么类型。如果memcpy和memset的参数类型不是void *，而是char *，那才叫真的奇怪了！这样的memcpy和memset明显不是一个&#8220;纯粹的，脱离低级趣味的&#8221;函数！<br><br>　　下面的代码执行正确：<br>//示例：memset接受任意类型指针<br>int intarray[100];<br>memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0<br><br>//示例：memcpy接受任意类型指针<br>int intarray1[100], intarray2[100];<br>memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1<br><br>　　有趣的是，memcpy和memset函数返回的也是void *类型，标准库函数的编写者是多么地富有学问啊！<br><br>　　规则五 void不能代表一个真实的变量<br><br>　　下面代码都企图让void代表一个真实的变量，因此都是错误的代码：<br>void a; //错误<br>function(void a); //错误<br><br>　　void体现了一种抽象，这个世界上的变量都是&#8220;有类型&#8221;的，譬如一个人不是男人就是女人.<br><br>　　void的出现只是为了一种抽象的需要，如果你正确地理解了面向对象中&#8220;抽象基类&#8221;的概念，也很容易理解void数据类型。正如不能给抽象基类定义一个实例，我们也不能定义一个void（让我们类比的称void为&#8220;抽象数据类型&#8221;）变量。<br><br></font><font color=#009999>关于CONST的用法<br>
<div>const在C语言中算是一个比较新的描述符，我们称之为常量修饰符，意即其所修饰<br>的对象为常量(immutable)。<br><br>我们来分情况看语法上它该如何被使用。<br><br>1、函数体内修饰局部变量。<br>例：<br>void func(){<br>const int a=0;<br>}<br><br>首先，我们先把const这个单词忽略不看，那么a是一个int类型的局部自动变量，<br>我们给它赋予初始值0。<br><br>然后再看const.<br><br>const作为一个类型限定词，和int有相同的地位。<br>const int a;<br>int const a;<br>是等价的。于是此处我们一定要清晰的明白，const修饰的对象是谁，是a,和int没<br>有关系。const 要求他所修饰的对象为常量，不可被改变，不可被赋值，不可作为<br>左值（l-value)。<br>这样的写法也是错误的。<br>const int a;<br>a=0;<br>这是一个很常见的使用方式：<br>const double pi=3.14;<br>在程序的后面如果企图对pi再次赋值或者修改就会出错。<br><br>然后看一个稍微复杂的例子。<br>const int* p;<br>还是先去掉const 修饰符号。<br>注意，下面两个是等价的。<br>int* p;<br>int *p;<br>其实我们想要说的是，*p是int类型。那么显然，p就是指向int的指针。<br>同理<br>const int* p;<br>其实等价于<br>const int (*p);<br>int const (*p);<br>即，*p是常量。也就是说，p指向的数据是常量。<br>于是<br>p+=8; //合法<br>*p=3; //非法，p指向的数据是常量。<br><br>那么如何声明一个自身是常量指针呢？方法是让const尽可能的靠近p;<br>int* const p;<br>const右面只有p,显然，它修饰的是p,说明p不可被更改。然后把const去掉，可以<br>看出p是一个指向 int形式变量的指针。<br>于是<br>p+=8; //非法<br>*p=3; //合法<br><br>再看一个更复杂的例子，它是上面二者的综合<br>const int* const p;<br>说明p自己是常量，且p指向的变量也是常量。<br>于是<br>p+=8; //非法<br>*p=3; //非法<br><br>const 还有一个作用就是用于修饰常量静态字符串。<br>例如：<br>const char* name="David";<br>如果没有const,我们可能会在后面有意无意的写name[4]='x'这样的语句，这样会<br>导致对只读内存区域的赋值，然后程序会立刻异常终止。有了 const,这个错误就<br>能在程序被编译的时候就立即检查出来，这就是const的好处。让逻辑错误在编译<br>期被发现。<br><br>const 还可以用来修饰数组<br>const char s[]="David";<br>与上面有类似的作用。<br><br>2、在函数声明时修饰参数<br>来看实际中的一个例子。<br>NAME<br>memmove -- copy byte string<br><br>LIBRARY<br>Standard C Library (libc, -lc)<br><br>SYNOPSIS<br>＃i nclude &lt;string.h&gt;<br><br>void *<br>memmove(void *dst, const void *src, size_t len);<br><br>这是标准库中的一个函数，用于按字节方式复制字符串（内存）。<br>它的第一个参数，是将字符串复制到哪里去（dest),是目的地，这段内存区域必须<br>是可写。<br>它的第二个参数，是要将什么样的字符串复制出去，我们对这段内存区域只做读<br>取，不写。<br>于是，我们站在这个函数自己的角度来看，src 这个指针，它所指向的内存内所存<br>储的数据在整个函数执行的过程中是不变。于是src所指向的内容是常量。于是就<br>需要用const修饰。<br>例如，我们这里这样使用它。<br>const char* s="hello";<br>char buf[100];<br>memmove(buf,s,6); //这里其实应该用strcpy或memcpy更好<br><br>如果我们反过来写，<br>memmove(s,buf,6);<br>那么编译器一定会报错。事实是我们经常会把各种函数的参数顺序写反。事实是编<br>译器在此时帮了我们大忙。如果编译器静悄悄的不报错，(在函数声明处去掉<br>const即可),那么这个程序在运行的时候一定会崩溃。<br><br>这里还要说明的一点是在函数参数声明中const一般用来声明指针而不是变量本身。<br>例如，上面的size_t len,在函数实现的时候可以完全不用更改len的值，那么是否<br>应该把len也声明为常量呢？可以，可以这么做。我们来分析这么做有什么优劣。<br>如果加了const,那么对于这个函数的实现者，可以防止他在实现这个函数的时候修<br>改不需要修改的值(len),这样很好。<br>但是对于这个函数的使用者，<br>1。这个修饰符号毫无意义，我们可以传递一个常量整数或者一个非常量整数过<br>去，反正对方获得的只是我们传递的一个copy。<br>2。暴露了实现。我不需要知道你在实现这个函数的时候是否修改过len的值。<br><br>所以，const一般只用来修饰指针。<br><br>再看一个复杂的例子<br>int execv(const char *path, char *const argv[]);<br>着重看后面这个，argv.它代表什么。<br>如果去掉const,我们可以看出<br>char * argv[];<br>argv是一个数组，它的每个元素都是char *类型的指针。<br>如果加上const.那么const修饰的是谁呢？他修饰的是一个数组，argv[],意思就是<br>说这个数组的元素是只读的。那么数组的元素的是什么类型呢？是char *类型的指<br>针.也就是说指针是常量，而它指向的数据不是。<br>于是<br>argv[1]=NULL; //非法<br>argv[0][0]='a'; //合法<br><br><br>3、全局变量。<br>我们的原则依然是，尽可能少的使用全局变量。<br>我们的第二条规则 则是，尽可能多的使用const。<br>如果一个全局变量只在本文件中使用，那么用法和前面所说的函数局部变量没有什<br>么区别。<br>如果它要在多个文件间共享，那么就牵扯到一个存储类型的问题。<br><br>有两种方式。<br>1.使用extern<br>例如<br>/* file1.h */<br>extern const double pi;<br>/* file1.c */<br>const double pi=3.14;<br>然后其他需要使用pi这个变量的，包含file1.h<br>＃i nclude "file1.h"<br>或者，自己把那句声明复制一遍就好。<br>这样做的结果是，整个程序链接完后，所有需要使用pi这个变量的共享一个存储区域。<br><br>2.使用static,静态外部存储类<br>/* constant.h */<br>static const pi=3.14;<br>需要使用这个变量的*.c文件中，必须包含这个头文件。<br>前面的static一定不能少。否则链接的时候会报告说该变量被多次定义。<br>这样做的结果是，每个包含了constant.h的*.c文件，都有一份该变量自己的copy,<br>该变量实际上还是被定义了多次，占用了多个存储空间，不过在加了static关键字<br>后，解决了文件间重定义的冲突。<br>坏处是浪费了存储空间，导致链接完后的可执行文件变大。但是通常，这个，小小<br>几字节的变化，不是问题。<br>好处是，你不用关心这个变量是在哪个文件中被初始化的。<br><br><br>最后，说说const的作用。<br>const 的好处，是引入了常量的概念，让我们不要去修改不该修改的内存。直接的<br>作用就是让更多的逻辑错误在编译期被发现。所以我们要尽可能的多使用const。<br>但是很多人并不习惯使用它，更有甚者，是在整个程序 编写／调试 完后才补<br>const。如果是给函数的声明补const,尚好。如果是给 全局／局部变量补const,那<br>么&#8230;&#8230;那么，为时已晚，无非是让代码看起来更漂亮了。</div>
<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=tb1><font color=#009999>c语言中的结构（struct)和联合（union）简介</font></td>
        </tr>
    </tbody>
</table>
<br><font size=2>联 &nbsp; &nbsp; 合(union)<br>&nbsp; 1. 联合说明和联合变量定义<br>&nbsp; 联合也是一种新的数据类型, 它是一种特殊形式的变量。<br>&nbsp; 联合说明和联合变量定义与结构十分相似。其形式为:<br>&nbsp; union 联合名{<br>&nbsp; &nbsp; &nbsp; 数据类型成员名;<br>&nbsp; &nbsp; &nbsp; 数据类型成员名;<br>&nbsp; &nbsp; &nbsp; ...<br>&nbsp; } 联合变量名;<br>&nbsp; 联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。<br>&nbsp; 下例表示说明一个联合a_bc:<br>&nbsp; union a_bc{<br>&nbsp; &nbsp; &nbsp; int i;<br>&nbsp; &nbsp; &nbsp; char mm;<br>&nbsp; };<br>&nbsp; 再用已说明的联合可定义联合变量。<br>&nbsp; 例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:<br>&nbsp; &nbsp; union a_bc lgc;<br>&nbsp; 在联合变量lgc中, 整型量i和字符mm公用同一内存位置。<br>&nbsp; 当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。<br>&nbsp; 联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用"-&gt;;"符号, 此时联合访问成员可表示成:<br>&nbsp; 联合名-&gt;;成员名<br>&nbsp; 另外, 联合既可以出现在结构内, 它的成员也可以是结构。<br>&nbsp; 例如:<br>&nbsp; struct{<br>&nbsp; &nbsp; &nbsp; int age;<br>&nbsp; &nbsp; &nbsp; char *addr;<br>&nbsp; &nbsp; &nbsp; union{<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int i;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char *ch;<br>&nbsp; &nbsp; &nbsp; }x;<br>&nbsp; }y[10];<br>&nbsp; 若要访问结构变量y[1]中联合x的成员i, 可以写成:<br>&nbsp; &nbsp; y[1].x.i;<br>&nbsp; 若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:<br>&nbsp; &nbsp; *y[2].x.ch;<br>&nbsp; 若写成"y[2].x.*ch;"是错误的。<br><br>&nbsp; 2. 结构和联合的区别<br>&nbsp; 结构和联合有下列区别:<br>&nbsp; 1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在。<br>&nbsp; 2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。<br>&nbsp; 下面举一个例了来加对深联合的理解。<br>&nbsp; 例4:<br>main()<br>{<br>&nbsp; union{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*定义一个联合*/<br>&nbsp; int i;<br>&nbsp; struct{ &nbsp; &nbsp; &nbsp; &nbsp; /*在联合中定义一个结构*/<br>&nbsp; &nbsp; &nbsp; &nbsp; char first;<br>&nbsp; &nbsp; &nbsp; &nbsp; char second;<br>&nbsp; &nbsp; &nbsp; &nbsp; }half;<br>&nbsp; }number;<br><br>&nbsp; number.i=0x4241; &nbsp; &nbsp; &nbsp; /*联合成员赋值*/<br>&nbsp; printf("%c%c\n", number.half.first, mumber.half.second);<br>&nbsp; number.half.first='a'; &nbsp; /*联合中结构成员赋值*/<br>&nbsp; number.half.second='b';<br>&nbsp; printf("%x\n", number.i);<br>&nbsp; getch();<br>}<br>&nbsp; 输出结果为:<br>&nbsp; AB<br>&nbsp; 6261<br>&nbsp; 从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。<br><br></font><font size=3>关于c中volatile关键字<br>
<div>一个定义为volatile的变量是说这变量可能会被意想不到地改变，这样，编译器就不会去假设这个变量的值了。精确地说就是，优化器在用到这个变量时必须每次都小心地重新读取这个变量的值，而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1). 并行设备的硬件寄存器（如：状态寄存器）<br>&nbsp;&nbsp;&nbsp;&nbsp; 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)<br>&nbsp;&nbsp;&nbsp;&nbsp; 3). 多线程应用中被几个任务共享的变量<br>&nbsp;&nbsp;&nbsp;&nbsp; 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道，所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。<br>&nbsp;&nbsp;&nbsp;&nbsp; 假设被面试者正确地回答了这是问题（嗯，怀疑这否会是这样），我将稍微深究一下，看一下这家伙是不是直正懂得volatile完全的重要性。<br>&nbsp;&nbsp;&nbsp;&nbsp; 1). 一个参数既可以是const还可以是volatile吗？解释为什么。<br>&nbsp;&nbsp;&nbsp;&nbsp; 2). 一个指针可以是volatile 吗？解释为什么。<br>&nbsp;&nbsp;&nbsp;&nbsp; 3). 下面的函数有什么错误：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int square(volatile int *ptr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return *ptr * *ptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面是答案：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。<br>&nbsp;&nbsp;&nbsp;&nbsp; 2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。<br>&nbsp;&nbsp;&nbsp;&nbsp; 3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方，但是，由于*ptr指向一个volatile型参数，编译器将产生类似下面的代码：<br>&nbsp;&nbsp;&nbsp;&nbsp; int square(volatile int *ptr)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a,b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = *ptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = *ptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a * b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; 由于*ptr的值可能被意想不到地该变，因此a和b可能是不同的。结果，这段代码可能返不是你所期望的平方值！正确的代码如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long square(volatile int *ptr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = *ptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a * a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>Volatile 关键字告诉编译器不要持有变量的临时性拷贝。一般用在多线程程序中，以避免在其中一个线程操作该变量时，将其拷贝入寄存器。请看以下情形:<br><br>&nbsp;&nbsp;&nbsp; A线程将变量复制入寄存器，然后进入循环，反复检测寄存器的值是否满足一定条件(它期待B线程改变变量的值。<br>在此种情况下，当B线程改变了变量的值时，已改变的值对其在寄存器的值没有影响。所以A线程进入死循环。<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; volatile 就是在此种情况下使用。</div>
</font></font>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/38719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2008-01-10 21:20 <a href="http://www.cnitblog.com/zouzheng/articles/38719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++程序员应聘试题剖析</title><link>http://www.cnitblog.com/zouzheng/articles/21856.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 15:04:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21856.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21856.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21856.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21856.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21856.html</trackback:ping><description><![CDATA[1.引言 <br /><br />　　本文的写作目的并不在于提供C/C++程序员求职面试指导，而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛，部分试题解答也参考了网友的意见。<br /><br />　　许多面试题看似简单，却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度，我们能真正写好一个strcpy函数吗？我们都觉得自己能，可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子，看看自己属于什么样的层次。此外，还有一些面试题考查面试者敏捷的思维能力。 <br /><br />　　分析这些面试题，本身包含很强的趣味性；而作为一名研发人员，通过对这些面试题的深入剖析则可进一步增强自身的内功。<br /><br />　　2.找错题<br /><br />　　试题1：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void test1()<br />{<br />　char string[10];<br />　char* str1 = "0123456789";<br />　strcpy( string, str1 );<br />}</td></tr></tbody></table><br />　　试题2：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void test2()<br />{<br />　char string[10], str1[10];<br />　int i;<br />　for(i=0; i&lt;10; i++)<br />　{<br />　　str1[i] = 'a';<br />　}<br />　strcpy( string, str1 );<br />}</td></tr></tbody></table><br />　　试题3：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void test3(char* str1)<br />{<br />　char string[10];<br />　if( strlen( str1 ) &lt;= 10 )<br />　{<br />　　strcpy( string, str1 );<br />　}<br />}</td></tr></tbody></table><br />　　解答：<br /><br />　　试题1字符串str1需要11个字节才能存放下（包括末尾的’\0’），而string只有10个字节的空间，strcpy会导致数组越界；<br /><br />　　对试题2，如果面试者指出字符数组str1不能在数组内结束可以给3分；如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分，在此基础上指出库函数strcpy工作方式的给10分；<br /><br />　　对试题3，if(strlen(str1) &lt;= 10)应改为if(strlen(str1) &lt; 10)，因为strlen的结果未统计’\0’所占用的1个字节。<br /><br />　　剖析：<br /><br />　　考查对基本功的掌握：<br /><br />　　(1)字符串以’\0’结尾；<br /><br />　　(2)对数组越界把握的敏感度；<br /><br />　　(3)库函数strcpy的工作方式，如果编写一个标准strcpy函数的总分值为10，下面给出几个不同得分的答案：<br /><br />　　2分<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void strcpy( char *strDest, char *strSrc )<br />{<br />　 while( (*strDest++ = * strSrc++) != ‘\0’ );<br />}</td></tr></tbody></table><br />　　4分<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void strcpy( char *strDest, const char *strSrc ) <br />//将源字符串加const，表明其为输入参数，加2分<br />{<br />　 while( (*strDest++ = * strSrc++) != ‘\0’ );<br />}</td></tr></tbody></table><br />　　7分<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void strcpy(char *strDest, const char *strSrc) <br />{<br />　//对源地址和目的地址加非0断言，加3分<br />　assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );<br />　while( (*strDest++ = * strSrc++) != ‘\0’ );<br />}</td></tr></tbody></table><br />　　10分<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>//为了实现链式操作，将目的地址返回，加3分！<br /><br />char * strcpy( char *strDest, const char *strSrc ) <br />{<br />　assert( (strDest != NULL) &amp;&amp; (strSrc != NULL) );<br />　char *address = strDest; <br />　while( (*strDest++ = * strSrc++) != ‘\0’ ); <br />　　return address;<br />}</td></tr></tbody></table><br />　　从2分到10分的几个答案我们可以清楚的看到，小小的strcpy竟然暗藏着这么多玄机，真不是盖的！需要多么扎实的基本功才能写一个完美的strcpy啊！<br /><br />　　(4)对strlen的掌握，它没有包括字符串末尾的'\0'。<br /><br />　　读者看了不同分值的strcpy版本，应该也可以写出一个10分的strlen函数了，完美的版本为： int strlen( const char *str ) //输入参数const<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>{<br />　assert( strt != NULL ); //断言字符串地址非0<br />　int len;<br />　while( (*str++) != '\0' ) <br />　{ <br />　　len++; <br />　} <br />　return len;<br />}</td></tr></tbody></table><br />　　试题4：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void GetMemory( char *p )<br />{<br />　p = (char *) malloc( 100 );<br />}<br /><br />void Test( void ) <br />{<br />　char *str = NULL;<br />　GetMemory( str ); <br />　strcpy( str, "hello world" );<br />　printf( str );<br />}</td></tr></tbody></table><br />　　试题5：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char *GetMemory( void )<br />{ <br />　char p[] = "hello world"; <br />　return p; <br />}<br /><br />void Test( void )<br />{ <br />　char *str = NULL; <br />　str = GetMemory(); <br />　printf( str ); <br />}</td></tr></tbody></table><br />　　试题6：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void GetMemory( char **p, int num )<br />{<br />　*p = (char *) malloc( num );<br />}<br /><br />void Test( void )<br />{<br />　char *str = NULL;<br />　GetMemory( &amp;str, 100 );<br />　strcpy( str, "hello" ); <br />　printf( str ); <br />}</td></tr></tbody></table><br />　　试题7：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void Test( void )<br />{<br />　char *str = (char *) malloc( 100 );<br />　strcpy( str, "hello" );<br />　free( str ); <br />　... //省略的其它语句<br />}</td></tr></tbody></table><br />　　解答：<br /><br />　　试题4传入中GetMemory( char *p )函数的形参为字符串指针，在函数内部修改形参并不能真正的改变传入形参的值，执行完<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char *str = NULL;<br />GetMemory( str ); </td></tr></tbody></table><br />　　后的str仍然为NULL；<br /><br />　　试题5中<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char p[] = "hello world"; <br />return p; </td></tr></tbody></table><br />　　的p[]数组为函数内的局部自动变量，在函数返回后，内存已经被释放。这是许多程序员常犯的错误，其根源在于不理解变量的生存期。<br /><br />　　试题6的GetMemory避免了试题4的问题，传入GetMemory的参数为字符串指针的指针，但是在GetMemory中执行申请内存及赋值语句<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>*p = (char *) malloc( num );</td></tr></tbody></table><br />　　后未判断内存是否申请成功，应加上：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>if ( *p == NULL )<br />{<br />　...//进行申请内存失败处理<br />}</td></tr></tbody></table><br />　　试题7存在与试题6同样的问题，在执行<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char *str = (char *) malloc(100);</td></tr></tbody></table><br />　　后未进行内存是否申请成功的判断；另外，在free(str)后未置str为空，导致可能变成一个“野”指针，应加上：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>str = NULL;</td></tr></tbody></table><br />　　试题6的Test函数中也未对malloc的内存进行释放。<br /><br />　　剖析：<br /><br />　　试题4～7考查面试者对内存操作的理解程度，基本功扎实的面试者一般都能正确的回答其中50~60的错误。但是要完全解答正确，却也绝非易事。<br /><br />　　对内存操作的考查主要集中在：<br /><br />　　（1）指针的理解；<br /><br />　　（2）变量的生存期及作用范围；<br /><br />　　（3）良好的动态内存申请和释放习惯。<br /><br />　　再看看下面的一段程序有什么错误：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>swap( int* p1,int* p2 )<br />{<br />　int *p;<br />　*p = *p1;<br />　*p1 = *p2;<br />　*p2 = *p;<br />}</td></tr></tbody></table><br />　　在swap函数中，p是一个“野”指针，有可能指向系统区，导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>swap( int* p1,int* p2 )<br />{<br />　int p;<br />　p = *p1;<br />　*p1 = *p2;<br />　*p2 = p;<br />}</td></tr></tbody></table><br />3.内功题<br /><br />　　试题1：分别给出BOOL，int，float，指针变量 与“零值”比较的 if 语句（假设变量名为var）<br /><br />　　解答：<br /><br />　　　BOOL型变量：if(!var)<br /><br />　　　int型变量： if(var==0)<br /><br />　　　float型变量：<br /><br />　　　const float EPSINON = 0.00001;<br /><br />　　　if ((x &gt;= - EPSINON) &amp;&amp; (x &lt;= EPSINON)<br /><br />　　　指针变量：　　if(var==NULL)<br /><br />　　剖析：<br /><br />　　考查对0值判断的“内功”，BOOL型变量的0判断完全可以写成if(var==0)，而int型变量也可以写成if(!var)，指针变量的判断也可以写成if(!var)，上述写法虽然程序都能正确运行，但是未能清晰地表达程序的意思。<br /><br />　　一般的，如果想让if判断一个变量的“真”、“假”，应直接使用if(var)、if(!var)，表明其为“逻辑”判断；如果用if判断一个数值型变量(short、int、long等)，应该用if(var==0)，表明是与0进行“数值”上的比较；而判断指针则适宜用if(var==NULL)，这是一种很好的编程习惯。<br /><br />　　浮点型变量并不精确，所以不可将float变量用“==”或“！=”与数字比较，应该设法转化成“&gt;=”或“&lt;=”形式。如果写成if (x == 0.0)，则判为错，得0分。<br /><br />　　试题2：以下为Windows NT下的32位C++程序，请计算sizeof的值<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void Func ( char str[100] )<br />{<br />　sizeof( str ) = ?<br />}<br /><br />void *p = malloc( 100 );<br />sizeof ( p ) = ?</td></tr></tbody></table><br />　　解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>sizeof( str ) = 4<br />sizeof ( p ) = 4</td></tr></tbody></table><br />　　剖析：<br /><br />　　Func ( char str[100] )函数中数组名作为函数形参时，在函数体内，数组名失去了本身的内涵，仅仅只是一个指针；在失去其内涵的同时，它还失去了其常量特性，可以作自增、自减等操作，可以被修改。<br /><br />　　数组名的本质如下：<br /><br />　　（1）数组名指代一种数据结构，这种数据结构就是数组；<br /><br />　　例如：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char str[10];<br />cout &lt;&lt; sizeof(str) &lt;&lt; endl;</td></tr></tbody></table><br />　　输出结果为10，str指代数据结构char[10]。<br /><br />　　（2）数组名可以转换为指向其指代实体的指针，而且是一个指针常量，不能作自增、自减等操作，不能被修改；<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>char str[10]; <br />str++; //编译出错，提示str不是左值　</td></tr></tbody></table><br />　　（3）数组名作为函数形参时，沦为普通指针。<br /><br />　　Windows NT 32位平台下，指针的长度（占用内存的大小）为4字节，故sizeof( str ) 、sizeof ( p ) 都为4。<br /><br />　　试题3：写一个“标准”宏MIN，这个宏输入两个参数并返回较小的一个。另外，当你写下面的代码时会发生什么事？<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>least = MIN(*p++, b);</td></tr></tbody></table><br />　　解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>#define MIN(A,B) ((A) &lt;= (B) ? (A) : (B))</td></tr></tbody></table><br />　　MIN(*p++, b)会产生宏的副作用<br /><br />　　剖析：<br /><br />　　这个面试题主要考查面试者对宏定义的使用，宏定义可以实现类似于函数的功能，但是它终归不是函数，而宏定义中括弧中的“参数”也不是真的参数，在宏展开的时候对“参数”进行的是一对一的替换。<br /><br />　　程序员对宏定义的使用要非常小心，特别要注意两个问题：<br /><br />　　（1）谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以，严格地讲，下述解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>#define MIN(A,B) (A) &lt;= (B) ? (A) : (B)<br />#define MIN(A,B) (A &lt;= B ? A : B )</td></tr></tbody></table><br />　　都应判0分；<br /><br />　　（2）防止宏的副作用。<br /><br />　　宏定义#define MIN(A,B) ((A) &lt;= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是：<br /><br />((*p++) &lt;= (b) ? (*p++) : (*p++))<br /><br />　　这个表达式会产生副作用，指针p会作三次++自增操作。<br /><br />　　除此之外，另一个应该判0分的解答是：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>#define MIN(A,B) ((A) &lt;= (B) ? (A) : (B)); </td></tr></tbody></table><br />　　这个解答在宏定义的后面加“;”，显示编写者对宏的概念模糊不清，只能被无情地判0分并被面试官淘汰。<br /><br />　　试题4：为什么标准头文件都有类似以下的结构？ <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>#ifndef __INCvxWorksh<br />#define __INCvxWorksh <br />#ifdef __cplusplus<br /><br />extern "C" {<br />#endif <br />/*...*/ <br />#ifdef __cplusplus<br />}<br /><br />#endif <br />#endif /* __INCvxWorksh */</td></tr></tbody></table><br />　　解答：<br /><br />　　头文件中的编译宏<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>#ifndef　__INCvxWorksh<br />#define　__INCvxWorksh<br />#endif </td></tr></tbody></table><br />　　的作用是防止被重复引用。<br /><br />　　作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在symbol库中的名字与C语言的不同。例如，假设某个函数的原型为： <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void foo(int x, int y);</td></tr></tbody></table><br />　　该函数被C编译器编译后在symbol库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息，C++就是考这种机制来实现函数重载的。<br /><br />　　为了实现C和C++的混合编程，C++提供了C连接交换指定符号extern "C"来解决名字匹配问题，函数声明前加上extern "C"后，则编译器就会按照C语言的方式将该函数编译为_foo，这样C语言中就可以调用C++的函数了。<br /><br />试题5：编写一个函数，作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2，移位后应该是“hiabcdefgh” <br /><br />　　函数头是这样的：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>//pStr是指向以'\0'结尾的字符串的指针<br />//steps是要求移动的n<br /><br />void LoopMove ( char * pStr, int steps )<br />{<br />　//请填充...<br />}</td></tr></tbody></table><br />　　解答：<br /><br />　　正确解答1：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void LoopMove ( char *pStr, int steps )<br />{<br />　int n = strlen( pStr ) - steps;<br />　char tmp[MAX_LEN]; <br />　strcpy ( tmp, pStr + n ); <br />　strcpy ( tmp + steps, pStr); <br />　*( tmp + strlen ( pStr ) ) = '\0';<br />　strcpy( pStr, tmp );<br />}</td></tr></tbody></table><br />　　正确解答2：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>void LoopMove ( char *pStr, int steps )<br />{<br />　int n = strlen( pStr ) - steps;<br />　char tmp[MAX_LEN]; <br />　memcpy( tmp, pStr + n, steps ); <br />　memcpy(pStr + steps, pStr, n ); <br />　memcpy(pStr, tmp, steps ); <br />}</td></tr></tbody></table><br />　　剖析：<br /><br />　　这个试题主要考查面试者对标准库函数的熟练程度，在需要的时候引用库函数可以很大程度上简化程序编写的工作量。<br /><br />　　最频繁被使用的库函数包括：<br /><br />　　（1） strcpy<br /><br />　　（2） memcpy<br /><br />　　（3） memset<br /><br />　　试题6：已知WAV文件格式如下表，打开一个WAV文件，以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。<br /><br />　　WAVE文件格式说明表<br /><br /><table cellspacing="0" cellpadding="0" width="90%" align="center" border="1"><tbody><tr><td><p> </p></td><td>偏移地址</td><td>字节数</td><td>数据类型</td><td>内 容</td></tr><tr><td rowspan="13">文件头 
<p> </p></td><td>00H</td><td>4 </td><td>Char</td><td>"RIFF"标志</td></tr><tr><td>04H</td><td>4</td><td>int32</td><td>文件长度</td></tr><tr><td>08H</td><td>4</td><td>Char</td><td>"WAVE"标志</td></tr><tr><td>0CH</td><td>4</td><td>Char</td><td>"fmt"标志</td></tr><tr><td>10H</td><td>4</td><td> </td><td>过渡字节（不定）</td></tr><tr><td>14H</td><td>2</td><td>int16</td><td>格式类别</td></tr><tr><td>16H</td><td>2</td><td>int16</td><td>通道数</td></tr><tr><td>18H</td><td>2</td><td>int16 </td><td>采样率（每秒样本数），表示每个通道的播放速度</td></tr><tr><td>1CH</td><td>4</td><td>int32</td><td>波形音频数据传送速率</td></tr><tr><td>20H</td><td>2</td><td>int16</td><td>数据块的调整数（按字节算的）</td></tr><tr><td>22H</td><td>2</td><td> </td><td>每样本的数据位数</td></tr><tr><td>24H</td><td>4</td><td>Char</td><td>数据标记符＂data＂</td></tr><tr><td>28H</td><td>4</td><td>int32</td><td>语音数据的长度</td></tr></tbody></table><br />　　解答：<br /><br />　　将WAV文件格式定义为结构体WAVEFORMAT： <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>typedef struct tagWaveFormat<br />{ <br />　char cRiffFlag[4]; <br />　UIN32 nFileLen; <br />　char cWaveFlag[4]; <br />　char cFmtFlag[4]; <br />　char cTransition[4]; <br />　UIN16 nFormatTag ; <br />　UIN16 nChannels; <br />　UIN16 nSamplesPerSec; <br />　UIN32 nAvgBytesperSec; <br />　UIN16 nBlockAlign; <br />　UIN16 nBitNumPerSample; <br />　char cDataFlag[4]; <br />　UIN16 nAudioLength; <br /><br />} WAVEFORMAT;</td></tr></tbody></table><br />　　假设WAV文件内容读出后存放在指针buffer开始的内存单元内，则分析文件格式的代码很简单，为：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>WAVEFORMAT waveFormat;<br />memcpy( &amp;waveFormat, buffer,sizeof( WAVEFORMAT ) ); </td></tr></tbody></table><br />　　直接通过访问waveFormat的成员，就可以获得特定WAV文件的各项格式信息。<br /><br />　　剖析：<br /><br />　　试题6考查面试者组织数据结构的能力，有经验的程序设计者将属于一个整体的数据成员组织为一个结构体，利用指针类型转换，可以将memcpy、memset等函数直接用于结构体地址，进行结构体的整体操作。 透过这个题可以看出面试者的程序设计经验是否丰富。<br /><br />　　试题7：编写类String的构造函数、析构函数和赋值函数，已知类String的原型为：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>class String<br />{ <br />　public: <br />　　String(const char *str = NULL); // 普通构造函数 <br />　　String(const String &amp;other); // 拷贝构造函数 <br />　　~ String(void); // 析构函数 <br />　　String &amp; operate =(const String &amp;other); // 赋值函数 <br />　private: <br />　　char *m_data; // 用于保存字符串 <br />};</td></tr></tbody></table><br />　　解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>//普通构造函数<br /><br />String::String(const char *str) <br />{<br />　if(str==NULL) <br />　{<br />　　m_data = new char[1]; // 得分点：对空字符串自动申请存放结束标志'\0'的空<br />　　//加分点：对m_data加NULL 判断<br />　　*m_data = '\0'; <br />　} <br />　else<br />　{<br />　　int length = strlen(str); <br />　　m_data = new char[length+1]; // 若能加 NULL 判断则更好 <br />　　strcpy(m_data, str); <br />　}<br />}<br /><br />// String的析构函数<br /><br />String::~String(void) <br />{<br />　delete [] m_data; // 或delete m_data;<br />}<br /><br />//拷贝构造函数<br /><br />String::String(const String &amp;other) 　　　// 得分点：输入参数为const型<br />{ <br />　int length = strlen(other.m_data); <br />　m_data = new char[length+1]; 　　　　//加分点：对m_data加NULL 判断<br />　strcpy(m_data, other.m_data); <br />}<br /><br />//赋值函数<br /><br />String &amp; String::operate =(const String &amp;other) // 得分点：输入参数为const型<br />{ <br />　if(this == &amp;other) 　　//得分点：检查自赋值<br />　　return *this; <br />　delete [] m_data; 　　　　//得分点：释放原有的内存资源<br />　int length = strlen( other.m_data ); <br />　m_data = new char[length+1]; 　//加分点：对m_data加NULL 判断<br />　strcpy( m_data, other.m_data ); <br />　return *this; 　　　　　　　　//得分点：返回本对象的引用<br />}</td></tr></tbody></table><br />　　剖析：<br /><br />　　能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上！<br /><br />　　在这个类中包括了指针类成员变量m_data，当类中包括指针类成员变量时，一定要重载其拷贝构造函数、赋值函数和析构函数，这既是对C++程序员的基本要求，也是《Effective　C++》中特别强调的条款。<br /><br />　　仔细学习这个类，特别注意加注释的得分点和加分点的意义，这样就具备了60%以上的C++基本功！<br /><br />　　试题8：请说出static和const关键字尽可能多的作用<br /><br />　　解答：<br /><br />　　static关键字至少有下列n个作用：<br /><br />　　（1）函数体内static变量的作用范围为该函数体，不同于auto变量，该变量的内存只被分配一次，因此其值在下次调用时仍维持上次的值；<br /><br />　　（2）在模块内的static全局变量可以被模块内所用函数访问，但不能被模块外其它函数访问；<br /><br />　　（3）在模块内的static函数只可被这一模块内的其它函数调用，这个函数的使用范围被限制在声明它的模块内；<br /><br />　　（4）在类中的static成员变量属于整个类所拥有，对类的所有对象只有一份拷贝；<br /><br />　　（5）在类中的static成员函数属于整个类所拥有，这个函数不接收this指针，因而只能访问类的static成员变量。<br /><br />　　const关键字至少有下列n个作用：<br /><br />　　（1）欲阻止一个变量被改变，可以使用const关键字。在定义该const变量时，通常需要对它进行初始化，因为以后就没有机会再去改变它了；<br /><br />　　（2）对指针来说，可以指定指针本身为const，也可以指定指针所指的数据为const，或二者同时指定为const；<br /><br />　　（3）在一个函数声明中，const可以修饰形参，表明它是一个输入参数，在函数内部不能改变其值；<br /><br />　　（4）对于类的成员函数，若指定其为const类型，则表明其是一个常函数，不能修改类的成员变量；<br /><br />　　（5）对于类的成员函数，有时候必须指定其返回值为const类型，以使得其返回值不为“左值”。例如：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>const classA operator*(const classA&amp; a1,const classA&amp; a2);</td></tr></tbody></table><br />　　operator*的返回结果必须是一个const对象。如果不是，这样的变态代码也不会编译出错：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>classA a, b, c;<br />(a * b) = c; // 对a*b的结果赋值</td></tr></tbody></table><br />　　操作(a * b) = c显然不符合编程者的初衷，也没有任何意义。<br /><br />　　剖析：<br /><br />　　惊讶吗？小小的static和const居然有这么多功能，我们能回答几个？如果只能回答1~2个，那还真得闭关再好好修炼修炼。<br /><br />　　这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入，没有一定的知识广度和深度，不可能对这个问题给出全面的解答。大多数人只能回答出static和const关键字的部分功能。<br /><br />　　4.技巧题<br /><br />　　试题1：请写一个C函数，若处理器是Big_endian的，则返回0；若是Little_endian的，则返回1<br /><br />　　解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>int checkCPU()<br />{<br />　{<br />　　union w<br />　　{ <br />　　　int a;<br />　　　char b;<br />　　} c;<br />　　c.a = 1;<br />　　return (c.b == 1);<br />　}<br />}</td></tr></tbody></table><br />　　剖析：<br /><br />　　嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节，而Big-endian模式对操作数的存放方式是从高字节到低字节。例如，16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式（假设从地址0x4000开始存放）为：<br /><br /><table cellspacing="0" cellpadding="0" width="72%" align="center" border="1"><tbody><tr><td>内存地址</td><td>存放内容</td></tr><tr><td>0x4000</td><td>0x34</td></tr><tr><td>0x4001</td><td>0x12</td></tr></tbody></table><br />　　而在Big-endian模式CPU内存中的存放方式则为：<br /><br /><table cellspacing="0" cellpadding="0" width="72%" align="center" border="1"><tbody><tr><td>内存地址</td><td>存放内容</td></tr><tr><td>0x4000</td><td>0x12</td></tr><tr><td>0x4001</td><td>0x34</td></tr></tbody></table><br />　　32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式（假设从地址0x4000开始存放）为：<br /><br /><table cellspacing="0" cellpadding="0" width="72%" align="center" border="1"><tbody><tr><td>内存地址</td><td>存放内容</td></tr><tr><td>0x4000</td><td>0x78</td></tr><tr><td>0x4001</td><td>0x56</td></tr><tr><td>0x4002</td><td>0x34</td></tr><tr><td>0x4003</td><td>0x12</td></tr></tbody></table><br />　　而在Big-endian模式CPU内存中的存放方式则为：<br /><br /><table cellspacing="0" cellpadding="0" width="72%" align="center" border="1"><tbody><tr><td>内存地址</td><td>存放内容</td></tr><tr><td>0x4000</td><td>0x12</td></tr><tr><td>0x4001</td><td>0x34</td></tr><tr><td>0x4002</td><td>0x56</td></tr><tr><td>0x4003</td><td>0x78</td></tr></tbody></table><br />　　联合体union的存放顺序是所有成员都从低地址开始存放，面试者的解答利用该特性，轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果谁能当场给出这个解答，那简直就是一个天才的程序员。<br /><br />　　试题2：写一个函数返回1+2+3+…+n的值（假定结果不会超过长整型变量的范围） <br /><br />　　解答：<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>int Sum( int n )<br />{ <br />　return ( (long)1 + n) * n / 2;　　//或return (1l + n) * n / 2;<br />}</td></tr></tbody></table><br />　　剖析：<br />　<br />　　对于这个题，只能说，也许最简单的答案就是最好的答案。下面的解答，或者基于下面的解答思路去优化，不管怎么“折腾”，其效率也不可能与直接return ( 1 l + n ) * n / 2相比！ <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>int Sum( int n )<br />{<br />　long sum = 0;<br />　for( int i=1; i&lt;=n; i++ )<br />　{<br />　　sum += i;<br />　}<br />　return sum;<br />} </td></tr></tbody></table><br />　　所以程序员们需要敏感地将数学等知识用在程序设计中。   <img src ="http://www.cnitblog.com/zouzheng/aggbug/21856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 23:04 <a href="http://www.cnitblog.com/zouzheng/articles/21856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试题 - 非技术类</title><link>http://www.cnitblog.com/zouzheng/articles/21854.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 13:50:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21854.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21854.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21854.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21854.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21854.html</trackback:ping><description><![CDATA[
		<p>
				<strong>1 请介绍一些你自己</strong>
		</p>
		<p>一般面试的第一个问题肯定是叫介绍一下你自己，所以一定要准备一个1分钟左右的自我介绍。</p>
		<p>
				<strong>2 请介绍一下你最熟悉的一个项目</strong>
		</p>
		<p>选择一个最熟悉、和你申请的职位最match的一个项目</p>
		<p>
				<strong>3 你认为你应聘这个职位有什么优势</strong>
		</p>
		<p>自信大胆的说出自己的在这个项目上的优点</p>
		<p>
				<strong>4 面试末尾，面试官一般会问，你还有什么问题要问吗？</strong>
		</p>
		<p>具体公司具体分析</p>
		<p>
				<strong>5 见面礼仪</strong>
		</p>
		<ul>
				<li>保持微笑 
</li>
				<li>面试前后要主动握手 
</li>
				<li>表现得自信、谦虚</li>
		</ul>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 21:50 <a href="http://www.cnitblog.com/zouzheng/articles/21854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>找工作经验交流会有感 </title><link>http://www.cnitblog.com/zouzheng/articles/21853.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 13:46:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21853.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21853.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21853.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21853.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21853.html</trackback:ping><description><![CDATA[
		<p>晚上7点，电院开了一个找工作经验交流会，请了几个工作的师兄来做演讲，他们分别是来自北京移动、威盛、北电、朗讯、IBM的牛人。听完以后，收获颇多。</p>
		<p>一个找工作的过程可以分为3个阶段，前期准备、找工作和开始工作。</p>
		<p>1 前期准备</p>
		<p>一般开始找工作在9月份以后了，在9月份之前的都叫做前期准备，也就是一个知识积累的阶段，这一阶段是整个找工作的基础，在这一阶段要搞清楚下面几点：</p>
		<ul>
				<li>方向。术业有专攻，所以一定要有精通的一门技术。 
</li>
				<li>多做项目。毕业后一定会从事研发，应聘研发职位，最重要的就是项目经验。 
</li>
				<li>实习。能去大公司实习最好。 </li>
		</ul>
		<p>2 找工作</p>
		<p>找工作是一个人一生中非常重要的一件事情，在找工作的过程中要把握好以下几点：心态、写简历、投简历、笔试、面试。</p>
		<p>2.1心态</p>
		<ul>
				<li>找工作是一个漫长的过程，大概有4个月左右的时间，一定要有心理准备。一个师兄说“在这几个月中，我不是在面试，就是在面试的路上”。 
</li>
				<li>找工作的时候心情有波动，但是不要大起大落，心态要放平稳。 
</li>
				<li>不要看到别人拿到大offer，自己的心态出现问题，做最好的自己就可以了。 
</li>
				<li>不管受到怎样的打击，一定要坚信自己会拿到满意的offer。 </li>
		</ul>
		<p>2.2 写简历</p>
		<ul>
				<li>简历非常的重要。 
</li>
				<li>简历中要突出keyword，很多公司第一轮都是靠机器来筛选简历，所以公司要求的keyword一定要体现在简历上。 
</li>
				<li>一个人要准备多份简历，要根据应聘公司的需要来修改自己的简历。如果这个公司只要求c++方面的，就不要把java写一大堆。 
</li>
				<li>不要轻易写精通这个，精通那个，如果让人家知道你在欺骗人家，你就玩完了 
</li>
				<li>项目经验4、5个就好，要把和你要投的公司相关的项目写在前面 </li>
		</ul>
		<p>2.3 投简历</p>
		<ul>
				<li>投简历分为网上投简历和招聘会投简历 
</li>
				<li>网上投简历不要急躁，一定要花至少4个小时来添那个简历，也不要快到deadline了才填，要提前2周之内搞定。 
</li>
				<li>公司每年招聘的职位相对固定，职位要求也变化不大，所以可以提前看看你适合哪个职位，因为投简历的时候，都是按职位投得。 </li>
		</ul>
		<p>2.4 笔试</p>
		<ul>
				<li>认真答完所有的题 
</li>
				<li>如果保证无误，可以提前交卷 
</li>
				<li>智力题可以平时多练练 </li>
		</ul>
		<p>2.5 面试</p>
		<ul>
				<li>不要迟到 
</li>
				<li>回答问题要有条理，可以先用一句话点明答案，再详细阐述，最后再总结。 
</li>
				<li>三分钟的自我介绍很重要 
</li>
				<li>如果问到了自己不熟的方面，可以直接说，我对某某方面的了解仅限于。。。方面，我的强项在于。。。。 
</li>
				<li>保持微笑 
</li>
				<li>可能面试者会故意为难你，你保持微笑 
</li>
				<li>体现出自己的 confidence 和 smart </li>
		</ul>
		<p>3 开始工作</p>
		<ul>
				<li>先做事后做人 
</li>
				<li>先做人后做事 
</li>
				<li>只做人不做事 </li>
		</ul>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 21:46 <a href="http://www.cnitblog.com/zouzheng/articles/21853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 招聘提问通用题库 </title><link>http://www.cnitblog.com/zouzheng/articles/21852.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 13:41:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21852.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21852.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21852.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21852.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 招聘提问通用题库																																																																						 																																																						类型																	...&nbsp;&nbsp;<a href='http://www.cnitblog.com/zouzheng/articles/21852.html'>阅读全文</a><img src ="http://www.cnitblog.com/zouzheng/aggbug/21852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 21:41 <a href="http://www.cnitblog.com/zouzheng/articles/21852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>suningin详解笔试面试题（6）－－moto笔试</title><link>http://www.cnitblog.com/zouzheng/articles/21841.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 03:10:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21841.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21841.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21841.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21841.html</trackback:ping><description><![CDATA[
		<div>10月21号moto的笔试是在我们学校举行的，120分钟的笔试时间，试题内容大致涵盖了c/c++，数据库，数字通信，IQ等方面。我自我感觉做的很顺利，至少两道编程题我都搞定了。一个多小时就把试题做完了，于是，我就把一些试题偷偷抄到了草稿纸上，回去和大家一齐分享。下面就是我抄回来的试题：<br />1。打印如下图案，共19行，只能有一个for循环（程序已经提供）<br />         *          <br />        ***         <br />       *****        <br />      *******       <br />     *********      <br />    ***********<br />   *************    <br />  ***************   <br />  ***************** <br />******************* <br />  ***************** <br />  ***************   <br />   *************    <br />    ***********     <br />     *********      <br />      *******       <br />       *****        <br />        ***         <br />         *          <br />for(i=0;i&lt;19;i++)<br />{</div>
		<div>}<br />在网上搜寻了些解答，如下：<br /><strong>1</strong><strong>.</strong><br />#include&lt;iostream&gt;<br />#include&lt;iomanip&gt;<br />#include&lt;string&gt;<br />using namespace std;<br />int main()<br />{<br /> int a[2]={-1,1};<br /> string str="*******************";<br /> int i=0,j=9,t=1;<br /> for(i=0;i&lt;19;++i)<br /> {<br />  j+=a[i&lt;10];<br />  if(i!=0)t=t+a[i&lt;10]*2;<br />  cout&lt;&lt;setw(j)&lt;&lt;right&lt;&lt;str.substr(0,t)&lt;&lt;endl;<br /> }<br /> return 0;<br />} <br /><br /><strong>2.<br /></strong>#include&lt;stdio.h&gt;<br />#include&lt;string.h&gt;
<div>int main()<br />{<br /> char * tempStr = "*******************";<br /> char * blank = " ";</div><div> int i = 0;<br /> char * dataStr [20];<br /> char blankstr[10];</div><div><br /> for ( i=0; i&lt;19; i++)<br /> {<br />  memset(dataStr, 0, 20);<br />  memset(blankstr,0,10);</div><div>  if (i&lt;10)<br />  {<br />   memcpy(blankstr,blank,9-i);<br />   memcpy(dataStr, tempStr, (i+1)*2-1);<br />  }<br />  else<br />  {<br />   memcpy(blankstr,blank,i-9);<br />   memcpy(dataStr, tempStr, (19-i)*2-1);<br />  }<br />  printf("%s",blankstr);<br />  printf("%s\n", dataStr);<br /> }<br /> return 0;<br />} <br />3。<br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#define MAXSIZE 19<br />void main()<br />{<br />    int i,k;<br />   char ch;<br />   char format[30],stars[30],tmp[3];<br />   ch = '*';<br />   strcpy(stars,"");<br />   for(i=0; i&lt;MAXSIZE; i++)<br />  {<br />      if(i &lt;= MAXSIZE/2)<br />     {<br />         k = (MAXSIZE + 1)/2 - i;<br />         strcpy(format,"%");<br />         itoa(k,tmp,10);<br />        strcat(format,tmp);<br />        strcat(format,"c");<br />        if(i&gt;0)<br />           {<br />                strcat(stars,"**");<br />                strcat(format,stars);<br />            }<br />         printf(format,ch);<br />         printf("\n");<br />      }<br />     else<br />     {<br />         k = i + 2 - (MAXSIZE + 1)/2;<br />         strcpy(format,"%");<br />         itoa(k,tmp,10);<br />        strcat(format,tmp);<br />        strcat(format,"c");<br />        stars[MAXSIZE -1 -(2*(i+1) - MAXSIZE -1)] = 0;<br />         strcat(format,stars);<br />        printf(format,ch);<br />        printf("\n");<br />     }<br /> }<br /> //getchar();<br /> //getchar();<br />}<br /> <br />注:printf格式%mc表示输入字符宽度为m位,左边补空格.<br /><br />4。<br /><div><font color="#ff0000">有高人发的回帖:</font></div><div>#include&lt;iostream.h&gt;</div><div>int main(int argv,int * argc[])<br />{<br /> for(int i=0;i&lt;19;i++)<br /> {<br />  static char cc[19] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};<br />        //19个空格<br />  static const int j = 19 / 2;   //j值为9<br />        static int count = 0;          //count为离中间元素的距离<br />        if( i &lt; ( 19 / 2 + 1)) <br />  {<br />          cc[j - count] = '*';<br />          cc[j + count] = '*';<br />          cout &lt;&lt; cc &lt;&lt; endl;<br />          count++;<br />  } <br />  else <br />  {<br />          count--;<br />          cc[j - count] = ' ';<br />          cc[j + count] = ' ';<br />          cout &lt;&lt; cc &lt;&lt; endl;<br />  }</div><div> }<br /> return 0;<br />}</div><div> </div><div><font color="#ff0000">一看就知差距,我的晦涩难懂</font></div><div><font color="#ff0000">我想用两个数组,一个存放空格数量,一个存放'*'</font></div><div><font color="#ff0000">但是下面这个程序只用了一个数组，把每一行输出的形状存到数组中，妙！我咋就没想到？！</font><br /><br />2.<br />void fun(int x)<br />{<br /> if(x/2&gt;0)fun(x/2);<br /> printf("%d",x);<br />}<br />求fun(10)的输出结果     <font size="2">//12510，一个递归，很简单的</font><br />3。<br />#define f1(n) (n)*(n)</div></div></div>
		<div>         int i=5;<br /> int k=0;<br /> k=f1(i++);<br /> printf("%d %d",i,k);<br />输出结果：  <font size="2">：// 7 25，++放后面是后算的</font><br />4。下面那个for循环是无限循环<br />for(int i=010;i==10;i+=0)       <font size="2">//这个明显不是，010等于8，8 != 10，一判断就出去了</font></div>
		<div>for(int i=10;(i++^--i)==0;i+=0)   //无限循环<br />还有几个忘了</div>
		<div>5.Email relay 和Email access分别用了什么协议？（其他还有很多，略）<br />SMTP,POP3<br />注: SMTP：Simple MAIL Transfer Protocol，简单邮件传输协议，互联网上的电子邮件发送就是使用这个协议。SMTP open relay host：开放的SMTP中继主机——它很可能被恶意的人利用，来产生大量垃圾邮件.<br />POP3协议允许客户机通过（临时的或永久的）TCP/IP连接或其他网络协议的连接，从一个服务器（这时就称为POP3服务器）上获取电子邮件（E-MAIL），POP3不负责发送邮件.<br /><br />6。in a mobile phone,软件运行期，stack data 存在于<br />a.rom,b.flash c.eeprom d.ram e.none of the above<br />答：D.ram。这题稍微涉及到一点硬件知识，ROM的全称是Read Only Memory，即只读存储器，flash ，eeprom都是ROM家族的一员，RAM是Random Access Memory的简称，意为随机存取存储器，也就是内存了。不管是堆还是栈都是放在内存里的。<br />7.<br />int i;<br /> int x=0x12345678;<br /> unsigned char *p=(unsigned char *)&amp;x;<br /> for(i=0;i&lt;sizeof(x);i++)<br />  printf("%2x",*(p+i));</div>
		<div> 在80x86pc机器上运行结果<br /> Sun Sparc Unix上运行结果<br />80x86系列机的堆栈的伸展方向是从高地址向低地址.堆栈操作都是字操作.数据入栈16位,高字节在前,低字节在后(即先压入高字节).出栈时,低字节在前,高字节在后(即低字节先出).低字节占低地址,高字节占高地址.  <br />Intel x86全部为little-endian字节顺序，即低字节的寄存器占用低内存地址线.<br />Sun Sparc Unix为big-endian字节顺序，即低字节寄存器占用高内存地址线.<br /> <br />x在PC机上的内存存放顺序为78 56 34 12，高字节在前，低字节在后，因此输出78563412<br />Sun Sparc Unix上输出12345678<br /></div>
		<div>8.<br /> char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };</div>
		<div> for(int i=0;i&lt;12;i++)<br /> printf("%d ",_______);   //<font size="2">a[i/6][((i&gt;=6 ? (i-6):i)+2)/5][i%3]);  或者：*(*(*(a+i/6)+(i/3%2))+i%3)    *((char *)a + i)<br /></font> //<font size="2">*(**a + i)</font><br />空格处填上合适的语句，顺序打印出a中的数字<br />9。void fun(char *a,char *b)<br />{<br /> a=b;<br /> (*a)++;<br />}<br />void main()<br />{<br /> char s1='A',s2='b';<br /> char *p1=&amp;s1;<br /> char *p2=&amp;s2;<br /> fun(p1,p2);<br /> printf("%c%c",s1,s2);<br />输出结果：  <font size="2">// Ac吧，这个比较简单</font><br />10。写一个strstr（）函数</div>
		<div>考完出来，我是很有信心能进入面试的，等了几天，陆续有人收到通知，我却没有。我的信心大受打击，怎么可能呢！？后来了解到，moto的笔试25道选择题做对19道才能参加面试，后面的题目基本不看。回想下，我后面填空和大题做的不错可是选择题确实做的不咋的（ 郁闷啊，给宿舍的同学鄙视了：你的水平也不行啊~~~）<br />    这个时候我开始感觉有点压力了，有点危机感了</div>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 11:10 <a href="http://www.cnitblog.com/zouzheng/articles/21841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>suningin详解笔试面试题（7)－－历年名企考题专辑</title><link>http://www.cnitblog.com/zouzheng/articles/21839.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 02:21:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21839.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21839.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21839.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21839.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21839.html</trackback:ping><description><![CDATA[
		<p>
				<font size="3">基础数学题：</font>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<font color="#000000">
								<font color="#0000ff">1。有三个不同的信箱，今有4封不同的信欲投其中，共有多少种不同的投法？</font>
						</font>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">答案：每封信有3种投法，于是3*3*3*3。</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#0000ff">2。连续4次抛掷一枚硬币，求恰出现两次是正面的概率和最后两次出现是正面的概率。</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<font color="#000000">
								<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								</span>
						</font>
				</span>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<font color="#0000ff">
								<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">答案：两次正面为，0.5*0.5*0.5*0.5；最后两次为正：0.5*0.5</span>
						</font>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#0000ff">3。一个口袋内装有除颜色外其他都相同的6个白球和4个红球，从中任意摸出2个，求：A、2个都是白球的概率；B、2个都是红球的概率；C、一个白球，一个红球的概率。</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">答案：A：（6/10）×（5/9） B：（4/10）×（3/9）</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">      C：（6/10）×（4/9）＋（4/10）×（6/9）</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#0000ff">4。有30支篮球队，先分3组（每组10队）按单循环制进行比赛，然后将每组前三名集中，再按单循环制进行比赛，规定在小组赛已相遇的两队不再重赛，求先后比赛共有多少场？</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">答案：小组赛时候次数为 3×（9＋8＋。。。＋1）</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">      每组前三名比赛次数3×6＋3×3</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#0000ff">5。正方形边长为1，以各个顶点半径为1做弧，在正方形中间有一个公共区域，求面积。</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">答案：</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">
										<font color="#0000ff">6。使用下列每组数字，排出加减乘除的公式，得出“24”。第一组“1、2、3、4”<br />；第二组“5、6、7、8”；第三组“3、3、8、8”。</font>
								</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">
										<font color="#0000ff">
												<font color="#000000">答案：A：<font face="Arial">(1+2+3)*4=24</font></font>
										</font>
								</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">
										<font color="#0000ff">
												<font color="#000000">      B：<font face="Arial">(5+7)*(8-6)=24</font></font>
										</font>
								</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">
										<font color="#0000ff">
												<font color="#000000">      C：8/(3-8/3)=24 </font>
												<br />
												<br />7。10个人排队戴帽子，10个黄帽子，9个蓝帽子，戴好后，后面的人可以看见前面所有人的帽子，然后从后面问起，问自己头上的帽子是什么颜色，结果一直问了9个人都说不知道，而最前面的人却知道自己头上的帽子的颜色。问是什么颜色，为什么？</font>
								</font>
						</span>
				</span>
		</p>
		<p>
				<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
						<span style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">
								<font color="#000000">
										<font color="#0000ff">
												<font color="#000000">答案：</font>
												<p>相关的题目7的还有: <br /><br />################################################ <br /><br />一位逻辑学教授有三个学生，这三个学生都非常聪明。 <br />一天教授想测验一下这三个学生，他在每个人头上都放了写着一个正整数的卡片，其中两个数之和等于第三个。 <br />每个人都可以看到其他人头上的数字，但看不到自己头上的数字。 <br />教授问第一个学生“你知道你头上的数字吗？” <br />第一个学生回答“不知道。” <br />教授接着问下去。 <br />第二个学生回答“不知道。” <br />第三个学生也回答“不知道。” <br />教授又从头问起。 <br />第一个学生还是回答“不知道。” <br />第二个学生还是回答“不知道。” <br />这时第三个学生说到“我知道了，是144！” <br /><br />请问另两个学生头上的数字和第三个学生是怎样知道自己头上的数字的？ <br /><br />################################################ <br /><br />两个大于一小于十的整数，把两数之和告诉甲，两数之积告诉乙。让他俩猜，两人都说不知道。突然甲说我知道这两个数了，乙也跟着说我知道了。请问这两个数各是多少？ <br /><br />两个大于一小于十的整数，把两数之和告诉甲，两数之积告诉乙。让他俩猜，两人都说不知道。之后两人都沉思了一会儿。突然乙说我知道这两个数了，甲也跟着说我知道了。请问这两个数各是多少？ <br /><br />两个大于一小于十的整数，把两数之和告诉甲，两数之积告诉乙。让他俩猜，两人都说不知道。突然甲说我知道这两个数了，可乙还是不知道。请问这两个数各是多少？ <br /><br />################################################ <br /><br />一个班上有50个学生。老师对同学们说：你们中有人脸上有泥巴，请自己举起手来。连续问了七遍，所有脸上有泥巴的学生都举起了手。每个人看不到自己脸上是否有泥巴，但能观察到其他人，假设每个学生都有很聪明。问：有多少个人脸上有泥巴？ <br /><br />################################################</p>
												<p>
														<br />8。一个班有m名同学，问m为多少时，有两人同一天生日的概率为0.6.建立数学模型并解答。同时说明该模型适用于通信中的那些情况。</p>
												<p>
														<font color="#000000">答案：</font>
														<br />9。为了解决学生洗澡难的问题，东方学校新建一座澡堂，水龙头数为m，每天开放k小时，如果学生人数为n，每位学生每周洗一次澡，每次须半小时，学生到达澡堂服从均匀分布，问当m为多少时，学生洗澡等待时间不超过10分钟。建立数学模型并解答。同时请说明该模型适用于通信中的那些情况。</p>
												<div class="f14">无两人同一天的生日概率为p1=365*364*……*(366-m)/365^m <br />有两人同一天生日的概率为p2=1-p1=1-365*364*……*(366-m)/365^m=0.6 <br /><br />365*364*……*(366-m)/365^m=0.4 <br />编写C++ 程序实现 <br />#include&lt;iostream.h&gt; <br />void main() <br />{ <br />int i=1; <br />double p=1; <br />for(i=1;i&lt;=365;i++) <br />{ p=(365-i+1)/365*p; <br />if (p==0.4) <br />{ <br />cout&lt;&lt;"一个班的人数为"&lt;&lt;i&lt;&lt;"使得有两人同一天的概率为0.6"&lt;&lt;endl; <br />break;} <br />else if (i==365) <br />cout&lt;&lt;"failue"&lt;&lt;endl; <br />} <br />} <br /></div>
												<div class="f14">
														<br />
														<font color="#000000">答案：？？？</font>
												</div>
												<div class="f14">
														<br />10。有若干台型号相同的联合收割机，收割一片土地上的小麦，若同时投入工作至收割完毕需用24小时；但它们是每隔相同的时间顺序投入工作的，每一台投入工作后都一直工作到小麦收割完毕。如果第一台收割时间是最后一台的5倍，请问：用这种收割方法收割完这片土地上的小麦需用多长时间？</div>
												<div class="f14"> </div>
												<div class="f14">
														<font color="#000000">答案：？？？<br /></font>
														<br />11。有一批货，如果本月初出售，可获利100元，然后可将本利都存入银行，已知银行月息为2.4%，如果下月初出售，可获利120元，但要付5元保管费，试问这批货何时出售最好（本月初还是下月初）？请说明理由。</div>
												<div class="f14"> </div>
												<div class="f14">
														<font color="#000000">答案：如果本月出手，得到的为100＋2.4；如果下个月则得到的为120－5 。</font>
												</div>
												<p>
														<font color="#000000">
																<font color="#0000ff">12。5个海盗抢到了100颗宝石,每一颗都一样的大小和价值连城.他们决定这么分:第一步,抽签决定自己的号码(1,2,3,4,5);第二步,首先,由1号提出分配方案,然后5个人进行表决,当且仅当超过半数的人同意时,按照他的提案进行分配,否则他将被扔入大海喂鲨鱼;第三步,1号死后,再由2号提出分配方案,然后4人进行表决,当且仅当超过半数的人同意时,按照他的提案进行分配,否则他将被扔入大海喂鲨鱼;第四步,以此类推.<br />条件:每个海盗都是很聪明的人,都能很理智的判断得失,从而做出选择.<br />问题:最后的分配结果如何 <br />提示:海盗的判断原则:1.保命;2.尽量多得宝石;3.尽量多杀人.</font>
														</font>
												</p>
												<p>
														<font color="#000000">
																<font color="#000000">答案：推理的关键是找对思路.<br />任何推理的源泉都在于简化.所以推理过程是这样的:从后向前推,如果1-3号强盗都喂了鲨鱼,只剩4号和5号的话,5号一定投反对票让4号喂鲨鱼,以独吞全部金币.所以,4号惟有支持3号才能保命.3号知道这一点,就会提(100,0,0)的分配方案,对4号,5号一毛不拔而将全部金币归为已有,因为他知道4号一无所获但还是会投赞成票,再加上自己一票,他的方案即可通过.不过,2号推知到3号的方案,就会提出(98,0,1,1)的方案,即放弃3号,而给予4号和5号各一枚金币.由于该方案对于4号和5号来说比在3号分配时更为有利,他们将支持他而不希望他出局而由3号来分配.这样,2号将拿走98枚金币.不过,2号的方案会被1号所洞悉,1号并将提出(97,0,1,2,0)或(97,0,1,0,2)的方案,即放弃2号,而给3号一枚金币,同时给4号(或5号)2枚金币.由于1号的这一方案对于3号和4号(或5号)来说,相比2号分配时更优,他们将投1号的赞成票,再加上1号自己的票,1号的方案可获通过,97枚金币可轻松落入囊中.这无疑是1号能够获取最大收益的方案了!可以看出,这个推理过程就先考虑简化的极端情况,从而顺藤摸瓜,得出最后的结果.另外,这其实是经济学中的博弈问题,1号提出的方案就是这种情况下的纳什均衡.一道推理题目同时涉及了经济学的基本原理,可见这道考题的老辣了.</font>
														</font>
												</p>
												<p>
														<font color="#000000">
																<font color="#000000">
																		<font color="#0000ff">13。一列火车上三个工人,史密斯,琼斯,罗伯特三人工作为消防员,司闸员,机械师.有三个乘客与三人名字相同,<br />1 罗伯特住在底特律.<br />2 司闸员住在芝加哥和底特律中间的地方.<br />3 琼斯一年赚2 万美金.<br />4 有一个乘客和司闸员住在一个地方,每年的薪水是司闸员的3 倍整.<br />5 史密斯台球打得比消防员好.<br />6 和司闸员同名的乘客住在芝加哥.<br />请问谁是机械师</font>
																		<br />
																</font>
														</font>
												</p>
												<p>
														<font color="#000000">
																<font color="#000000">答案：地点:底特律某个地方芝加哥<br />工人:Robbert x y<br />乘客:Robbert y x<br />工作:司闸员<br />因为Johns 一年2 万,因为无法分别到底是哪一Johns,所以只能认为他们两个都拿2 万由于2 万不能被3 整除,所以<strong style="COLOR: white; BACKGROUND-COLOR: #990099">如果</strong>y 是Johns,那么不能满足条件4所以x 肯定是Johns.Johns 是司闸员.又有条件5,Smith 打的比消防员好,从数学逻辑,Smith 不会是消防员.所以Smith 肯定是机械师.最后应该是<br />地点:底特律某个地方芝加哥<br />工人:Robbert Johns(2 万)Smith<br />乘客:Robbert Smith(6 万)Johns(2 万)<br />工作:消防员,司闸员,机械师.</font>
														</font>
												</p>
										</font>
								</font>
						</span>
				</span>
		</p>
		<p>
		</p>
		<div class="f14 wr">最前面的那个肯定是黄帽子。因为后面有九个人都不能确定自己是什么帽子，说明有可能是黄帽子，有可能是蓝帽子。 <br />这还不足以说服，这个要倒推才行。 <br />比如在有2个人的情况下，有2个黄帽子，1个蓝帽子，如果第一个人是蓝帽子，因为第二个人可以看见前面的，而蓝帽子只有一个。这种情况第二个可以推断出自己是黄帽子。如果第一个是黄帽子，则第二人是戴的黄帽子还是蓝帽子则不确定。 <br />比如在有3个人的情况下，有3个黄帽子，2个蓝帽子.在这种情况下有几种可能： <br />A:1蓝，2蓝的情况下，3知道自己是什么颜色，因为只有两个蓝帽子。 <br />B：1蓝，2黄的情况下，3不知道自己是什么颜色，2知道自己是什么颜色。因为2会这样思考，1是蓝色，如果自己是蓝色的话，那3应该知道自己是什么颜色，而3不知道，则自己肯定是黄色。 <br />C：1黄，2蓝，的情况下，3不知道自己是什么颜色，2也不能确定自己是什么颜色。 <br />D:1黄，2黄的情况下，2和3都不确定自己是什么颜色。 <br />排除A和B的情形，只剩C和D，在这两种情况下，1都是黄色。 <br />比如在有4个人的情况下... <br />5个人.... <br />以此类推. <br />所以在10个人的情况下，只有第1个人是黄帽子，其它人才不能确定。如果第1个人是蓝帽子，则剩下的九个人中，总有一个人能确定</div>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 10:21 <a href="http://www.cnitblog.com/zouzheng/articles/21839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>suningin详解笔试面试题（4）--微软试题</title><link>http://www.cnitblog.com/zouzheng/articles/21838.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 01:28:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21838.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21838.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21838.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21838.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21838.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font color="#ff6600">
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">1.</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">有</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">7</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克、</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">2</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克砝码各一个，天平一只，如何只用这些物品三次将</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">140</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克的盐分成</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">50</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">、</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">90</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克各一份？</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
						<?XML:NAMESPACE PREFIX = O /?>
						<o:p>
						</o:p>
				</span> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font color="#000000">
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">答案：（一）1.天平一边放</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">7+2=9</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克砝码，另一边放</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">9</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐。</span>
				</font>
				<font color="#000000">
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
								<br />                        2.</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">天平一边放</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">7</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克砝码和刚才得到的</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">9</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐，另一边放</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">16</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐。</span>
				</font>
				<font color="#000000">
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
								<br />                        3. </span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">天平一边放刚才得到的</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">16</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐和再刚才得到的</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">9</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐，另一边放</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">25</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐。</span>
				</font>
				<font color="#000000">
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
								<br />
								<br />
						</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">              这些</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">16+9+25=50</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐，剩下的就是</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">90</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">克盐。</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font color="#000000">
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">
						</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
								<o:p>
								</o:p>
						</span>
				</font> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial">
						<o:p>
								<font color="#0000ff"> （二）</font>
						</o:p>
				</span>
		</p>
		<p>
				<font color="#000000">
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">                1 70=70 <br />                 2 35=35 <br />                  3 20+2=15+7 <br />                   4 </span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">（</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">20+70</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">）</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">+</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">（</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">15+35</span>
						<span style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">）</span>
						<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">=140</span>
				</font>
		</p>
		<font color="#000000">
				<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">
				</span>
		</font>
		<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: #333333; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">
				<p>
						<br style="mso-special-character: line-break" />
						<font color="#0000ff">
								<font size="3">
										<span style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">2。迈克和托德的薪水相差</span>
										<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"> $21 </span>
										<span style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">。迈克的薪水比托德多</span>
										<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt"> $20 </span>
										<span style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">。迈克的薪水是多少？托德的薪水是多少？</span>
										<span style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">
										</span>
										<span style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 1.0pt">（答案中不包含小数点）</span>
								</font>
						</font>
						<font size="3">
								<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: #333333; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt">
										<font color="#0000ff">
												<br style="mso-special-character: line-break" />
										</font>
										<br style="mso-special-character: line-break" />
								</span>答案：|<font face="宋体">托德－迈克|＝21，迈克－托德＝20，答案迈克$21.5，托德$0.5</font></font>
				</p>
				<p>谁都知道答案为$21 .5 和$0.5但是题目中偏偏说不能含有小数点，我们这里就需要换一种思路答题，那么我们的答案是21美元50美分和50美分，呵呵没有小数点吧。。。。</p>
				<p>
						<font color="#0000ff">3．有三筐水果，一筐装的全是苹果，第二筐装的全是橘子，第三筐是橘子与苹果混在一起。筐上的标签都是骗人的，（比如，如果标签写的是橘子，那么可以肯定筐里不会只有橘子，可能还有苹果）你的任务是拿出其中一筐，从里面只拿一只水果，然后正确写出三筐水果的标签</font>
				</p>
				<p>答案：1、选标签写着混合的一篮，拿出一个有两种情况，要么是苹果，要么是桔子（因为不可能是混合的，所以拿出什么，这篮就是什么） <br />             2、剩下的一篮写着苹果，一篮写着桔子，应该不难判断了吧</p>
		</span>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 09:28 <a href="http://www.cnitblog.com/zouzheng/articles/21838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>suningin详解笔试面试题（3）--IBM社会招聘笔试题</title><link>http://www.cnitblog.com/zouzheng/articles/21836.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Sat, 13 Jan 2007 01:13:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21836.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21836.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21836.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21836.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21836.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>
														<font color="#0000ff">1．一个粗细均匀的长直管子，两端开口，里面有4个白球和4个黑球，球的直径、两端开口的直径等于管子的内径，现在白球和黑球的排列是wwwwbbbb，要求不取出任何一个球，使得排列变为bbwwwwbb?</font>
												</p>
												<p>
														<font color="#000000">答案：</font>切下管子的bb端，装到另一端，遂成BBWWWWBB ；或者如果可以弯曲管子也可以达到这个效果。</p>
												<p>
														<font color="#0000ff">2．一只蜗牛从井底爬到井口，每天白天蜗牛要睡觉，晚上才出来活动，一个晚上蜗牛可以向上爬3尺，但是白天睡觉的时候会往下滑2尺，井深10尺，问蜗牛几天可以爬出来？ </font>
												</p>
												<p>答案：8天，前7天每天3－2＝1尺，第八天不用等到晚上啦，这个题没有什么意思！</p>
												<p>
														<font color="#0000ff">3．在一个平面上画1999条直线最多能将这一平面划分成多少个部分？</font>
												</p>
												<p>答案：0条直线分平面为1份 <br />          1条(1+1)份,2条(2+1+1)份,3条(3+2+1+1份 <br />          1999条(1999+1998+1997+-------+2+1+1)份为1999001份 </p>
												<p>
														<font color="#0000ff">4．在太平洋的一个小岛上生活着土人，他们不愿意被外人打扰，一天，一个探险家到了岛上，被土人抓住，土人的祭司告诉他，你临死前还可以有一个机会留下一句话，如果这句话是真的，你将被烧死，是假的，你将被五马分尸，可怜的探险家如何才能活下来？</font>
												</p>
												<p>答案：说：“我会被五马分尸”，就形成悖论。</p>
												<p>
														<font color="#0000ff">5．怎样种四棵树使得任意两棵树的距离相等。</font>
												</p>
												<p>答案：四棵树种在一个坑里；或者找到一个空间等边六边形一样的山，一棵在山顶，三棵在山脚下。感觉这个题目的思路是不能停留在一个平面上，要网立体想。</p>
												<p>
														<font color="#0000ff">6．27个小运动员在参加完比赛后，口渴难耐，去小店买饮料，饮料店搞促销，凭三个空瓶可以再换一瓶，他们最少买多少瓶饮料才能保证一人一瓶？</font>
												</p>
												<p>答案：三个空瓶就可以换得一个新瓶，这个题只要知道9个空瓶可以换3个新瓶，而这三个又可以在换一个新的就可以解答了。这样的解答是买9个送3＋1个，再买9个送3＋1个，这个时候再买一瓶就到27了。这样19瓶。</p>
												<p>还有一种答案是9＋3＋1＋9＋3＋1这个时候还有一个人没有就向老板先赊一瓶，然后喝晚正好还剩3瓶，一起还了就不用付钱了，这样18瓶。</p>
												<p>根据第二种得思路要27瓶直接赊27个然后可以还9个去掉这9个一样得到18。</p>
												<p>
														<font color="#0000ff">7．有一座山，山上有座庙，只有一条路可以从山上的庙到山脚，每周一早上8点，有一个聪明的小和尚去山下化缘，周二早上8点从山脚回山上的庙里，小和尚的上下山的速度是任意的，在每个往返中，他总是能在周一和周二的同一钟点到达山路上的同一点。例如，有一次他发现星期一的8点30和星期二的8点30他都到了山路靠山脚的3/4的地方，问这是为什么？</font>
												</p>
												<p>答案：我们可以这样考虑，如果看成两个和尚一个上山一个下山，不管他们得速度怎样，总有一个时刻是要相遇的。这道题出的有迷惑型，其实它没有什么难度，只是在一定的程度上混乱了大家的眼球。把一个过程分成了两个来说而已。</p>
												<p>
														<font color="#0000ff">8假设一张圆盘像唱机上的唱盘那样转动。这张盘一半是黑色，一半是白色。假设你有数量不限的一些颜色传感器。要想确定圆盘转动的方向，你需要在它周围摆多少个颜色传感器？它们应该被摆放在什么位置？</font>
												</p>
												<p>答案：2个为a,b，均放在左侧a在左上，b在左下，若a先于b变化,则顺时针，b先于a变化，则逆时针</p>
												<p>
														<font color="#0000ff">9假设时钟到了12点。注意时针和分针重叠在一起。在一天之中，时针和分针共重叠多少次？你知道它们重叠时的具体时间吗？ </font>
												</p>
												<p>
														<font color="#0000ff">
														</font>答案：22次。我们需要知道的是11点后到1点后之间我们的两个指针只重叠一次。想不通的看看你身边的表想想整个过成就知道了</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-13 09:13 <a href="http://www.cnitblog.com/zouzheng/articles/21836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道受用终身的测试题</title><link>http://www.cnitblog.com/zouzheng/articles/21831.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Fri, 12 Jan 2007 13:53:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21831.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21831.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21831.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21831.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21831.html</trackback:ping><description><![CDATA[
		<p>给你做一道题吧…… 测试一下看看你是不是通得过自已对自已的考验.这是一家公司要招收新的职员其中一个测试的问题…… <br /></p>
		<p>
				<br />你开着一辆车。 <br /><br />在一个暴风雨的晚上。 <br /><br />你经过一个车站。 <br /><br />有三个人正在等公共汽车。 <br /><br />一个是快要死的老人，好可怜的。 <br /><br />一个是医生，他曾救过你的命，是大恩人，你做梦都想报答他。 <br /><br />还有一个女人/男人，她/他是那种你做梦都想嫁/娶的人，也许错过就没有了。 <br /><br />但你的车只能坐一个人，你会如何选择那？请解释一下你的理由。 <br /><br />在你看下面的话之前仔细考虑一下 <br />| <br />| <br />|<br />我不知道这是不是一个对你性格的测试, 因为每一个回答都有他自己的原因。 <br /><br />老人快要死了，你首先应该先救他。 然而，每个老人最后都只能把死作为他们的终点站, 你先让那个医生上车，因为他救过你，你认为这是个好机会报答他。 同时有些人认为一样可以在将来某个时候去报答他, 但是你一旦错过了这个机会，你可能永远不能遇到一个让你这么心动的人了。 <br /><br /></p>
		<p>在200个应征者中，只有一个人被雇佣了，他并没有解释他的理由，他只是说了以下的话 <br /><br />"给医生车钥匙，让他带着老人去医院，而我则留下来陪我的梦中情人一起等公车!" <br /><br />每个人我认识的人都认为以上的回答是最好的，但没有一个人（包括我在内）一开始都没想到。</p>
		<p>
				<br />
				<br />是否是因为我们从未想过要放弃我们手中已经拥有的优势（车钥匙）? 有时，如果我们能放弃一些我们的固执，狭隘，和一些优势的话，我们可能会得到更多.......<br /><br /></p>
		<h4 class="TextColor1" id="subjcns!AD1B9CBBF78BB598!117" style="MARGIN-BOTTOM: 0px">海盗分金币</h4>
		<div id="msgcns!AD1B9CBBF78BB598!117">
				<div>数学的逻辑有时会导致看来十分怪异的结论。一般的规则是，如果逻辑推理没有漏洞，那么结论就必定站得住脚，即使它与你的直觉矛盾。 1998年9月，加利福尼亚州帕洛阿尔托的Stephen M. Omohundro寄给我一道难题，它恰好就属于这一类。这难题已经流传了至少十年，但是Omohundro对它作了改动，使它的逻辑问题变得分外复杂了。 <br />    先来看看此难题原先的形状。10名海盗抢得了窖藏的100块金子，并打算瓜分这些战利品。这是一些讲民主的海盗（当然是他们自己特有的民主），他们的习惯是按下面的方式进行分配：最厉害的一名海盗提出分配方案，然后所有的海盗（包括提出方案者本人）就此方案进行表决。如果50%或更多的海盗赞同此方案，此方案就获得通过并据此分配战利品。否则提出方案的海盗将被扔到海里，然后下提名最厉害的海盗又重复上述过程。<br />    所有的海盗都乐于看到他们的一位同伙被扔进海里，不过，如果让他们选择的话，他们还是宁可得一笔现金。他们当然也不愿意自己被扔到海里。所有的海盗都是有理性的，而且知道其他的海盗也是有理性的。此外，没有两名海盗是同等厉害的——这些海盗按照完全由上到下的等级排好了座次，并且每个人都清楚自己和其他所有人的等级。这些金块不能再分，也不允许几名海盗共有金块，因为任何海盗都不相信他的同伙会遵守关于共享金块的安排。这是一伙每人都只为自己打算的海盗。最凶的一名海盗应当提出什么样的分配方案才能使他获得最多的金子呢？ <br />    为方便起见，我们按照这些海盗的怯懦程度来给他们编号。最怯懦的海盗为1号海盗，次怯懦的海盗为2号海盗，如此类推。这样最厉害的海盗就应当得到最大的编号，而方案的提出就将倒过来从上至下地进行。 <br />    分析所有这类策略游戏的奥妙就在于应当从结尾出发倒推回去。游戏结束时，你容易知道何种决策有利而何种决策不利。确定了这一点后，你就可以把它用到倒数第2次决策上，如此类推。如果从游戏的开头出发进行分析，那是走不了多远的。其原因在于，所有的战略决策都是要确定：“如果我这样做，那么下一个人会怎样做？”<br />    因此在你以下海盗所做的决定对你来说是重要的，而在你之前的海盗所做的决定并不重要，因为你反正对这些决定也无能为力了。 <br />    记住了这一点，就可以知道我们的出发点应当是游戏进行到只剩两名海盗——即1号和2号——的时候。这时最厉害的海盗是2号，而他的最佳分配方案是一目了然的：100块金子全归他一人所有，1号海盗什么也得不到。由于他自己肯定为这个方案投赞成票，这样就占了总数的50%，因此方案获得通过。 <br />    现在加上3号海盗。1号海盗知道，如果3号的方案被否决，那么最后将只剩2个海盗，而1号将肯定一无所获——此外，3号也明白1号了解这一形势。因此，只要3号的分配方案给1号一点甜头使他不至于空手而归，那么不论3号提出什么样的分配方案，1号都将投赞成票。因此3号需要分出尽可能少的一点金子来贿赂1号海盗，这样就有了下面的分配方案： 3号海盗分得99块金子，2号海盗一无所获，1号海盗得1块金子。 <br />    4号海盗的策略也差不多。他需要有50%的支持票，因此同3号一样也需再找一人做同党。他可以给同党的最低贿赂是1块金子，而他可以用这块金子来收买2号海盗。因为如果4号被否决而3号得以通过，则2号将一文不名。因此，4号的分配方案应是：99块金子归自己，3号一块也得不到，2号得1块金子，1号也是一块也得不到。<br />    5号海盗的策略稍有不同。他需要收买另两名海盗，因此至少得用2块金子来贿赂，才能使自己的方案得到采纳。他的分配方案应该是：98块金子归自己，1块金子给3号，1块金子给1号。 <br />    这一分析过程可以照着上述思路继续进行下去。每个分配方案都是唯一确定的，它可以使提出该方案的海盗获得尽可能多的金子，同时又保证该方案肯定能通过。照这一模式进行下去，10号海盗提出的方案将是96块金子归他所有，其他编号为偶数的海盗各得1块金子，而编号为奇数的海盗则什么也得不到。这就解决了10名海盗的分配难题。<br />    Omohundro的贡献是他把这一问题扩大到有500名海盗的情形，即500名海盗瓜分100块金子。显然，类似的规律依然成立——至少是在一定范围内成立。事实上，前面所述的规律直到第200号海盗都成立。 200号海盗的方案将是：从1到199号的所有奇数号的海盗都将一无所获，而从2到198号的所有偶数号海盗将各得1块金子，剩下的1块金子归200号海盗自己所有。 <br />    乍看起来，这一论证方法到200号之后将不再适用了，因为201号拿不出更多的金子来收买其他海盗。但是即使分不到金子，201号至少还希望自己不会被扔进海里，因此他可以这样分配：给1到199号的所有奇数号海盗每人1块金子，自己一块也不要。<br />    202号海盗同样别无选择，只能一块金子都不要了——他必须把这100块金子全部用来收买100名海盗，而且这100名海盗还必须是那些按照201号方案将一无所获的人。由于这样的海盗有101名，因此202号的方案将不再是唯一的——贿赂方案有101种。<br />    203号海盗必须获得102张赞成票，但他显然没有足够的金子去收买101名同伙。因此，无论提出什么样的分配方案，他都注定会被扔到海里去喂鱼。不过，尽管203号命中注定死路一条，但并不是说他在游戏进程中不起任何作用。相反，204号现在知道，203号为了能保住性命，就必须避免由他自己来提出分配方案这么一种局面，所以无论204号海盗提出什么样的方案，203号都一定会投赞成票。这样204号海盗总算侥幸拣到一条命：他可以得到他自己的1票、203号的1票、以及另外100名收买的海盗的赞成票，刚好达到保命所需的50%。获得金子的海盗，必属于根据202号方案肯定将一无所获的那101名海盗之列。 <br />    205号海盗的命运又如何呢？他可没有这样走运了。他不能指望203号和204号支持他的方案，因为如果他们投票反对205号方案，就可以幸灾乐祸地看到205号被扔到海里去喂鱼，而他们自己的性命却仍然能够保全。这样，无论205号海盗提出什么方案都必死无疑。206号海盗也是如此——他肯定可以得到205号的支持，但这不足以救他一命。类似地，207号海盗需要104张赞成票——除了他收买的100张赞成票以及他自己的1张赞成票之外，他还需3张赞成票才能免于一死。他可以获得205号和206号的支持，但还差一张票却是无论如何也弄不到了，因此207号海盗的命运也是下海喂鱼。<br />    208号又时来运转了。他需要104张赞成票，而205、206、207号都会支持他，加上他自己一票及收买的100票，他得以过关保命。获得他贿赂的必属于那些根据204号方案肯定将一无所获的人（候选人包括2到200号中所有偶数号的海盗、以及201、203、204号）。 <br />    现在可以看出一条新的、此后将一直有效的规律：那些方案能过关的海盗（他们的分配方案全都是把金子用来收买100名同伙而自己一点都得不到）相隔的距离越来越远，而在他们之间的海盗则无论提什么样的方案都会被扔进海里——因此为了保命，他们必会投票支持比他们厉害的海盗提出的任何分配方案。得以避免葬身鱼腹的海盗包括201、202、204、208、216、232、264、328、456号，即其号码等于200加2的某一方幂的海盗。 <br />    现在我们来看看哪些海盗是获得贿赂的幸运儿。分配贿赂的方法是不唯一的，其中一种方法是让201号海盗把贿赂分给1到199号的所有奇数编号的海盗，让202号分给2到200号的所有偶数编号的海盗，然后是让204号贿赂奇数编号的海盗，208号贿赂偶数编号的海盗，如此类推，也就是轮流贿赂奇数编号和偶数编号的海盗。 <br />    结论是：当500名海盗运用最优策略来瓜分金子时，头44名海盗必死无疑，而456号海盗则给从1到199号中所有奇数编号的海盗每人分1块金子，问题就解决了。由于这些海盗所实行的那种民主制度，他们的事情就搞成了最厉害的一批海盗多半都是下海喂鱼，不过有时他们也会觉得自己很幸运——虽然分不到抢来的金子，但总可以免于一死。只有最怯懦的200名海盗有可能分得一份脏物，而他们之中又只有一半的人能真正得到一块金子，的确是怯懦者继承财富。<br /><br /></div>
		</div>
<img src ="http://www.cnitblog.com/zouzheng/aggbug/21831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-12 21:53 <a href="http://www.cnitblog.com/zouzheng/articles/21831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>suningin详解笔试面试题（1）</title><link>http://www.cnitblog.com/zouzheng/articles/21826.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Fri, 12 Jan 2007 11:38:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21826.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21826.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21826.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21826.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21826.html</trackback:ping><description><![CDATA[1．<span style="FONT-SIZE: 12pt">有两根不均匀分布的香，香烧完的时间是一个小时，你能用什么方法来确定一段</span><span style="FONT-SIZE: 12pt">15</span><span style="FONT-SIZE: 12pt">分钟的时间？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：把两根香同时点起来，第一支香两头点着，另一支香只烧一头，等第一支香烧完的同时（这是烧完总长度的</span><span style="FONT-SIZE: 12pt">3/4</span><span style="FONT-SIZE: 12pt">），把第二支香另一头点燃，另一头从燃起到熄灭的时间就是</span><span style="FONT-SIZE: 12pt">15</span><span style="FONT-SIZE: 12pt">分！</span><span style="FONT-SIZE: 12pt"><br /><br /></span><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">           2．<span style="FONT: 7pt -Times New Roman-"></span></span><span style="FONT-SIZE: 12pt">一个经理有三个女儿，三个女儿的年龄加起来等于</span><span style="FONT-SIZE: 12pt">13</span><span style="FONT-SIZE: 12pt">，三个女儿的年龄乘起来等于经理自己的年龄，有一个下属已知道经理的年龄，但仍不能确定经理三个女儿的年龄，这时经理说只有一个女儿的头发是黑的，然后这个下属就知道了经理三个女儿的年龄。请问三个女儿的年龄分别是多少？为什么？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：三女的年龄应该是</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">9</span><span style="FONT-SIZE: 12pt">。因为只有一个孩子黑头发，即只有她长大了，其他两个还是幼年时期即小于</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">岁，头发为淡色。再结合经理的年龄应该至少大于</span><span style="FONT-SIZE: 12pt">25</span><span style="FONT-SIZE: 12pt">。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            3．</span><span style="FONT-SIZE: 12pt">有三个人去住旅馆，住三间房，每一间房</span><span style="FONT-SIZE: 12pt">$10</span><span style="FONT-SIZE: 12pt">元，于是他们一共付给老板</span><span style="FONT-SIZE: 12pt">$30</span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt">第二天，老板觉得三间房只需要</span><span style="FONT-SIZE: 12pt">$25</span><span style="FONT-SIZE: 12pt">元就够了于是叫小弟退回</span><span style="FONT-SIZE: 12pt">$5</span><span style="FONT-SIZE: 12pt">给三位客人，</span><span style="FONT-SIZE: 12pt">谁知小弟贪心</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">只退回每人</span><span style="FONT-SIZE: 12pt">$1</span><span style="FONT-SIZE: 12pt">，自己偷偷拿了</span><span style="FONT-SIZE: 12pt">$2</span><span style="FONT-SIZE: 12pt">，这样一来便等于那三位客人每人各花了九元，</span><span style="FONT-SIZE: 12pt">于是三个人一共花了</span><span style="FONT-SIZE: 12pt">$27</span><span style="FONT-SIZE: 12pt">，再加上小弟独吞了不</span><span style="FONT-SIZE: 12pt">$2</span><span style="FONT-SIZE: 12pt">，总共是</span><span style="FONT-SIZE: 12pt">$29</span><span style="FONT-SIZE: 12pt">。可是当初他们三个人一共付出</span><span style="FONT-SIZE: 12pt">$30</span><span style="FONT-SIZE: 12pt">那么还有</span><span style="FONT-SIZE: 12pt">$1</span><span style="FONT-SIZE: 12pt">呢？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：一共付出的</span><span style="FONT-SIZE: 12pt">30</span><span style="FONT-SIZE: 12pt">元包括</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">元（</span><span style="FONT-SIZE: 12pt">25</span><span style="FONT-SIZE: 12pt">元给老板＋小弟贪污</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">元）和每人退回</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">元（共</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">元），拿</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">和</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">元相加纯属混淆视听。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            4．</span><span style="FONT-SIZE: 12pt">有两位盲人，他们都各自买了两对黑袜和两对白袜，八对袜了的布质、大小完全相同，</span><span style="FONT-SIZE: 12pt">而每对袜了都有一张商标纸连着。两位盲人不小心将八对袜了混在一起。他们每人怎样才能取回黑袜和白袜各两对呢？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：每对袜子都拆开，每人各拿一支，袜子无左右，最后取回黑袜和白袜各两对。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">             5．<span style="FONT: 7pt -Times New Roman-"></span></span><span style="FONT-SIZE: 12pt">有一辆火车以每小时</span><span style="FONT-SIZE: 12pt">15</span><span style="FONT-SIZE: 12pt">公里的速度离开洛杉矶直奔纽约，另一辆火车以每小时</span><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">公里的速度从纽约开往洛杉矶。如果有一只鸟，以</span><span style="FONT-SIZE: 12pt">30</span><span style="FONT-SIZE: 12pt">公里每小时的速度和两辆火车同时启动，从洛杉矶出发，碰到另一辆车后返回，依次在两辆火车来回飞行，直到两辆火车相遇，请问，这只小鸟飞行了多长距离？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：两个火车在相聚的之前鸟是一直在匀速飞行的，设：洛杉矶纽约距离为</span><span style="FONT-SIZE: 12pt">A</span><span style="FONT-SIZE: 12pt">，则鸟飞行的时间为</span><span style="FONT-SIZE: 12pt">A/</span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">＋</span><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">），在乘以</span><span style="FONT-SIZE: 12pt">30</span><span style="FONT-SIZE: 12pt">就是鸟的飞行距离。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            6．</span><span style="FONT-SIZE: 12pt">你有两个罐子，</span><span style="FONT-SIZE: 12pt">50</span><span style="FONT-SIZE: 12pt">个红色弹球，</span><span style="FONT-SIZE: 12pt">50</span><span style="FONT-SIZE: 12pt">个蓝色弹球，随机选出一个罐子，随机选取出一个弹球放入罐子，怎么给红色弹球最大的选中机会？在你的计划中，得到红球的准确几率是多少？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：一个罐子放一个红球</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">另一个罐子放</span><span style="FONT-SIZE: 12pt">49</span><span style="FONT-SIZE: 12pt">个红球和</span><span style="FONT-SIZE: 12pt">50</span><span style="FONT-SIZE: 12pt">个蓝球</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">概率接近</span><span style="FONT-SIZE: 12pt">75%. <br /></span><span style="FONT-SIZE: 12pt">这是所能达到的最大概率了。</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">实际上，只要一个罐子放</span><span style="FONT-SIZE: 12pt">&lt;50</span><span style="FONT-SIZE: 12pt">个红球，不放篮球，</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">另一个罐子放剩下的球，拿出红球的概率就大于</span><span style="FONT-SIZE: 12pt">50% <br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">           7．</span><span style="FONT-SIZE: 12pt">你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被污染的重量＋</span><span style="FONT-SIZE: 12pt">1.</span><span style="FONT-SIZE: 12pt">只称量一次，如何判断哪个罐子的药被污染了？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">号罐取</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">丸，</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">号罐取</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">丸，</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">号罐取</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">丸，</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">号罐取</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">丸，称量该</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">个药丸，比正</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">常重量重几就是几号罐的药有问题。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">             8．</span><span style="FONT-SIZE: 12pt">你有一桶果冻，其中有黄色，绿色，红色三种，闭上眼睛，抓取两个同种颜色的果冻。抓取多少个就可以确定你肯定有两个同一颜色的果冻？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">个</span><span style="FONT-SIZE: 12pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">因为只有三种颜色，当你拿到</span><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">4</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">个时候一定有重复的。</span><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">             9．</span><span style="FONT-SIZE: 12pt">对一批编号为</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">～</span><span style="FONT-SIZE: 12pt">100</span><span style="FONT-SIZE: 12pt">，全部开关朝上</span><span style="FONT-SIZE: 12pt">(</span><span style="FONT-SIZE: 12pt">开</span><span style="FONT-SIZE: 12pt">)</span><span style="FONT-SIZE: 12pt">的灯进行以下</span><span style="FONT-SIZE: 12pt">*</span><span style="FONT-SIZE: 12pt">作：凡是</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">的倍数反方向拨一次开关；</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">的倍数反方向又拨一次开关；</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">的倍数反方向又拨一次开关</span><span style="FONT-SIZE: 12pt">……</span><span style="FONT-SIZE: 12pt">问：最后为关熄状态的灯的编号。</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt" align="left"><span style="FONT-SIZE: 12pt">答</span><span style="FONT-SIZE: 12pt">:1,4,9,16,25,36,49,64,81,100 <br /></span><span style="FONT-SIZE: 12pt">所有的质数因为都只有</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">和他本身两个约数</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">所以都会先下后上各一次</span><span style="FONT-SIZE: 12pt">.</span><span style="FONT-SIZE: 12pt">故最后的状态为开</span><span style="FONT-SIZE: 12pt">. <br /></span><span style="FONT-SIZE: 12pt">而合数至少有两个或两个以上的约数</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">如果它有偶数个不同的约数时</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">这个合数所对应开关的状态将为开</span><span style="FONT-SIZE: 12pt">. </span><span style="FONT-SIZE: 12pt">如果它有奇数个约数时</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">则对应开关将为关</span><span style="FONT-SIZE: 12pt">.</span><span style="FONT-SIZE: 12pt">我们知道任何一个合数当它只有奇数个约数时</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">必然是它某个约数的平方</span><span style="FONT-SIZE: 12pt">.</span><span style="FONT-SIZE: 12pt">检查</span><span style="FONT-SIZE: 12pt">1-100</span><span style="FONT-SIZE: 12pt">所有的数</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">可得到答案</span><span style="FONT-SIZE: 12pt">.</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">           10．</span><span style="FONT-SIZE: 12pt">想象你在镜子前，请问，为什么镜子中的影像可以颠倒左右，却不能颠倒上下？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：镜像对称的轴是人的中轴</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            11．<span style="FONT: 7pt -Times New Roman-"></span></span><span style="FONT-SIZE: 12pt">一群人开舞会，每人头上都戴着一顶帽子。帽子只有黑白两种，黑的至少有一顶。每个人都能看到其它人帽子的颜色，却看不到自己的。主持人先让大家看看别人头上戴的是什幺帽子，然后关灯，如果有人认为自己戴的是黑帽子，就打自己一个耳光。第一次关灯，没有声音。于是再开灯，大家再看一遍，关灯时仍然鸦雀无声。一直到第三次关灯，才有劈劈啪啪打耳光的声音响起。问有多少人戴着黑帽子？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：有三个人戴黑帽。假设有</span><span style="FONT-SIZE: 12pt">N</span><span style="FONT-SIZE: 12pt">个人戴黑，当</span><span style="FONT-SIZE: 12pt">N=1</span><span style="FONT-SIZE: 12pt">时，戴黑人看见别人都为白则能肯</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">定自己为黑。于是第一次关灯就应该有声。可以断定</span><span style="FONT-SIZE: 12pt">N&gt;1</span><span style="FONT-SIZE: 12pt">。对于每个戴黑的人来说，他能看见</span><span style="FONT-SIZE: 12pt">N-1</span><span style="FONT-SIZE: 12pt">顶黑帽</span><span style="FONT-SIZE: 12pt">，并由此假定自己为</span><span style="FONT-SIZE: 12pt">白。但等待</span><span style="FONT-SIZE: 12pt">N-1</span><span style="FONT-SIZE: 12pt">次还没有人打自己以后，每个戴黑人都能知道自己也是黑的了。所以第</span><span style="FONT-SIZE: 12pt">N</span><span style="FONT-SIZE: 12pt">次关灯就有</span><span style="FONT-SIZE: 12pt">N</span><span style="FONT-SIZE: 12pt">个人打自己。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            12．</span><span style="FONT-SIZE: 12pt">两个圆环，半径分别是</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">和</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">，小圆在大圆内部绕大圆圆周一周，问小圆自身转了几周？如果在大圆的外部，小圆自身转几周呢？</span><span style="FONT-SIZE: 12pt"><br /><br /></span><span style="FONT-SIZE: 12pt">答：内，小圆转</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">圈。外为</span><span style="FONT-SIZE: 12pt">6</span><span style="FONT-SIZE: 12pt">圈，小圆的圆心为实际的移动周长。</span><span style="FONT-SIZE: 12pt"><br /><br /></span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">             13．</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">元钱一瓶汽水，喝完后两个空瓶换一瓶汽水，问：你有</span><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">元钱，最多可以喝到几瓶汽水？</span></div><div style="TEXT-INDENT: 36pt"><span style="FONT-SIZE: 12pt">答：</span><span style="FONT-SIZE: 12pt">39</span><span style="FONT-SIZE: 12pt">瓶，从第</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">瓶开始，相当于</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">元买</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">瓶。</span></div><div style="TEXT-INDENT: 36pt"><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">——</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">——</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">（余</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">）——</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">（＋</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">）——</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">（＋</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">）——</span><span style="FONT-SIZE: 12pt">1</span></div><div style="TEXT-INDENT: 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">           14．</span><span style="FONT-SIZE: 12pt">微软：有</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">颗弹子球，其中</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">颗是</span><span style="FONT-SIZE: 12pt">“</span><span style="FONT-SIZE: 12pt">缺陷球</span><span style="FONT-SIZE: 12pt">”</span><span style="FONT-SIZE: 12pt">，也就是它比其他的球都重。你怎样使用天平只通过两次称量就能够找到这个球﹖</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 35.9pt; TEXT-INDENT: -6pt"><span style="FONT-SIZE: 12pt">  答案</span><span style="FONT-SIZE: 12pt">: </span><span style="FONT-SIZE: 12pt">把球分为</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">三组记为</span><span style="FONT-SIZE: 12pt">a</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">b</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">c</span><span style="FONT-SIZE: 12pt">，把</span><span style="FONT-SIZE: 12pt">b</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">c</span><span style="FONT-SIZE: 12pt">放入天平，如果平衡，重的球在</span><span style="FONT-SIZE: 12pt">a</span><span style="FONT-SIZE: 12pt">中，在把</span><span style="FONT-SIZE: 12pt">a</span><span style="FONT-SIZE: 12pt">分为</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">的两组就可以搞定了；</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            </span><span style="FONT-SIZE: 12pt">如果不平衡如</span><span style="FONT-SIZE: 12pt">b</span><span style="FONT-SIZE: 12pt">重，就说明重的球在</span><span style="FONT-SIZE: 12pt">b</span><span style="FONT-SIZE: 12pt">里面，把</span><span style="FONT-SIZE: 12pt">b</span><span style="FONT-SIZE: 12pt">分为</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">三组随便称两个就可以知道我们要的是哪个。</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            15．</span><span style="FONT-SIZE: 12pt">一个正三角形的每个角上各有一只蚂蚁。每只蚂蚁开始朝另一只蚂蚁做直线运动，目标角是随机选择。蚂蚁互不相撞的概率是多少﹖</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt"><span style="FONT-SIZE: 12pt">答案应当是：只有两种方法可以让蚂蚁避免相撞：或者它们全部顺时针运动，或者它们全部逆时针运动。否则，肯定会撞到一起。选择一只蚂蚁，一旦它确定了自己是逆时针或者是顺时针运动，其他的蚂蚁就必须做相同方向的运动才能避免相撞。由于蚂蚁运动的方向是随机选择的，那么第二只蚂蚁有</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">／</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">的概率选择与第一只蚂蚁相同的运动方向。第三只蚂蚁也有</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">／</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">的概率选择与第一只相同的方向。因此，蚂蚁避免撞到一起的概率是</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">／</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">。</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            16．</span><span style="FONT-SIZE: 12pt">微软。估算一下一个行进在小雨中的人</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">分钟内身上淋到的雨的质量</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt"><span style="FONT-SIZE: 12pt">答案：近似认为雨滴垂直地面降落，下雨降水量为</span><span style="FONT-SIZE: 12pt">0.2mm <br /></span><span style="FONT-SIZE: 12pt">近似认为雨水密度为</span><span style="FONT-SIZE: 12pt">1000kg/m^3 <br /></span><span style="FONT-SIZE: 12pt">假设人的肩膀宽度为</span><span style="FONT-SIZE: 12pt">0.5m</span><span style="FONT-SIZE: 12pt">，人的行进速度为</span><span style="FONT-SIZE: 12pt">50m/min <br /></span><span style="FONT-SIZE: 12pt">则人在</span><span style="FONT-SIZE: 12pt">5min</span><span style="FONT-SIZE: 12pt">中走过的面积为</span><span style="FONT-SIZE: 12pt">0.5*50*5=125</span><span style="FONT-SIZE: 12pt">平米</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">在此面积内落雨体积为</span><span style="FONT-SIZE: 12pt">0.0002*125=0.025</span><span style="FONT-SIZE: 12pt">立方米</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">所以此落雨质量为</span><span style="FONT-SIZE: 12pt">0.025*1000=25kg</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">             17．<span style="FONT: 7pt -Times New Roman-"></span></span><span style="FONT-SIZE: 12pt">一楼到十楼的每层电梯门口都放着一颗钻石，钻石大小不一。你乘坐电梯从一楼到十楼，每层楼电梯门都会打开一次，只能拿一次钻石，问怎样才能拿到最大的那颗？</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt"><span style="FONT-SIZE: 12pt">答案：前三个一律不拿，以后的一个如果比它前面的三个都大，就拿，不然就不拿。一直到第</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">个如果还不符合就拿它。可以参考</span><span style="FONT-SIZE: 12pt">CMO2004(</span><span style="FONT-SIZE: 12pt">或</span><span style="FONT-SIZE: 12pt">2003)</span><span style="FONT-SIZE: 12pt">的一个题，证明比较长，这里不写了。这样拿到前三大的概率是</span><span style="FONT-SIZE: 12pt">70%</span><span style="FONT-SIZE: 12pt">多，最大的是</span><span style="FONT-SIZE: 12pt">30%</span><span style="FONT-SIZE: 12pt">多，是很好的情况了。绝对最大的情况不存在。</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">推广一下：有</span><span style="FONT-SIZE: 12pt">M</span><span style="FONT-SIZE: 12pt">个的话，把</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">改为与</span><span style="FONT-SIZE: 12pt">M/3</span><span style="FONT-SIZE: 12pt">最接近的整数。</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">            18．</span><span style="FONT-SIZE: 12pt">用</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">种颜色为一个二十面体涂颜色，每面都要覆盖，你能够用多少种不同的涂法？你将选择哪三种颜色？</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt"><span style="FONT-SIZE: 12pt">答案：</span><span style="FONT-SIZE: 12pt">应该是个数列问题，三个颜色是随便的，各人所好。</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">涂法思路：第一面色彩选择三种的一种，第二面选择三种的一种</span><span style="FONT-SIZE: 12pt">……</span><span style="FONT-SIZE: 12pt">故一共有：</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">的</span><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">次方减</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">种（</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">种单纯色）。</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">去除所有色只有两色的方案有：</span><span style="FONT-SIZE: 12pt"><br />2</span><span style="FONT-SIZE: 12pt">的</span><span style="FONT-SIZE: 12pt">20</span><span style="FONT-SIZE: 12pt">次方减</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">种单纯色）乘</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">种（两色的配色方案有</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">种）。</span><span style="FONT-SIZE: 12pt"><br /></span><span style="FONT-SIZE: 12pt">结果为</span><span style="FONT-SIZE: 12pt"><br />3486784398-3145722 = 3483638676</span><span style="FONT-SIZE: 12pt">种。</span></div><div> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"><span style="FONT-SIZE: 12pt">              19.   Intel EE</span><span style="FONT-SIZE: 12pt">的</span><span style="FONT-SIZE: 12pt">IQ</span><span style="FONT-SIZE: 12pt">测试题</span><span style="FONT-SIZE: 12pt">   </span><span style="FONT-SIZE: 12pt">有</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">堆苹果，每一堆</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">个其中一堆每个</span><span style="FONT-SIZE: 12pt">240g</span><span style="FONT-SIZE: 12pt">其它每堆都是</span><span style="FONT-SIZE: 12pt">250g</span><span style="FONT-SIZE: 12pt">/</span><span style="FONT-SIZE: 12pt">个有一把称请你只称一次把那一堆</span><span style="FONT-SIZE: 12pt">240</span><span style="FONT-SIZE: 12pt">的苹果找出来。</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"><span style="FONT-SIZE: 12pt">              </span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"><span style="FONT-SIZE: 12pt">              </span><span style="FONT-SIZE: 12pt">答案：从</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">到</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">每堆取</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">。。。</span><span style="FONT-SIZE: 12pt">10</span><span style="FONT-SIZE: 12pt">个，称重一下，看一下重量就知道哪个堆了。</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"> </div><div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align="left"><span style="FONT-SIZE: 12pt">          20.</span><span style="FONT-SIZE: 12pt"> </span><span style="FONT-SIZE: 12pt">你让工人为你工作七天，回报是一根金条。这个金一平分成相连的</span><span style="FONT-SIZE: 12pt">7</span><span style="FONT-SIZE: 12pt">段，</span></div><div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align="left"><span style="FONT-SIZE: 12pt">                </span><span style="FONT-SIZE: 12pt">你必须在每天结束的时候给他们一段金条如果只许你两次把金条弄断， </span></div><div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align="left"><span style="FONT-SIZE: 12pt">                你如</span><span style="FONT-SIZE: 12pt">何</span><span style="FONT-SIZE: 12pt">给你的工人付费？</span></div><div align="left"> </div><div style="TEXT-INDENT: 18pt" align="left"><span style="FONT-SIZE: 12pt">          答案：分为三段，分别为</span><span style="FONT-SIZE: 12pt">1/7</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">2/7</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">4/7</span><span style="FONT-SIZE: 12pt">，用人民币找钱的方式发放工资。</span></div><div style="TEXT-INDENT: 18pt" align="left"> </div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"><span style="FONT-SIZE: 12pt">           21.</span><span style="FONT-SIZE: 12pt">如果你有无穷多的水，一个</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">夸脱的和一个</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">夸脱的提桶，</span></div><div style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: -36pt" align="left"><span style="FONT-SIZE: 12pt">                 你如何准确称出</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">夸脱的水？</span></div><div align="left"><span style="FONT-SIZE: 12pt">     </span></div><div style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: -60pt" align="left"><span style="FONT-SIZE: 12pt">                 </span><span style="FONT-SIZE: 12pt">答案：先把</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">承满到如</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">中，在承满</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">再次到入</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">中，这样就可以得到</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">，把</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">中的全部到掉，把得到的</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">导入在到入一个</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">就可以得到</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">了<br /><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt; mso-char-indent-count: -2.5"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt"><font color="#0000ff"><span style="FONT-SIZE: 12pt">22</span><span style="FONT-SIZE: 12pt">．</span><span style="FONT-SIZE: 12pt">中科院的一道面试题：有</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">升</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">升</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">升</span><span style="FONT-SIZE: 12pt">三个桶，要求：水龙头只能打开一次，而且不能浪</span><span style="FONT-SIZE: 12pt">?</span><span style="FONT-SIZE: 12pt">费水，如何才能称得</span><span style="FONT-SIZE: 12pt">13</span><span style="FONT-SIZE: 12pt">升</span><span style="FONT-SIZE: 12pt">水？</span></font></pre><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt"> </pre><pre style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">答案：这道题没有什么意思，一个</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">五个</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">倒入</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">中就可以了，打开水龙头，在接</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">升桶的水的同时，在上面接</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">个</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">升桶的水，倒入</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">升桶，</span></pre><pre style="MARGIN-LEFT: 35.9pt"><span style="FONT-SIZE: 12pt">然后，</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">升桶接满，再倒入</span><span style="FONT-SIZE: 12pt">27</span><span style="FONT-SIZE: 12pt">升桶。当时我想，既接满了水，</span></pre><pre style="MARGIN-LEFT: 35.9pt"><span style="FONT-SIZE: 12pt">又可以说是一滴水也没浪费。</span></pre><pre style="MARGIN-LEFT: 35.9pt"><span style="FONT-SIZE: 12pt"></span><span style="FONT-SIZE: 12pt"></span></pre><pre style="MARGIN-LEFT: 35.9pt"><font color="#0000ff"><span style="FONT-SIZE: 12pt">23.</span><span style="FONT-SIZE: 12pt">一个人死了以后在黄泉路上有一个岔路口，一条是到天堂的，另一条到地狱，分别有一个魔鬼把守，一个魔鬼只说真话，另一个只说假话（哪个说真</span><span style="FONT-SIZE: 12pt">or</span><span style="FONT-SIZE: 12pt">假不知道）；这个人只可以问一个问题，问哪个都可以，但只一共只可以问一个，问你他怎么才能到天堂？</span></font></pre><pre> </pre><pre> </pre><pre style="MARGIN-LEFT: 48pt; TEXT-INDENT: -48pt"><span style="FONT-SIZE: 12pt">答案：问随便其中的一个</span><span style="FONT-SIZE: 12pt">""""</span><span style="FONT-SIZE: 12pt">如果我问他</span><span style="FONT-SIZE: 12pt">(</span><span style="FONT-SIZE: 12pt">就是你问的旁边的那一个</span><span style="FONT-SIZE: 12pt">)</span><span style="FONT-SIZE: 12pt">哪条是通向地狱的路</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">他会怎么回答</span><span style="FONT-SIZE: 12pt">?""" </span><span style="FONT-SIZE: 12pt">这样问不管问到谁</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">得到的答案不对</span><span style="FONT-SIZE: 12pt"> ,</span><span style="FONT-SIZE: 12pt">也就是回答的正好是通向天堂的路</span><span style="FONT-SIZE: 12pt">.</span></pre><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt"> </pre><div><font color="#0000ff"><span style="FONT-SIZE: 12pt">24</span><span style="FONT-SIZE: 12pt">．一个旅行者遇到三个美女</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">他不知道哪个是天使</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">哪个是魔鬼</span><span style="FONT-SIZE: 12pt">.</span><span style="FONT-SIZE: 12pt">天使说真话</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">魔鬼说假话</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt">. <br /></span><span style="FONT-SIZE: 12pt">甲说</span><span style="FONT-SIZE: 12pt">:</span><span style="FONT-SIZE: 12pt">在乙和丙之间</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">至少有一个是天使</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt">. <br /></span><span style="FONT-SIZE: 12pt">乙说</span><span style="FONT-SIZE: 12pt">:</span><span style="FONT-SIZE: 12pt">在丙和甲之间</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">至少有一个是魔鬼</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt">. <br /></span><span style="FONT-SIZE: 12pt">丙说</span><span style="FONT-SIZE: 12pt">:</span><span style="FONT-SIZE: 12pt">我告诉你正确的消息吧</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt">. <br /><br /></span><span style="FONT-SIZE: 12pt">你能判断出有几个天使吗</span><span style="FONT-SIZE: 12pt">?</span></font></div><div> </div><div><span style="FONT-SIZE: 12pt">答案：两个！甲和乙！丙是魔鬼！</span><span style="FONT-SIZE: 12pt">因为：如果甲是魔鬼的话，那乙和丙都不是天使，也就是说乙说的话是假话，那么丙和甲就该都不是魔鬼！与前面假设不符，所以甲不可能是魔鬼！就是这样！！</span></div><div> </div><pre><font color="#0000ff"><span style="FONT-SIZE: 12pt">25</span><span style="FONT-SIZE: 12pt">．</span><span style="FONT-SIZE: 12pt">Lg</span><span style="FONT-SIZE: 12pt">假设每天从伦敦到纽约发一艘客轮，同时从纽约也发伦敦一艘，</span></font></pre><pre style="TEXT-INDENT: 24pt"><font color="#0000ff"><span style="FONT-SIZE: 12pt">路程用</span><span style="FONT-SIZE: 12pt">7</span><span style="FONT-SIZE: 12pt">天，问从伦敦发的客轮到达纽约时，中途和几艘客轮迎面相遇？</span></font></pre><pre style="TEXT-INDENT: 24pt"><font color="#0000ff"> </font></pre><pre style="MARGIN-LEFT: 23.95pt"><span style="FONT-SIZE: 12pt">答案：</span><span style="FONT-SIZE: 12pt">13</span><span style="FONT-SIZE: 12pt">，在它出发的时候在海上已经存在</span><span style="FONT-SIZE: 12pt">6</span><span style="FONT-SIZE: 12pt">艘船了，这样每天我们可以遇到</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">艘船，在到达的那一天只能遇到</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">艘，因为还有一艘是没有出发的。</span></pre><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt"><span style="FONT-SIZE: 12pt">   </span></pre><pre style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><font color="#0000ff"><span style="FONT-SIZE: 12pt">26 12</span><span style="FONT-SIZE: 12pt">个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就找到那个球。</span><span style="FONT-SIZE: 12pt">13</span><span style="FONT-SIZE: 12pt">个呢？（注意此题并未说明那个球的重量是轻是重，所以需要仔细考虑）（</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">分钟</span><span style="FONT-SIZE: 12pt">-1</span><span style="FONT-SIZE: 12pt">小时）</span></font></pre><pre style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><font color="#0000ff"> </font></pre><pre style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><span style="FONT-SIZE: 12pt">      </span><span style="FONT-SIZE: 12pt">答案：</span></pre><pre style="MARGIN-LEFT: 81.7pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">（1）<span style="FONT: 7pt -Times New Roman-">    </span></span><span style="FONT-SIZE: 12pt">分为</span><span style="FONT-SIZE: 12pt">444</span><span style="FONT-SIZE: 12pt">三组，取任意两个</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">放在天平上，如果平，那么在剩下的</span><span style="FONT-SIZE: 12pt">4</span><span style="FONT-SIZE: 12pt">个里，下面分为</span><span style="FONT-SIZE: 12pt">11</span><span style="FONT-SIZE: 12pt">称第二次，不管平不平都换掉一个，就会知道那个是要求的；</span></pre><pre style="MARGIN-LEFT: 81.7pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">（2）<span style="FONT: 7pt -Times New Roman-">    </span></span><span style="FONT-SIZE: 12pt">如果</span><span style="FONT-SIZE: 12pt">44</span><span style="FONT-SIZE: 12pt">不平，则把这</span><span style="FONT-SIZE: 12pt">8</span><span style="FONT-SIZE: 12pt">个分为</span><span style="FONT-SIZE: 12pt">233</span><span style="FONT-SIZE: 12pt">三种，用</span><span style="FONT-SIZE: 12pt">14</span><span style="FONT-SIZE: 12pt">题结合（</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">）的方法搞定即可。</span></pre><pre style="MARGIN-LEFT: 81.7pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 12pt">（3）<span style="FONT: 7pt -Times New Roman-">    </span></span><span style="FONT-SIZE: 12pt">如果</span><span style="FONT-SIZE: 12pt">13</span><span style="FONT-SIZE: 12pt">就分为</span><span style="FONT-SIZE: 12pt">445</span><span style="FONT-SIZE: 12pt">，先用</span><span style="FONT-SIZE: 12pt">44</span><span style="FONT-SIZE: 12pt">，不平用（</span><span style="FONT-SIZE: 12pt">1</span><span style="FONT-SIZE: 12pt">），平就取再取</span><span style="FONT-SIZE: 12pt">3</span><span style="FONT-SIZE: 12pt">个加入</span><span style="FONT-SIZE: 12pt">5</span><span style="FONT-SIZE: 12pt">中用（</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">）</span></pre><pre> </pre><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt"><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">27<span style="FONT: 7pt -Times New Roman-">           </span></span><span style="FONT-SIZE: 12pt; COLOR: #333333">门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系？</span></font></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333">答案：首先让</span><span style="FONT-SIZE: 12pt; COLOR: #333333">3</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个开关处于同一种状态（这时我们不知道是开还是关），然后改变其中两个，</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟后，再改变这两个中的一个，</span><span style="FONT-SIZE: 12pt; COLOR: #333333">5</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟后再改变两个中的另一个，然后进屋，根据灯泡的温度就可以知道对应关系了。（开的时间长短直接影响到进屋时候灯泡的温度，而且如果开始都是开着的，进屋时候有两个开着；如果开始是关着的，进屋时候有</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个是关着的。不管怎样</span><span style="FONT-SIZE: 12pt; COLOR: #333333">3</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个灯对应的温度都是热、温、凉三种）</span></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333"> </span></pre><pre><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">28</span><span style="FONT-SIZE: 12pt; COLOR: #333333">人民币为什么只有</span><span style="FONT-SIZE: 12pt; COLOR: #333333">1</span><span style="FONT-SIZE: 12pt; COLOR: #333333">、</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">、</span><span style="FONT-SIZE: 12pt; COLOR: #333333">5</span><span style="FONT-SIZE: 12pt; COLOR: #333333">、</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">的面值？</span></font></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333">答案：因为这样用这四种面试可以拼凑出来任何面值的钱</span></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333"></span></pre><pre><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">29</span><span style="FONT-SIZE: 12pt; COLOR: #333333">太阳总是从东边升起吗？</span></font></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333">答案：不是，如果我们站在极点上所有的方向都是一致的。在北极点，根本就没有</span><span style="FONT-SIZE: 12pt; COLOR: #333333">“</span><span style="FONT-SIZE: 12pt; COLOR: #333333">东方</span><span style="FONT-SIZE: 12pt; COLOR: #333333">”</span><span style="FONT-SIZE: 12pt; COLOR: #333333">这个方向。每一个方向都是南。在</span><span style="FONT-SIZE: 12pt; COLOR: #333333">6</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个月的</span><span style="FONT-SIZE: 12pt; COLOR: #333333">“</span><span style="FONT-SIZE: 12pt; COLOR: #333333">极昼</span><span style="FONT-SIZE: 12pt; COLOR: #333333">”</span><span style="FONT-SIZE: 12pt; COLOR: #333333">时间，太阳从南边升起从南边落下。另外在南极也一样，每一个方向都是北方。</span><span style="FONT-SIZE: 12pt; COLOR: #333333"><br /></span></pre></span></pre><pre style="MARGIN-LEFT: 30pt; TEXT-INDENT: -30pt; mso-char-indent-count: -2.5"><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Arial"><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">30</span><span style="FONT-SIZE: 12pt; COLOR: #333333">烧一根不均匀的绳需用一个小时，如何用它来判断半个小时？</span></font><pre><span style="FONT-SIZE: 12pt; COLOR: #333333"></span></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333">答案：这道题伶仃一看还以为和那个（</span><span style="FONT-SIZE: 12pt">有两根不均匀分布的香，香烧完的时间是一个小时，你能用什么方法来确定一段</span><span style="FONT-SIZE: 12pt">15</span><span style="FONT-SIZE: 12pt">分钟的时间？</span><span style="FONT-SIZE: 12pt; COLOR: #333333">）一样呢，其实只要两头一起点燃就可以得到半个小时了，呵呵，骗人的！</span></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333"></span></pre><pre><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">31</span><span style="FONT-SIZE: 12pt; COLOR: #333333">有</span><span style="FONT-SIZE: 12pt; COLOR: #333333">4</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个女人要过一座桥。她们都站在桥的某一边，要让她们在</span><span style="FONT-SIZE: 12pt; COLOR: #333333">17</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟内全部通过这座桥。这时是晚上。她们只有一个手电筒。最多只能让两个人同时过桥。不管是谁过桥，不管是一个人还是两个人，必须要带着手电筒。手电筒必须要传来传去，不能扔过去。每个女人过桥的速度不同，两个人的速度必须以较慢的那个人的速度过桥。</span></font><span style="FONT-SIZE: 12pt; COLOR: #333333"><font color="#0000ff"><br /></font></span><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333">　　第一个女人：过桥需要</span><span style="FONT-SIZE: 12pt; COLOR: #333333">1</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟；</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333"><br /></span><span style="FONT-SIZE: 12pt; COLOR: #333333">　　第二个女人：过桥需要</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟；</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333"><br /></span><span style="FONT-SIZE: 12pt; COLOR: #333333">　　第三个女人：过桥需要</span><span style="FONT-SIZE: 12pt; COLOR: #333333">5</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟；</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333"><br /></span><span style="FONT-SIZE: 12pt; COLOR: #333333">　　第四个女人：过桥需要</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟。</span></font><font color="#0000ff"><span style="FONT-SIZE: 12pt; COLOR: #333333"><br /></span><span style="FONT-SIZE: 12pt; COLOR: #333333">　　比如，如果第一个女人与第</span><span style="FONT-SIZE: 12pt; COLOR: #333333">4</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个女人首先过桥，等她们过去时，已经过去了</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟。如果让第</span><span style="FONT-SIZE: 12pt; COLOR: #333333">4</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个女人将手电筒送回去，那么等她到达桥的另一端时，总共用去了</span><span style="FONT-SIZE: 12pt; COLOR: #333333">20</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟，行动也就失败了。怎样让这</span><span style="FONT-SIZE: 12pt; COLOR: #333333">4</span><span style="FONT-SIZE: 12pt; COLOR: #333333">个女人在</span><span style="FONT-SIZE: 12pt; COLOR: #333333">17</span><span style="FONT-SIZE: 12pt; COLOR: #333333">分钟内过桥？还有别的什么方法？</span></font><pre><span style="FONT-SIZE: 12pt; COLOR: #333333"></span></pre><pre><span style="FONT-SIZE: 12pt; COLOR: #333333">答案：过河的问题，他们的思路就是要有去有回，这道题主要就是要让时间尽可能的少用，那么最好的就是让大时间</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">、</span><span style="FONT-SIZE: 12pt; COLOR: #333333">5</span><span style="FONT-SIZE: 12pt; COLOR: #333333">一起过去，又不用回来，于是我们按照下面的方法过桥：</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">和</span><span style="FONT-SIZE: 12pt; COLOR: #333333">1</span><span style="FONT-SIZE: 12pt; COLOR: #333333">一起，</span><span style="FONT-SIZE: 12pt; COLOR: #333333">1</span><span style="FONT-SIZE: 12pt; COLOR: #333333">回来，用时</span><span style="FONT-SIZE: 12pt; COLOR: #333333">3</span><span style="FONT-SIZE: 12pt; COLOR: #333333">；</span><span style="FONT-SIZE: 12pt; COLOR: #333333">10</span><span style="FONT-SIZE: 12pt; COLOR: #333333">和</span><span style="FONT-SIZE: 12pt; COLOR: #333333">5</span><span style="FONT-SIZE: 12pt; COLOR: #333333">一起，</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">回来，用时</span><span style="FONT-SIZE: 12pt; COLOR: #333333">12</span><span style="FONT-SIZE: 12pt; COLOR: #333333">；</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">和</span><span style="FONT-SIZE: 12pt; COLOR: #333333">1</span><span style="FONT-SIZE: 12pt; COLOR: #333333">一起再过去，用时</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">。一共用时</span><span style="FONT-SIZE: 12pt; COLOR: #333333">3</span><span style="FONT-SIZE: 12pt; COLOR: #333333">＋</span><span style="FONT-SIZE: 12pt; COLOR: #333333">12</span><span style="FONT-SIZE: 12pt; COLOR: #333333">＋</span><span style="FONT-SIZE: 12pt; COLOR: #333333">2</span><span style="FONT-SIZE: 12pt; COLOR: #333333">＝</span><span style="FONT-SIZE: 12pt; COLOR: #333333">17</span><span style="FONT-SIZE: 12pt; COLOR: #333333">，呵呵，有意思把！</span></pre></pre></span></pre></span></div><img src ="http://www.cnitblog.com/zouzheng/aggbug/21826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-12 19:38 <a href="http://www.cnitblog.com/zouzheng/articles/21826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言面试题（转载）</title><link>http://www.cnitblog.com/zouzheng/articles/21737.html</link><dc:creator>zz</dc:creator><author>zz</author><pubDate>Wed, 10 Jan 2007 14:04:00 GMT</pubDate><guid>http://www.cnitblog.com/zouzheng/articles/21737.html</guid><wfw:comment>http://www.cnitblog.com/zouzheng/comments/21737.html</wfw:comment><comments>http://www.cnitblog.com/zouzheng/articles/21737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zouzheng/comments/commentRss/21737.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zouzheng/services/trackbacks/21737.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 发布之前先申明两点：     1 所有资料来自网络(主要是CSDN)，本人只是收集和转发。     2 所有问题解答(尤其是代码)只是参考，不保证正确。 先发基本问题，再发编程问题..........     free131(白日?做梦!) ( ) 信誉：100  2006-4-17 10:00:18  得分: 0           4.    static有什么用途？（请至少说明两种） 1.限...&nbsp;&nbsp;<a href='http://www.cnitblog.com/zouzheng/articles/21737.html'>阅读全文</a><img src ="http://www.cnitblog.com/zouzheng/aggbug/21737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zouzheng/" target="_blank">zz</a> 2007-01-10 22:04 <a href="http://www.cnitblog.com/zouzheng/articles/21737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>