c++ Primer(第五版) 课后题答案(五)

本文详细介绍了C++中的控制结构,包括空语句、复合语句、条件语句、循环语句及其应用实例。通过具体代码示例展示了如何正确使用这些控制结构来处理程序中的逻辑流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  

5.1

     (1)由一个单独的分号构成的语句,叫做空语句。

     (2)如果在程序的某个地方,语法上需要一条语句但逻辑上不需要,此时应该使用空              语句。

              例如://重复读入数据直至到达文件末尾或某次输入的值等于 sought

                        while(cin >> s && s != sought)

                                ;    //空语句

               使用空语句时,应该加上注释。从而令读这段代码的人知道该语句是有意省略


5.2     什么是块?什么时候会用到块?

       (1)复合语句就是用花括号括起来的(可能为空)语句和声明的序列,复合语句又被称为块。

       (2)在程序的某个地方,语法上需要一条语句但逻辑上需要许多条语句,则应该使用复合语句。


5.3

      使用逗号运算符重写1.4.1节的while循环语句,使它不再需要块。

#include<iostream>

int main()
{
	int sum = 0, val = 1;
	//只要val的值小于等于10 ,while 循环就会持续进行
	while (val <= 10)
		sum += val, ++val;
	
	std::cout << "Sum of 1 to 10 inclusive is"
		<< sum << std::endl;
	return 0;
}
        改写之后的代码的可读性降低。

  


5.4

    说明下列例子的含义,如果存在问题,试着修改

(1) 

      利用迭代器进行循环,遍历string 类型变量s包含的所有值   。

       ++iter,直到 iter == s.end()

while( sting::iterator iter != s.end())
        {/*...*/}

(2)

     该例子存在问题,status只能在相应的while语句块的内部可见,一旦语句结束,变量也就超出作用范围了。

<pre name="code" class="cpp"><pre name="code" class="cpp">while( bool status = find(word))
        {/*...*/}
if( !status )
 {/*...*/}

 
 

修改后的例子:

   如果其他代码也需要访问控制变量,则变量必须定义在语句的外部。

   

bool status = 0;
while(  status = find(word))
        {/*...*/}
if( !status )
 {/*...*/}

5.5

      使用if else语句实现把数字成绩转换成字母成绩的要求:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main()
{
	int grade = 0;                //数字成绩变量
	string lettergrade;           //字母成绩变量
	cout << "输入成绩(整数):" << endl;
	cin >> grade;                   //输入成绩
	const vector<string> scores { "F", "D", "C", "B", "A", "A++" };  //scores保存string类型的对象
	//如果成绩小于60 ,对应字母为F,而且不需要考虑添加加减符号的问题。否则执行 else语句。
	if (grade < 60 )
	{
		lettergrade = scores[0];
	} 
	else
	{
		lettergrade = scores[(grade - 50) / 10];        //先转换为字母成绩
		if (grade != 100)                               //成绩小于100,执行
		{
			if ( grade % 10 > 7)                         //末尾是 8, 9 添加+
			{
				lettergrade += '+';
			} 
			else if(grade % 10 < 3)                     //末尾是 0,1,2,添加-
			{
				lettergrade += '-';
			}
		} 
	}
	cout << "lettergrade is " << lettergrade;          //输出数字成绩相对应的字母成绩
	return 0;
}


5.6   

           修改上一题,  用条件运算符代替 if else 语句


#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main()
{
	int grade = 0;
	string lettergrade;
	const vector<string> scores{ "F", "D", "C", "B", "A", "A++" };    //scores保存string类型的对象
	
	cout << "输入成绩(整数):" << endl;
	cin >> grade;                   //输入成绩

	if (grade >= 60)                            //成绩大于等于60,把数字成绩转换为字母成绩
	{
		lettergrade = scores[(grade - 50) / 10];
	}
	
	//使用条件运算符代替if else 语句
	    (  (grade < 60) ? (lettergrade = scores[0]) :                  //成绩大于60 执行下一行
		(  (100 == grade) ? (lettergrade = scores[5]) :             //成绩不等于100.执行下一行
		(  (grade % 10 > 7) ? (lettergrade += '+') :                 //末尾是 8, 9 添加+
		(  (grade % 10 < 3) ? (lettergrade += '-') : lettergrade        //末尾是 0,1,2,添加-
		)
		)
		)
		);
		cout << "lettergrade is " << lettergrade;          //输出数字成绩相对应的字母成绩
	return 0;
}


5.7

                  

(a)  if (ival1 != ival2)
         ival1 = ival2
     else ival1 = ival2 = 0;

(b) if (ival < minval)
	minval = ival;
        occurs = 1;
(c) if (int ival = get_value())
        cout << "ival = " << ival << endl;
    if (!val)
        cout << "ival = 0 \n";
(d)if (ival = 0)
       ival = get_value();
 
<span style="color:#ff0000;">//改正后的代码</span>

(a)  if (ival1 != ival2)
        ival1 = ival2;
     else ival1 = ival2 = 0;
(b) if (ival < minval)
      {
	minval = ival;
	occurs = 1;
      }
(c) int ival;
    if (ival = get_value())
        cout << "ival = " << ival << endl;
    if (!val)
        cout << "ival = 0 \n";

(d)if (ival == 0)
      ival = get_value();


5.8

          什么是“悬垂else”?C++语言是如何处理else子句的?
         (1)所谓“悬垂else”指的是 当一个语句包含的 if子句多余else子句时,各个else子句应该与哪个if子句匹配的问题。
       (2)在C++中,规定else子句与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。




5.9

        

#include <iostream>
#include<string>

using namespace std;

int main()
{
	unsigned aeiouCnt = 0;
	char ch = 0;
	cout << "输入一段文本(以结束符号结尾):" << endl;
	while (cin >> ch)
	{
		if ('a' == ch)
			++aeiouCnt;
		if ('e' == ch)
			++aeiouCnt;
		if ('i' == ch)
			++aeiouCnt;
		if ('o' == ch)
			++aeiouCnt;
		if ('u' == ch)
			++aeiouCnt;
	}
	cout << "读入的文本中共有" << aeiouCnt << "元音字母" << endl;
	return 0;
}

5.10


#include<iostream>

using namespace std;

int main()
{
	char ch;
	//初始化每个元音字母的计数器
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
	//输入文本文件
	while (cin >> ch)      //ctrl+Z结束
	{
		//如果ch是元音字母,相应的计数器加一
		switch (ch)
		{
		case 'a':
		case 'A':
			++aCnt;
			break;
		case 'e':
		case 'E':
			++eCnt;
			break;
		case 'i':
		case 'I':
			++iCnt;
			break;
		case 'o':
		case 'O':
			++oCnt;
			break;
		case 'u':
		case 'U':
			++uCnt;
			break;
		default:
			break;
		}
	}
	cout << "Number of vowel a :\t" << aCnt << '\n'
		<< "Number of vowel e :\t" << eCnt << '\n'
		<< "Number of vowel i :\t" << iCnt << '\n'
		<< "Number of vowel o :\t" << oCnt << '\n'
		<< "Number of vowel u :\t" << uCnt << endl;
	return 0;
}



5.11

#include<iostream>

using namespace std;

int main()
{
	char ch;
	//初始化每个元音字母的计数器
	unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0,spaceCnt = 0,tabCnt = 0,newlineCnt = 0;
	//输入文本文件
	while (cin.get(ch))      //ctrl+Z结束
	{
		//如果ch是元音字母,相应的计数器加一
		switch (ch)
		{
		case 'a':
		case 'A':
			++aCnt;
			break;
		case 'e':
		case 'E':
			++eCnt;
			break;
		case 'i':
		case 'I':
			++iCnt;
			break;
		case 'o':
		case 'O':
			++oCnt;
			break;
		case 'u':
		case 'U':
			++uCnt;
			break;
		case ' ':
			++spaceCnt;
			break;
		case'\n':
			++newlineCnt;
			break;
		case'\t':
			++tabCnt;
			break;
		default:
			break;
		}
	}
	cout << "Number of vowel a :\t" << aCnt << '\n'
		<< "Number of vowel e :\t" << eCnt << '\n'
		<< "Number of vowel i :\t" << iCnt << '\n'
		<< "Number of vowel o :\t" << oCnt << '\n'
		<< "Number of vowel u :\t" << uCnt << '\n'
		<< "Number of space character :\t" << spaceCnt << '\n'
		<< "Number of Tab   character :\t" << tabCnt << '\n'
		<< "Number of newline character  :\t" << newlineCnt << endl;
		
	return 0;
}



5.12

     统计含有两个字符的字符序列的数量:ff,fl,fi.

 

#include<iostream>

using namespace std;

int main()
{
	unsigned ffCnt = 0, flCnt = 0, fiCnt = 0;  //将对应的计数器归零
	char currCh, preCh = '\0';                 //分别记录当前字符及前字符
	while ( cin >> currCh)
	{
		if ('f' == preCh)
		{
			switch (currCh)
			{
			case 'f':
				++ffCnt;
				break;
			case'l':
				++flCnt;
				break;
			case'i':
				++fiCnt;
				break;
			default:
				break;
			}
		}
		preCh = currCh;   //将前字符 置为当前字符
	}
	cout << "Number of \"ff\": \t" << ffCnt << '\n'
		<< "Number of \"fl\": \t" << flCnt << '\n'
		<< "Number of \"fi\": \t" << fiCnt << endl;
	return 0;
}




5.13

      

//改正后的代码
(a)unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch)
{
case'a':
	aCnt++;
	break;
case'e':
	eCnt++;
	break;
default :
	iouCnt++;
}

(b)unsigned index = some_value();
int ix = 0;
switch (index)
{
case'1':
	ix = get_value();
	ivec[ix] = index;
	break;
default:
	ix = ivec.size() - 1;
	ivec[ix] = index;
}
(c)
unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit)
{
case 1:
case 3:
case 5:
case 7:
case 9:
	oddCnt++;
	break;
case 2:
case 4:
case 6:
case 8:
case 10:
	evenCnt++;
	break;

}

(d)//case标号中的值只能使用常量表达式
const unsigned ival = 512, jval = 1024, kval = 4096;
          unsigned bufsize;
unsigned swt = get_bufCnt();
switch (swt)
{
case ival:
	bufsize = ival * sizeof(int);
	break;
case jval:
	bufsize = jval * sizeof(int);
	break;
case kval:
	bufsize = kval * sizeof(int);
	break;
}


5.14

   

#include<iostream>
#include<string >

using namespace std;

int main()
{
	string currWord, preWord;    //当前输入的单词以及前一单词
	string repWord;              //重复次数最多的单词
	int currCnt = 0, maxCnt = 1;  //当前单词重复次数以及重复次数最多的值
	cout << "Enter some words :(Ctrl +Z to end)" << endl;
	while (cin >>currWord)
	{
		if (currWord == preWord)        //当前单词重复出现
		{
			++currCnt;
		} 
		else
		{
			if (currCnt> maxCnt)
			{
				maxCnt = currCnt;
				repWord = preWord;
			}
			currCnt = 1;
		}
		preWord = currWord;       //修改对前一单词的记录
	}
	if (maxCnt != 1)           //有单词重复
		cout << '"' << repWord << '"'
		<< "repeated for" << maxCnt
		<< "times" << endl;
	else
		cout << "There is no repeated word" << endl;
	return 0;
}

5.15

      修改后的代码:

      (a)  int ix = 0;

            for(ix = 0; ix !=sz; ++ix) {/*....*/}

            if(ix != sz)

                //.......

     (b)

        int ix;

        for( ix = 0; ix != sz ;++ix)  {/*.....*/}

     (c)  当sz初始值大于零时,这将是一个死循环



5.16   

       若有如下定义:

       const size_t size = 100;

       int  ia[size];

       下面三个程序段等价:

       

       //程序段1

       size_t ix = 0;

       while(ix != size)

              {

                    /*......*/     //对ia的元素进行处理

                    ++ix;

               }   

        //程序段2

         for(size_t ix = 0; ix != size; ++ix)

              {

                      /*......*/     //对ia的元素进行处理

              }

          //程序段3

            size_t ix = 0;

             do {

                        /*......*/     //对ia的元素进行处理

                          ++ix;

                   }while(ix != size);


          如果只用一种循环编写程序,更愿意用for 结构

          因为for结构的形式最为简洁灵活。




5.17


#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> ivec1;
	vector<int> ivec2;
	int ival;
	cout << "Enter elements for the first vector :(32767 to end)"
		<< endl;
	cin >> ival;
	while (ival  != 32767)
	{
		ivec1.push_back(ival);
		cin >> ival;
	}
	cout << "Enter elements for the second vector :(32767 to end)"
		<< endl;
	cin >> ival;
	while (ival != 32767)
	{
		ivec2.push_back(ival);
		cin >> ival;
	}

	vector<int>::size_type size1, size2;
	size1 = ivec1.size();
	size2 = ivec2.size();
	bool result = true;
	for (vector<int>::size_type ix = 0;
		ix != (size1 > size2 ? size2 : size1); ++ix)
		if (ivec1[ix] != ivec2[ix])
		{
		result = false;
		break;
		}
	if (result)
	{
		if (size1 < size2)
		{
			cout << "The first vector is prefix of the second one."
				<< endl;
		}

		else if (size1 == size2)
			cout << "Two vectors are equal." << endl;
		else
			cout << "The second vector is prefix of the first one."
			<< endl;
	}
	else
		cout << "No vector is prefix of the other one" << endl;

	return 0;
}


5.18

//(a)每次循环读入两个整数,输出它们的和。
//     循环有错误:循环应该用一对花括号括住。
//	 改为:
	 do 
	 {
	     int v1, v2;
	     cout << "Please enter two numbers to sum :";
	      if (cin >> v1 >> v2)
		   cout << "Sum is: " << v1 + v2 << endl;
	 } while (cin);
	 /*(b)当get_response 函数返回真值时执行循环体。
		 此循环有误:do while循环的条件中不能定义变量。
		 改为:*/
	     int ival
		 do 
		 {
			 ival = get_response();
		 } while (ival);
	/*(c)当get_response 函数返回真值时执行循环体。*/
		 int ival
			 do
			 {
			 ival = get_response();
			 } while (ival);

5.19

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string s1, s2,s3;   //定义三个字符串变量
	
	do 
	{
		cout << "Enter two strings:" << endl;
		cin >> s1 >> s2;                 //输入字符串
		if (s1.size() > s2.size())         //比较字符串的大小
		{
			cout << s1 << "is longer than " << s2 << endl;
		}
		else if (s1.size() < s2.size())
		{
			cout << s1 << "is smaller than " << s2 << endl;
		}
		else
			cout << "Two strings are equal." << endl;
		cout << "continue?(yes or no)" << endl;         //选择是否继续循环
		cin >> s3;
	} while (s3[0] != 'n' && s3[0] != 'N');           //判断条件

	return 0;
}


5.20

#include<iostream>
#include<string>

using namespace std;

int main()
{
	string s1;
	bool   s = false;         
	cout << "输入一个字符串:" << endl;
	cin >> s1;                                             //输入一个字符串
	string::size_type index = 0;                           //字符串的下标,从零开始
	while ( index != s1.size())                            //遍历字符串中的每个字符,直到字符串结束
	{
		if (s1[index] == s1[index + 1])                     //如果有连续重复的字母,执行下面代码
		{
			cout << "\"" << s1[index] << "\"" << "连续重复出现" << endl;
			s = true;                                                            //标记是否有重复出现的字母
			break;                                                               //如果有重复出现的字母,跳出while循环语句。
		} 
		else
			++index;                                //下标加一
	}
	if (false == s)                                                     //如果标记没有,输出相应的代码
	{
		cout << "没有任何单词是连续重复出现的" << endl;
	}
	return 0;
}



5.23

#include<iostream>

using namespace std;

int main()
{
	int num1, num2,result;
	cin >> num1 >> num2;
	result = num1 / num2;
	cout << "结果是: " << result << endl;
	return 0;
}

5.24

#include<iostream>

using namespace std;

int main()
{
	int num1, num2, result;
	cin >> num1 >> num2;
	if (0 == num2)
	{
		throw runtime_error("分母不能为0");
	}
	result = num1 / num2;
	cout << "结果是: " << result << endl;
	return 0;
}


5.25

#include<iostream>

using namespace std;

int main()
{
	int num1, num2, result;
	while (cin >> num1 >> num2)
	{
		try
		{
			if (num2 == 0)
			{
				throw runtime_error("分母不能为零");
			}
		}
		catch (runtime_error err)
		{
			cout << err.what()
				<< "\nTry Agin? Enter y or n " << endl;
			char c;
			cin >> c;
			if (!cin || c == 'n')
				break;
		}
	}
	result = num1 / num2;
	cout << "结果是: " << result << endl;
	return 0;
}



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值