郑莉版c语言第六章课后习题答案

 

第 六 章           数组、指针与字符串

 

 

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-4 已知有一个数组名叫oneArray,用一条语句求出其元素的个数。

 

 

解:

源程序:

nArrayLength = sizeof(oneArray) / sizeof(oneArray[0]);

 

 

6-5 用一条语句定义一个有5×3个元素的二维整型数组,并依次赋予1~15的初值。

 

 

解:

源程序:

int theArray[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };

或:int theArray[5][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12},{13,14,15} };

 

 

6-6 运算符*和&的作用是什么?

 

 

解:

*称为指针运算符,是一个一元操作符,表示指针所指向的对象的值;&称为取地址运算符,也是一个一元操作符,是用来得到一个对象的地址。

 

6-7 什么叫做指针?指针中储存的地址和这个地址中的值有何区别?

 

 

解:

指针是一种数据类型,具有指针类型的变量称为指针变量。指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的内容。

 

 

6-8 定义一个整型指针,用new语句为其分配包含10个整型元素的地址空间。

 

 

解:

源程序:

int *pInteger = new int[10];

 

 

6-9 在字符串”Hello,world!”中结束符是什么?

 

 

解:

是NULL字符。

 

 

6-10 定义一个有五个元素的整型数组,在程序中提示用户输入元素值,最后再在屏幕上显示出来。

 

 

解:

源程序:

#include

 

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-14 程序中定义一个double类型变量的指针。分别显示指针占了多少字节和指针所指的变量占了多少字节。

 

 

解:

double *counter;

cout << "\nSize of pointer == "sizeof(counter);

cout << '\nSize of addressed value == "<

 

 

6-15 const int * p1 和 int * const p2的区别是什么?

 

 

解:

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

int main()

{

int *p;

*pInt = 9;

cout << "The value at p: " << *p;

return 0;

}

 

 

解:

指针p没有初始化,也就是没有指向某个确定的内存单元,它指向内存中的一个随机地址,给这个随机地址赋值是非常危险的。

6-18 下列程序有何问题,请改正;仔细体会使用指针时应避免出现的这个问题。

#include

int Fn1();

int main()

{

int a = Fn1();

cout << "the value of a is: " << a;

return 0;

}

 

int Fn1()

{

int * p = new int (5);

return *p;

}

 

 

解:

此程序中给*p分配的内存没有被释放掉。

改正:

#include

int* Fn1();

int main()

{

int *a = Fn1();

cout << "the value of a is: " << *a;

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

{

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 << "CircleOne: " << CircleOne.GetRadius() << endl;

cout << "CircleTwo: " << CircleTwo.GetRadius() << endl;

return 0;

}程序运行输出:

CircleOne: 5

CircleTwo: 9

 

 

6-21 编写一个函数,统计一个英文句子中字母的个数,在主程序中实现输入、输出。

 

 

解:

源程序:

#include

#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 << "输入一个英语句子:" << 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

 

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++)

;

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 << "在" << str1 << "中左起第" << n+1

<< "个位置。"<

else

cout << str2 << "不在" << str1 << "中。" << endl;

}

程序运行输出:

输入一个英语单词:abcdefgh

输入另一个英语单词:de

de在abcdefghijk中左起第4个位置。

 

6-23 编写函数reverse(char *s)的倒序递归程序,使字符串s倒序。

 

 

解:

源程序:

#include

#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 << "原字符串为:" << str1 << endl;

reverse(str1);

cout << "倒序反转后为:" << str1 << endl;

}

程序运行输出:

输入一个字符串:abcdefghijk

原字符串为:abcdefghijk

倒序反转后为:kjihgfedcba

 

 

6-24 设学生人数N=8,提示用户输入N个人的考试成绩,然后计算出平均成绩,显示出来。

 

 

解:

源程序:

#include

#include

 

#define N 8

 

float grades[N]; //存放成绩的数组

 

void main()

{

int i;

float total,average;

 

//提示输入成绩

for(i = 0; i < N; i++ )

{

cout << "Enter grade #" <<(i +1) << ": ";

cin >> grades[i];

}

 

total = 0;

for (i = 0; i < N; i++)

total += grades[i];

average = total / N;

cout << "\nAverage grade: " << average << endl;

}

程序运行输出:

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

#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

itsMyString[i] = cMyString[i];

itsMyString[itsLen]='\0';

}

 

MyString::MyString (const MyString & rhs)

{

itsLen=rhs.GetLen();

itsMyString = new char[itsLen+1];

for (unsigned short i = 0; i

itsMyString[i] = rhs[i];

itsMyString[itsLen] = '\0';

}

 

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

itsMyString[i] = rhs[i];

itsMyString[itsLen] = '\0';

return *this;

}

 

char & MyString::operator[](unsigned short offset)

{

if (offset > itsLen)

return itsMyString[itsLen-1];

else

return itsMyString[offset];

}

 

char MyString::operator[](unsigned short offset) const

{

if (offset > itsLen)

return itsMyString[itsLen-1];

else

return itsMyString[offset];

}

 

MyString MyString::operator+(const MyString& rhs)

{

unsigned short totalLen = itsLen + rhs.GetLen();

MyString temp(totalLen);

for (unsigned short i = 0; i

temp[i] = itsMyString[i];

for (unsigned short j = 0; j

temp[i] = rhs[j];

temp[totalLen]='\0';

return temp;

}

 

void MyString::operator+=(const MyString& rhs)

{

unsigned short rhsLen = rhs.GetLen();

unsigned short totalLen = itsLen + rhsLen;

MyString temp(totalLen);

for (unsigned short i = 0; i

temp[i] = itsMyString[i];

for (unsigned short j = 0; j

temp[i] = rhs[i-itsLen];

temp[totalLen]='\0';

*this = temp;

}

 

int main()

{

MyString s1("initial test");

cout << "S1:\t" << s1.GetMyString() << endl;

 

char * temp = "Hello World";

s1 = temp;

cout << "S1:\t" << s1.GetMyString() << endl;

 

char tempTwo[20];

strcpy(tempTwo,"; nice to be here!");

s1 += tempTwo;

cout << "tempTwo:\t" << tempTwo << endl;

cout << "S1:\t" << s1.GetMyString() << endl;

 

cout << "S1[4]:\t" << s1[4] << endl;

s1[4]='x';

cout << "S1:\t" << s1.GetMyString() << endl;

 

cout << "S1[999]:\t" << s1[999] << endl;

 

MyString s2(" Another myString");

MyString s3;

s3 = s1+s2;

cout << "S3:\t" << s3.GetMyString() << endl;

 

MyString s4;

s4 = "Why does this work?";

cout << "S4:\t" << s4.GetMyString() << endl;

return 0;

}

 

程序运行输出:

S1: initial test

S1: Hello World

tempTwo: ; nice to be here!

S1: Hello World; nice to be here!

S1[4]: o

S1: Hellx World; nice to be here!

S1[999]: !

S3: Hellx World; nice to be here! Another myString

S4: Why does this work?

 

 

 

6-26 编写一个3×3矩阵转置的函数,在main()函数中输入数据。

 

 

解:

#include

 

void move (int matrix[3][3])

{

int i, j, k;

for(i=0; i<3; i++)

for (j=0; j

{

k = matrix[i][j];

matrix[i][j] = matrix[j][i];

matrix[j][i] = k;

}

}

 

void main()

{

int i, j;

int data[3][3];

cout << "输入矩阵的元素" << endl;

for(i=0; i<3; i++)

for (j=0; j<3; j++)

{

cout << "第" << i+1 << "行第" << j+1

<<"个元素为:";

cin >> data[i][j];

}

cout << "输入的矩阵的为:" << endl;

for(i=0; i<3; i++)

{

for (j=0; j<3; j++)

cout << data[i][j] << " ";

cout << endl;

}

move(data);

cout << "转置后的矩阵的为:" << endl;

for(i=0; i<3; i++)

{

for (j=0; j<3; j++)

cout << data[i][j] << " ";

cout << endl;

}

}

 

程序运行输出:

输入矩阵的元素

第1行第1个元素为:1

第1行第2个元素为:2

第1行第3个元素为:3

第2行第1个元素为:4

第2行第2个元素为:5

第2行第3个元素为:6

第3行第1个元素为:7

第3行第2个元素为:8

第3行第3个元素为:9

输入的矩阵的为:

1 2 3

4 5 6

7 8 9

转置后的矩阵的为:

1 4 7

2 5 8

3 6 9

 

 

6-27 编写一个矩阵转置的函数,矩阵的维数在程序中由用户输入。

 

 

解:

#include

 

void move (int *matrix ,int n)

{

int i, j, k;

for(i=0; i

for (j=0; j

{

k = *(matrix + i*n + j);

*(matrix + i*n + j) = *(matrix + j*n + i);

*(matrix + j*n + i) = k;

}

}

 

void main()

{

int n, i, j;

int *p;

cout << "请输入矩阵的维数:";

cin >> n;

p = new int[n*n];

cout << "输入矩阵的元素" << endl;

for(i=0; i

for (j=0; j

{

cout << "第" << i+1 << "行第" << j+1

<<"个元素为:";

cin >> p[i*n + j];

}

cout << "输入的矩阵的为:" << endl;

for(i=0; i

{

for (j=0; j

cout << p[i*n + j] << " ";

cout << endl;

}

move(p, n);

cout << "转置后的矩阵的为:" << endl;

for(i=0; i

{

for (j=0; j

cout << p[i*n + j] << " ";

cout << endl;

}

}

程序运行输出:

请输入矩阵的维数:3

输入矩阵的元素

第1行第1个元素为:1

第1行第2个元素为:2

第1行第3个元素为:3

第2行第1个元素为:4

第2行第2个元素为:5

第2行第3个元素为:6

第3行第1个元素为:7

第3行第2个元素为:8

第3行第3个元素为:9

输入的矩阵的为:

1 2 3

4 5 6

7 8 9

转置后的矩阵的为:

1 4 7

2 5 8

3 6 9

 

 

6-28 定义一个Employee类,其中包括表示姓名、街道地址、城市和邮编等属性,包括chage_name()和display()等函数;display()使用cout语句显示姓名、街道地址、城市和邮编等属性,函数change_name()改变对象的姓名属性,实现并测试这个类。

 

 

解:

源程序:

#include

#include

 

class Employee

{

private:

char name[30];

char street[30];

char city[18];

char zip[6];

public:

Employee(char *n, char *str, char *ct, char *z);

void change_name(char *n);

void display();

};

 

Employee::Employee (char *n,char *str,char *ct, char *z)

{

strcpy(name, n);

strcpy(street, str);

strcpy(city, ct);

strcpy(zip, z);

}

 

void Employee::change_name (char *n)

{

strcpy(name, n);

}

 

void Employee::display ()

{

cout << name << " " << street << " ";

cout << city << " "<< zip;

}

 

void main(void)

{

Employee e1("张三","平安大街3号", "北京", "100000");

e1.display();

cout << endl;

e1.change_name("李四");

e1.display();

cout << endl;

}

程序运行输出:

张三 平安大街3号 北京 100000

李四 平安大街3号 北京 100000

 

 

 

 

你可能感兴趣的:(郑莉版c语言第六章课后习题答案)