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

📄 教学--第十七章 数组(二).htm

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {0,0,0,0,0,0,0},</SPAN>
      <P><SPAN lang=en-us>};</SPAN>
      <P> 
      <P>请改动例三的程序,<SPAN lang=zh-cn>但不允许改变数组A的元素值</SPAN>,使之打印出一个躺着的“A”。下面是输出结果:
      <P align=center><IMG height=112 src="教学--第十七章 数组(二).files/ls17.h5.gif" 
      width=56 border=0>
      <P>请大家想想如何实现,具体代码请见课程配套代码源文件。
      <P> 
      <H4><SPAN lang=zh-cn><A name=17.3.2>17.3.2</A> 二维数组在班级管理程序中应用</SPAN></H4>
      <P><B>例五: </B>多个班级的成绩管理
      <P> 
      <P>以前我们做过单个班级,或整个学校的成绩,那时都是将所有学生进行统一编号。事实上,不同的班级需要各自独立的编号。
      <P>比如初一年段有4个班级,每个班级最多40人。那么很直观地,该成绩数据对应于这样一个二维数组:
      <P> 
      <P><SPAN lang=en-us>int cj[4][40];</SPAN>
      <P> 
      <P>在这里,数组的高维(第二维)和低维(第一维)具备了现实意义。例中,4代表4个班级,40代表每个班级中最多有40个学生。因此低维代表班级中学生的编号,高维代表班级的编号。这和现实的逻辑是对应的:现实中,我们也认为班级的编号应当比学员的编号高一级,对不?你向别人介绍说:“我是2班的24号”,而不是“我是24号的2班”。
      <P> 
      <P>一个可以管理多个班级的学生成绩的程序,涉及到方方面面,本例的重点仅在于:请掌握如何将现实中的具有高低维信息,用二维数组表达出来。并不是所有具有二维信息的现实数据,都需要明确地区分高低维,比如一个长方形,究竟”长“算”高维还是“宽”算高维?这就无所谓了。但另外一些二维数据,注意到它们的高低维区分,可以更直观地写出程序。
      <P> 
      <P>闲话少说,现在问,2班24号的成绩是哪个?你应该回答:<SPAN lang=en-us> cj[1][23]; 
      </SPAN>——最后一次提醒,C++中的数组下标从0开始,无论是一维二维还是更多维的数组,所以2班24号对应的是下标是<SPAN 
      lang=en-us>1</SPAN>和23。
      <P> 
      <P>我们要实现以下管理:
      <P> 
      <P>1、录入成绩,用户输入班级编号,然后输入该班每个学员的成绩;
      <P>2、清空成绩,用户输入班级编号,程序将该班学员的成绩都置为0;
      <P>3、输出成绩,用户输入班级编号,程序将该班学员成绩按每行10个,输出到屏幕;
      <P>4、查询成绩,用户输入班级编号和学员编号,程序在屏幕上打出该学员成绩。
      <P><SPAN lang=en-us>5</SPAN>、统计成绩,用户输入班级编号,程序输出该班级合计成绩和平均成绩。
      <P>0、退出。
      <P> 
      <P>看上去,这是一个稍微大点的程序了。
      <P>我们已经学过函数,所以上面的四个功能都各用一个函数来实现。另外,“让用户输入班级编号”等动作,我们也分别写成独立的函数。
      <P>四个功能中,都需要对各班级学员成绩进行处理,所以我们定义一个全局的二维数组。
      <P>下面我们一步一步实现。
      <P> 
      <P><B>第一步:定义全局二维数组,加入基本的头文件。</B>
      <P> 
      <P>第一步的操作结果应是这样<SPAN lang=en-us>(</SPAN>黑色部分为需要加入的代码<SPAN 
      lang=en-us>)</SPAN>:
      <P> 
      <P>//--------------------------------------------------------------------------
      <P>//支持多班级的成绩管理系统
      <P>#pragma hdrstop
      <P><B>#include &lt;iostream.h&gt;</B>
      <P>//---------------------------------------------------------------------------
      <P><B><SPAN lang=en-us>#define CLASS_COUNT 
      4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //</SPAN>4个班级</B>
      <P><B><SPAN lang=en-us>#define CLASS_STUDENT_COUNT 40 </SPAN>&nbsp;<SPAN 
      lang=en-us> </SPAN>//每班最多40个学员</B>
      <P> 
      <P><B><SPAN lang=en-us>//</SPAN>定义一个全局二维数组变量,用于存储多班成绩:</B>
      <P><B><SPAN lang=en-us>int cj[CLASS_COUNT][CLASS_STUDENT_COUNT];&nbsp; 
      //</SPAN>提示:全局变量会被自动初始化为全0。</B>
      <P><B><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //</SPAN>所以一开始该<SPAN lang=en-us>cj</SPAN>数组中每个成绩均为0。</B>
      <P> 
      <P>#pragma argsused
      <P>int main(int argc, char* argv[])
      <P>{
      <P><SPAN lang=en-us>&nbsp;&nbsp; </SPAN>return 0;
      <P>}
      <P>//---------------------------------------------------------------------------<BR> 
      <P><B>第二步:加入让用户选择功能的函数。</B>
      <P> 
      <P>我们大致按从上而下方法来写这个程序。该程序首先要做的是让用户选择待执行功能。下面的函数实现这个界面。
      <P> 
      <P>//函数:提供一个界面,让用户选择功能:
      <P><SPAN lang=en-us>//</SPAN>返回值:1~5, 待执行的功能,0:退出程序
      <P><SPAN lang=en-us>int SelectFunc()</SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; int selected;</SPAN>
      <P> 
      <P><SPAN lang=en-us>&nbsp;&nbsp; do </SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; {</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; 
      "</SPAN>请选择:<SPAN lang=en-us>(0~5)"&nbsp;&nbsp; &lt;&lt; endl;</SPAN>
      <P> 
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; 
      "</SPAN>1、录入成绩<SPAN lang=en-us>" &lt;&lt; endl</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &lt;&lt; "</SPAN>2、清空成绩<SPAN lang=en-us>" &lt;&lt; endl</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &lt;&lt; "3</SPAN>、输出成绩<SPAN lang=en-us>" &lt;&lt; endl</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &lt;&lt; "4</SPAN>、查询成绩<SPAN lang=en-us>" &lt;&lt; endl</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &lt;&lt; "5</SPAN>、统计成绩<SPAN lang=en-us>" &lt;&lt; endl</SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      &lt;&lt; "0</SPAN>、退出<SPAN lang=en-us>" &lt;&lt; endl;</SPAN>
      <P> 
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; selected;</SPAN>
      <P><SPAN lang=en-us>&nbsp; }</SPAN>
      <P><SPAN lang=en-us>&nbsp; while(selected &lt; 0 || selected &gt; 5); 
      //</SPAN>如果用户输入0~5范围之外的数字,则重复输入。
      <P> 
      <P><SPAN lang=en-us>&nbsp; return selected;</SPAN>
      <P><SPAN lang=en-us>}</SPAN>
      <P> 
      <P>函数首先输入1到5项功能,及0<SPAN lang=en-us>:</SPAN>用于退出。注意我们用了一个<SPAN 
      lang=en-us>do...while</SPAN>循环,循环继续的条件是用户输入有误。<SPAN 
      lang=en-us>do...while</SPAN>流程用于这类目的,我们已经不是第一次了。
      <P>函数最后返回<SPAN lang=en-us> selected </SPAN>的值。
      <P> 
      <P>这个函数代码最好放在下面位置:
      <P> 
      <P><SPAN lang=en-us>......</SPAN>
      <P><SPAN lang=en-us>int cj[CLASS_COUNT][CLASS_STUDENT_COUNT]; </SPAN>
      <P><SPAN 
      lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>
      <P><B><FONT color=#0000ff><SPAN lang=en-us>/*</SPAN></FONT></B>
      <P> 
      <P><SPAN lang=en-us><FONT color=#0000ff><B>&nbsp; 
      </B></FONT></SPAN><B><FONT color=#0000ff><SPAN 
      lang=en-us>&nbsp;&lt;&lt;&lt;&lt; </SPAN>前面<SPAN 
      lang=en-us>SelectFunc</SPAN>()函数的实现代码加在此处。</FONT></B>
      <P> 
      <P><SPAN lang=en-us><FONT color=#0000ff><B>*/</B></FONT></SPAN>
      <P> 
      <P>#pragma argsused
      <P>int main(int argc, char* argv[])
      <P><SPAN lang=en-us>......</SPAN>
      <P> 
      <P>为了验证一下我们关于该函数是否能正常工作,我们可以先把它在<SPAN lang=en-us>main()</SPAN>函数内用一下:
      <P> 
      <P><SPAN lang=en-us>int main</SPAN>(int argc, char* argv[])
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us><B>&nbsp;&nbsp;&nbsp; <FONT 
      color=#008080>SelectFunc();</FONT></B></SPAN>
      <P><SPAN lang=en-us>}</SPAN>
      <P>按<SPAN lang=en-us>Ctrl + F9 
      </SPAN>编译,如果有误,只现在就参照本课程或源代码改正。如果一切顺利,则你会发现这个函数工作得很好。那么,删掉用于调试的<FONT 
      color=#008080><B>:</B></FONT>
      <P><FONT color=#008080><B><SPAN lang=en-us>SelectFunc();</SPAN></B></FONT>
      <P>这一行,我们开始下一个函数。
      <P> 
      <P><B>第三步:辅助函数:用户输入班级编号等。</B>
      <P> 
      <P>“录入、清空、统计”成绩之间,都需要用户输入班级编号。而“查询成绩”则要求用户输入班级编号及学号,所以这一步我们来实现这两个函数。
      <P> 
      <P><SPAN lang=en-us>//</SPAN>用户输入班级编号:
      <P><SPAN lang=en-us>int SelectClass()</SPAN>
      <P><SPAN lang=en-us>{</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; int classNumber; //</SPAN><SPAN 
      lang=zh-cn>班级编号</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; do</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; 
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout 
      &lt;&lt; "</SPAN><SPAN lang=zh-cn>请输入班级编号:</SPAN><SPAN 
      lang=en-us>(1~4)";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      cin &gt;&gt; classNumber;</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp; }</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp; while(classNumber &lt; 1 || 
      classNumber &gt; CLASS_COUNT);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      return classNumber - 1;</SPAN>
      <P><SPAN lang=en-us>}</SPAN>
      <P> 
      <P><SPAN lang=en-us>SelectClass </SPAN><SPAN lang=zh-cn>和</SPAN> 
      SelectFunc<SPAN lang=zh-cn> 
      中的流程完全一样。为了适应普通用户的习惯,我们让他们输入1~4,而不是0~3</SPAN>,<SPAN 
      lang=zh-cn>所以最后需要将</SPAN>classNumber<SPAN lang=zh-cn>减1后再返回。</SPAN>
      <P> 
      <P><SPAN 
      lang=zh-cn>另外一个函数是用户在选择“成绩查询”时,我们需要他输入班级编号和学生学号。前面的</SPAN>SelectClass()<SPAN 
      lang=zh-cn>已经实现班级选级,我们只需再写一个选级学号的函数</SPAN>SelectStudent<SPAN 
      lang=zh-cn>即可。并且</SPAN>SelectStudent<SPAN 
      lang=zh-cn>和</SPAN>SelectClass<SPAN 
      lang=zh-cn>除了提示信息不一样,没什么不同的。我们不写在此。</SPAN>
      <P> 
      <P><B><SPAN lang=zh-cn>第四步:录入、清空、查询、统计成绩功能的一一实现。</SPAN></B>
      <P> 
      <P><SPAN lang=zh-cn>//录入成绩</SPAN>
      <P>//<SPAN lang=zh-cn>参数</SPAN> classNumber: <SPAN lang=zh-cn>班级编号</SPAN>
      <P>void InputScore(int classNumber)
      <P>{
      <P>&nbsp;&nbsp; /*
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN 
      lang=zh-cn>一个班级最多40个学员,但也可以少于40个,所以我们规定,当用户输入-1时,表示已经输入完毕。</SPAN>
      <P>&nbsp; */
      <P> 
      <P>&nbsp; //<SPAN lang=zh-cn>判断</SPAN>classNumber<SPAN 
      lang=zh-cn>是否在合法的范围内:</SPAN>
      <P>&nbsp; if(classNumber &lt; 0 || classNumber &gt;= <SPAN 
      lang=en-us>CLASS_COUNT)</SPAN>
      <P><SPAN lang=en-us>&nbsp;&nbsp;&nbsp;&nbsp; return;</SPAN>
      <P> 
      <P>&nbsp; //<SPAN lang=zh-cn>提示字串:</SPAN>
      <P>&nbsp; cout &lt;&lt; "<SPAN lang=zh-cn>请输入</SPAN>" &lt;&lt; classNumber 
      + 1 &lt;&lt; "<SPAN lang=zh-cn>班的学生成绩。</SPAN>" &lt;&lt; endl;
      <P>&nbsp; cout &lt;&lt; "<SPAN lang=zh-cn>输入-1表示结束。</SPAN>" &lt;&lt; endl;
      <P> 
      <P>&nbsp; for(int i=0; i &lt; <SPAN lang=en-us>CLASS_STUDENT_COUNT; 
      i++)</SPAN>
      <P><SPAN lang=en-us>&nbsp; {</SPAN>
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "<SPAN lang=zh-cn>请输入</SPAN>" 
      &lt;&lt; i+1 &lt;&lt; "<SPAN lang=zh-cn>号学员成绩:</SPAN>";
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; cj[classNumber][i];&nbsp;&nbsp; 
      //cj <SPAN lang=zh-cn>是全局变量,所以这里可以直接用。</SPAN>
      <P> 
      <P>&nbsp;&nbsp;&nbsp;&nbsp; //<SPAN lang=zh-cn>判断是否为-1,若是,跳出循环:</SPAN>
      <P>&nbsp;&nbsp;&nbsp;&nbsp; if( -1 == cj[classNumber][i])
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
      <P><SPAN lang=en-us>&nbsp; }</SPAN>&nbsp;&nbsp; 
      <P>}
      <P>//----------------------------------------------------
      <P>//<SPAN lang=zh-cn>清空成绩:</SPAN>
      <P>void ClearScore(int classNumber)
      <P>{
      <P>&nbsp; //<SPAN lang=zh-cn>判断</SPAN>clas

⌨️ 快捷键说明

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