《c++ builder编程指南.doc》由会员分享,可在线阅读,更多相关《c++ builder编程指南.doc(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+Builder 编程指南2关键字:C+Builder,编程指南 作者:佚名 更新:2002-11-01 浏览:5158三、常用控件的使用与编程 静态文本是用户无法直接改变(不可编辑)的文本,程序可以在运行时刻来改变它,通常起标注和提示作用,它位于控件板的“Standard”页,其主要属性有: Align:指该控件在窗口中的位置或对齐方式(AlBottom:位于底部;AlClient:充满客户区;AlLeft:位于左方;AlNone:用户自定义;AlRight:位于右方;AlTop:位于顶部)。 Alignment:显示文字在本控件中的位置(taCenter:居中;taLeftJustify
2、:居左;taRightJustify:居右)。 AutoSize:是否自动缩放(当设为true时,则控件的尺寸随控件里面文字的大小而改变)。 Caption:控件中要显示的文字,即标题。 Color:控件的颜色。 Cursor:鼠标移入控件后的形状。 Enabled:设置该控件是否有效。 Font:设置该控件内文字的字体,单击该属性弹出字体设置对话框,可以设置字体风格、字体尺寸、字体颜色等。 Name:控件名称。 标准按钮主要用于响应用户鼠标或键盘按下的操作,它位于控件板的Standard页,其主要属性有: Cancel:当设为true时,此按钮相当于放弃按钮,即当用户按下Esc键时相当于用鼠
3、标单击此按钮。 Default:设置该按钮是否为缺省按钮。 ModalResult:模式结果。(可选值有mrNone、mrOk、mrCancel、mrAbort、mrRetry、mrIgnore、mrYes、mrNo等)当设为非mrNone时,主要用于按下该按钮时关闭该按钮所属模式窗口。 标准按钮控件可以响应的主要事件有: OnClick:鼠标单击或按下热键时的响应事件。 OnEnter:当按钮获得输入焦点时的响应事件。 OnExit:当按钮失去输入焦点时的响应事件。 OnKeyDown:当键盘任意键按下时的响应事件。 OnKeyPress:当键盘上字符键按下时的响应事件。 OnKeyUp:放
4、开键盘按键时的响应事件。 OnMouseDown:鼠标键按下时的响应事件。 OnMouseUp:鼠标键弹起时的响应事件。 OnMouseMove:鼠标移动时的响应事件。 单行编辑框控件用来接收来自用户的单行可编辑输入,它位于控件板的Standard页,其主要属性有: AutoSelect:自动选择。用来设置当该控件获得输入焦点时编辑框里的文本内容是否被自动选择。若用户想要在每次选中该编辑框时就要替换掉原有的内容,不是在原有的内容后添加新的内容,可把该属性设为true。 CharCase:控制编辑框内字符的大小写。(可选值有ecLowerCase:全为小写;ecNormal:正常方式,大小写均可
5、;ecUpperCase:全为大写。) MaxLength:设置输入文本的最大长度。当为0时表示不受限制。 ReadOnly:当该属性设为true时,用户不能改变编辑框里面的文本。 Text:当程序运行时显示在编辑框里面的文本内容。 状态条控件一般放在应用程序界面底部,用于快速提示当前状态或提供简单帮助等功能,它位于控件板的Win32页上,其主要属性有: Panel:面板属性,用来设置状态条的风格。用鼠标单击该属 所示(状态条被分成三个小面板)。利用该编辑器和对象观察器就可以把状态条编辑成合适的样子。 SimplePanel:简单面板。用来决定是显示一个简单面板还是多个面板,设为true时,只
6、显示一个简单面板。 SimpleText:当SimplePanel设为true时,显示在简单面板里的文本。 下面以一实例介绍控件的用法。该程序可以实时地在状态条中显示当前鼠标位置,也可以在编辑框中直接输入鼠标的坐标值,用来改变鼠标在屏幕中的位置。 (1) 从控件板的“Standard”页拖动两个静态文本控件“Label1”和“Label2”、两个单行编辑框“Edit1”和“Edit2”、一个按钮控件“Button1”到窗体“Form1”上,设置“Label1”和“Label2”的“Caption”属性值分别为“鼠标X坐标值:”和“鼠标Y坐标值:”;设置“Edit1”和“Edit2”的“Text
7、”属性都为“0”;设置“Button1”的“Caption”属性为“退出”。根据自己的喜好安排好各控件在窗体中的布局。选择菜单“File|Save As”,另存程序文件“Unit1.cpp”为“xyp.cpp”;选择“File|Save Project As”,另存工程文件为“xy.bpr”。 (2) 从控件板的“Win32”页拖动一个状态条控件“StatusBar1”到窗体“Form1”的底部(自动),点击其“Panels”属性,所示的三个小面板,其中一个放提示信息,另外两个分别存放鼠标的X和Y坐标值。 (3) 利用对象观察器设置“Form1”的“OnMouseMove”(鼠标在窗体上移动时
8、触发该消息)消息响应函数为“MouseMove()”,单行编辑框“Edit1”和“Edit2”的“OnChange”消息响应函数同为“EditChange()”,标准按钮“Button1”的“OnClick”消息响应函数为“ExitButton()”。 (4) 转入代码编辑器,在“xyp.cpp”中键入如下程序代码: void _fastcall TForm1:MouseMove(TObject *Sender, TShiftState Shift,int X, int Y) /该程序段用于在状态条中的第二个小面板(Item1)中显示鼠标的X坐标值,第三个小 /面板(Item2)中显示鼠标的Y
9、坐标值。IntToStr()函数用于把整型坐标值转换为字符型。 StatusBar1-Panels-Items1-Text = IntToStr(X); StatusBar1-Panels-Items2-Text = IntToStr(Y); void _fastcall TForm1:ExitButton(TObject *Sender) Close();/关闭应用程序 void _fastcall TForm1:EditChange(TObject *Sender) /调用API函数SetCursorPos()(C+ Builder中可以直接调用)设置鼠标位置,ToInt()/用于把字符型
10、的值转换为整型值。读者要留意这种C+ Builder中所特有的转换方法。 SetCursorPos(Edit1-Text.ToInt(),Edit2-Text.ToInt() ; 位图按钮控件位于Additional页,它提供了同标准按钮一样的功能,但它能在按钮上贴上一幅位图,其主要属性有: Glyph:浮雕,单击该属性会弹出一个“Picture Editor”对图(510cb17.Jpg ) 所示。 Hint:当鼠标停留在该控件上一段时间后所弹出的一小段提示信息。 Layout:用于决定位图贴在按钮的哪个位置。(blGlyphBottom:位于按钮标题的下方;blGlyphLeft:位于按钮
11、标题的左方;blGlyphRight:位于按钮标题的右方;blGlyphTop:位于按钮标题的上方。) 快速按钮(SpeedButton)是一种新型的按钮控件,它具有一般按钮的属性和方法,另外除了可以在按钮上添加文字标题外,还可以在按钮表面设定不同图像(这点有别于位图按钮,它只能设定一幅图像),用于代表不同的按钮状态(如选中、无效等)。一般把若干个快速按钮都集中在一个工具条(ToolBar)或面板(Panel)上,使用户可以快速地执行一些常用命令。其主要属性有: AllowAllUp:全部弹起。当该属性设为true时,属于同一组(通过设置GroupIndex属性为相同值)的快捷按钮可以同时处于
12、弹起状态,即所有按钮均未被选中。 Down:按钮是否处于按下状态。 Glyph:点击该属性弹出“Picture Editor”对话框,用于装入一幅位图,然后把该位图分成四幅小位图,每幅小位图代表不同的按钮状态。这就要求“Glyph”属性设定的位图必须包含四幅相同大小尺寸的小位图,并且这些小位图必须紧密相连且在同一水平线上。 NumGlyphs:设定每个按钮对应的小位图的个数。 Flat:设定快速按钮的平面效果。设定该属性为true,当鼠标不在按钮上时,该按钮呈现平面状态;当鼠标移到按钮之上时,按钮马上突了出来。当Flat为false时,则没有这种效果。 工具条按钮(ToolBar)(简称工具条
13、)通常作为工具按钮(tool buttons)或其它按钮的一个容器,以便对其进行统一管理。一般情况下可以在工具条上产生工具按钮(在工具条控件上单击鼠标右键,选择弹出式菜单中的“New Button”或“New Separator”,则可以产生一系列的工具按钮或分割线)或放置快速按钮,以便对应用程序进行更加直接的控制(它一般是一些菜单的快捷方式),其主要属性有: Flat:工具条上的工具按钮或其它控件是否具有平面特性。 Images:工具条上的工具按钮所对应的图像系列。它一般对应一个ImageList控件。Wrapable:工具条上的按钮是否可以自动换行,产生一个对齐的新列。 为用工具条产生的一
14、个应用程序界面,它共有四个工具按钮,对应一个“ImageList”控件。 / 本文转自 C+Builder研究 - C+ Builder3.0提供了一个Splitter控件来实现对用户窗口的分割,只需拖动该控件到窗体上,就可以实现窗口的任意分割。把面板控件(Panel)拖动到窗体上,设置其对齐方式,然后把Splitter控件拖动到面板控件的边缘,设置其对齐方式与面板控件的对的分割方式为例来介绍其具体操作过程: (1) 放置一个面板“Panel1”到窗体“Form1”上,并设置其“Align”属性为“alLeft”,然后在“Panel1”的右边界处放置一个“Splitter”控件,其“Align
15、”属性为“alLeft”。应当使“Splitter”控件的“Left”属性值大于或等于“Panel1”的“Left”值加上其“Width”的值。再设定“Splitter”控件的“Width”属性值为3。 (2)放置另外一个面板“Panel2”到窗体“Form1”上,并设置其“Align”属性为“alClient”。最后在各面板控件上放置其它所需控件,从而实现了窗口的分割。 图像控件“TImage”位于“Additional”页,主要用于在某一位置来显示一幅图片。该控件的主要属性有: Center:图片是否在控件的居中位置。 Picture:用于装入图片。 Stretch:用于图片是否自动伸缩到
16、控件大小。 下面以实例介绍上述几个控件的用法。 假如设计一个图像放大、缩小的演示程序,可以选择任意一幅位图进行演示。 (1) 拖动一个面板(Panel)控件到窗体“Form1”上,设置其“Align”属性为“alTop”,让其充当工具条控件。然后拖动四个快速按钮控件到面板上,设置其“Caption”属性分别为“打开”、“放大”、“缩小”和“退出”,设置其“Flat”属性为“true”,“Layout”属性为“blGlyphBottom”。最后用“Glyph”属性为各个快速按钮设置图像。 (2) 然后拖动一个图像控件和一个“OpenDialog”(打开文件对话框)控件到窗体之上;设置“Form1
17、”的“Caption”属性为。 (3) 另存程序文件“Unit1.cpp”为“imageio.cpp”,另存工程文件为“image.bpr”。转入代码编辑器,在程序“imageio.cpp”中键入如下代码: void _fastcall TForm1:SpeedExitClick(TObject *Sender) Close();/关闭应用程序 void _fastcall TForm1:SpeedOpenClick(TObject *Sender) /利用打开文件对话框为图像控件装入位图。 Image1-Stretch = true;/图像大小随图像框的大小而改变 OpenDialog1-F
18、ilter = “Bmp files (*.bmp)|*.bmp”;/文件过滤器中只装入位图文件 if(OpenDialog1-Execute() Image1-Picture-LoadFromFile(OpenDialog1-FileName); void _fastcall TForm1:SpeedInClick(TObject *Sender) /图像的长和宽分别增加10各象素 Image1-Height=Image1-Height+10; Image1-Width=Image1-Width+10; void _fastcall TForm1:SpeedOutClick(TObject
19、*Sender) /图像的长和宽分别减少10各象素 Image1-Height=Image1-Height-10; Image1-Width=Image1-Width-10; 用“打开”按钮选择一幅位图,用“放大”或“缩小”按钮对改位图进行任意大小的缩放操作。最后设计一个类似Win95“开始”菜单中的“运行”功能基本. 该应用程序是进程应用程序。进程是装入内存并准备执行的程序,它是资源分配的独立单位。进程有代码、数据,该进程中的线程可用的其他系统资源,如文件、管道和同步对象组成。通过为外部可执行程序创建进程,从而可以在自己的应用程序中调用外部可执行程序。创建进程应使用Windows的API函数
20、“CreateProcess()”,其具体用法和内部所涉及到的数据结构,读者可以参考其他书籍。 在“Open”标签所对应的编辑框内输入可执行文件的名称(包括路径),单击“Run”按钮,就可运行该外部可执行文件。也可以单击“Browse”按钮,利用打开文件对话框选择外部可执行文件并运行它。 拖动如下所示的控件到窗体上,并设置其属性: 控件名称属性设定值 From1(窗体)CaptionProcess Programming Demo Label1 (标签)CaptionOpen: Edit1(编辑框)Text OpenDialog1(打开文件对话框) Button1(按钮)CaptionRun
21、Button2(按钮)CaptionExit Button3(按钮)CaptionBrowse 然后在程序中键入代码。 在事件Button1Click中添加如下代码(按“Run”按钮时的响应函数): void _fastcall TForm1:Button1Click(TObject *Sender) STARTUPINFO StartInfo; PROCESS_INFORMATION ProcessInformation; StartInfo.cb=sizeof(STARTUPINFO); StartInfo.lpDesktop=NULL; StartInfo.lpReserved=NULL
22、; StartInfo.lpTitle=NULL; StartInfo.dwFlags=STARTF_USESHOWWINDOW; StartInfo.cbReserved2=0; StartInfo.lpReserved2=NULL; StartInfo.wShowWindow=SW_SHOWNORMAL; /为外部可执行程序创建进程,其中的可执行文件名由Edit1编辑框提供。 BOOL bReturn=CreateProcess(NULL,Edit1-Text.c_str(),NULL,NULL, FALSE,NULL,NULL,NULL,&StartInfo, &ProcessInfor
23、mation); if(!bReturn) /当输入可执行文件名无效时,弹出信息框,然后控制焦点停留在编辑框上。 Application-MessageBox(“你没有指定可执行文件”,“C+ Builder MessageBox”, MB_OKCANCEL +MB_DEFBUTTON1); Edit1-SetFocus(); 在事件Button2Click中添加如下代码: void _fastcall TForm1:Button2Click(TObject *Sender) Close();/按“Exit”按钮时,程序退出。 在事件Button3Click中添加如下代码: void _fas
24、tcall TForm1:Button3Click(TObject *Sender) OpenDialog1-Execute();/执行打开文件对话框 Edit1-Text=OpenDialog1-FileName;/把选中的可执行文件名返回给编辑框。 运行该程序,然后利用该程序调用Windows的计算器外部程序 高质量C+/C编程指南(第3章 命名规则) 关键字:匈牙利法,共性规则 作者:林锐 更新:2002-08-07 浏览:4255第3章 命名规则比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有
25、的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。“匈牙利”法最大的缺点是烦琐,例如inti,j,k;floatx,y,z;倘若采用“匈牙利”命名规则,则应当写成intiI,iJ,ik;/ 前缀 i表示int类型floatfX,fY,fZ;/ 前缀 f表示float类型如此烦琐的程序会让绝大多数程序员无法忍受。据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在
26、项目中贯彻实施。3.1 共性规则本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。【规则3-1-2】标识符的长度应当符合“min-length & max-information”原则。几十年前老ANSI C规定名字不准超过6个字符,现今的C+/C不再有此限制。一般来说,长名字能更好地表达含义
27、,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。【规则3-1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。【规则3-1-4】程序中不要出现仅靠大小写区分的相似的标识符。例如:intx,X;
28、/ 变量x 与 X 容易混淆void foo(int x);/ 函数foo 与FOO容易混淆void FOO(float x);【规则3-1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。【规则3-1-6】变量的名字应当使用“名词”或者“形容词名词”。例如:floatvalue;floatoldValue;floatnewValue;【规则3-1-7】全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。例如:DrawBox();/ 全局函数box-Draw(); /
29、 类的成员函数【规则3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。/ 本文转自 C+Builder研究 - 例如:intminValue;intmaxValue;intSetValue();intGetValue();【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。3.2 简单的Windows应用程序命名规则作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。【规则3-2-1】类
30、名和函数名用大写字母开头的单词组合而成。例如:class Node;/ 类名class LeafNode;/ 类名voidDraw(void);/ 函数名voidSetValue(int value);/ 函数名【规则3-2-2】变量和参数用小写字母开头的单词组合而成。例如:BOOflag;intdrawMode;【规则3-2-3】常量全用大写的字母,用下划线分割单词。例如:const int MAX = 100;const int MAX_LENGTH = 100;【规则3-2-4】静态变量加前缀s_(表示static)。例如:void Init()static int s_initValu
31、e; / 静态变量【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。例如:int g_howManyPeople;/ 全局变量int g_howMuchMoney;/ 全局变量【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。例如:void Object:SetValue(int width, int height)m_width = width;m_height = height;【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图
32、形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。3.3 简单的Unix应用程序命名规则高质量C+/C编程指南(第4章 表达式和基本语句) 关键字:运算符的优先级,复合表达式,if,for,switch,goto 作者:林锐 更新:2002-08-07 浏览:4100第4章 表达式和基本语句读者可能怀疑:连if、for、while、goto、switch这样简单的东西也要探讨编程风格,是不是小题大做?我真的发觉很多程序员用隐含错误的方式写表达式和基本语句,我自己也犯过类似的错误。表达式和语句都属于C+/C的短语结构语法。它们看似简单,但使用时隐患比较多。本章归纳了正
33、确使用表达式和语句的一些规则与建议。4.1 运算符的优先级C+/C语言的运算符有数十个,运算符的优先级与结合律如表4-1所示。注意一元运算符 + - * 的优先级高于对应的二元运算符。优先级运算符结合律从 高到低排列( ) - .从左至右! + - (类型) sizeof + - * &从右至左* / %从左至右+ -从左至右从左至右 =从左至右= !=从左至右&从左至右从左至右|从左至右&从左至右|从右至左? :从右至左= += -= *= /= %= &= = |= =从左至右表4-1 运算符的优先级与结合律【规则4-1-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用
34、默认的优先级。由于将表4-1熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。例如:word = (high = b & c d & c + f = g + h ; / 复合表达式过于复杂【规则4-2-2】不要有多用途的复合表达式。例如:d = (a = b + c) + r ;该表达式既求a值又求d值。应该拆分为两个独立的语句:a = b + c;d = a + r;【规则4-2-3】不要把程序中的复合表达式与“真正的数学表达式”混淆。例如:if (a b c) / a b c是数学表达式而不是程序表达式并不表示 if (ab) & (bc)而是成了令人费解的
35、if ( (ab)=”或“=-EPSINON) & (x=EPSINON)其中EPSINON是允许的误差(即精度)。4.3.4 指针变量与零值比较【规则4-3-4】应当将指针变量用“=”或“!=”与NULL比较。 指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句 如下:/ 本文转自 C+Builder研究 - if (p = NULL) / p与NULL显式比较,强调p是指针变量if (p != NULL)不要写成if (p = 0) / 容易让人误解p是整型变量if (p != 0)或者if (p) / 容
36、易让人误解p是布尔变量if (!p)4.3.5 对if语句的补充说明有时候我们可能会看到 if (NULL = p) 这样古怪的格式。不是程序写错了,是程序员为了防止将 if (p = NULL) 误写成 if (p = NULL),而有意把p和NULL颠倒。编译器认为 if (p = NULL) 是合法的,但是会指出 if (NULL = p)是错误的,因为NULL不能被赋值。程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序if (condition)return x;return y;改写为if (condition) return x; else return
37、 y; 或者改写成更加简练的return (condition ? x : y);4.4 循环语句的效率C+/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。本节重点论述循环体的效率。提高循环体效率的基本办法是降低循环体的复杂性。【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如示例4-4(b)的效率比示例4-4(a)的高。for (row=0; row100; row+) for ( col=0; col5; col+ ) sum = sum + arowcol; for (col=0;
38、col5; col+ ) for (row=0; row100; row+) sum = sum + arowcol; 示例4-4(a) 低效率:长循环在最外层 示例4-4(b) 高效率:长循环在最内层【建议4-4-2】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例4-4(c)的程序比示例4-4(d)多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例4-4(d)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例4-4(c)的写法比较好,因为程序
39、更加简洁。for (i=0; iN; i+) if (condition) DoSomething(); else DoOtherthing(); if (condition) for (i=0; iN; i+) DoSomething(); else for (i=0; iN; i+) DoOtherthing(); 表4-4(c) 效率低但程序简洁 表4-4(d) 效率高但程序不简洁4.5 for 语句的循环控制变量【规则4-5-1】不可在for 循环体内修改循环变量,防止for 循环失去控制。【建议4-5-1】建议for语句的循环控制变量的取值采用“半开半闭区间”写法。示例4-5(a)中的x值属于半开半闭区间“0 = x N”,起点到终点的间隔为N,循环次数为N。示例4-5(b)中的x值属于闭区间“0 = x = N-1”,起点到终点的间隔为N-1,循环次数为N。相比之下,示例4-5(a)的写法更加直观,尽管两者的功能是相同的。for (int x=0; xN; x+) for (int x=0; x=N-1; x+) 示例4-5(a) 循环变量属于半开半闭区间 示例4-5(b) 循环变量属于闭区间4.6 switch语句有了if语句为什么还要switch语句?s
限制150内