当前位置: 首页 > 文档资料 > C++大学教程 >

5.19 更多的指针练习

优质
小牛编辑
128浏览
2023-12-01

5.20 修改图 5.24 的洗牌与发牌程序,使洗牌与发牌操作由同一函数(shuffleAndDeal)完成。这个函数应包含嵌套循环结构,类似于图 5.24 中的函数 shuffle。

5.21 下列程序有什么作用?

1 // ex05_21.cpp
2 #include<iostream.h>
3 void mystery1(car *,const char *);
5
6 int main()
7 {
8 char string1[80],string2[80];
9
10 cout<<"Enter two strings:";
11 cin>>string1>>string2;
12 mystery1(string1,string2);
13 cout << string1 << endl;
14 return 0;
15 }
16
17 void mystery1( char *s1, const char *s2 )
18 {
19 while { *s1 != '\0' }
20 ++s1;
21
22 for ( ; *s1 = *s2; s1++, s2++ )
23 ; // empty statement
24 }

5.22 下列程序有什么作用?

1 // ex05 22.cpp
2 #include <iostream.h>
3
4 void mystery2( const char * );
5
6 int main()
7 {
8 char string[ 80 ];
9
10 cout << "Enter two strings: ";
11 cin >> string;
12 cout << mystery2( string ) << endl;
13 return 0;
14 }
15
16 int mystery2( const char *s )
17 {
18 for {int x = O; * s != '\0'; s++ )
19 ++x;
20
21 return x;
22 }

5.23 找出下列程序中的错误。如果能纠正,请说明纠正方法。

int *number;
cout << number << endl;
b) float *realPtr;
long *integerPtr;
integerPtr = realPtr;
c) int *x, y;
x = y;
d) char s[] = "this is a character array";
for( ; *s != '\0'; s++)
cout << *s << ' ';
e) short * numPtr, result;
void *genericPtr = numPtr;
result = *genericPtr + 7;
f) float x = 19.34;
float xPtr &x;
cout << xPtr << endl;
char * s;

5.24(快速排序)在第4章的例子和练习中,我们介绍了冒泡排序、桶排序和选择排序:现在要介绍称为快速排序的递归排序方法。单下标数组值的基本算法如下:

a)分区步骤:取未排序数组的第一个元素,确定其在排序数组中的最终位置,即该元素左边的所有值小于该元素,该元素右边的所有值大于该元素。这样就确定了一个元素位置,有了两个未排序子数组。
b)递归步骤:对每个未排序子数组完成第一步。
每次对未排序子数组完成第一步时,又确定了一个元素位置,有了另外两个未排序子数组。当子数组只有一个元素时,就已经排序完毕,该元素已经在最终位置了。
基本算法似乎很简单,但如何确定每个子数组的第一个元素在排序数组中的最终位置呢?例如,考虑下列数值(黑体元素是分区元素,要放在排序数组中的最终位置)
37 2 6 4 89 9 10 12 68 45
a)从数组最右边的元素开始,比较37与每个元素,直到找出小于37的元素.然后将这个元素与37交换。第一个小于37的元素是12.因此将12与37交换。新数组如下:
12 2 6 4 89 8 lO 37 68 45
元素12用斜体表示刚刚与37交换。
b)从数组左边12以后的元素开始,比较37与每个元素,直到找出大于37的元素,然后将这个元素与37交换。第一个大于37的元素是89,因此将89与37交换。新数组如下:
12 2 6 4 37 8 lO 89 68 45
c)从数组右边89以前的元素开始,比较37与每个元素,直到找出小于37的元素,然后将这个元素与37交换。第一个小于37的元素是10,因此将10与37交换。新数组如下:
12 2 6 4 10 8 37 89 68 45
d)从数组左边10以后的元素开始,比较37与每个元素,直到找出大于37的元素,然后将这个元素与37交换。由于没有比37更大的元素,因此37已经放在排序数组中的最终位置。
对上述数组采用分区后,就出现两个未排序小数组。小于37的未排序小数组包含12、2、6、4、10和8。大于37的未排序小数组包含89、68和45。对这两个未排序小数组进行像原数组一样的处理。
根据上述介绍,编写一个递归函数quiksort,排序单下标整型数组。函数接收—个整型数组、开始下标和结束下标参数。quicksort调用函数Partition函数进行分区。

5.25(走迷宫)下列#和圆点(.)组成的网格是表示迷宫的双下标数组。

# # # # # # # # # # # #
# . . . # . . . . . . #
. . # . # . # # # # . #
# # # . # . . . . # . #
# . . . . # # # . # . .
# # # # . # . # . # . #
# . . # . # . # . # . #
# # . # . # . # . # . #
# . . . . . . . . # . #
# # # # # # . # # # . #
# . . . . . . # . . . #
# # # # # # # # # # # #

上述双下标数组中,#表示迷宫的墙,圆点表示可以走的路线,只能在数组中包含圆点 的地方移动。

走迷宫的一个简单算法总能走到出口(如果有)。如果没有出口,则会回到起始点。

将右手放在右边的墙上并开始前进,手不离墙,最终总能走到出口。当然,可能还有更短的路径,但上述路径总能走到出口。

编写走迷宫的递归函数mazeTraverse。函数接收12 x 12字符的数组,表示这个迷宫,并接收开始位置参数。mazeTraverse在寻找迷宫的出口时,应将字符x放在沿途的每一格。

每次移动之后,函数应显示迷宫,让用户能看到迷宫的走法。

5.26(随机产生迷宫)编写一个mazeGenerator函数,接受12 x 12字符的数组并随机产生迷宫。函数还应提供迷宫的开始和结束位置。试用随机产生迷宫测试练习5.25所写的函数mazeTraverse。

5 27(任何大小的迷宫)将练习5.25和5.26的函数mazeTraverse与mazeGenerator一般化,可以处理任伺大小的迷宫。

5.28(函数指针数组)将图4.23的程序改写成使用菜单驱动界面。程序提供5个选项如下所示(应在屏幕上显示):

Enter a choice:
0 Print the array of grades
1 Find the minimum grade
2 Find the maximum grade
3 Print the average on all tests for each student
4 End program

和返回相同类型数值的函数。因此,图4.23的函数应修改成接收相同类型参数和返回相同类型数值。将函数 minimummaximum 修改成打印最小值与最大值,不返回任何内容。

对选项3,将图4.23的函数average修改成输出每个学生(而不是特定学生)的平均成绩。

函数 average 与函数 printArrayminimummaximum 接收相同类型参数且不返回任何内容。将4个函数的指针存放在数组 processGrades 中,并用用户选择的选项作为调用每个函数的数组下标。

5.29(修改Simpletron模拟程序)练习5.19中编写了计算机的软件模拟,执行用 Simpletron Machine Language(SML) 编写的程序。本练习中要对Simpletron模拟程序进行几个修改和补充。练习15.26和15.27中将建立一个编译器,将高级编程语言(BASIC的变形)编写的程序转换为SML。要执行编译器产生的程序.需要进行下列修改和补充。

a)将Simpletron模拟程序的内存扩展为包含10410个内存单元,使Simpletron模拟程序能处理更大的程序。
b)让模拟程序进行求模计算,这要求增加SML指令。
c)让模拟程序进行指数计算,这要求增加SML指令。
d)将Simpletron模拟程序修改成用十六进制值而不是用整数值表示SML指令。
e)将Simpletron模拟程序修改成允许输出换行符。这要求增加SML指令。
f)将Simpletron模拟程序修改成不仅能处理整数值,而且能处理浮点数。
s)将Simpletron模拟程序修改成处理字符串输入。提示每个Simpletron字可以分为两组,各放两位整数。每个两位整数表示一个字符的ASCII十进制的对应值。增加在特定的 Simpleton内存单元开始输入和存放字符串的机器语言指令。该内存单元的字的前半部分是字符串中的字符数(即字符串的长度),后半部分包含一个用两个十进制位所表示的ASCII字符。机器语言指令将每个字符变为对应ASCII值并赋给半个字。
h)将Simpletron模拟程序修改成处理字符串输出(按g)中的格式存放)。提示:增加在特定 Simpletron 内存单元开始打印字符串的机器语言指令。该内存单元的字的前半部分是字符串中的字符数(即字符串的长度),后半部分包含一个用两个十进制位表示的ASCll字符。机器语言指令将每个两位数变为对应字符,检查字符串长度,并通过将两位数转换成相应字符来打印字符串。

5.30 下列程序有什么作用?

1 // exO5_30.cpp
2 #include <iostream.h>
3
4 int mystery3( const char *, const char * );
5
6 int main()
7 {
8 char string1[ 80 ], string2[ 80 ];
9
10 cout << "Enter two strings: ";
11 cin >> string1 >> string2;
i2 cout << "The result is"
13 << mystery3< string1, string2 << endl;
14
15 return 0;
16 }
17
18 int mystery3 ( const char *s1, const char *s2 }
19 {
20 for ( ; * s1 != '\0' && *s2 != '\0'; s1++,s2++ )
21
22 if ( *s1 != *s2 )
23 return 0;
24
25 return 1;
26 }