C语言程序设计(郑莉)课后习题答案 下载本文

解:

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 << \return 0; } 解:

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

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

int a = Fn1();

cout << \return 0; }

int Fn1() {

int * p = new int (5); return *p; } 解:

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

#include int* Fn1(); int main() {

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 #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 #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 #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 #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