解:
const int * p1 声明了一个指向整型常量的指针p1,因此不能通过指针p1来改变它所指向的整型值;int * const p2声明了一个指针型常量,用于存放整型变量的地址,这个指针一旦初始化后,就不能被重新赋值了。
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-17 下列程序有何问题,请仔细体会使用指针时应避免出现这个的问题。
#include
cout << \return 0; } 解:
指针p没有初始化,也就是没有指向某个确定的内存单元,它指向内存中的一个随机地址,给这个随机地址赋值是非常危险的。
6-18 下列程序有何问题,请改正;仔细体会使用指针时应避免出现的这个问题。 #include
int a = Fn1();
cout << \return 0; }
int Fn1() {
int * p = new int (5); return *p; } 解:
此程序中给*p分配的内存没有被释放掉。 改正:
#include
int *a = Fn1();
cout << \delete a; return 0; }
int* Fn1() {
int * p = new int (5); return p; }
6-19 声明一个参数为整型,返回值为长整型的函数指针;声明类A的一个成员函数指针,其参数为整型,返回值长整型。 解:
long (* p_fn1)(int); long ( A::*p_fn2)(int);
6-20 实现一个名为SimpleCircle的简单圆类,其数据成员int *itsRadius为一个指向其半径值的指针,设计对数据成员的各种操作,给出这个类的完整实现并测试这个类。 解: 源程序:
#include
class SimpleCircle {
25
public:
SimpleCircle(); SimpleCircle(int);
SimpleCircle(const SimpleCircle &); ~SimpleCircle() {}
void SetRadius(int); int GetRadius()const;
private: int *itsRadius; };
SimpleCircle::SimpleCircle() {
itsRadius = new int(5); }
SimpleCircle::SimpleCircle(int radius) {
itsRadius = new int(radius); }
SimpleCircle::SimpleCircle(const SimpleCircle & rhs) {
int val = rhs.GetRadius(); itsRadius = new int(val); }
int SimpleCircle::GetRadius() const {
return *itsRadius; }
int main() {
SimpleCircle CircleOne, CircleTwo(9);
cout << \cout << \return 0; }程序运行输出: CircleOne: 5 CircleTwo: 9
6-21 编写一个函数,统计一个英文句子中字母的个数,在主程序中实现输入、输出。
解: 源程序:
#include
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 << \输入一个英语句子:\gets(text);
cout << \这个句子里有\个字母。\endl; }
程序运行输出: 输入一个英语句子: It is very interesting! 这个句子里有19个字母。
6-22 编写函数int index(char *s, char *t),返回字符串t 在字符串s中出现的最左边的位置,如果在s中没有与t匹配的子串,就返回-1。 解: 源程序:
#include
int index( char *s, char *t) {
int i,j,k;
for(i = 0; s[i] != '\\0'; i++) {
for(j = i, k = 0; t[k] != '\\0' && s[j] == t[k]; j++, k++) ;
26
if (t[k] =='\\0') return i; }
return -1; }
void main() { int n;
char str1[20],str2[20]; cout << \输入一个英语单词:\cin >> str1;
cout << \输入另一个英语单词:\cin >> str2;
n = index(str1,str2); if (n > 0)
cout << str2 << \在\中左起第\<< \个位置。\else
cout << str2 << \不在\中。\}
程序运行输出:
输入一个英语单词:abcdefgh 输入另一个英语单词:de
de在abcdefghijk中左起第4个位置。
6-23 编写函数reverse(char *s)的倒序递归程序,使字符串s倒序。 解: 源程序:
#include
void reverse(char *s, char *t) { char c; if (s < t) { c = *s; *s = *t; *t = c;
reverse(++s, --t); } }
void reverse( char *s)
{
reverse(s, s + strlen(s) - 1); }
void main() {
char str1[20];
cout << \输入一个字符串:\cin >> str1;
cout << \原字符串为:\reverse(str1);
cout << \倒序反转后为:\}
程序运行输出:
输入一个字符串:abcdefghijk 原字符串为:abcdefghijk 倒序反转后为:kjihgfedcba
6-24 设学生人数N=8,提示用户输入N个人的考试成绩,然后计算出平均成绩,显示出来。 解: 源程序:
#include
#define N 8
float grades[N]; //存放成绩的数组
void main() { int i;
float total,average;
//提示输入成绩
for(i = 0; i < N; i++ ) {
cout << \cin >> grades[i]; }
total = 0;
for (i = 0; i < N; i++) total += grades[i]; average = total / N;
27
cout << \}
程序运行输出: Enter grade #1: 86 Enter grade #2: 98 Enter grade #3: 67 Enter grade #4: 80 Enter grade #5: 78 Enter grade #6: 95 Enter grade #7: 78 Enter grade #8: 56
Average grade: 79.75
6-25 设计一个字符串类MyString,具有构造函数、析构函数、拷贝构造函数,重载运算符+、=、+=、[],尽可能地完善它,使之能满足各种需要。(运算符重载功能为选做,参见第8章) 解:
#include
class MyString { public: MyString();
MyString(const char *const); MyString(const MyString &); ~MyString();
char & operator[](unsigned short offset); char operator[](unsigned short offset) const; MyString operator+(const MyString&); void operator+=(const MyString&); MyString & operator= (const MyString &);
unsigned short GetLen()const { return itsLen; } const char * GetMyString() const { return itsMyString; }
private:
MyString (unsigned short); // private constructor char * itsMyString; unsigned short itsLen; };
MyString::MyString()
{
itsMyString = new char[1]; itsMyString[0] = '\\0'; itsLen=0; }
MyString::MyString(unsigned short len) {
itsMyString = new char[len+1];
for (unsigned short i = 0; i<=len; i++) itsMyString[i] = '\\0'; itsLen=len; }
MyString::MyString(const char * const cMyString) {
itsLen = strlen(cMyString); itsMyString = new char[itsLen+1];
for (unsigned short i = 0; i MyString::MyString (const MyString & rhs) { itsLen=rhs.GetLen(); itsMyString = new char[itsLen+1]; for (unsigned short i = 0; i MyString::~MyString () { delete [] itsMyString; itsLen = 0; } MyString& MyString::operator=(const MyString & rhs) { if (this == &rhs) return *this; delete [] itsMyString; itsLen=rhs.GetLen(); itsMyString = new char[itsLen+1]; for (unsigned short i = 0; i 28