⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第16章 数组(一).htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '3' : cout &lt;&lt; cj3 &lt;&lt; 
      endl; break;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '4' : cout &lt;&lt; cj4 &lt;&lt; 
      endl; break;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '5' : cout &lt;&lt; cj5 &lt;&lt; 
      endl; break;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '6' : cout &lt;&lt; cj6 &lt;&lt; 
      endl; break;</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其它的,输出出错消息:</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default :&nbsp; cout &lt;&lt; "您的输入有误!" 
      &lt;&lt; endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
      <P>&nbsp; }</P>
      <P>}</P>
      <P>while(c != '0') ; //用户输入‘0’,表示退出</P>
      <P>......</P>
      <P> </P>
      <P>手有点酸,不过毕竟实现了查询功能。小王把写好的程序拿到系主任那里一运行,主任<SPAN 
      lang=zh-cn>的眼睛透过厚厚的眼镜片闪闪发光……</SPAN>并且开始打听“没有弯路,编程摇篮”的网址。然后他说:“小王,你这个程序太好了!我们完全有必要把它发扬光大!你这就把程序稍作修改,扩展到整个学校的5000个学生的成绩都可以查询……”</P>
      <P>“5000个学生?我岂不要定义5000个成绩变量……”小王眼前一黑,倒在地上。</P>
      <P> </P>
      <H3><A name=16.2>16.2</A> 数组的定义及使用</H3>
      <P><SPAN lang=zh-cn>请从下面的实例中讲解,数组变量与我们以前学过的普通变量在定义和使用上有什么区别。</SPAN></P>
      <H4><SPAN lang=en-us><A name=16.2.1>16.2.1</A> </SPAN>实例演示</H4>
      <P>处理5000个学员的成绩,是否需要定义5000个变量?</P>
      <P>现实生活中有大量的数据类似于此,它们<B>有相同的类型,需要的处理的方法也一致</B>。 
      为了实现对这些数据统一表达和处理,C,C++提供了“数组”这一数据结构。</P>
      <P> </P>
      <P><B>数据类型 数组变量名[个数常量];</B></P>
      <P> </P>
      <P>和普通变量定义的语法:数据类型 变量名;相比,主要是多了一个“[个数]”。</P>
      <P> </P>
      <P>定义数组时,方括号内的数值指明该数组包含几个元素;使用数组时,方括号内的数值表示:使用的是第几个元素。为了直观,我假设可以用汉字来命名变量:</P>
      <P><SPAN lang=en-us>int </SPAN>抽屉<SPAN lang=en-us>[100];</SPAN></P>
      <P>这里定义了一个“抽屉数组”,这个数组包含了100个抽屉。</P>
      <P>而在使用时:</P>
      <P><SPAN lang=en-us>int a = </SPAN>抽屉<SPAN lang=en-us>[10];</SPAN></P>
      <P>这里的10表示我们要使用第10个抽屉(其实是第11个,见后)。</P>
      <P> </P>
      <P>还是来看小王老师的学生成绩管理系统吧。因为主任说要管理5000个学生成绩,那么,我们就得定义一个成绩数组,包含5000个元素。</P>
      <P> </P>
      <P>int&nbsp; cj[5000];</P>
      <P> </P>
      <P><B>这一行我们就相当于定义了5000个int类型的变量</B>。这5000个变量有个统一的名字:cj。为了区分出每个变量,还需要使用“[下标]”的格式指明。下标从0开始,一直到4999。比如,第一变量是: 
      cj[0],第二个为:cj[1]……最后一个是cj[4999]。</P>
      <P>强调:<B>在C,C++中,数组的下标从0开始</B>。因此,我们定义了数组 int cj[5000];得到的是从cj[0] ~ 
      cj[4999]的变量,而不是cj[1] ~ cj[5000]。</P>
      <P> </P>
      <P>比如,让第100个学员的成绩为80:</P>
      <P>cj[99] = 80; </P>
      <P>为什么是99而不是100?因为数组的下标从0开始。</P>
      <P>再比如,让变量a等于第100个学员的成绩:</P>
      <P>int a = cj[99];</P>
      <P> </P>
      <P>有了“数组”这个新武器,要解决前面全校成绩查询问题,一下子变得简单了。</P>
      <P> </P>
      <P>......</P>
      <P>//定义一个含5000个元素的数组,用于存入5000个学生的成绩:</P>
      <P>int cj[<I><SPAN lang=en-us>5000</SPAN></I>];</P>
      <P> </P>
      <P>//总成绩,平均成绩:</P>
      <P>int zcj=0, pjcj;</P>
      <P> </P>
      <P>//仍然可以用我们熟悉的循环来实现输入:</P>
      <P>for(int i=0; i&lt;<I>5000</I>; i++)&nbsp; //i从0开始,到第49999(含)个结束。</P>
      <P>{</P>
      <P>&nbsp;&nbsp; cout &lt;&lt; "请输入第" &lt;&lt; i+1 &lt;&lt; "学员的成绩:";</P>
      <P>&nbsp;&nbsp; cin &gt;&gt; cj[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //输入数组中第i个元素</P>
      <P>&nbsp;&nbsp; </P>
      <P>&nbsp;&nbsp; //不断累加总成绩:</P>
      <P>&nbsp;&nbsp; zcj += 
      cj[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </P>
      <P>}</P>
      <P> </P>
      <P>//平均成绩:</P>
      <P>pjcj = zcj / <I>5000</I>;</P>
      <P> </P>
      <P>//输出:</P>
      <P>cout &lt;&lt; "总成绩:" &lt;&lt; zcj &lt;&lt; endl;</P>
      <P>cout &lt;&lt; "平均成绩:" &lt;&lt; pjcj &lt;&lt; endl;</P>
      <P> </P>
      <P>//下面实现查询:</P>
      <P>int i; </P>
      <P> </P>
      <P>do</P>
      <P>{</P>
      <P>&nbsp;&nbsp; cout &lt;&lt; "请输入您要查询的学生次序号(1<SPAN lang=en-us> 
      </SPAN>~<SPAN lang=en-us> </SPAN>" &lt;&lt; <I>5000</I> &lt;&lt; "):" 
;</P>
      <P>&nbsp;&nbsp; cin &gt;&gt; i;</P>
      <P> </P>
      <P>&nbsp;&nbsp; if( i &gt;= 1 &amp;&amp; i &lt;= <I>5000</I>)</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; cj[i-1] &lt;&lt; endl; 
      <FONT color=#ff0000>//问:为什么索引是 i-1,而不是 i ?</FONT></P>
      <P>&nbsp;&nbsp; }</P>
      <P>&nbsp;&nbsp; else if( i != 0)</P>
      <P>&nbsp;&nbsp; {</P>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "您的输入有误!" &lt;&lt; 
      endl;</P>
      <P>&nbsp;&nbsp; }</P>
      <P>}</P>
      <P>while(i != 0);&nbsp; //用户输入数字0,表示结束。</P>
      <P>......</P>
      <P> </P>
      <P>代码用了两个循环——是的,<B>有了数组,你会发现循环流程将用得越来越多</B>——<SPAN lang=zh-cn>第一个</SPAN> 
      for <SPAN lang=zh-cn>循环用以输入5000个成绩。第二个do...while 循环用以查询。用户可以输入</SPAN><SPAN 
      lang=en-us>1</SPAN>到5000之内的数字(和现实生活习惯一致)。</P>
      <P> </P>
      <P>下面要复习“宏”的知识。如果学校多了一个学生,那么我们就得将上面所有以斜体标出的“5000”改为5001。这是一件让人觉得无趣,且很容易出错的工作。另外,现在我们要调试这段程序,难道你真的有耐心输入5000个成绩?在调试时,我们可能希望只输入5个成绩。</P>
      <P>这时我们可以使用“宏”。下面的代码中,先是定义了一个宏:MAX_CJ_COUNT,而后所有立即数5000都用它来表示。当我们需要改变人数时,只需更改MAX_CJ_COUNT的宏定义。</P>
      <P> </P>
      <P>//定义一个含5000个元素的数组,用于存入5000个学生的成绩:</P>
      <P>#define MAX_CJ_COUNT&nbsp; 5000 //定义一个宏,方便修改为实际学生人数。</P>
      <P>int cj[MAX_CJ_COUNT];</P>
      <P> </P>
      <P>以下代码<SPAN lang=zh-cn>略。</SPAN>有关宏的用处,请复习:<A 
      href="http://www.d2school.com/bcyl/bhcpp/newls/ls05.php#5.3.2" 
      name=5.3.2>5.3.2 用宏表示常数</A></P>
      <P> </P>
      <P><B>除非确实可以一次决定某数组的大小,否则,使用一个意义明确的宏来定义数组的大小,总是一个不错的主意。</B></P>
      <H4><A name=16.2.2>16.2.2</A> 个数<SPAN lang=zh-cn>定义</SPAN>必须是常量</H4>
      <P>再一看眼数组定义的语法:</P>
      <P>数据类型 数组变量名[个数<FONT color=#ff0000>常量</FONT>];</P>
      <P> </P>
      <P>注意“常量”两字,这说明,个数必须是一个可以事先决定的值,并且该值不能被改变。</P>
      <P>比如用立即数: </P>
      <P>int arr[5000]; </P>
      <P> </P>
      <P>或者用宏:</P>
      <P>#define MAX_CJ_COUNT&nbsp; 5000</P>
      <P>int arr[MAX_CJ_COUNT]; </P>
      <P> </P>
      <P>或者用常量:</P>
      <P>const int max_cj_count = 5000;</P>
      <P>int arr[max_cj_count];</P>
      <P> </P>
      <P>就是<FONT color=#ff0000>不能</FONT>用变量:</P>
      <P>int max_cj_count =&nbsp; 5000; </P>
      <P>int arr[max_cj_count];&nbsp;&nbsp; // error! 不能用变量指定数组的大小。</P>
      <P> </P>
      <P>为什么呢?因为数组占用的内存空间大小必须在程序<SPAN 
      lang=zh-cn>编译</SPAN>时决定,并且一旦决定了,就不能再改变。所以只能用常量(不变的量)来指明数组的大小。当然,这是指在数据区或栈区分配内存(和程序有一样的全存期),如果是在堆区,则可以动态地分配数组的大小,这些我们在指针一章里讲。</P>
      <P>有关常量和变量的区别,如果有所不清,请前面章节内容。</P>
      <P> </P>
      <H3><A name=16.3>16.<SPAN lang=en-us>3</SPAN></A> 如何给数组中的元素赋值</H3>
      <P>如果把单个变量看成是“游兵散勇”的话,那么数组对应的是“集团”。集团的“兵”就是我们前面说的数组的元素。这些“兵”不再有单独的名字,而是统一使用编号来区别,这个编号,我们称为“下标”。</P>
      <P>在和数组打交道时,我们需要分清:是对整个数组操作,还是对数组中的单个元素进行操作。</P>
      <P> </P>
      <H4><A name=16.3.1>16.3.1</A> 在定义数组时初始化。</H4>
      <P>普通变量可以在定义时同时赋初值:</P>
      <P>int a = 100;</P>
      <P>也可以在定义以后才赋值:</P>
      <P>int a;</P>
      <P>a = 100;</P>
      <P> </P>
      <P>对于数组变量,则只能在定义时,对<B>整个数组</B>赋初值:</P>
      <P> </P>
      <P>数据类型 数组变量名[个数] = {元素1初值,元素2初值,};</P>
      <P> </P>
      <P>即,将初值用一对 {} ( 花括号 )括起来,相邻的值之间用逗号分隔。</P>
      <P> </P>
      <P>比如:</P>
      <P>int arr[10] = {9,8,7,6,5,4,3,2,1,0};</P>
      <P>上面定义一了个数组 
      arr,共10个元素。初始值为从9到0。即,执行上面代码以后,arr[0]值为10,arr[1]值为9……arr[9]值为0。</P>
      <P> </P>
      <P><B>在初始化赋值是时,注意所给值的个数不能超过数组的大小</B>,比如:</P>
      <P>int arr[10] = {10,9,8,7,6,5,4,3,2,1,0};&nbsp; //错误!越界了</P>
      <P>你定义了数组为10个元素,可是你却赋给它11个值,这称为数组越界:你在宾馆里预定了10间房,你却让11个人去住,多出的那个人挤在哪里呢?编译器遇上这类问题时,很明智地停了下来。</P>
      <P> </P>
      <P><B>不过,你可以给它少于定义个数的初值</B>:</P>
      <P>int arr[10] = 
      {9,8,7,5};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //允许</P>
      <P>你定义了数组为10个元素,但你可以给它少于10个的初始值。那些没有得到初始值的元素值是多少呢?对于全局变量来说,将被编译器初始化为0,对于局部变量而言,则是未定义的值(不可预测的值)。如果只定义数组,没有对其进行任何初始化,同样适于本情况。所有元素的初值均依本数组是全局或局部变量而定,为0或未定义值。</P>
      <P> </P>
      <P>可以跳过一两个元素不初始化吗?如:</P>
      <P>int arr[10] =&nbsp; {9,,7,,6};&nbsp; //跳过中间的某些元素,C:OK;C++: Erro<SPAN 
      lang=en-us>r</SPAN>。</P>
      <P>因为我们主要学习C++,所以认为<B>跳过数组中某些元素的初始化赋值是错误的</B>。</P>
      <P>也就是说,你尽可以先预定下多个房间,然后先只派部分人去住。不过C说:允许你们跳着房号住,而C++则要求依次住下,把空房留在后面。</P>
      <P> </P>
      <P>你还可以不指定数组元素个数,直接通过对其初始化来让编译器得到它的实际个数:</P>
      <P> </P>
      <P>int arr[] = {9,8,7};&nbsp; //元素个数为: 3</P>
      <P>即,<B>在未指定义大小时,则初始值的个数就是数组元素的个数</B>。</P>
      <P> </P>
      <P>不过,你<B>不能既不指定数组元素个数,也不进行初始化</B>:</P>
      <P>int arr[];&nbsp;&nbsp; //Error, 到底是几个元素?</P>
      <P>这也没有什么不好理解的,去几个人,就开几个房间。让宾馆老板自已去数人头,我们不必非得自已报人数——前提是,房客一个一个的都得事先现身。</P>
      <P> </P>
      <H4><A name=16.3.2>16.3.2</A> <SPAN lang=zh-cn>在定义之后为元素赋值</SPAN></H4>
      <P>很多时候,我们无法在定义数组的同时就知道数组中各元素的值,所以,这时需要在定义以后各数组中的各个元素赋值。记住,此时只能对<B>单个元素</B>进行直接操作。这和普通变量不一样,下面的代码是错误的:</P>
      <P> </P>
      <P>int arr[5];</P>
      <P>...</P>
      <P>arr[5] = {1,2,3,4,5}; //错,在编译器看来,<SPAN lang=en-us>arr[5]</SPAN>是数组<SPAN 
      lang=en-us>arr</SPAN>的第6个元素。</P>
      <P>//或</P>
      <P>arr = {1,2,3,4,5};&nbsp;&nbsp; //错,仍然不行。</P>
      <P>这一点和普通变量不一样。也就是说,对数组整体的初始化,只能在定义时实行。</P>
      <P> </P>
      <P>大都数情况,我们这样改变数组中某个元素的值:</P>
      <P> </P>
      <P>int arr[5];</P>
      <P> </P>
      <P><SPAN lang=en-us>arr[0] = 95;&nbsp; </SPAN></P>
      <P>arr[1] = 89;</P>
      <P>arr[2] = 100;</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -