C语言编程实例:移动数组元素与报数游戏解法

需积分: 0 1 下载量 42 浏览量 更新于2024-07-26 收藏 146KB PDF 举报
在C语言程序设计100实例2中,我们探讨了两个有趣的编程问题,旨在帮助学习者理解和应用C语言来解决实际问题。 **程序68:数组元素移动** 题目要求实现一个函数`move()`,该函数接受一个整数数组`array`、数组长度`n`和移动次数`m`,使得数组中前`n-1`个元素向前移动`m`个位置,同时将最后一个元素移到新形成的序列末尾。程序分析部分提示了要通过指针操作来实现这个功能,先将数组的末尾元素依次向前移动,然后递归处理剩余的移动次数。以下是核心代码: ```c move(array, n, m) { int *p, array_end; array_end = *(array + n - 1); // 获取数组末尾元素 for (p = array + n - 1; p > array; p--) { *p = *(p - 1); // 向前移动元素 } *array = array_end; // 将末尾元素放到第一个位置 m--; // 减去已移动次数 if (m > 0) // 如果还有剩余移动次数,继续调用自身 move(array, n, m); } ``` **程序69:圈中留人游戏** 另一个问题是关于数组元素的动态删除与计数。在这个场景中,有n个人围成一圈报数,报到3的人退出圈子。目标是找出最后剩下的那个人在原始排列中的编号。程序首先定义数组`num`存储每个人的编号,然后通过一个循环和条件判断来执行报数和删除操作。以下是关键代码段: ```c for (i = 0; i < n; i++) { if (*(p + i) != 0) k++; // 统计未退出的人数 if (k == 3) { *(p + i) = 0; // 报到3的人退出 k = 0; // 重置计数 m++; // 退出人数增加 } i++; // 进入下一个 if (i == n) i = 0; // 当前轮次结束,回到数组开头 } while (*p == 0) p++; // 找到最后一个非零元素,即最后留下的那个人的编号 printf("%d is left\n", *p); ``` 这两个实例展示了C语言中数组操作和控制结构(如循环和递归)的运用,以及如何通过逻辑判断处理动态变化的问题。它们有助于提高编程实践能力,对准备面试或者深入理解C语言编程有显著帮助。