当前位置:文档之家› C++Primer中文版(第四版)题解整理

C++Primer中文版(第四版)题解整理

C++Primer中文版(第四版)题解整理
C++Primer中文版(第四版)题解整理

查看所用的编译器文档,了解它所用的文件命名规范。编译并运行本节的main 程序。

【解答】

一般而言,C++编译器要求待编译的程序保存在文件中。C++程序中一般涉及两类文件:头文件和源文件。大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成。文件后缀通常表明文件的类型,如头文件的后缀可以是.h 或.hpp 等;源文件的后缀可以是.cc 或.cpp 等,具体的后缀与使用的编译器有

关。通常可以通过编译器所提供的联机帮助文档了解其文件命名规范。

习题1.2

修改程序使其返回-1。返回值-1 通常作为程序运行失败的指示器。然而,系统不同,如何(甚至是否)报告main 函数运行失败也不同。重新编译并再次运行程序,看看你的系统如何处理main 函数的运行失败指示器。

【解答】

笔者所使用的Windows操作系统并不报告main 函数的运行失败,因此,程序返回-1 或返回0 在运行效果上没有什么区别。但是,如果在DOS 命令提示符方式下运行程序,然后再键入echo %ERRORLEVEL%命令,则系统会显示返回值-1。习题1.3

编一个程序,在标准输出上打印“Hello, World”。

#include

#include "windows.h"

using namespace std;

int main()

{ system("CLS");

cout<<"Hello,World!"<

return 0;

}

习题1.4

我们的程序利用内置的加法操作符“+”来产生两个数的和。编写程序,使用乘法操作符“*”产生两个数的积。

#include

#include "windows.h"

using namespace std;

int main()

{ system("CLS");

cout<<"Enter two numbers:"<

int v1,v2;

cin>>v1>>v2;

cout<<"The product of "<

return 0;

}

习题1.5

我们的程序使用了一条较长的输出语句。重写程序,使用单独的语句打印每一

#include

#include "windows.h"

using namespace std;

int main()

{

system("CLS");

cout << "Enter two numbers:" << endl;

int v1, v2;

cin >> v1 >> v2;

cout << "The sum of ";

cout << v1;

cout << " and ";

cout << v2;

cout << " is ";

cout << v1 + v2 ;

cout << endl;

return 0;

}

习题1.6

解释下面的程序段:

std::cout << "The sum of " << v1;

<< " and " << v2;

<< " is " << v1 + v2

<< std::endl;

这段代码合法吗?如果合法,为什么?如果不合法,又为什么?

【解答】

这段代码不合法。

注意,第1、2、4 行的末尾有分号,表示这段代码包含三条语句,即第1、2 行各为一个语句,第3、4 行构成一个语句。“<<”为二元操作符,在第2、3 两条语句中,第一个“<<”缺少左操作数,因此不合法。

在第2、3 行的开头加上“std::cout”,即可更正。

习题1.7

编译有不正确嵌套注释的程序。

【解答】

由注释对嵌套导致的编译器错误信息通常令人迷惑。例如,在笔者所用的编译器中编译1.3 节中给出的带有不正确嵌套注释的程序:

#include

/*

* comment pairs /* */ cannot nest.

* "cannot nest" is considered source code,

* as is the rest of the program

*/

int main()

{

return 0;

}

编译器会给出如下错误信息:

error C2143: syntax error : missing ';' before '<'

error C2501: 'include' : missing storage-class or type specifiers warning C4138: '*/' found outside of comment (第6 行)

error C2143: syntax error : missing ';' before '{' (第8 行)

error C2447: '{' : missing function header (old-style formal list?)(第8 行)

习题1.8

指出下列输出语句哪些(如果有)是合法的。

std::cout << "/*";

std::cout << "*/";

std::cout << /* "*/" */;

预测结果,然后编译包含上述三条语句的程序,检查你的答案。纠正所遇到的错误。

【解答】

第一条和第二条语句合法。

第三条语句中<<操作符之后至第二个双引号之前的部分被注释掉了,导致<<操作符的右操作数不是一个完整的字符串,所以不合法。在分号之前加上一个双引号即可更正。

习题1.9

下列循环做什么? sum 的最终值是多少?

int sum = 0;

for (int i = -100; i <= 100; ++i)

sum += i;

【解答】

该循环求-100~100 之间所有整数的和(包括-100 和100)。

sum 的最终值是0。

习题1.10

用for 循环编程,求从50~100 的所有自然数的和。然后用while 循环重写该程序。

【解答】

用for 循环编写的程序如下:

#include

#include "windows.h"

int main()

{

int sum = 0;

system("CLS");

for (int i = 50; i <= 100; ++i)

sum += i;

std::cout << "Sum of 50 to 100 inclusive is "

<< sum << std::endl;

return 0;

}

用while 循环编写的程序如下:

#include

#include "windows.h"

using namespace std;

int main()

{

int sum=0, i=50;

system("CLS");

while(i<=100)

{

sum+=i;

i++;

}

cout<<"Sum of 50 to 100 inclusive is "<< sum <

return 0;

}

习题1.11

用while 循环编程,输出10~0 递减的自然数。然后用for 循环重写该程序。【解答】

用while 循环编写的程序如下:

#include

#include "windows.h"

using namespace std;

int main()

{ int i=10;

system("CLS");

while(i>=0)

{

cout<

i--;

}

cout<

return 0;

}

用for 循环编写的程序如下:

#include

#include "windows.h"

using namespace std;

int main()

{ system("CLS");

for (int i=10;i>=0;i--)

{

cout<

}

cout<

return 0;

}

习题1.12

对比前面两个习题中所写的循环。两种形式各有何优缺点?

【解答】

在for 循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况。在while 循环中,循环控制变量的初始化一般放在while 语句之前,循环控制变量的修改一般放在循环体中,形式上不如for 语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。两种形式各有优点,但它们在功能上是等价的,可以相互转换。

习题1.13

编译器不同,理解其诊断内容的难易程度也不同。编写一些程序,包含本小节“再谈编译”部分讨论的那些常见错误。研究编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时不会陌生。

【解答】

对于程序中出现的错误,编译器通常会给出简略的提示信息,包括错误出现的文件及代码行、错误代码、错误性质的描述。如果要获得关于该错误的详细信息,一般可以根据编译器给出的错误代码在其联机帮助文档中查找。

习题1.14

如果输入值相等,本节展示的程序将产生什么问题?

【解答】

sum 的值即为输入值。因为输入的v1 和v2 值相等(假设为x),所以lower 和upper 相等,均为x。for 循环中的循环变量val 初始化为lower,从而

val<=upper

为真,循环体执行一次,sum 的值为val(即输入值x);然后val 加1,val 的值就大于upper,循环执行结束。

习题1.15

用两个相等的值作为输入编译并运行本节中的程序。将实际输出与你在习题

1.14 中所做的预测相比较,解释实际结果和你预计的结果间的不相符之处。【解答】

运行1.4.3 节中给出的程序,输入两个相等的值(例如3,3),则程序输出为:Sum of 3 to 3 inclusive is 3

与习题1.14 中给出的预测一致。

习题1.16

编写程序,输出用户输入的两个数中的较大者。

#include

#include "windows.h"

using namespace std;

int main()

{

system("CLS");

cout<<"Enter two numbers: "<

int v1,v2;

cin>>v1>>v2;

if(v1>=v2)

cout<<"The bigger number is :"<

else

cout<<"The bigger number is :"<

return 0;

}

习题1.17

编写程序,要求用户输入一组数。输出信息说明其中有多少个负数。

#include

#include "windows.h"

using namespace std;

int main()

{

int amount = 0, value;

system("CLS");

// 读入数据直到遇见文件结束符,计算所读入的负数的个数

while (cin >> value)

if (value <= 0)

++amount;

cout << "Amount of all negative values read is"

<< amount << std::endl;

return 0;

}

习题1.18

编写程序,提示用户输入两个数并将这两个数范围内的每个数写到标准输出。#include

#include "windows.h"

using namespace std;

int main()

{

system("CLS");

cout<<"Enter two numbers :"<

int v1,v2;

cin>>v1>>v2;

int lower,upper;

lower=v1;

upper=v2;

if(v1>=v2)

{

upper=v1;

lower=v2;

}

cout<<"Values of " << lower << " to "<< upper << " inclusive are: " <

for(;lower<=upper;lower++)

cout<

cout<

return 0;

}

习题1.19

如果上题给定数1000 和2000,程序将产生什么结果?修改程序,使每一行输出不超过10 个数。

【解答】

所有数的输出连在一起,不便于阅读。

程序修改如下:

#include

#include "windows.h"

using namespace std;

int main()

{

system("CLS");

cout<<"Enter two numbers :"<

int v1,v2;

cin>>v1>>v2;

int lower,upper;

lower=v1;

upper=v2;

if(v1>=v2)

{

upper=v1;

lower=v2;

}

cout<<"Values of " << lower << " to "<< upper << " inclusive are: " <

for(int count=1;lower<=upper;lower++,count++)

{

cout<

if(count%10==0)

cout<

}

cout<

return 0;

}

习题1.20

编写程序,求用户指定范围内的数的和,省略设置上界和下界的if 测试。假定输入数是7 和3,按照这个顺序,预测程序运行结果。然后按照给定的数是7 和3 运行程序,看结果是否与你预测的相符。如果不相符,反复研究关于for 和while 循环的讨论直到弄清楚其中的原因。

#include

#include "windows.h"

using namespace std;

int main()

{

system("CLS");

cout<<"Enter two numbers :"<

int v1,v2,sum=0;

cin>>v1>>v2;

for(int val=v1;val<=v2;val++)

{

sum+=val;

}

cout<<"Sum of " << v1<< " to " << v2 << " inclusive is "<< sum << endl;

return 0;

}

如果输入数据为7 和3,则v1 值为7,v2 值为3。for 语句头中将val 的初

始值设为7,第一次测试表达式val <= v2 时,该表达式的值为false,for 语句的循环体一次也不执行,所以求和结果sum 为0。

习题1.21

本书配套网站(https://www.doczj.com/doc/9f236811.html,/cpp_primer)的第1 章的代码目录下有Sales_ item.h 源文件。复制该文件到你的工作目录。编写程序,循环遍历一组书的销售交易,读入每笔交易并将交易写至标准输出。

#include

#include "Sales_item.h"

#include "windows.h"

using namespace std;

int main()

{

Sales_item book;

system("CLS");

cout << "Enter transactions:" <

while (cin >> book)

{

// 输出ISBN,售出书的本数,总收入,平均价格

cout << "ISBN, number of copies sold, "<< "total revenue, and average price are: "<

cout << book <

}

return 0;

}

习题1.22

编写程序,读入两个具有相同ISBN 的Sales_item 对象并产生它们的和。

#include

#include "Sales_item.h"

#include "windows.h"

using namespace std;

int main()

{

Sales_item trans1, trans2;

// 读入交易

system("CLS");

cout << "Enter two transactions:" <

cin >> trans1 >> trans2;

if (trans1.same_isbn(trans2))

cout << "The total information: " <

<< "ISBN, number of copies sold, "

<< "total revenue, and average price are:"

<< endl << trans1 + trans2;

else

cout << "The two transactions have different ISBN."<

return 0;

}

习题1.23

编写程序,读入几个具有相同ISBN 的交易,输出所有读入交易的和。

#include

#include "Sales_item.h"

#include "windows.h"

using namespace std;

int main()

{

Sales_item total, trans;

system("CLS");

cout << "Enter transactions:" <

if (cin >> total)

{

while (cin >> trans)

if (total.same_isbn(trans)) // ISBN 相同

total = total + trans;

else

{ // ISBN 不同

cout << "Different ISBN." <

return -1;

}

// 输出交易之和

cout << "The total information: " <

<< "ISBN, number of copies sold, "

<< "total revenue, and average price are:"

<

}

else

{

cout << "No data?!" <

return -1;

}

return 0;

}

习题1.24

编写程序,读入几笔不同的交易。对于每笔新读入的交易,要确定它的ISBN 是否和以前的交易的ISBN 一样,并且记下每一个ISBN 的交易的总数。通过给定多笔不同的交易来测试程序。这些交易必须代表多个不同的ISBN,但是每个ISBN 的记录应分在同一组。

#include

#include "Sales_item.h"

#include "windows.h"

using namespace std;

int main()

{

Sales_item trans1, trans2;

int amount;

system("CLS");

cout << "Enter transactions:" <

cin >> trans1;

amount=1;

while (cin >> trans2)

if (trans1.same_isbn(trans2))

++amount;

else

{

cout << "Transaction amount of previous ISBN: "

<< amount <

trans1 = trans2;

amount=1;

}

cout << "Transaction amount of the last ISBN: "

<< amount <

return 0;

}

/*习题1.25

使用源自本书配套网站的Sales_item.h 头文件,编译并执行1.6 节给出的书店程序。*/

习题1.26

在书店程序中,我们使用了加法操作符而不是复合赋值操作符将trans 加到total 中,为什么我们不使用复合赋值操作符?

【解答】

因为在1.5.1 节中提及的Sales_item 对象上的操作中只包含了+和=,没有包含+=操作。(但事实上,使用Sales_item.h 文件,已经可以用+=操作符取代=和+ 操作符的复合使用。)

习题2.1

int、long 和short 类型之间有什么差别?

【解答】

它们的最小存储空间不同,分别为16 位、32 位和16 位。一般而言,short 类型为半个机器字(word)长,int 类型为一个机器字长,而long 类型为一个或两个机器字长(在32 位机器中,int 类型和long 类型的字长通常是相同的)。因此,它们的表示范围不同。

习题2.2

unsigned 和signed 类型有什么差别?

【解答】

前者为无符号类型,只能表示大于或等于0 的数。后者为带符号类型,可以表

示正数、负数和0。

习题2.3

如果在某机器上short 类型占16 位,那么可以赋给short 类型的最大数是什么?

unsigned short 类型的最大数又是什么?

【解答】

若在某机器上short 类型占16 位,那么可以赋给short 类型的最大数是215-1,即32767;而unsigned short 类型的最大数为216-1,即65535。

习题2.4

当给16 位的unsigned short 对象赋值100000 时,赋的值是什么?

【解答】

34464。

100000 超过了16 位的unsigned short 类型的表示范围,编译器对其二进制表示截取低16 位,相当于对65536 求余(求模,%),得34464。

习题2.5

float 类型和double 类型有什么差别?

【解答】

二者的存储位数不同(一般而言,float 类型为32 个二进制位,double 类型为

64 个二进制位),因而取值范围不同,精度也不同(float 类型只能保证6 位有效数字,而double 类型至少能保证10 位有效数字)。

习题2.6

要计算抵押贷款的偿还金额,利率、本金和付款额应分别选用哪种类型?解释你选择的理由。

【解答】

利率可以选择float 类型,因为利率通常为百分之几。一般只保留到小数点后两位,所以6 位有效数字就足以表示了。

本金可以选择long 类型,因为本金通常为整数。long 类型可表示的最大整数一

般为231-1(即2147483647),应该足以表示了。

付款额一般为实数,可以选择double 类型,因为float 类型的6 位有效数字可能不足以表示。

习题2.7

解释下列字面值常量的不同之处。

(a) 'a',L'a',"a",L"a"

(b) 10,10u,10L,10uL,012,0xC

(c) 3.14,3.14f,3.14L

【解答】

'a',L'a',"a",L"a"

'a'为char 型字面值,L'a'为wchar_t 型字面值,"a"为字符串字面值,L"a"为宽字符串字面值。

(b) 10,10u,10L,10uL,012,0xC

10 为int 型字面值,10u 为unsigned 型字面值,10L 为long 型字面值,10uL 为unsigned long 型字面值,012 为八进制表示的int 型字面值,0xC 为十六

进制表示的int 型字面值。

(c) 3.14,3.14f,3.14L

3.14 为double 型字面值,3.14f 为float 型字面值,3.14L 为long double 型字面值。

习题2.8

确定下列字面值常量的类型:

(a) –10 (b) -10u (c) -10. (d) -10e-2

【解答】

(a) int 型

(b) unsigned int 型

(c) double 型

(d) double 型

习题2.9

下列哪些(如果有)是非法的?

(a) "Who goes with F\145rgus?\012"

(b) 3.14e1L (c) "two" L"some"

(d) 1024f (e) 3.14UL

(f) "multiple line

comment"

【解答】

(c) 非法。因为字符串字面值与宽字符串字面值的连接是未定义的。

(d) 非法。因为整数1024 后面不能带后缀f。

(e) 非法。因为浮点字面值不能带后缀U。

(f) 非法。因为分两行书写的字符串字面值必须在第一行的末尾加上反斜线。习题2.10

使用转义字符编写一段程序,输出2M,然后换行。修改程序,输出2,跟着一个制表符,然后是M,最后是换行符。

【解答】

输出2M、然后换行的程序段:

// 输出"2M"和换行字符

std::cout << "2M" << '\n';

修改后的程序段:

// 输出'2', '\t', 'M'和换行字符

std::cout << '2' << '\t' << 'M' << '\n';

习题2.11

编写程序,要求用户输入两个数——底数(base)和指数(exponent),输出底数的指数次方的结果。

#include

#include "windows.h"

using namespace std;

int main()

{

int base,exponent;

long result=1;

system("CLS");

cout<<"Enter base and exponent :"<

cin>>base>>exponent;

if(exponent<0)

{

cout<<"Exponent can't be smaller than 0"<

return -1;

}

if(exponent>0)

{

for(int cnt=1;cnt<=exponent;cnt++)

result*=base;

}

cout<

"<

return 0;

}

习题2.12

区分左值和右值,并举例说明。

【解答】

左值(lvalue)就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。

右值(rvalue)就是变量的值,见2.3.1 节。

变量名出现在赋值运算符的左边,就是一个左值;而出现在赋值运算符右边的变量名或字面常量就是一个右值。

例如:

val1=val2/8

这里的val1 是个左值,而val2 和8 都是右值。

习题2.13

举出一个需要左值的例子。

【解答】

赋值运算符的左边(被赋值的对象)需要左值,见习题2.12。

习题2.14

下面哪些(如果有)名字是非法的?更正每个非法的标识符名字。

(a) int double = 3.14159; (b) char _;

(c) bool catch-22; (d) char 1_or_2 ='1';

(e) float Float = 3.14f;

【解答】

(a) double 是C++语言中的关键字,不能用作用户标识符,所以非法。此语句可改为:double dval = 3.14159;。

(c) 名字catch-22 中包含在字母、数字和下划线之外的字符“-”,所以非法。可将其改为:catch_22;。

(d) 名字1_or_2 非法,因为标识符必须以字母或下划线开头,不能以数字开头。可将其改为:one_or_two;。

习题2.15

下面两个定义是否不同?有何不同?

int month = 9, day = 7;

int month =09, day = 07;

如果上述定义有错的话,那么应该怎样改正呢?

【解答】

这两个定义不同。前者定义了两个int 型变量,初值分别为9 和7;后者也定义了两个int 型变量,其中day 被初始化为八进制值7;而month 的初始化有错:试图将month 初始化为八进制值09,但八进制数字范围为0~7,所以出错。可

将第二个定义改为:

int month =011, day = 07;

习题2.16

假设calc 是一个返回double 对象的函数。下面哪些是非法定义?改正所有的非法定义。

(a) int car = 1024, auto = 2048;

(b) int ival = ival;

(c) std::cin >> int input_value;

(d) double salary = wage = 9999.99;

(e) double calc = calc();

【解答】

(a) 非法:auto 是关键字,不能用作变量名。使用另一变量名,如aut 即可更正。

(c) 非法:>>运算符后面不能进行变量定义。改为:

int input_value;

std::cin >> input_value;

(d) 非法:同一定义语句中不同变量的初始化应分别进行。改为:

double salary = 9999.99, wage = 9999.99;

注意,(b)虽然语法上没有错误,但这个初始化没有实际意义,ival 仍是未初始化的。

习题2.17

下列变量的初始值(如果有)是什么?

std::string global_str;

int global_int;

int main()

{

int local_int;

std::string local_str;

// ...

return 0;

}

【解答】

global_str 和local_str 的初始值均为空字符串,global_int 的初始值为0,local_int 没有初始值。

习题2.18

解释下列例子中name 的意义:

extern std::string name;

std::string name("exercise 3.5a");

extern std::string name("exercise 3.5a");

【解答】

第一条语句是一个声明,说明std::string 变量name 在程序的其他地方定义。第二条语句是一个定义,定义了std::string 变量name,并将name 初始化为"exercise 3.5a"。

第三条语句也是一个定义,定义了std::string 变量name,并将name 初始化为"exercise 3.5a",但这个语句只能出现在函数外部(即,name 是一个全局变量)。

习题2.19

下列程序中j 的值是多少?

int i = 42;

int main()

{

int i = 100;

int j = i;

// ...

}

【解答】

j 的值是100。j 的赋值所使用到的i 应该是main 函数中定义的局部变量i,因为局部变量的定义会屏蔽全局变量的定义。

习题2.20

下列程序段将会输出什么?

int i = 100, sum = 0;

for (int i = 0; i != 10; ++i)

sum += i;

std::cout << i << " " << sum << std::endl;

【解答】

输出为:

100 55

for 语句中定义的变量i,其作用域仅限于for 语句内部。输出的i 值是for 语句之前所定义的变量i 的值。

习题2.21

下列程序合法吗?

int sum = 0;

for (int i = 0; i != 10; ++i)

sum += i;

std::cout << "Sum from 0 to " << i

<< " is " << sum << std::endl;

【解答】

不合法。因为变量i 具有语句作用域,只能在for 语句中使用,输出语句中

使用i 属非法。

习题2.22

下列程序段虽然合法,但是风格很糟糕。有什么问题呢?怎样改善?

for (int i = 0; i < 100; ++i)

// process i

【解答】

问题主要在于使用了具体值100 作为循环上界:100 的意义在上下文中没有体现

出来,导致程序的可读性差;若100 这个值在程序中出现多次,则当程序的需求发生变化(如将100 改变为200)时,对程序代码的修改复杂且易出错,导致程序的可维护性差。

改善方法:设置一个const 变量(常量)取代100 作为循环上界使用,并为该变量选择有意义的名字。

习题2.23

下列哪些语句合法?对于那些不合法的使用,解释原因。

(a) const int buf;

(b) int cnt = 0;

const int sz = cnt;

(c) cnt++; sz++;

【解答】

(a) 不合法。因为定义const 变量(常量)时必须进行初始化,而buf 没有初始化。

(b) 合法。

(c) 不合法。因为修改了const变量sz 的值。

习题2.24

下列哪些定义是非法的?为什么?如何改正?

(a) int ival = 1.01; (b) int &rval1 = 1.01;

(c) int &rval2 = ival; (d) const int &rval3 = 1;

【解答】

(b)非法。

因为rval1 是一个非const引用,非const 引用不能绑定到右值,而1.01 是一个右值。可改正为:

int &rval1 = ival;

(假设ival 是一个已定义的int 变量)。

习题2.25

在习题2.24 给出的定义下,下列哪些赋值是非法的?如果赋值合法,解释赋值的作用。

(a) rval2 = 3.14159; (b) rval2 = rval3;

(c) ival = rval3; (d) rval3 = ival;

【解答】

(d)非法。因为rval3 是一个const引用,不能进行赋值。

合法赋值的作用:

(a)将一个double 型字面值赋给int 型变量ival,发生隐式类型转换,ival 得到的值为3。

(b)将int 值1 赋给变量ival。

(c)将int 值1 赋给变量ival。

习题2.26

(a)中的定义和(b)中的赋值存在哪些不同?哪些是非法的?

(a) int ival = 0; (b) ival = ri;

const int &ri = 0; ri = ival;

【解答】

int ival = 0; 定义ival 为int 变量,并将其初始化为0。

const int &ri = 0; 定义ri 为const 引用,并将其绑定到右值0。

ival = ri; 将0 值赋给ival。

ri = ival; 试图对ri 赋值,这是非法的,因为ri 是const 引用,

不能赋值。

习题2.27

下列代码输出什么?

int i, &ri = i;

i = 5; ri =10;

std::cout << i << " " << ri << std::endl;

【解答】

输出:

10 10

ri 是i 的引用,对ri 进行赋值,实际上相当于对i 进行赋值,所以输出i 和ri 的值均为10。

习题2.28

编译以下程序,确定你的编译器是否会警告遗漏了类定义后面的分号。

class Foo {

// empty

} // Note: no semicolon

int main()

{

return 0;

}

如果编译器的诊断结果难以理解,记住这些信息以备后用。

【解答】

在笔者所用的编译器中编译上述程序,编译器会给出如下错误信息:

error C2628: 'Foo' followed by 'int' is illegal (did you forget a ';'?) (第4 行)

warning C4326: return type of 'main' should be 'int or void' instead of 'Foo' (第5 行)

error C2440: 'return' : cannot convert from 'int' to 'Foo' (第

6 行)

也就是说,该编译器会对遗漏了类定义后面的分号给出提示。

习题2.29

区分类中的public 部分和private 部分。

【解答】

类中public 部分定义的成员在程序的任何部分都可以访问。通常在public 部分放置操作,以便程序中的其他部分可以执行这些操作。

类中private 部分定义的成员只能被作为类的组成部分的代码(以及该类的友元)访问。通常在private 部分放置数据,以对对象的内部数据进行隐藏。习题2.30

定义表示下列类型的类的数据成员:

(a)电话号码 (b) 地址

(c) 员工或公司 (d) 某大学的学生

【解答】

(a) 电话号码

class Tel_number {

public:

//...对象上的操作

private:

std::string country_number;

std::string city_number;

std::string phone_number;

};

(b) 地址

class Address {

public:

//...对象上的操作

private:

std::string country;

std::string city;

std::string street;

std::string number;

};

(c) 员工或公司

class Employee {

public:

// ...对象上的操作

private:

std::string ID;

std::string name;

char sex;

Address addr;

Tel_number tel;

};

class Company {

public:

// ...对象上的操作

private:

std::string name;

Address addr;

Tel_number tel;

};

(d) 某大学的学生

class Student {

public:

// ...对象上的操作

private:

std::string ID;

std::string name;

char sex;

std::string dept; // 所在系

std::string major;

Address home_addr;

Tel_number tel;

};

注意,在不同的具体应用中,类的设计会有所不同,这里给出的只是一般性的简单例子。

习题2.31

判别下列语句哪些是声明,哪些是定义,请解释原因。

(a) extern int ix = 1024 ;

(b) int iy ;

(c) extern int iz ;

(d) extern const int &ri ;

【解答】

(a)是定义,因为extern 声明进行了初始化。

(b)是定义,变量定义的常规形式。

(c)是声明,extern 声明的常规形式。

(d)是声明,声明了一个const 引用。

习题2.32

下列声明和定义哪些应该放在头文件中?哪些应该放在源文件中?请解释原因。

(a) int var ;

(b) const double pi = 3.1416;

(c) extern int total = 255 ;

(d) const double sq2 = squt (2.0) ;

【解答】

(a)、(c)、(d)应放在源文件中,因为(a)和(c)是变量定义,定义通常应放在源文件中。(d)中的const 变量sq2 不是用常量表达式初始化的,所以也应该放在源文件中。

(b)中的const 变量pi 是用常量表达式初始化的,应该放在头文件中。

计算机操作系统(第四版)

第三章处理机调度与死锁 1,高级调度与低级调度的主要任务是什么?为什么要引入中级调度? 【解】(1)高级调度主要任务是用于决定把外存上处于后备队列中的那些作业调入内存,并为它们创建进程,分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。(2)低级调度主要任务是决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。(3)引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。为此,应使那些暂时不能运行的进程不再占用宝贵的内存空间,而将它们调至外存上去等待,称此时的进程状态为就绪驻外存状态或挂起状态。当这些进程重又具备运行条件,且内存又稍有空闲时,由中级调度决定,将外存上的那些重又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上,等待进程调度。 3、何谓作业、作业步和作业流? 【解】作业包含通常的程序和数据,还配有作业说明书。系统根据该说明书对程序的运行进行控制。批处理系统中是以作业为基本单位从外存调入内存。 作业步是指每个作业运行期间都必须经过若干个相对独立相互关联的顺序加工的步骤。 作业流是指若干个作业进入系统后依次存放在外存上形成的输入作业流;在操作系统的控制下,逐个作业进程处理,于是形成了处理作业流。 4、在什么情冴下需要使用作业控制块JCB?其中包含了哪些内容? 【解】每当作业进入系统时,系统便为每个作业建立一个作业控制块JCB,根据作业类型将它插入到相应的后备队列中。 JCB 包含的内容通常有:1) 作业标识2)用户名称3)用户账户4)作业类型(CPU繁忙型、I/O芳名型、批量型、终端型)5)作业状态6)调度信息(优先级、作业已运行)7)资源要求8)进入系统时间9) 开始处理时间10) 作业完成时间11) 作业退出时间12) 资源使用情况等 5.在作业调度中应如何确定接纳多少个作业和接纳哪些作业? 【解】作业调度每次接纳进入内存的作业数,取决于多道程序度。应将哪些作业从外存调入

大学物理课本答案习题 第十三章习题解答

习题十三 13-1 如题图13-1所示,两条平行长直导线和一个矩形导线框共面,且导线框的一个边与长直导线平行,到两长直导线的距离分别为1r , 2r 。已知两导线中电流都为0sin I I t ω=,其中I 0和ω为常数,t 为 时间。导线框长为a ,宽为b ,求导线框中的感应电动势。 解:无限长直电流激发的磁感应强度为02I B r μ= π。取坐标Ox 垂直于 直导线,坐标原点取在矩形导线框的左边框上,坐标正方向为水平向右。取回路的绕行正方向为顺时针。由场强的叠加原理可得x 处的磁感应强度大小 00122() 2() I I B r x r x μμ= + π+π+ 方向垂直纸面向里。 通过微分面积d d S a x =的磁通量为 00m 12d d d d 2()2()I I B S B S a x r x r x μμΦππ?? =?==+??++?? 通过矩形线圈的磁通量为 00m 01 2d 2()2()b I I a x r x r x μμΦ??=+??π+π+???012012ln ln sin 2a r b r b I t r r μω?? ++=+ ?π?? 感生电动势 0m 12012d ln ln cos d 2i a r b r b I t t r r μωΦεω?? ++=- =-+ ?π?? 012012()()ln cos 2a r b r b I t r r μωω?? ++=- ??π?? 0i ε>时,回路中感应电动势的实际方向为顺时针;0i ε<时,回路中感应电动势的实际方向 为逆时针。 13-2 如题图13-2所示,有一半径为r =10cm 的多匝圆形线圈,匝数N =100,置于均匀磁场B 中(B =0.5T )。圆形线圈可绕通过圆心的轴O 1O 2转动,转速1 600r min n -=? 。求圆线圈自图示的初始位置转过 题图13-1 题图 13-2 解图13-1

实用英语综合教程3第四版答案4-7单元

Unit 4 5 One of the difficulties that overseas students have to overcome has to do with adapting to foreign culture. One of the challenges that faces us has to do with coping with global warming. Winning a scholarship starts with getting excellent grades. Succeeding in a job interview starts with making a good impression. This is true in spoken language as well as in written language. This is true in modern societies as well as in ancient societies. Being sorry that I had broken his cell phone, I hurried out to buy him a new one. Being happy that I had got a pay raise, I spent much money in a big shopping mall. These lectures are sure to help you achieve face with new challenges. The promotion plans are sure to help us increase the sales of our new models. Don't just sit in front of the computer all day long and expect your parents to do everything for you. Don't just stay at home and expect a good job to come to you. Unit 5 Language may be a big problem, but there are many other things you can do to help. The short time schedule may be a big problem, but there are many other things we can do to catch up. Crying is not wrong. We just have to cheer up after it. Dreaming is not wrong. We just have to work on to realize our dreams. Whenever she is in bad mood, she goes to the seaside for a walk. Whenever you feel like talking with me, give me a call. If you're going with us, come and meet us at eight. If you're traveling to other places, go online for some helpful information.

操作系统第四版-课后习题答案

操作系统第四版-课后习题答案

第一章 作者:佚名来源:网络 1、有一台计算机,具有IMB 内存,操作系统占用200KB ,每个用户进程各占200KB 。如果用户进程等待I/O 的时间为80 % ,若增加1MB 内存,则CPU 的利用率提高多少? 答:设每个进程等待I/O 的百分比为P ,则n 个进程同时等待刀O 的概率是Pn ,当n 个进程同时等待I/O 期间CPU 是空闲的,故CPU 的利用率为1-Pn。由题意可知,除去操作系统,内存还能容纳4 个用户进程,由于每个用户进程等待I/O的时间为80 % , 故: CPU利用率=l-(80%)4 = 0.59 若再增加1MB 内存,系统中可同时运行9 个用户进程,此时:cPu 利用率=l-(1-80%)9 = 0.87 故增加IMB 内存使CPU 的利用率提高了47 % : 87 %/59 %=147 % 147 %-100 % = 47 % 2 一个计算机系统,有一台输入机和一台打印机,现有两道程序投入运行,且程序A 先开始做,程序B 后开始运行。程序A 的运行轨迹为:计算50ms 、打印100ms 、再计算50ms 、打印100ms ,结束。程序B 的运行轨迹为:计算50ms 、输入80ms 、再计算100ms ,结束。试说明(1 )两道程序运行时,CPU有无空闲等待?若有,在哪段时间内等待?为什么会等待?( 2 )程序A 、B 有无等待CPU 的情况?若有,指出发生等待的时刻。 答:画出两道程序并发执行图如下: (1)两道程序运行期间,CPU存在空闲等待,时间为100 至150ms 之间(见图中有色部分) (2)程序A 无等待现象,但程序B 有等待。程序B 有等待时间段为180rns 至200ms 间(见图中有色部分) 3 设有三道程序,按A 、B 、C优先次序运行,其内部计算和UO操作时间由图给出。

c++primerplus中文版第六版源代码

C++ primer plus 中文版第六版源代码 第二章到第四章,后续继续更新……… 第二章 1:#include void main() { using namespace std; int carrots; carrots=25; cout<<"I have "; cout<

2:#include int stonetolb(int); int main() { using namespace std; int stone; cout<<"Enter the weight in stone: "; cin>>stone; int pounds=stonetolb(stone); cout< void main()

{ using namespace std; int carrots; carrots=25; cout<<"How many carrots do you have?"<>carrots; cout<<"Here are two more."; carrots=carrots+2; cout<<"Now you have "< using namespace std; void main() { cout<<"Come up and C++ me some time.";

大学物理学下册答案第11章

第11章 稳恒磁场 习 题 一 选择题 11-1 边长为l 的正方形线圈,分别用图11-1中所示的两种方式通以电流I (其中ab 、cd 与正方形共面),在这两种情况下,线圈在其中心产生的磁感应强度的大小分别为:[ ] (A )10B =,20B = (B )10B = ,02I B l π= (C )01I B l π= ,20B = (D )01I B l π= ,02I B l π= 答案:C 解析:有限长直导线在空间激发的磁感应强度大小为012(cos cos )4I B d μθθπ= -,并结合右手螺旋定则判断磁感应强度方向,按照磁场的叠加原理,可计 算 01I B l π= ,20B =。故正确答案为(C )。 11-2 两个载有相等电流I 的半径为R 的圆线圈一个处于水平位置,一个处于竖直位置,两个线圈的圆心重合,如图11-2所示,则在圆心O 处的磁感应强度大小为多少? [ ] (A )0 (B )R I 2/0μ (C )R I 2/20μ (D )R I /0μ 答案:C 解析:圆线圈在圆心处的磁感应强度大小为120/2B B I R μ==,按照右手螺旋定 习题11-1图 习题11-2图

则判断知1B 和2B 的方向相互垂直,依照磁场的矢量叠加原理,计算可得圆心O 处的磁感应强度大小为0/2B I R =。 11-3 如图11-3所示,在均匀磁场B 中,有一个半径为R 的半球面S ,S 边线所在平面的单位法线矢量n 与磁感应强度B 的夹角为α,则通过该半球面的磁通量的大小为[ ] (A )B R 2π (B )B R 22π (C )2cos R B πα (D )2sin R B πα 答案:C 解析:通过半球面的磁感应线线必通过底面,因此2cos m B S R B παΦ=?= 。故正 确答案为(C )。 11-4 如图11-4所示,在无限长载流直导线附近作一球形闭合曲面S ,当曲面S 向长直导线靠近时,穿过曲面S 的磁通量Φ B 将如何变化?[ ] ( A )Φ增大, B 也增大 (B )Φ不变,B 也不变 ( C )Φ增大,B 不变 ( D )Φ不变,B 增大 答案:D 解析:根据磁场的高斯定理0S BdS Φ==? ,通过闭合曲面S 的磁感应强度始终为0,保持不变。无限长载流直导线在空间中激发的磁感应强度大小为02I B d μπ= ,曲面S 靠近长直导线时,距离d 减小,从而B 增大。故正确答案为(D )。 11-5下列说法正确的是[ ] (A) 闭合回路上各点磁感应强度都为零时,回路内一定没有电流穿过 (B) 闭合回路上各点磁感应强度都为零时,回路内穿过电流的代数和必定为零 (C) 磁感应强度沿闭合回路的积分为零时,回路上各点的磁感应强度必定为零 (D) 磁感应强度沿闭合回路的积分不为零时,回路上任意一点的磁感应强度 I 习题11-4图 习题11-3图

C Primer Plus第6版编程练习答案

Chapter 2 Programming Exercises PE 2--‐1 /* Programming Exercise 2-1 */ #include <> int main(void) { printf("Gustav Mahler\n"); printf("Gustav\nMahler\n"); printf("Gustav "); printf("Mahler\n"); return 0; } PE 2--‐3 /* Programming Exercise 2-3 */ #include <> int main(void) { int ageyears; /* age in years */ int agedays; /* age in days */ /* large ages may require the long type */ ageyears = 101; agedays = 365 * ageyears; printf("An age of %d years is %d days.\n", ageyears, agedays); return 0; } PE 2--‐4 /* Programming Exercise 2-4 */ #include <> void jolly(void); void deny(void); int main(void) { jolly(); jolly(); jolly(); deny(); return 0; } void jolly(void) { printf("For he's a jolly good fellow!\n"); } void deny(void) { printf("Which nobody can deny!\n"); } PE 2--‐6 /* Programming Exercise 2-6 */ #include <> int main(void) { int toes; toes = 10; printf("toes = %d\n", toes);

新风尚大学实用英语综合教程4课后习题答案

Everyone needs friends .If you fail to make friends,you should examine yourself and see if there is something wrong with your personality. Maybe you have social faults such as snobbishness , talkativeness and using slang etc. Which drive away your new acquaintances . Whatever your social faults may be , look at them honestly and make real effort to correct them. A friendly person does his best to make a stranger feel at home , wherever he happens to be. Put yourself in the other fellows' place and make them feel welcome . Try to remember names . It makes your new acquaintances feel happy when you call them by their names . It gives them the feeling that they have made an impression on you and that mean something to them because you remember them. If you don't agree with other people on a certain matter , you should be friendly . Don't argue, but discuss . You always lose friends if you argue too much . A friendly person thinks of others , and doesn't insist on his own "rights". People who refuse to consider others have few friends. Finally , don't treat people only according to their social positions . Really friendly people respect everyone at all times .

内蒙古科技大学马文蔚大学物理(下册)第六版答案解析

第九章振动 习题:P37~39 1,2,3,4,5,6,7,8,16.

9-4 一质点做简谐运动,周期为T,当它由平衡位置向X 轴正方向运动时,从1/2 最大位移处到最大位移处这段路程所需的时间( ) A、T/12 B、T/8 C、T/6 D、T/4 分析(C),通过相位差和时间差的关系计算。可设位移函数 y=A*sin(ωt),其中ω=2π/T; 当y=A/2, ω t1= π /6 ;当y=A, ω t2= π /2 ;△ t=t2-t1=[ π /(2 ω )]-[ π /(6 ω )]= π/(3ω)=T/6

9-回图(a)中所阿的是两个简谐运动的曲线,若这两个简谐j?动可叠加* 则合成的余弦振动的初相位为() 3 1 (A)-7W (B)—IT(C)F (D)O 分析与解由振动曲线可以知道,这是两个同振动方向、同频率简谐运动, 它们的相位差是TT(即反相位)?运动方程分别为X I= Acos ωt利%2= -^-CoS(((;? + 瓷)?它们的振幅不同.对于这样两个简谐运动M用旋转欠量送,如图(b)很方便 A 求得合运动方程为x=ycos ωt.因而正确答案为(D). 9-目有一个弹簧振子,振幅4 =2-0 X 10-2 m,周期T = 1.0 s,初相<p = 3ιτ∕4.试写出它的运动方程,并作出X - 1图I e - i图和a - t图. 解因3=X∕T,则运动方程 / 2πf ≡?cos(ωt + φ) =ACUS

根据题中给出的数据得 X = 2. 0 Xio '2cos( 2irf + O- 75τr) ( m ) 振子的速度和加速度分别为 t) = dx∕(It = -4π × 10^2Rin(2ττt + 0. 75ττ) (m * s^,) (Z = ?2χ∕df2 = - 8TT2X 10 ^2cos( 2τrt + 0. 75τT) ( m ? s ^2) X-I^V-C及Oft图如图所示.

新编实用英语综合教程2第四版汉译英答案

新编实用英语综合教程2第四版汉译英答案 Unit 1 P14 1) 你能告诉我在哪儿可以买到口香糖吗? Can you tell me where I can buy some chewing gum? 2) 警察想知道她长什么样儿。 The police wanted to know what she looked like. 3) 你知道她穿的是什么衣服吗? Do you know what she was wearing? 4) 在报告中他们问到银行里有几个监控摄像头。 In the report, they asked how many security cameras there were in the bank. 5) 面试官问他已经工作几年了。 The interviewer asked him how many years he had worked. 6) 你想知道他什么时候去上海吗? Do you want to know when he will leave for Shanghai? 7) 我只是想知道你喜欢什么颜色, 红色还是黄色。 I want to know which color you prefer — red or yellow. 填空题 1) What's your guideline in choosing songs for your audience? 2) The seminar starts on Friday and the experts will be discussing the impact of technology on the climate in the future. 3) Barclays appointed Bob Diamond, the head of its investment-banking2011. March from executive chiefnew its as business, 4) Frankly speaking, I cannot uphold such conduct. You see, it is aimed only at the personal interest. 5) However, just because you can write statements in purely mathematical notations, this doesn't mean that you necessarily should. 6) That was good timing because his work was influential in shaping the project plan. 7) Those studying abroad will most likely return home for better employment because of the tight job market abroad. 8) It gives me great pleasure to express once again my deep appreciation for the grand reception and generous hospitality we enjoy here. P19 1) 2) 3) 美国人一般早早就安排好他们的退休生活。Americans usually make a plane for their retirement well in advance. 他们通常被看成最有希望的歌 手。They are commonly regarded as the most promising singers. 我从你的

计算机操作系统第四版试题及答案

操作系统期末考试(一) 一、单项选择题(在每小题的四个备选答案中,只有一个是正确的,将其号码写在题干的括号中。每小题2分,共20分) 1、文件系统的主要组成部分是() A、文件控制块及文件 B、I/O文件及块设备文件 C、系统文件及用户文件 D、文件及管理文件的软件 2、实现进程互斥可采用的方法() A、中断 B、查询 C、开锁和关锁 D、按键处理 3、某页式管理系统中,地址寄存器的低9位表示页内地址,则页面大小为() A、1024字节 B、512字节 C、1024K D、512K 4、串联文件适合于()存取 … A、直接 B、顺序 C、索引 D、随机 5、进程的同步与互斥是由于程序的()引起的 A、顺序执行 B、长短不同 C、信号量 D、并发执行 6、信号量的值() A、总是为正 B、总是为负 C、总是为0 D、可以为负整数 7、多道程序的实质是() A、程序的顺序执行 B、程序的并发执行 C、多个处理机同时执行 D、用户程序和系统程序交叉执行 8、虚拟存储器最基本的特征是() A、从逻辑上扩充内存容量 B、提高内存利用率 C、驻留性 D、固定性 ; 9、飞机定票系统是一个() A、实时系统 B、批处理系统 C、通用系统 D、分时系统 10、操作系统中,被调度和分派资源的基本单位,并可独立执行的实体是() A、线程 B、程序 C、进程 D、指令 二、名词解释(每小题3分,共15分) 1.死锁: 2.原子操作: 3.临界区: 4.虚拟存储器: 5.文件系统: ' 三、判断改错题(判断正误,并改正错误,每小题2分,共20分) 1、通道是通过通道程序来对I/O设备进行控制的。 () 2、请求页式管理系统中,既可以减少外零头,又可以减少内零头。 () 3、操作系统中系统调用越多,系统功能就越强,用户使用越复杂。 () 4、一个进程可以挂起自已,也可以激活自已。 () 5、虚拟存储器的最大容量是由磁盘空间决定的。 () 6、单级文件目录可以解决文件的重名问题。 () 7、进程调度只有一种方式:剥夺方式。 ()

C Primer Plus (第六版)中文版 6.16编程练习

//******************6.15复习题************************** //*********** 6 ************************** #include int main(void) { int i, j; for (i = 0; i < 4; i++) //外层循环控制行内层循环控制列 { for (j = 0; j < 8; j++) { printf("$"); } printf("\n"); } return 0; } //******************6.16 编程练习 ************************** //****************** 一 ************************** #include #define SIZE 26 int main(void) { char array[SIZE]; int index = 0; array[0] = 'a'; printf("%c", array[0]); for (index = 1; index < SIZE; index++) { array[index] = 'a' + index; printf("%c", array[index]); } return 0; } //****************** 二 ************************** #include int main(void)

{ int i, j;//i控制行,j控制列计数作用 for (i = 0; i < 5; i++) { for (j = 0; j < =i ; j++) { printf("$"); } printf("\n"); } return 0; } //****************** 三 ************************** #include int main(void) { int i;//外层循环控制行 int j;//内层循环控制列 char ch = 'F'; for (i = 0; i < 6; i++) { for (j = 0; j <= i; j++) printf("%c", ch-j ); printf("\n"); } return 0; } //****************** 四 ************************** #include int main(void) { int i;//外层循环控制行 int j;//内层循环控制列 char ch = 'A'; for (i = 0; i < 6; i++) { for (j = 0; j <= i; j++) printf("%c", ch++ ); printf("\n");

21世纪大学实用英语综合教程(第四册)课后答案

21世纪大学实用英语综合教程(第四册)练习答案(上)2008-06-30 18:22 Unit 1 5. 1. forbade 2. mourning 3. charge 4. accumulate 5. begged 6. declared 7. narrow 8. penniless 9. unloading 10. stolen 11. absence 12. faithfully 6. 1. a good deal of 2. speak of 3. leaning on 4. stood on his feet 5. at (the) most 6. both…and 7. counted out 8. with the help of 9. heard of 10. be blessed with 10. 1. Driven by a strong will, he eventually fulfilled the task he had undertaken. 2. He promised to write to me as soon as he got there, but nothing has been heard of him so far. 3. The boss has never been so pleased with any employee before. The young man is a real find. 4. With the help of the doctors and nurses, the patient was able to stand on his feet once more and soon resumed working. 5. The old man’s wrinkled face spoke of the hardships he had endured in his life. 6. When she recovered somewhat, she leaned on the window watching the children play on the lawn. Unit 2 5. 1. statistics 2. versions 3. legal 4. adventurous 5. fate 6. indeed 7. chatting 8. online 9. owed 10. Internet 12. expenses 6. 1. insisted on 2. gave…notice 3. base…on 4. from the beginning 5. in the middle of

计算机操作系统(第四版)课后习题答案第二章

第二章 1. 什么是前趋图?为什么要引入前趋图? 答:前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph),用于描述进程之间执行的前后关系。 2. 画出下面四条诧句的前趋图: S1=a:=x+y; S2=b:=z+1; S3=c:=a-b; S4=w:=c+1; 答:其前趋图为: 3. 为什么程序并发执行会产生间断性特征? 程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的进程之间,形成了相互制约的关系,从而也就使得进程在执行期间出现间断性。 4. 程序并发执行时为什么会失去封闭性和可再现性? 因为程序并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态是由多个程序来改变,致使程序的运行失去了封闭性。而程序一旦失去了封闭性也会导致其再失去可再现性。 5. 在操作系统中为什么要引入进程概念?它会产生什么样的影响? 为了使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述,从而在操作系统中引入了进程概念。影响: 使程序的并发执行得以实行。 6. 试从动态性,并发性和独立性上比较进程和程序? a. 动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只是一组有序指令的集合,是静态实体。 b. 并发性是进程的重要特征,同时也是OS的重要特征。引入进程的目的正是为了使其程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。 c. 独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。 7. 试说明PCB的作用?为什么说PCB是进程存在的唯一标志? a. PCB是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需的用于描述进程情况及控制进程运行所需的全部信息。因而它的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能和其它进程并发执行的进程。 b. 在进程的整个生命周期中,系统总是通过其PCB对进程进行控制,系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的,所以说,PCB是进程存在的唯一标志。 11.试说明进程在三个基本状态之间转换的典型原因。 答:(1)就绪状态→执行状态:进程分配到CPU资源(2)执行状态→就绪状态:时间片用完(3)执行状态→阻塞状态:I/O请求(4)阻塞状态→就绪状态:I/O完成 12.为什么要引入挂起状态?该状态有哪些性质? 答:引入挂起状态处于五种不同的需要: 终端用户需要,父进程需要,操作系统需要,对换需要和负荷调节需要。处于挂起状态的进程不能接收处理机调度。10.在进行进程切换时,所要保存的处理机状态信息有哪些?答:进行进程切换时,所要保存的处理机状态信息有:(1)进程当前暂存信息(2)下一指令地址信息(3)进程状态信息(4)过程和系统调用参数及调用地址信息。13.在进行进程切换时,所要保存的处理机状态信息有哪些? 答:进行进程切换时,所要保存的处理机状态信息有: (1)进程当前暂存信息 (2)下一指令地址信息 (3)进程状态信息 (4)过程和系统调用参数及调用地址信息。 14.试说明引起进程创建的主要事件。答:引起进程创建的主要事件有:用户登录、作业调度、提供服务、应用请求。 15.试说明引起进程被撤销的主要事件。答:引起进程被撤销的主要事件有:正常结束、异常结束(越界错误、保护错、非法指令、特权指令错、运行超时、等待超时、算术运算错、I/O 故障)、外界干预(操作员或操作系统干预、父进程请求、父进程终止)。 16.在创建一个进程时所要完成的主要工作是什么? 答:(1)OS 发现请求创建新进程事件后,调用进程创建原语Creat();(2)申请空白PCB;(3)为新进程分配资源;(4)初始化进程控制块;(5)将新进程插入就绪队列. 17.在撤销一个进程时所要完成的主要工作是什么? 答:(1)根据被终止进程标识符,从PCB 集中检索出进程PCB,读出该进程状态。(2)若被终止进程处于执行状态,立即终止该进程的执行,臵调度标志真,指示该进程被终止后重新调度。(3)若该进程还有子进程,应将所

CPrimerPlus第6版中文版勘误表

注意:下面的勘误中,红色字体为修改后的文字,提请各位读者注意。 第 6 页,” 1.6 语言标准”中的第 3 行,将 1987 年修改为 1978 年。 第 22 页,” 2. main ()函数”中的第 1 行, int main (void ) 后面的分号( ; )删除。 第 24 页,“5. 声明”的第 10 行,也就 是一个变量、函数或其他实体的名称。 第 27 页,图 2.3 中,下划线应该只包含括号中的内容;第 2 段的第 4 行,而不是存储 在 源代码 中的指令。 第 30页,“2.5.4 打印多个值”的第 4行,双引 号后面的第 1 个变量。 第 34页,“2.7.3 程序状态”第 2段的第 4 行,要尽量忠实 于代码来模拟。 第 35页,“2.10 本章小结”第 2段的第 1句,声明 语句为变量指定变量名, 并标识该变量中存 储的数据类型;本页倒数第 2 行,即 检查程序每执行一步后所有变量的值。 第37页,“2.12编程练习”中第1题,把你的名和姓打印在一行……把你的 名和姓分别打印在 两行……把你的 名和姓打印在一行……把示例的内容换成你的 名字。 第 40 页,第 1 行,用于把英 磅常衡盎司转换为… … 第44页,“3.4 C 语言基本数据类型”的第 1句,本节将 详细介绍C 语言的基本属性类型…… 第 46页,“5. 八进制和十六进制”的第 4句,十六进制数 3的二进制数 是 0011,十六进制数 5 的二进制数 是 0101;“6. 显示八进制和十六进制”的第 1 句,既可以使用 也可以 显示不同进制 的数;将“回忆一下……程序在执行完毕后不会立即关闭执行窗口”放到一个括号里。 第 47页,“2. 使用多种整数类型的原因”第 3句,过去的一台运行 Windows 3.x 的机器上。 第 53 页,图 3.5 下面的第 4 行“上面最后一个例子( printf ( “ ” a \\ is a backslash. ” \n ” ); )” 第 56页,正文的第 2行和第 4行应该分别为 printf ( “me32 = %““d”“\n ”, me32); printf ( “me32 = %d\n ” , me32); 第 61 页,“无符号类型”的最后 1 句,相当于 unsigned int (即两者之间添加一个空格 )。 第 62 页,程序清单 3.8 中的第 1 行,将 //* typesize.c -- 打印类型大小 */ 中的第一个斜杠删 除。 第 63页,“3.6 参数和陷阱”第 2行, printf ( “ Hello,pal. ” )(即 Hello, 和 pal. 之间没有空 格)。 第 64 页,程序清单 3.10 中的第 1 行,使用 转义序列。 第 75 页,倒数第 8行, 何时使用圆括号 取决于运算对象是类型还是特定量。 第82页,第11行, . 格式字符串包含了两个待打印项 number 和pies 对应的 ..... 第83页,表4.4中的“ L”修饰符的含义介绍中,应该是示例: ” %L ”、“%10.4Le” 第 84 页,表 4.5 中的第 1 行,即,从字段的左侧开始打印该 项(即,应该只保留一个 项);在 “ 0”标记的含义中,添加一行: 示例:"%010d"和"%08.3f"。 第86页,第1段的第2行,……字段宽度是容纳 待打印数字所需的……; 倒数第4段中,根据%x 打印出1f,根据%打印出1F 第87页,“4.4.4转换说明的意义”第 2段,……读者认为原始值 被替换成转换后的值。 第89页,“参数传递”第2行,把变量n1、n2、n3和n4的值传递给程序(即,保留一个顿号)。 第 93页,第 5行的 2121.45 的字体应该与第 4行的 42 的字体保持一致;表 4.6 上面的最后一 行,对于 double 类型要使用 1 修饰符。 第 94 页,表中的第 3 行,把对应的数值存储为 unsigned short int 类型;把“ j ”转换说明的 示例 放到“ z ”转换说明中;在“ j ”转换说明的含义中添加:示例:” %jd”、” %ju”。 第95页,“3.scanf () 的返回值”上面一段的倒数第 3行,如果在格式字符串中把空格放到 %c 的前面 。 第98页,倒数第2段,strlen () 函数(声明在string.h 头文件中)可用于 ... 。 第 100 页,” 4.8 编程练习”中的第 2 题,将该题中的“名和姓”统一替换为“名字” ;并执行 以下 操作;第 3题,将 a 、 b 项中的“输入”替换为” The input is ”,将“或”替换为“ or”, 将末尾1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.

大学物理(上册)参考答案

第一章作业题 P21 1.1; 1.2; 1.4; 1.9 质点沿x 轴运动,其加速度和位置的关系为 a =2+62 x ,a 的单位为2 s m -?,x 的单 位为 m. 质点在x =0处,速度为101 s m -?,试求质点在任何坐标处的速度值. 解: ∵ x v v t x x v t v a d d d d d d d d === 分离变量: x x adx d )62(d 2 +==υυ 两边积分得 c x x v ++=32 2221 由题知,0=x 时,100 =v ,∴50=c ∴ 1 3s m 252-?++=x x v 1.10已知一质点作直线运动,其加速度为 a =4+3t 2 s m -?,开始运动时,x =5 m , v =0, 求该质点在t =10s 时的速度和位置. 解:∵ t t v a 34d d +== 分离变量,得 t t v d )34(d += 积分,得 1 223 4c t t v ++= 由题知,0=t ,00 =v ,∴01=c 故 2234t t v + = 又因为 2 234d d t t t x v +== 分离变量, t t t x d )23 4(d 2+= 积分得 2 3221 2c t t x ++= 由题知 0=t ,50 =x ,∴52=c 故 52123 2++ =t t x 所以s 10=t 时 m 70551021 102s m 1901023 10432101210=+?+?=?=?+ ?=-x v 1.11 一质点沿半径为1 m 的圆周运动,运动方程为 θ=2+33 t ,θ式中以弧度计,t 以秒

相关主题
文本预览
相关文档 最新文档