零开始的C语言学习之路——谭浩强教材课后题实践记录与问题解析(第八章指针④)

文章讲述了如何在C/C++中编写一个函数,实现给定n个整数数组,根据用户输入的m值将数组元素向后移动m个位置。首先介绍了固定大小数组的实现方法,然后扩展到动态数组的情况,通过检测回车符结束输入并处理未初始化的数组元素。
摘要由CSDN通过智能技术生成

8.4 题目:

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,如图所示。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。


思路:

一、由于拿不准如何确定动态的整数个数n,故先写了一个固定值n=10,输入十个整数后再输入要求移动的位置个数m的代码,便于理解。

思路:

           ①先定义一个数组a[10],用于存放输入的十个整数,数组b[10]是空的,用于存放平移后数字的排列。再用指针变量f1,f2分别指向两个数组的首元素地址,移动时使用指针来操作。

           ②对于移动的算法,先是自己举了一个例子后,掌握一定的规律

//老数组最后m~n的元素放到新数组的前0~m位置,老数组前0~m的元素放到新数组的m+1~n位置
void Move_Bcak(int* p1, int* p2, int n, int m)
{
	for (int i = 0; i < m; i++)
		*(p2 + i) = *(p1 + n - m + i);
	for (int i = 0, j = m + 1; i < (n-m); j++, i++)
		*(p2 + j) = *(p1 + i);
}

int main()
{
	int a[10], b[10];
	int* f1, * f2;
	int i, m;
	printf("请输入n个整数:\n");
	for(i=0;i<10;i++)
		scanf("%d", f1);
	printf("请输入想要向后移动的的个数:\n");
	scanf("%d", &m);
	f1 = a;
	f2 = b;
	Move_Bcak(f1, f2, 10, m);
	printf("数组向后移动后的结果为:\n");
	for (int i = 0; i < 10; i++)
		printf("%3d", *(f2 + i));
	return 0;
}

 二、对于动态的n个整数

思路:

        ①这一部分主要是统计n的值,一开始想的是检测遍历数组,未到'\0'时n的值和遍历时i的值一样+1,但是意识到'\0'是字符数组才有的(错误思路),所以得在循环里用if (getchar() == '\n') break;发现回车时提前结束循环(正确思路)

        ②在测量整型数组有多少有效数据时,想到一个问题就是:整型数组必须是填满的吗?比如a[10],但是我只输入“1,2,3,4,5”,那么数组里是5个元素还是10个元素?(前5个是“1,2,3,4,5”后面补充“0,0,0,0,0”)——答案是5个元素,剩余的5个元素(即 a[5]~a[9])将保持未初始化的状态,它们的值将是未定义的(在C/C++中通常是内存中的随机值)

 

//老数组最后m个(a[n-m]~a[n-1])的元素放到新数组的前0~m-1(b[0]~b[m-1])位置,
//老数组前0~n-m-1(a[0]~a[n-m-1])的元素放到新数组的m+1~n(b[m]~b[n-1])位置
void Move_Bcak(int* p1, int* p2, int n, int m)
{
	for (int i = 0; i < m; i++)
		*(p2 + i) = *(p1 + n - m + i);
	for (int i = 0; i < (n-m); i++)
		*(p2 + m + i) = *(p1 + i);
}

int main()
{
	int a[50], b[50];
	int* f1=a, * f2=b;
	int i, n=0, m;
	printf("请输入n个整数:\n");
	for(i=0;i<50;i++)
	{
		scanf("%d", f1+i);
		n++;
		if (getchar() == '\n')  // 添加此行,解决连续输入数字导致的读取问题
			break;
	}
	printf("n=%d", n);
	printf("请输入想要向后移动的的个数:\n");
	scanf("%d", &m);
	Move_Bcak(f1, f2, n, m);
	printf("数组向后移动后的结果为:\n");
	for (int i = 0; i < n; i++)
		printf("%3d", *(f2 + i));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值