资源描述
第 二 章 C++简单程序设计
2-10 执行完下列语句后,a、b、c三个变量的值为多少?
a = 30;
b = a++;
c = ++a;
解:
a:32 ; b:30 ; c:32;
2-13 写一条for语句,计数条件为n从100到200,步长为2;然后用while和do…while语句完成同样的循环。
解:
for循环:
for (int n = 100; n <= 200; n += 2);
while循环:
int x = 100;
while (n <= 200)
n += 2;
do…while循环:
int n = 100;
do
{
n += 2;
} while(n <= 200);
2-17 修改下面这个程序中的错误,改正后它的运行结果是什么?
#include <iostream.h>
void main()
int i
int j;
i = 10; /* 给i赋值
j = 20; /* 给j赋值 */
cout << "i + j = << i + j; /* 输出结果 */
return 0;
}
解:
改正:
#include <iostream.h>
int main()
{
int i;
int j;
i = 10; // 给i赋值
j = 20; /* 给j赋值 */
cout << "i + j = " << i + j; /* 输出结果 */
return 0;
}
程序运行输出:
i + j = 30
2-18 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。
解:
源程序:
#include <iostream.h>
int main()
{
int i;
cout << "请输入一个数字:";
cin >> i;
cout << "您输入一个数字是" << i << endl;
return 0;
}
程序运行输出:
请输入一个数字:5
您输入一个数字是5
2-20 打印ASCII码为32~127的字符。
解:
#include <iostream.h>
int main()
{
for (int i = 32; i<128; i++)
cout << (char) i;
return 0;
}
程序运行输出:
!"#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[\]^'abcdefghijklmnopqrstuvwxyz<|>~s
2-21 运行下面的程序,观察其输出,与你的设想是否相同?
#include <iostream.h>
int main()
{
unsigned int x;
unsigned int y = 100;
unsigned int z = 50;
x= y - z;
cout << "Difference is: " << x;
x = z - y;
cout << "\nNow difference is: " << x <<endl;
return 0;
}
解:
程序运行输出:
Difference is: 50
Now difference is: 4294967246
注意,第二行的输出并非 -50,注意x、y、z的数据类型。
2-22 运行下面的程序,观察其输出,体会i++与++i的差别。
#include <iostream.h>
int main()
{
int myAge = 39; // initialize two integers
int yourAge = 39;
cout << "I am: " << myAge << " years old.\n";
cout << "You are: " << yourAge << " years old\n";
myAge++; // postfix increment
++yourAge; // prefix increment
cout << "One year passes...\n";
cout << "I am: " << myAge << " years old.\n";
cout << "You are: " << yourAge << " years old\n";
cout << "Another year passes\n";
cout << "I am: " << myAge++ << " years old.\n";
cout << "You are: " << ++yourAge << " years old\n";
cout << "Let's print it again.\n";
cout << "I am: " << myAge << " years old.\n";
cout << "You are: " << yourAge << " years old\n";
return 0;
}
解:
程序运行输出:
I am 39 years old
You are 39 years old
One year passes
I am 40 years old
You are 40 years old
Another year passes
I am 40 years old
You are 41 years old
Let's print it again
I am 41 years old
You are 41 years old
2-28 编写一个完整的程序,实现功能:向用户提问"现在正在下雨吗?",提示用户输入Y或N。若输入为Y,显示"现在正在下雨。"; 若输入为N,显示"现在没有下雨。";否则继续提问"现在正在下雨吗?"
解:
源程序:
#include <iostream.h>
#include <stdlib.h>
void main()
{
char flag;
while(1)
{
cout << "现在正在下雨吗?(Yes or No):";
cin >> flag;
if ( toupper(flag) == 'Y')
{
cout << "现在正在下雨。";
break;
}
if ( toupper(flag) == 'N')
{
cout << "现在没有下雨。";
break;
}
}
}
程序运行输出:
现在正在下雨吗?(Yes or No):x
现在正在下雨吗?(Yes or No):l
现在正在下雨吗?(Yes or No):q
现在正在下雨吗?(Yes or No):n
现在没有下雨。
或:
现在正在下雨吗?(Yes or No):y
现在正在下雨。
2-29 编写一个完整的程序,运行时向用户提问"你考试考了多少分?(0~100)",接收输入后判断其等级,显示出来。规则如下:
解:
#include <iostream.h>
void main()
{
int i,score;
cout << "你考试考了多少分?(0~100):";
cin >> score;
if (score>100 || score<0)
cout << "分数值必须在0到100之间!";
else
{
i = score/10;
switch (i)
{
case 10:
case 9:
cout << "你的成绩为优!";
break;
case 8:
cout << "你的成绩为良!";
break;
case 7:
case 6:
cout << "你的成绩为中!";
break;
default:
cout << "你的成绩为差!";
}
}
}
程序运行输出:
你考试考了多少分?(0~100):85
你的成绩为良!
2-31 用穷举法找出1~100间的质数,显示出来。分别使用while,do-while,for循环语句实现。
解:
源程序:
使用while循环语句:
#include <iostream.h>
#include <math.h>
void main()
{
int i,j,k,flag;
i = 2;
while(i <= 100)
{
flag = 1;
k = sqrt(i);
j = 2;
while (j <= k)
{
if(i%j == 0)
{
flag = 0;
break;
}
j++;
}
if (flag)
cout << i << "是质数." << endl;
i++;
}
}
使用do…while循环语句:
#include <iostream.h>
#include <math.h>
void main()
{
int i,j,k,flag;
i = 2;
do{
flag = 1;
k = sqrt(i);
j = 2;
do{
if(i%j == 0)
{
flag = 0;
break;
}
j++;
}while (j <= k);
if (flag)
cout << i << "是质数." << endl;
i++;
}while(i <= 100);
}
使用for循环语句:
#include <iostream.h>
#include <math.h>
void main()
{
int i,j,k,flag;
for(i = 2; i <= 100; i++)
{
flag = 1;
k = sqrt(i);
for (j = 2; j <= k; j++)
{
if(i%j == 0)
{
flag = 0;
break;
}
}
if (flag)
cout << i << "是质数." << endl;
}
}
程序运行输出:
2是质数.
3是质数.
5是质数.
7是质数.
11是质数.
13是质数.
17是质数.
19是质数.
23是质数.
29是质数.
31是质数.
37是质数.
41是质数.
43是质数.
47是质数.
53是质数.
59是质数.
61是质数.
67是质数.
71是质数.
73是质数.
79是质数.
83是质数.
89是质数.
97是质数.
2-33 定义一个表示时间的结构体,可以精确表示年、月、日、小时、分、秒;提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。
解:
源程序见"实验指导"部分实验二
2-34 在程序中定义一个整型变量,赋以1~100的值,要求用户猜这个数,比较两个数的大小,把结果提示给用户,直到猜对为止。分别使用while、do…while语句实现循环。
解:
//使用while语句
#include <iostream.h>
void main() {
int n = 18;
int m = 0;
while(m != n)
{
cout << "请猜这个数的值为多少?(0~~100):";
cin >> m;
if (n > m)
cout << "你猜的值太小了!" << endl;
else if (n < m)
cout << "你猜的值太大了!" << endl;
else
cout << "你猜对了!" << endl;
}
}
//使用do…while语句
#include <iostream.h>
void main() {
int n = 18;
int m = 0;
do{
cout << "请猜这个数的值为多少?(0~~100):";
cin >> m;
if (n > m)
cout << "你猜的值太小了!" << endl;
else if (n < m)
cout << "你猜的值太大了!" << endl;
else
cout << "你猜对了!" << endl;
}while(n != m);
}
程序运行输出:
请猜这个数的值为多少?(0~~100):50
你猜的值太大了!
请猜这个数的值为多少?(0~~100):25
你猜的值太大了!
请猜这个数的值为多少?(0~~100):10
你猜的值太小了!
请猜这个数的值为多少?(0~~100):15
你猜的值太小了!
请猜这个数的值为多少?(0~~100):18
你猜对了!
第三章 函数
3-2 观察下面程序的运行输出,与你设想的有何不同?仔细体会引用的用法。
源程序:
#include <iostream.h>
int main()
{
int intOne;
int &rSomeRef = intOne;
intOne = 5;
cout << "intOne:\t\t" << intOne << endl;
cout << "rSomeRef:\t" << rSomeRef << endl;
int intTwo = 8;
rSomeRef = intTwo; // not what you think!
cout << "\nintOne:\t\t" << intOne << endl;
cout << "intTwo:\t\t" << intTwo << endl;
cout << "rSomeRef:\t" << rSomeRef << endl;
return 0;
}
程序运行输出:
intOne: 5
rSomeRef: 5
intOne: 8
intTwo: 8
rSomeRef: 8
3-7 编写函数,参数为两个unsigned short int型数,返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0,则返回值为-1。在主程序中实现输入输出。
解:
源程序:
#include <iostream.h>
short int Divider(unsigned short int a, unsigned short int b)
{
if (b == 0)
return -1;
else
return a/b;
}
typedef unsigned short int USHORT;
typedef unsigned long int ULONG;
int main()
{
USHORT one, two;
short int answer;
cout << "Enter two numbers.\n Number one: ";
cin >> one;
cout << "Number two: ";
cin >> two;
answer = Divider(one, two);
if (answer > -1)
cout << "Answer: " << answer;
else
cout << "Error, can't divide by zero!";
return 0;
}
程序运行输出:
Enter two numbers.
Number one:8
Number two:2
Answer: 4
3-8 编写函数把华氏温度转换为摄氏温度,公式为:C = (F - 32) * 5/9; 在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度。
解:
源程序见"实验指导"部分实验三
3-10 编写函数求两个整数的最大公约数和最小公倍数。
解:
源程序:
#include <iostream.h>
#include <math.h>
int fn1(int i,int j); //求最大公约数的函数
void main()
{
int i,j,x,y;
cout << "请输入一个正整数:";
cin >> i ;
cout << "请输入另一个正整数:";
cin >> j ;
x = fn1(i,j);
y = i * j / x;
cout << i << "和" << j << "的最大公约数是:" << x << endl;
cout << i << "和" << j << "的最小公倍数是:" << y << endl;
}
int fn1(int i, int j)
{
int temp;
if (i < j)
{
temp = i;
i = j;
j = i;
}
while(j != 0)
{
temp = i % j;
i = j;
j = temp;
}
return i;
}
程序运行输出:
请输入一个正整数:120
请输入另一个正整数:72
120和72的最大公约数是:24
120和72的最小公倍数是:360
3-12 在主程序中提示输入整数n,编写函数用递归的方法求1 + 2 + … + n的值。
解:
#include <iostream.h>
#include <math.h>
int fn1(int i);
void main()
{
int i;
cout << "请输入一个正整数:";
cin >> i ;
cout << "从1累加到" <<i << "的和为:" << fn1(i) << endl;
}
int fn1(int i)
{
if (i == 1)
return 1;
else
return i + fn1(i -1);
}
程序运行输出:
请输入一个正整数:100
从1累加到100的和为:5050
3-14 用递归的方法编写函数求Fibonacci 级数,公式为fib(n) = fib(n-1) + fib(n-2),n>2;
fib(1) = fib(2) = 1;观察递归调用的过程。
解:
源程序见"实验指导"部分实验三
3-15 用递归的方法编写函数求n阶勒让德多项式的值,在主程序中实现输入、输出;
解:
#include <iostream.h>
float p(int n, int x);
void main()
{
int n,x;
cout << "请输入正整数n:";
cin >> n;
cout << "请输入正整数x:";
cin >> x;
cout << "n = " << n << endl;
cout << "x = " << x << endl;
cout << "P" << n << "(" << x << ") = " << p(n,x) << endl;
}
float p(int n, int x)
{
if (n == 0)
return 1;
else if (n == 1)
return x;
else
return ((2*n-1)*x*p(n-1,x) - (n-1)*p(n-2,x)) /n ;
}
程序运行输出:
请输入正整数n:1
请输入正整数x:2
n = 1
x = 2
P1(2) = 2
请输入正整数n:3
请输入正整数x:4
n = 3
x = 4
P3(4) = 154
第 四 章 类
4-9 设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。
解:
源程序:
#include <iostream.h>
class Rectangle
{
public:
Rectangle (int top, int left, int bottom, int right);
~Rectangle () {}
int GetTop() const { return itsTop; }
int GetLeft() const { return itsLeft; }
int GetBottom() const { return itsBottom; }
int GetRight() const { return itsRight; }
void SetTop(int top) { itsTop = top; }
void SetLeft (int left) { itsLeft = left; }
void SetBottom (int bottom) { itsBottom = bottom; }
void SetRight (int right) { itsRight = right; }
int GetArea() const;
private:
int itsTop;
int itsLeft;
int itsBottom;
int itsRight;
};
Rectangle::Rectangle(int top, int left, int bottom, int right)
{
itsTop = top;
itsLeft = left;
itsBottom = bottom;
itsRight = right;
}
int Rectangle::GetArea() const
{
int Width = itsRight-itsLeft;
int Height = itsTop - itsBottom;
return (Width * Height);
}
int main()
{
Rectangle MyRectangle (100, 20, 50, 80 );
int Area = MyRectangle.GetArea();
cout << "Area: " << Area << "\n";
return 0;
}
程序运行输出:
Area: 3000
Upper Left X Coordinate: 20
4-11 定义一个矩形类,有长、宽两个属性,有成员函数计算矩形的面积
解:
#include <iostream.h>
class Rectangle
{
public:
Rectangle(float len, float width)
{
Length = len;
Width = width;
}
~Rectangle(){};
float GetArea() { return Length * Width; }
float GetLength() { return Length; }
float GetWidth() { return Width; }
private:
float Length;
float Width;
};
void main()
{
float length, width;
cout << "请输入矩形的长度:";
cin >> length;
cout << "请输入矩形的宽度:";
cin >> width;
Rectangle r(length, width);
cout << "长为" << length << "宽为" << width << "的矩形的面积为:"
<< r.GetArea () << endl;
}
程序运行输出:
请输入矩形的长度:5
请输入矩形的宽度:4
长为5宽为4的矩形的面积为:20
4-12 定义一个"数据类型" datatype类,能处理包含字符型、整型、浮点型三种类型的数据,给出其构造函数。
解:
#include <iostream.h>
class datatype{
enum{
character,
integer,
floating_point
} vartype;
union
{
char c;
int i;
float f;
};
public:
datatype(char ch) {
vartype = character;
c = ch;
}
datatype(int ii) {
vartype = integer;
i = ii;
}
datatype(float ff) {
vartype = floating_point;
f = ff;
}
void print();
};
void datatype::print() {
switch (vartype) {
case character:
cout << "字符型: " << c << endl;
break;
case integer:
cout << "整型: " << i << endl;
break;
case floating_point:
cout << "浮点型: " << f << endl;
break;
}
}
void main() {
datatype A('c'), B(12), C(1.44F);
A.print();
B.print();
C.print();
}
程序运行输出:
字符型: c
整型: 12
浮点型: 1.44
4-13 定义一个Circle类,有数据成员半径Radius,成员函数GetArea(),计算圆的面积,构造一个Circle的对象进行测试。
解:
#include <iostream.h>
class Circle
{
public:
Circle(float radius){ Radius = radius;}
~Circle(){}
float GetArea() { return 3.14 * Radius * Radius; }
private:
float Radius;
};
void main()
{
float radius;
cout << "请输入圆的半径:";
cin >> radius;
Circle p(radius);
cout << "半径为" << radius << "的圆的面积为:" << p.GetArea ()
<< endl;
}
程序运行输出:
请输入圆的半径:5
半径为5的圆的面积为:78.5
4-14 定义一个tree类,有成员ages,成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值。
解:
#include <iostream.h>
class Tree {
int ages;
public:
Tree(int n=0);
~Tree();
void grow(int years);
void age();
};
Tree::Tree(int n) {
ages = n;
}
Tree::~Tree() {
age();
}
void Tree::grow(int years) {
ages += years;
}
void Tree::age() {
cout << "这棵树的年龄为" << ages << endl;
}
void main()
{
Tree t(12);
t.age();
t.grow(4);
}
程序运行输出:
这棵树的年龄为12
这棵树的年龄为16
第 五 章 C++程序的基本结构
5-12 在函数fn1()中定义一个静态变量n,fn1()中对n的值加1,在主函数中,调用fn1()十次,显示n的值。
解:
#include <iostream.h>
void fn1()
{
static int n = 0;
n++;
cout << "n的值为" << n <<endl;
}
void main()
{
for(int i = 0; i < 10; i++)
fn1();
}
程序运行输出:
n的值为1
n的值为2
n的值为3
n的值为4
n的值为5
n的值为6
n的值为7
n的值为8
n的值为9
n的值为10
5-13 定义类X、Y、Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是X的友元函数,实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。
解:
#include "my_x_y_z.h"
void main()
{
X x;
Z z;
z.f(&x);
}
// my_x_y_z.h文件
#ifndef MY_X_Y_Z_H
class X;
class Y {
void g(X*);
};
class X
{
private:
int i;
public:
X(){i=0;}
friend void h(X*);
friend void Y::g(X*);
friend class Z;
};
void h(X* x) { x->i =+10; }
void Y::g(X* x) { x->i ++; }
class Z {
public:
void f(X* x) { x->i += 5; }
};
#endif // MY_X_Y_Z_H
程序运行输出:无
5-14 定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。
解:
源程序:
#include <iostream.h>
class Boat;
class Car
{
private:
int weight;
public:
Car(int j){weight = j;}
friend int totalWeight(Car &aCar, Boat &aBoat);
};
class Boat
{
private:
int weight;
public:
Boat(int j){weight = j;}
friend int totalWeight(Car &aCar, Boat &aBoat);
};
int totalWeight(Car &aCar, Boat &aBoat)
{
return aCar.weight + aBoat.weight;
}
void main()
{
Car c1(4);
Boat b1(5);
cout << totalWeight(c1, b1) << endl;
}
程序运行输出:
9
第 六 章 数组、指针与字符串
6-1 数组A[10][5][15]一共有多少个元素?
解:
10×5×15 = 750 个元素
1-2 在数组A[20]中第一个元素和最后一个元素是哪一个?
解:
第一个元素是A[0],最后一个元素是A[19]。
6-3 用一条语句定义一个有五个元素的整型数组,并依次赋予1~5的初值。
解:
源程序:
int IntegerArray[5] = { 1, 2, 3, 4, 5 };
或:int IntegerArray[] = { 1, 2, 3, 4, 5 };
6-7 什么叫做指针?指针中储存的地址和这个地址中的值有何区别?
解:
指针是一种数据类型,具有指针类型的变量称为指针变量。指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的内容。
6-10 定义一个有五个元素的整型数组,在程序中提示用户输入元素值,最后再在屏幕上显示出来。
解:
源程序:
#include <iostream.h>
int main()
{
int myArray[5];
int i;
for ( i=0; i<5; i++)
{
cout << "Value for myArray[" << i << "]: ";
cin >> myArray[i];
}
for (i = 0; i<5; i++)
cout << i << ": " << myArray[i] << "\n";
return 0;
}
程序运行输出:
Value for myArray[0]: 2
Value for myArray[1]: 5
Value for myArray[2]: 7
Value for myArray[3]: 8
Value for myArray[4]: 3
0: 2
1: 5
2: 7
3: 8
4: 3
6-11 引用和指针有何区别?何时只能使用指针而不能使用引用?
解:
引用是一个别名,不能为NULL值,不能被重新分配;指针是一个存放地址的变量。当需要对变量重新赋以另外的地址或赋值为NULL时只能使用指针。
6-12 声明下列指针:float类型变量的指针pFloat,char类型的指针pString和struct customer型的指针prec。
解:
float *pfloat;
char *pString;
struct customer *prec;
6-13 给定float类型的指针fp,写出显示fp所指向的值的输出流语句。
解:
cout << "Value == " << *fp;
6-16 定义一个整型变量a,一个整型指针p,一个引用r,通过p把a的值改为10,通过r把a的值改为5
解:
void main()
{
int a;
int *p = &a;
int &r = a;
*p = 10;
r = 5;
}
6-21 编写一个函数,统计一个英文句子中字母的个数,在主程序中实现输入、输出。
解:
源程序:
#include <iostream.h>
#include <stdio.h>
int count(char *str)
{
int i,num=0;
for (i=0; str[i]; i++)
{
if ( (str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z') )
num++;
}
return num;
}
void main()
{
char text[100];
cout << "输入一个英语句子:" << endl;
gets(text);
cout << "这个句子里有" << count(text) << "个字母。" << endl;
}
程序运行输出:
输入一个英语句子:
It is very interesting!
这个句子里有19个字母。
6-22 编写函数int index(char *s, char *t),返回字符串t 在字符串s中出现的最左边的位置,如果在s中没有与t匹配的子串,就返回-1。
解:
源程序:
#include <iostream.h>
int index( char *s, char *t)
展开阅读全文