您的位置:首页 > 编程语言 > C语言/C++

C++ Primer学习笔记之第五章--语句

2016-12-08 09:21 423 查看

5.1 简单语句

1、空语句

;           //只有一个分号




2、if语句

(1)格式:

if(condition)
statement1;
else if(condition2)
statement2;
....
....
else
statement3;


5.3.1节练习

5.5:写一段程序,使用if else语句实现把数字成绩转换成字幕成绩的要求。

int grade;
char c;
cin>>grade;
if(grade<50)
c='D';
else if(grade>50&&grade<60)
c='C';
else if(grade>60&&grade<80)
c='B';
else
c='A';
cout<<"grade="<<c<<endl;


5.6:改写5.5的程序,使用条件运算符代替if else语句。

int grade;
cin>>grade;
cout<<"grade="<<(grade<50?'D':(grade>50||grade<60?'C':(grade>60||grade<80?'B':'A')))<<endl;




3、switch语句

(1)格式:

switch()
{
case expr1:
statement1;
(break;)
case expr2:
statement;
(break;)
....
....
default:
statement;
(break;)
}


5.3.2 节练习

练习5.9 :编写一段程序,使用一系列if语句统计从cin读入的文本中有多少元音字符

char c;
int count=0;
std::vector<char> vc;
while(cin>>c&&c!='#')
vc.push_back(c);
for(auto k:vc)
{
if(k=='a'||k=='A')
++count;
else if(k=='e'||k=='E')
++count;
else if(k=='i'||k=='I')
++count;
else if(k=='o'||k=='O')
++count;
else if(k=='u'||k=='U')
++count;
else
continue;
}
cout<<"Yuanyin zimu:"<<count<<endl;


练习5.10:编写一段程序,既统计元音字母的小写形式,也统计大写形式。

int count=0;
char c;
std::vector<char> vc;
while(cin>>c&&c!='#')
vc.push_back(c);
for(auto dei:vc)
{
switch(dei)
{
case 'a':++count;break;
case 'A':++count;break;
case 'e':++count;break;
case 'E':++count;break;
case 'i':++count;break;
case 'I':++count;break;
case 'o':++count;break;
case 'O':++count;break;
case 'u':++count;break;
case 'U':++count;break;
default:continue;
}

}
cout<<"yuanyinzimu: "<<count<<endl;


练习5.11:修改统计原因字母的程序,使其也能统计空格、制表和换行符的数量

int count=0;
char c;
std::vector<char> vc;
while(cin.get(c)&&c!='#')
vc.push_back(c);
for(auto dei:vc)
{
if(isspace(dei)||dei==' ')
++count;
switch(dei)
{
case 'a':++count;break;
case 'A':++count;break;
case 'e':++count;break;
case 'E':++count;break;
case 'i':++count;break;
case 'I':++count;break;
case 'o':++count;break;
case 'O':++count;break;
case 'u':++count;break;
case 'U':++count;break;
default:continue;
}

}
cout<<"yuanyinzimu: "<<count<<endl;




4、迭代语句(循环)

(1)while语句

<1>格式:

while(condition)        //条件为真,则执行下面的语句;
statement;


5.4.1 节练习

5.14:编写一段程序,从标准输入中读取若干string对象并查看连续重复出现的单词,要求记录练习重复出现的最大次数以及对应的单词。如果这样的单词存在,输出重复出现的最大次数,如果不存在,输出一条信息说明任何单词都没有连续出现过

string a;
int count=1;
int tmp=0;
std::vector<int> iv;
std::vector<string> vstr;
while(cin>>a&&a!="quit")
vstr.push_back(a);
for (std::vector<string>::iterator is = vstr.begin();
is != vstr.end();
++is)
{
if(is==vstr.end()-1)
break;
if(*is==*(is+1))
{
cout<<*is<<endl;
count+=1;
cout<<count<<endl;
iv.push_back(count);
}
else
count=1;
}
for(auto i=iv.begin();i!=iv.end();++i)
{
if(i==iv.end()-1)
break;
cout<<*i<<endl;
if(*i<*(i+1))
tmp=*(i+1);
else
tmp=*i;

}

if(iv.empty())
cout<<"No same words.\n";
else
cout<<"The words "<<a<<" show up "<<tmp<<" times."<<endl;




(2)传统for语句

<1>格式:

for(init-statement;condition;expression)
statement;


<2>init-statement 可有多个,但condition只能有一个,expression可有多个。

5.4.2 节练习

练习5.17:编写一段程序,检验其中一个vector对象是否是另一个的前缀。

std::vector<int> iv1;
int i1;
std::vector<int> iv2;
int i2;
cout<<"Enter the element of iv1: "<<endl;
while(cin>>i1&&i1!=9)
iv1.push_back(i1);
cout<<"Enter the element of iv2: "<<endl;
while(cin>>i2&&i2!=9)
iv2.push_back(i2);
if(iv1.size()<iv2.size())
for(auto itv1=iv1.begin(),itv2=iv2.begin();itv1!=iv1.end();++itv1,++itv2)
if(*itv1!=*itv2)
cout<<"itv1 is not the qianzhui."<<endl;
else
cout<<"itv1 is the qianzhui."<<endl;
else
for(auto itv1=iv1.begin(),itv2=iv2.begin();itv2!=iv2.end();++itv1,++itv2)
if(*itv1!=*itv2)
cout<<"itv2 is not the qianzhui."<<endl;
else
cout<<"itv2 is the qianzhui."<<endl;




(3)范围for语句(range for):

<1>格式:

for(declaration:expression)
statement;


<2>作用:能遍历容器或其他序列的所有元素。



5、do…while语句

(1)格式:

do
statement;
while(condition);


5.4.4 练习

练习5.19:编写一段程序,使用do…while循环重复第执行下述任务;首先提示用户输入两个string对象,然后挑出比较短的那个并输出它

do
{
int v1,v2;
cout<<"Please enter two numbers to sum: ";
if(cin>>v1>>v2)
cout<<"Sum is: "<<v1+v2<<endl;
}
while(cin);




5.5
跳转语句

1、break语句:负责终止离它最近的while、do、do…while、for或switch语句,并从这些语句之后的第一条语句开始继续执行

2、continue语句:终止最近的循环迭代并立即开始下一次迭代。continue语句只出现在for、while和do…while循环内部

3、goto语句:无条件跳转到同一函数内的另一条语句。(尽量不用,容易引起程序流的混乱)

5.5.1 节练习

练习5.20:编写一段程序,从标准输入中读取string对象的序列直到连续重复出现两个相同的单词或者所有单词都读完为止。

string str1,str2;
do
{
cout<<"Enter string1: "<<endl;
getline(cin,str1);
cout<<"Enter string2: "<<endl;
getline(cin,str2);
if(str1.size()<str2.size())
cout<<"The shortest string: "<<str1<<endl;
else
cout<<"The shortest string: "<<str2<<endl;
}
while(str1=="quit"||str2=="quit");


练习5.21:修改5.5.1节练习题的程序,使其找到的重复单词必须以大写字母开头:

string str1;
string str2;
do
{
cout<<"Enter the word: "<<endl;
cin>>str1;

auto c1=str1.begin(),c2=str2.begin();
if(isupper(*c1)&&isupper(*c2)&&str1==str2)
{
cout<<str1<<" and "<<str2<<" are same word"<<endl;
break;
}
else
cout<<"Not the same word."<<endl;
str2=str1;
}
while(1);




5.6 try语句块和异常处理

1、C++语言中异常处理包括一下三个部分

(1)throw表达式(throw expression),异常检测使用throw表达式来表示它遇到了无法处理的问题,我们说throw 引发(raise) 了异常。

(2)try语句块(try bolck),异常处理部分使用try语句块处理异常。try语句块以关键字 try 开始,并以一个或多个catch子句(catch clause)结束。

<1>try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以称作异常处理代码(exception handler)

(3)一套异常类(exception class),用于在throw表达式和相关的catch子句之间传递异常的具体信息。



5.6.1 throw表达式

1、throw表达式包含关键字throw和紧随其后的一个表达式,表达式的类型为抛出异常类型

2、例:

if(item1.isbn()!=item2.isbn())
throw runtime_error("Data must refer to same IBSN");
cout<<item+item2<<endl;


(1)如果ISBN不一样就抛出一个异常,异常类型为runtime_error的对象。抛出的异常将终止当前的函数,并把控制权转移给处理该异常的代码。

(2)runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。

5.6.2 try语句块

1、语法格式:

try{
program-statements
}catch(exception-declaration){
handler-statements;
}catch(exception-declaration){
handler-statements;
}
....


(1)program-statements为try语句块内的语句。

(2)exception-declaration为异常的声明

(3)handler-statements为处理异常的语句

2、异常终端了程序的正常流程。



5.6.3 标准异常

1、定义的异常类

(1)exception:最常见的问题

(2)runtime_error:只有在运行时才能检测出的问题

(3)range_error:运行时错误:生成的结果超出了有意义的值域范围

(4)overflow_error:运行时错误:计算上溢

(5)underflow_error:运行时错误:计算下溢

(6)logic_error:程序逻辑错误

(7)domain_error:逻辑错误,参数对应的结果不存在

(8)invalid_argument:逻辑错误,参数无效

(9)length_error:逻辑错误,视图创建一个超出该类型最大长度的对象

(10)out_of_range:逻辑错误,使用一个超出有范围的值

2、标准异常类有what成员,返回const char *,是异常的文本信息。

5.6.3 节练习

练习5.23:编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果:

int a,b;
cout<<"Enter to numbers: (/)"<<endl;
while(cin>>a>>b)
{
cout<<"result="<<a/b<<endl;
cout<<"Enter to numbers: (/)"<<endl;
}


练习5.24:修改5.23练习,使得当第二个数是0时抛出异常。先不设定catch子句,运行程序并为除数输入0。

int a,b;
cout<<"Enter to numbers: (a/b)"<<endl;
while(cin>>a>>b)
{
if(b==0)
throw runtime_error("b must not equal to 0!\n");
cout<<"result="<<a/b<<endl;
cout<<"Enter to numbers: (/)"<<endl;
}


练习5.25:修改5.24程序,使用try语句块去捕获异常。catch子句应该为用户输出一条提示信息,询问其是否输入新数并重新执行try语句块的内容

int a,b;
cout<<"Enter to numbers: (a/b)"<<endl;
while(cin>>a>>b)
{
try
{
if(b==0)
throw runtime_error("b must not equal to 0!\n");
} catch(runtime_error err){
cout<<err.what()
<<"\nTry to enter Again?Enter y or n"<<endl;
char c;
cin>>c;
if(!cin||c=='n')
break;
}
cout<<"result="<<a/b<<endl;
cout<<"Enter to numbers: (a/b)"<<endl;
}




术语表总结

1、异常声明(exception declaration):位于catch子句中的声明,指定了该catch子句能处理的异常类型。

2、异常安全(exception safe):当异常抛出后,程序能执行的正确行为。

3、terminate是一个标准库函数,当异常没有被catch到时调用。terminate终止当前程序执行。

4、throw表达式(throw expression):一种中断当前执行路径的表达式。throw表达式抛出的一个异常并把控制权转义到能处理该异常的最近的catch子句。

5、try语句块(try block):跟在try关键字后面的块,以及一个或多个catch子句。如果try语句块的代码引发异常并且其中一个catch子句匹配该异常类型,则异常被该catch子句处理。否则,异常将由外围try语句块,或者程序终止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: