C primer plus 复习题答案 上

第二章

  1. c++程序的模块叫做函数
  2. 预处理器编译指令是用作替换编译指令
  3. 可以使用程序再std空间内的各定义
  4. cout<<“Hello, world!”<<endl;
  5. int cheeses;
  6. cheeses = 32;
  7. cin >>cheeses;
  8. cout <<“We have " << cheeses <<” varieties of cheese,"<<endl;
  9. froop函数接收double值,返回int值
    rattle函数接收int值,不返回值
    prune不接受任何值,返回int值
  10. 无返回值
  11. 可能是没有使用std空间

第三章

  1. 有多种类型,可以根据特定的情况选择最合适的类型
  2. short rbis= 80;
    unsigned int q = 42110;
    unsigned long ants = 3000000000;
  3. 可以用climit的头文件来限定
  4. 33L的类型是long,常量33为int型
  5. 大多数情况下是等价的
  6. char c=88;
    cout << c <<endl;
    cout.put(char(88));
    cout << char(88)<<endl;
    cout << (char)88 <<endl;
  7. 需要具体分析
  8. 74
    4
    0
    4.5
    3
int pos =(int )x1+(int )x2;
int pos =int(x1)+int(x2);

将他们作为double类型相加,再进行转换,可采取下述方法之一

int pos = (int)(x1+x2);
int pos = int (x1+x2);
  1. int
    float
    char
    char32_t
    double

第四章

char actor[30];
short betsie[100];
float chuck[13];
long double dipsea[64];

arrary<char,30> actor;
array<short,100> betsie;
array<float,13>;
array<long double,64> dipsea;

int arr[5] {1,3,5,7,9};

int even = arr[0] + arr[4];

cout<<ideas[1]<<endl;

char str1[] = “cheeseburger”;

string str2 = “Waldorf Salad”;

struct fish

{

char kind[30];

int weight;

double length;

}
  1. fish a ={“shark”,100,100.1};

  2. enum Response{No,Yes,Maybe};

double *ptr = &ted;

cout<<*ptr<<endl;
float *ptr = treacle;

cout<<*ptr<<endl;//第一个元素

cout<<*(ptr+9)<<endl;//最后一个,注意是加9
int num;
cin>>num;
int *ptr = new int [num];
vector<int> vi(num);

有效,打印出该字符串首字符的地址

struct fish{char name[10];int weight;double length;};
fish *ptr = new fish;
cin>>ptr->length;
cout<<ptr->weight<<endl;
delete ptr;

第二句没有指明应该读取多少数据。所以address被分配的内存可能不够用来存放用户输入的数据,从而导致数组越界,发生程序崩溃或者某些不可预知的后果。

#include <vector>

#include <string>

#include <array>

const int count = 10;

std::vector<string> vs(count);

std::array<string,10> as; 

第五章

1.入口条件循环和出口条件循环之间的区别是什么?各种c++循环分别属于其中的哪一种?

入口循环就是程序在执行循环体中的语句之前先检查循环条件;出口循环是在执行循环体中的语句之后检查循环条件。for循环和while循环都是入口条件循环;do while循环为出口条件循环。

  1. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int i;
for(i=0;i<5;i++)
      cout<<i;
cout<<endl;

01234

  1. 如果下面的代码片段是有效程序的组成部分,它将打印什么内容?
int j;
for(j=0;j<11;j+=3)
    cout<<j;
cout<<endl<<j<<endl;

0369
12

  1. 如果下面代码是有效程序的组成部分,它将打印什么内容?
int j=5;
while(++j<9)
    cout<<j++<<endl;

6
8

  1. 如果下面代码是有效程序的组成部分,它将打印什么内容?
int k=8;
do
    cout<<"k="<<k<<endl;
while(k++<5);

k= 8

  1. 编写一个打印1、2、4、8、16、32、64的for循环,每轮循环都将计数变量的值乘以2。
int i;
for(i=1;i<=64;i*=2)
    cout<<i<<" ";
  1. 如何在循环体中包括多条语句?
    将语句放在一对大括号中形成一个复合语句或代码块。

  2. 下面的语句是否有效?如果无效,原因是什么?如果有效,它将完成什么工作?

a. int x={1,024}
b. int y=1,024;

语句a是有效的,表达式1,024为逗号表达式,该表达时的右侧表达式的值,由于024为8进制数,对应的十进制数为20,因此x的值应为20,即x=20。
语句b也是有效的,但是逗号运算符的优先级低于赋值运算符,因此b中表达式等效为(int y=1),024;。

  1. 在查看输入方面,cin>>ch同cin.get(ch)和ch=cin.get()有什么不同?

cin>>ch将跳过空格、换行符和制表符,其他两种格式将读取这些字符。

第六章

1 .请看下面两个计算空格和换行符数目的代码片段:

//version 1
while(cin.get(ch))   //quit on eof
{  
    if(ch==' ')
         spaces++;
    if(ch=='\n')
         newlines++;
}

//version 2
while(cin.get(ch))   //quit eof
{
    if(ch==' ')
         spacees++;
    else if(ch=='\n')    
         newlines++;
}

第二个格式比第一个格式好在哪里?

第二个版本比第一个版本效率更高,因为在第一个中对于每个字符都需要判断两次,而在第二个版本中,如果字符为空格,在经过if判断确定为空格后,该字符肯定不是换行符,第二个else if的判断直接跳过,节省判断时间。

  1. 在程序清单6.2中,用ch+1替换++ch将发生什么情况?
// ifelse.cpp -- using the if else statement
#include <iostream>
int main()
{
   char ch;
   std::cout << "Type, and I shall repeat.\n";
   std::cin.get(ch);
   while (ch != '.')
   {
       if (ch == '\n')
            std::cout << ch; // done if newline
       else
            std::cout << ++ch; // done otherwise
       std::cin.get(ch);
}
   // try ch + 1 instead of ++ch for interesting effect
   std::cout << "\nPlease excuse the slight confusion.\n";
   // std::cin.get();
   // std::cin.get();
   return 0;
}

++ch的数据类型依旧是char型,但对于char+1最终类型为int型,因此当++ch换成ch+1后,输出的是数字。

  1. 请认真考虑下面的程序:

#include<iostream>
using namespace std;
int main()
{
    char ch;
    int ct1,ct2;
    ct1=ct2=0;
    while((ch=cin.get())!='$')
    {
        cout<<ch;
        ct1++;
        if(ch='$')
              ct2++;
         cout<<ch;
    }
    cout<<"ct1="<<ct1<<",ct2="<<ct2<<"\n";
    return 0;
}

假设输入如下(请在每行末尾按回车键):
Hi!
Send $10 or $20 now!

则输出将是什么(还记得吗,输入被缓冲)?
输入输出结果为

Hi!
H$i$!$
$Send $10 or $20 now!
S$e$n$d$ $ct1=9,ct2=9

  1. 创建表示下述条件的逻辑表达式:
    a.weight大于或等于115,但小于125。
    b.ch为q或Q。
    c.x为偶数,但不是26.
    d.x为偶数,但不是26。
    e.donation为1000-2000或guest为1。
    f.ch是小写字母或大写字母(假设小写字母是依次编码的,大写字母也是依次编码的,但在大小写字母间编码是不连续的)。

//a
weight>=115 && weight<125   

//b
ch=='q' || ch=='Q'

//c
x%2==0 && x!=26

//d
x%2==0 && x%26!=0

//e
donation>=1000 && donation<=20000 || guest==1

//f
(ch>='a' && ch<='z') || (ch<='Z' && ch>='A')

  1. 在英语中,"I will not not speak(我不会不说) "的意思与"I will speak(我要说)"相同。在c++中,!!x是否与x相同呢?

对于bool变量而言,!!x与x是相同的,但对于其他类型变量不一定相同,例如!!5=1,!!5≠5。

  1. 创建一个条件表达式,其值为变量的绝对值。也就是说,如果变量x为正,则表达式的值为x;但如果x为负,则表达式的值为-x–这是一个正值。
    x>=0 ? x : -x;

  2. 用switch改写下面的代码片段:

if(ch=='A')
    a_grade++;
else if(ch=='B')
    b_grade++;
else if(ch=='C')
    c_grade++;
else if(ch=='D')
    d_grade++;
else
    f_grade++;

改代码后

switch(ch)
{
    case 'A' : a_grade++;
                    break;
    case 'B' : b_grade++;
                    break;
    case 'C' : c_grade++;
                    break;
    case 'D' : d_grade++;
                    break;
    default :   f_grade++;
                    break;
}

  1. 对于程序清单6.10,与使用字符(如a和c)表示菜单选项和case标签有何优点呢?(提示:想一想用户输入q和输入5的情况。)
// switch.cpp -- using the switch statement
#include <iostream>
using namespace std;
void showmenu(); // function prototypes
void report();
void comfort();
int main()
{
	showmenu();
	int choice;
	cin >> choice;
	while (choice != 5)
	{
		switch (choice)
		{
		case 1: cout << "\a\n";
			break;
		case 2: report();
			break;
		case 3: cout << "The boss was in all day.\n";
			break;
		case 4: comfort();
			break;
		default: cout << "That's not a choice.\n";
		}
		showmenu();
		cin >> choice;
	}
	cout << "Bye!\n";
	return 0;
}
void showmenu()
{
	cout << "Please enter 1, 2, 3, 4, or 5:\n"
		"1) alarm 2) report\n"
		"3) alibi 4) comfort\n"
		"5) quit\n";
}
void report()
{
	cout << "It's been an excellent week for business.\n"
		"Sales are up 120%. Expenses are down 35%.\n";
}
void comfort()
{
	cout << "Your employees think you are the finest CEO\n"
		"in the industry. The board of directors think\n"
		"you are the finest CEO in the industry.\n";
}

使用数字作为菜单选项和case标签,限定了用户只有输入数字的时候才能有效,若用户错误的输入非整数类型,导致程序被挂起。而使用字符作为菜单选项和case标签,当用户输入错误类型,程序能正确通过default部分提示用户输入错误,用户体验更加友好,提高了程序的容错性和健壮性。

9.请看下面的代码片段

int line = 0;
char ch;
while(cin.get(ch))
{
    if(ch=='Q')
        break;
    if(ch!='\n')
        continue;
    line++;
}

int line = 0;
char ch;
while(cin.get(ch) && ch!='Q')
{
    if(ch=='\n')
        line++;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不好,商鞅要跑

谢谢咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值