• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qyk123
博客园    首页    新随笔    联系   管理    订阅  订阅
C语言实验报告十——指针

题目:

利用指针编写程序

设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。

例如:原数列为2,4,6,8,10,12,14,16,18,20。若要求把从第4个数开始的5个数按

逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20

要求:

进行逆序处理时使用指针方法。

分析:

  1. 输入:

    • 用户首先被要求输入一个已排序的数组,然后输入一个指定位置 m 和一个计数 n。
  2. order 函数:

    • order 函数接受一个数组指针和两个索引,然后在指定范围内进行元素的对称交换。
    • 通过使用三个指针(pm1,pend,pminddle)来遍历范围,从两端向中间逐步交换元素。
  3. 主函数 main:

    • 声明一个大小为 N 的数组,并由用户输入已排序的数值。
    • 用户输入指定位置 m 和重新排列的元素个数 n。
    • 打印原始数组。
    • 调用 order 函数,以在指定位置 m 处开始,重新排列 n 个元素。
    • 打印重新排序后的数组。
  4. 潜在问题:

    • 用户需要确保输入的数组是已排序的,否则结果可能不符合预期。
    • 代码没有对用户输入进行验证,可能导致错误,例如输入位置 m 超出数组范围。
    • 打印的格式较为简单,可能不够清晰。

代码:

#define N 10
void order(int* pa, int m1, int n1)
{
	int temp, * pm1, * pend, * pminddle;
	pm1 = pa + m1 - 1;
	pend = pa + m1 + n1 - 2;
	pminddle = pa + m1 - 1 + n1 / 2;

	for (; pm1 < pminddle; pm1++, pend--)
	{
		temp = *pm1;
		*pm1 = *pend;
		*pend = temp;
	}
}
int main()
{
	int a[N];
	int m, n, i;
	printf("输入一个已排好序的数:");
	for (i = 0; i < N; i++)
	scanf("%3d", &a[i]);
	printf("输入指定位置m:");
	scanf("%d", &m);
	printf("输入重新排的个数n:");
	scanf("%d", &n);
	printf("输出原序的:");
	for (i = 0; i < N; i++)
	printf("%4d", a[i]);
	printf("输出重排序的:");
	order(a, m, n);
	for (i = 0; i < N; i++)
		printf("%4d", a[i]);
	return 0;
}

posted on 2024-02-23 19:16  qiyukun  阅读(53)  评论(0)    收藏  举报  来源
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3