鸡啄米:c++编程入门系列之六(算法的基本控制结构之选择结构)
&&&&&& 上一讲鸡啄米为大家讲了运算符和表达式的知识,这一讲鸡啄米主要讲算法基本控制结构中的选择结构,同时教大家写比较简单的程序。
&&&&&& 为了能写出简单的程序并看见它们的输出效果,鸡啄米先讲下数据的输入和输出。数据从一个对象到另一个对象的流动我们一般称之为“流”,比如程序中的数据在屏幕上显示出来,我们可以想成数据从程序流向屏幕,就是输出流。从键盘输入数据就是输入流了。从流中获取数据叫做提取操作,向流中添加数据叫做插入操作。cin是系统预定义的输入流,用来处理标准输入即键盘输入。cout是预定义的输出流,用来处理标准输出,即屏幕输出。
&&&&&&“<<”是预定义的插入符,它用在cout上可以实现屏幕输出。使用形式如下:cout<<表达式<<表达式...。这里可以连着多个表达式,输出多个数据到屏幕。这里的表达式可以是很复杂的表达式,系统会计算出这些表达式的值只把结果传给插入符<<,然后显示到屏幕上。例如,cout<<"a+b="<<a+b;会把"a+b="这个字符串和a+b的计算结果输出到屏幕。如果a=1,b=2;则屏幕上显示a+b=3。
&&&&& “>>”是提取符,用到cin上用来把键盘上输入的数赋值给变量。使用形式为:cin>>表达式>>表达式...。这里的提取符也可以有多个,每个后边跟一个表达式,这里的表达式一般是用来存放输入值的变量。比如,int a,b; cin>>a>>b;后面这个语句要求从键盘上输入两个整型数,两个数之间用空格分隔,如果输入 3 4,则变量a的值为3,b的值为4。
&&&&& &再介绍几个操纵符,操纵符用来把输出值以特殊的格式显示出来。比如setw(int)用来设置域宽,就是设置数值的显示位数,setprecision(int)用来设置浮点数的小数位数(包括小数点),endl插入换行符,并刷新流。还有dec,hex,oct是要求以几进制显示。
&&&&&& 下面鸡啄米开始讲算法的基本控制结构。算法的基本控制结构包括顺序结构、选择结构和循环结构。顺序结构就是按照事物的逻辑一条语句一条语句的写下来,顺序执行,就像流水账,这种结构最常见,也最简单,这里就不讲了。这一讲鸡啄米主要讲选择结构,循环结构下一讲会讲到。
&&&&&& 大家想想,如果有这样一个问题,若x<0,则y=-1,若x=0,则y=0,若x>0,则y=1。这里涉及到好几种选择,顺序结构肯定不行了,就要用到选择结构。
&&&&&&一.用if语句实现选择结构
&&&& &if语句专门用来实现选择结构,使用形式为:
&&&&&&if (表达式)
&&&&&&&&&&&& &语句1
&&&&&&else
&&&&&&&&&&&&& 语句2
&&&&&&这个结构的执行顺序是,先计算表达式的值,如果为true,则执行语句1,否则就执行语句2。比如,
&&&&& if (x>y)
&&&&&&&&&&&&&& cout<<x;
&&&&& else
&&&&&&&&&&&&&&&cout<<y;
&&&&&&这段程序可以用来输出x和y中比较大的那个数。if语句中的else和语句2可以没有,变成:if (表达式) 语句。比如,if (x>y) cout<<x。
&&&&&&这里鸡啄米给大家一个程序例子,大家可以在vs2010中点file->new->project创建一个win32 console application。比如创建的新工程名叫test,然后找到test.cpp,里面有_tmain函数,实际上就是鸡啄米前面说的main函数,是程序的入口函数。我们就在这个main函数里写一段代码,用来判断输入一个年份时这个年份是不是闰年。大家知道,可以被4整除不能被100整除,或者能被400整除的年份都是闰年。下面是程序:
&&&&& #include "stdafx.h"
&&&& include <iostream>
&&&&&&using namespace std;
&&&& &int _tmain(int argc, _tchar* argv[])
&&&& &{
&&&&&&&&&& &int nyear;
&&&&&&&&&& &bool bisleapyear;
&&&&&&&&&& &cout<<"enter the year:";
&&&&&&&&&&& cin>>nyear;
&&&&&&&&&&& bisleapyear = ((nyear%4==0 && nyear%100!=0) || (nyear%400==0));
&&&&&&&&&& &if (bisleapyear)
&&&&&&&&&&&&&&& &cout<<nyear<<"is a leap year."<<endl;
&&&&&&&&&& &else
&&&&&&&&&&&&& &&&cout<<nyear<<"is not a leap year."<<endl;
&&&&&&&&&& &return 0;
&&&& &}
&&&&&&因为vs2010里已经没有以前iostream.h文件,所以这里包含了iostream文件,这是最新的c++标准,里面同样包含了输入输出函数,using namespace std是说要用到std名字空间,名字空间鸡啄米以后会讲。开始debug运行,屏幕上会显示:enter the year:,然后我们输入2000,点回车屏幕上接着显示:2000 is a leap year.可能你看不到这一句窗口就消失了,没关系,可以点debug->start without debugging,这样窗口就不会消失了。
&&&&& 二.多重选择结构
&&&& &有些问题可能需要我们进行多次判断,这样就可以有几种方法:
&&&&& 1.嵌套的if语句
&&&&&&使用的语法形式:
&&&& &if(表达式1)
&&&&&&&&& if(表达式2)& 语句1
&&&&&&&&&&else&&&&&&&&&&& &语句2
&&&&&&else
&&&&&&&& &if(表达式3)& 语句3
&&&&&&&&&&else&&&&&&&&& && 语句4
&&&&& 语句1、2、3、4可以是复合语句。每一层的if都要与else配对,如果省略掉一个else则要使用{}把这一层的if语句括起来。鸡啄米建议大家写程序的时候最好每层都用大括号括起来这样会大大减少出错的概率,也比较整齐,即使是熟手也一样。鸡啄米再给大家举个例子:
&&&& include "stdafx.h"
&&&& include <iostream>
&&&&& using namespace std;
&&&& &int _tmain(int argc, _tchar* argv[])
&&&& &{
&&&&&&&&&&&&&int x,y;
&&&&&&&&&&&& cout<<"enter x and y:";
&&&&&&&&&&& &cin>>x>>y;
&&&&&&&&&& & if (x!=y)
&&&&&&&&&& & {
&&&&&&&&&&&&&&&&&& &if (x>y)
&&&&&&&&&&&&&&&&&&&&&&& &cout<<"x>y"<<endl;
&&&&&&&&&&&&&&&&&& &else
&&&&&&&&&&&&&&&&&&&&&&& &cout<<"x<y"<<endl;
&&&&&&&&&&& &}
&&&&&&&&&&&& else
&&&&&&&&&& & {
&&&&&&&&&&&&&&&&&&&&cout<<"x=y"<<endl;
&&&&&&&&&&& &}
&&&&&&&&&&& &return 0;
&&&& &}
&&&& &运行这个程序,屏幕上会显示,enter x and y:,然后输入3 5,按回车接着会显示x<y。
&&&&& 2.if...else if语句
&&& & 若if语句的嵌套都在else分支下,就可以使用if...else if语句。使用的语法形式为:
&&&& &if (表达式1)&&&&&&&&&&& 语句1
&&&&& else if (表达式2)&& 语句2
&&&& &else if (表达式3)&& 语句3
&&&&&&...
&&&&& else&&&&&&&&&&&&&&&&&&&&&& &语句n
&&&&& 这里的执行逻辑就是,如果表达式1为true,则执行语句1,如果表达式1为false,且表达式2为true则执行语句2,如果表达式1、表达式2为false,且表达式3为true则执行语句3...就这样一层一层判断着执行下去。
&&&&& 3.switch语句
&&&&& 我们进行判断选择的时候,有可能每次都是对同一个表达式的值进行判断,那么就没有必要在每一个嵌套的if语句里都计算一下它的值,而是使用switch来解决这个问题。语法形式为:
&&&& &switch (表达式)
&&&&& {
&&&&& case 常量表达式1:& 语句1
&&&&& case 常量表达式2:& 语句2
&&&&& ...
&&&&& case 常量表达式n:& 语句n
&&&&& default:&&&&&&&&&& 语句n+1
&&&&& }&&&
&&&&&&此类语句的执行顺序是,先计算表达式的值,然后在case语句中寻找与之相等的常量表达式,跳到此处开始执行,若没有与之相等的则跳到default开始执行。使用switch语句时要注意以下几点:这些常量表达式的值不能相同,顺序可以随便;每个case语句的最后都要加break语句,不然会一直把下面所有的语句执行完;switch括号里的表达式必须是整型、字符型和枚举型的一种;每个case下的语句不需要加{};如果多个case下执行一样的操作,则多个case可以共用一组语句,比如
&&&&& case 1:
&&&&&&case 2:
&&&&& case 3:&& a++;
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&鸡啄米再给大家举个switch的例子。如果整型变量a为0则输出“小鸡”,如果为1则输出“小啄”,如果为2则输出“小米”,其他情况下输出“鸡啄米”。程序如下:
&&&&& #include "stdafx.h"
&&&&& #include <iostream>
&&&&& using namespace std;
&&&& &int _tmain(int argc, _tchar* argv[])
&&&&& {
&&&&&&&&&&&&& int a;
&&&&&&&&&&&& &cout<<"enter a:";
&&&&&&&&&& && cin>>a;
&&&&&&&&&&&& &switch (a)
&&&&&&&&&&&& &{
&&&&&&&&&&& & case 0:
&&&&&&&&&&&&&&&&&&&&&& cout<<"小鸡"<<endl;
&&&&&&&&&&&&&&&&&&&& & break;
&&&&&&&&&&&&&&case 1:
&&&&&&&&&&&&&&&&&&&&& &cout<<"小啄"<<endl;
&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&& &case 2:
&&&&&&&&&&&&&&&&&&&&&& cout<<"小米"<<endl;
&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&& default:
&&&&&&&&&&&&&&&&&&&&& &cout<<"鸡啄米"<<endl;
&&&&&&&&&&&&&&&&&&&&&& break;
&&&&&&&&&&&&& }
&&&&&&&&&&&&& return 0;
&&&&& }
&&&&&&运行时屏幕显示enter a:,我们输入2,则会接着显示“小米”。
&&&&& 这一讲鸡啄米首先讲了输入输出流对象,然后讲了选择控制结构,举了几个程序例子,大家可以按照鸡啄米的程序上机调试运行下,也可以自己在此基础上改改程序然后看看结果是否如你所想,大家先找找编程的感觉,在编程入门的时候不要着急。
&