案例描述
甲乙一起玩猜硬币的游戏:初始时,甲的左手握着一枚硬币,游戏开始后,甲进行有限次或真或假的交换,最后由乙来猜两只手中是否有硬币。写明案例,实现游戏过程。
案例分析
因为游戏要执行有限次,所以需要首先确定交换进行的次数,通过循环执行每次交换,又因为每次交换真假不确定,所以至少需要实现两个交换函数,一个函数真正的实现两只手的交换,另一个只需要表面完成交换。而每次是否真正交换硬币也是随机的。因此使用随机数发生器来决定每次选择执行的函数。
必备知识
1,指针作为参数函数
在C语言中,实参和形参之间的数据传递是单向的值传递,只能由实参传递给形参。这与C语言中的内存分配方式有关。当发生函数调用时,系统会使用与形参对应的实参为形参赋值,此时的形参以及该函数中的变量都存放在函数调用中系统在栈区开辟的空间里。栈区于函数调用时被分配,于函数调用结束后被回收,在此过程中,栈区对主函数不可见,因此主函数并不能读取栈中形参的数据。若要将栈中的数据传输给主函数只能用return()实现。
本节学习将使用一种新的方法,使用指针变量作为函数的形参,通过传递地址的方式,使形参和实参都指向主函数中数据所在地址,从而使被调函数可以对主调函数中的数据进行操作。
2,指针的交换
根据指针可以获得变量的地址,也可以得到变量的信息,所以指针交换可以包括两方面,一是指针指向交换,二是指针所指地址中存储数据的交换。
- 指针指向交换
若要交换指针的指向,首先需要一个指针变量,记录其中一个指针原来的指向,再使该指针指向另一个指针,使另外一个指针指向该指针的原来的指向,具体的实现方法如下:
int *tmp = 0; //创建辅助变量 指针
tmp = p; //使用辅助变量指针记录指针p的指向
p = q; //将q指向地址p所指地址中
q = tmp; //将p中原来的数据放到q所指的地址中
- 数据的交换
具体的实现方法如下:
int tmp = 0; //创建辅助变量
tmp = *p; //使用辅助变量记录指针p指向地址中的数据
*p = *q; //将q指向地址中的数据放到p所指地址中
*q = *tmp; //将p中原来的数据放到q所指的地址中
案例设计
- 使用基类型的变量作为形参,构造交换函数
- 使用指针变量作为形参,在函数体中交换指针的指向
- 使用指针变量作为形参,在函数体中交换指针变量所指内存中存储的数据
- 使用随机数生成器确定交换发生的次数,选择每次要执行的交换方法
- 使用while循环语句控制交换进行的轮数
- 使用switch语句根据产生的额随机数选择本轮次执行的交换方法
完整代码