📄 教学--第十七章 数组(二).htm
字号:
<P><SPAN lang=en-us> {0,0,0,0,0,0,0},</SPAN>
<P><SPAN lang=en-us> {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 <iostream.h></B>
<P>//---------------------------------------------------------------------------
<P><B><SPAN lang=en-us>#define CLASS_COUNT
4
//</SPAN>4个班级</B>
<P><B><SPAN lang=en-us>#define CLASS_STUDENT_COUNT 40 </SPAN> <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];
//</SPAN>提示:全局变量会被自动初始化为全0。</B>
<P><B><SPAN
lang=en-us>
//</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> </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> int selected;</SPAN>
<P>
<P><SPAN lang=en-us> do </SPAN>
<P><SPAN lang=en-us> {</SPAN>
<P><SPAN lang=en-us> cout <<
"</SPAN>请选择:<SPAN lang=en-us>(0~5)" << endl;</SPAN>
<P>
<P><SPAN lang=en-us> cout <<
"</SPAN>1、录入成绩<SPAN lang=en-us>" << endl</SPAN>
<P><SPAN
lang=en-us>
<< "</SPAN>2、清空成绩<SPAN lang=en-us>" << endl</SPAN>
<P><SPAN
lang=en-us>
<< "3</SPAN>、输出成绩<SPAN lang=en-us>" << endl</SPAN>
<P><SPAN
lang=en-us>
<< "4</SPAN>、查询成绩<SPAN lang=en-us>" << endl</SPAN>
<P><SPAN
lang=en-us>
<< "5</SPAN>、统计成绩<SPAN lang=en-us>" << endl</SPAN>
<P><SPAN
lang=en-us>
<< "0</SPAN>、退出<SPAN lang=en-us>" << endl;</SPAN>
<P>
<P><SPAN lang=en-us> cin >> selected;</SPAN>
<P><SPAN lang=en-us> }</SPAN>
<P><SPAN lang=en-us> while(selected < 0 || selected > 5);
//</SPAN>如果用户输入0~5范围之外的数字,则重复输入。
<P>
<P><SPAN lang=en-us> 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>
</SPAN>
<P><B><FONT color=#0000ff><SPAN lang=en-us>/*</SPAN></FONT></B>
<P>
<P><SPAN lang=en-us><FONT color=#0000ff><B>
</B></FONT></SPAN><B><FONT color=#0000ff><SPAN
lang=en-us> <<<< </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> <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> int classNumber; //</SPAN><SPAN
lang=zh-cn>班级编号</SPAN>
<P><SPAN lang=en-us> do</SPAN>
<P><SPAN lang=en-us>
{<BR> cout
<< "</SPAN><SPAN lang=zh-cn>请输入班级编号:</SPAN><SPAN
lang=en-us>(1~4)";<BR>
cin >> classNumber;</SPAN>
<P><SPAN lang=en-us> }</SPAN>
<P><SPAN lang=en-us> while(classNumber < 1 ||
classNumber > CLASS_COUNT);<BR><BR>
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> /*
<P> <SPAN
lang=zh-cn>一个班级最多40个学员,但也可以少于40个,所以我们规定,当用户输入-1时,表示已经输入完毕。</SPAN>
<P> */
<P>
<P> //<SPAN lang=zh-cn>判断</SPAN>classNumber<SPAN
lang=zh-cn>是否在合法的范围内:</SPAN>
<P> if(classNumber < 0 || classNumber >= <SPAN
lang=en-us>CLASS_COUNT)</SPAN>
<P><SPAN lang=en-us> return;</SPAN>
<P>
<P> //<SPAN lang=zh-cn>提示字串:</SPAN>
<P> cout << "<SPAN lang=zh-cn>请输入</SPAN>" << classNumber
+ 1 << "<SPAN lang=zh-cn>班的学生成绩。</SPAN>" << endl;
<P> cout << "<SPAN lang=zh-cn>输入-1表示结束。</SPAN>" << endl;
<P>
<P> for(int i=0; i < <SPAN lang=en-us>CLASS_STUDENT_COUNT;
i++)</SPAN>
<P><SPAN lang=en-us> {</SPAN>
<P> cout << "<SPAN lang=zh-cn>请输入</SPAN>"
<< i+1 << "<SPAN lang=zh-cn>号学员成绩:</SPAN>";
<P> cin >> cj[classNumber][i];
//cj <SPAN lang=zh-cn>是全局变量,所以这里可以直接用。</SPAN>
<P>
<P> //<SPAN lang=zh-cn>判断是否为-1,若是,跳出循环:</SPAN>
<P> if( -1 == cj[classNumber][i])
<P> break;
<P><SPAN lang=en-us> }</SPAN>
<P>}
<P>//----------------------------------------------------
<P>//<SPAN lang=zh-cn>清空成绩:</SPAN>
<P>void ClearScore(int classNumber)
<P>{
<P> //<SPAN lang=zh-cn>判断</SPAN>clas
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -