C语言学习之打印菱形、数组奇偶排序

 Part 1:C语言实现打印菱形

如上图所示,是使用C语言打印的一个菱形,小编这里使用指针的方式来解决该问题(也可通过观察规律实现)。

在解决该问题时,我们通常分为两步来实现菱形的打印,第一步是打印菱形的上半部分,第二步是打印菱形的下半部分。

<1>打印菱形的上半部分

问题分析:如图所示,如果我们将上半部分的每行看成一个一维数组,那么第一行数组的内容除了中间位为星号,其他的都是空格,然后之后的每行都是在上一行的基础上向两端依次扩展一位,直到遍历完整个数组。

实现:通过分析,我们已经知道了上半部分是如何实现的,那么具体该怎么编码实现呢?

首先,我们需要定义一个一维数组,初始化该数组内部的全部元素为空格;然后,定义两个指针变量 start end ,用于在每次的循环过程中修改数组向两端扩展的元素为星号。细心的你肯定已经发现了每行的星号都是奇数,因此在写代码的过程中定义数组时,要注意定义为奇数。由于数组的下标是从0开始的,因此在开始的时候,我们只需要给接收数组的指针加上数组长度的一半,使得指针指向数组中间位置。

在这里,我们需要清楚的是:由于我们是使用指针对数组的内存进行操作,因此每次向外扩展时,不仅扩展的元素是星号,同时它们之间的元素(即上一行的元素)也是星号。
<2>打印菱形的下半部分

扫描二维码关注公众号,回复: 11211892 查看本文章

问题分析:与上半部分相似,下半部分可以看成是对一个全是星号的数组,每次修改两端的两个星号。

实现:经过上半部分的操作,两个指针变量 start 和 end 分别指向数组的首尾,因此在此处的实现上不需要定义新的指针变量。每次对两头的指针进行加1和减1操作,然后将其指向的目标的内容修改为空格即可。

#include <stdio.h>
#include <windows.h>

#define SIZE 11

void PrintDiamond(char *p1, int _len)
{
	int index = _len / 2;
	char *start = p1 + index;
	char *end = p1 + index;
	//上三角
	for (int i = 0; i <= index; i++){
		*start = '*';
		*end = '*';
		int j = 0;
		for (; j < _len; j++){
			printf("%c ", *(p1 + j));
		}
		if (i != index){
			start--, end++;
		}
		printf("\n");
		printf("\n");
	}
	//下三角
	for (int i = 0; i < index; i++){
		*start = ' ';
		*end = ' ';
		int j = 0;
		for (; j < _len; j++){
			printf("%c ", *(p1 + j));
		}
		start++, end--;
		printf("\n");
		printf("\n");
	}
}

int main()
{
	char arr1[SIZE] = { ' ' };
	//int len = sizeof(arr1) / sizeof(arr1[0]);
	PrintDiamond(arr1, SIZE);

	system("pause");
	return 0;
}

Part 2:数组奇偶排序

Question:调整数组使奇数全部都位于偶数前面

问题分析:首先,我们需要定义一个数组 arr1,然后对数组内部的元素进行重新排列。这里需要注意的是,是对原数组的重新排列,因此在操作结束之后,arr1 内部元素实现重新排列

实现:根据上面的分析,小编在编写函数实现功能的时候,先对现有的数组进行了一份拷贝,然后使用指针操作对 arr1 中的内容进行修改。

#include <stdio.h>
#include <windows.h>
#pragma warning(disable:4996)

#define SIZE 10

void ArrCopy(int *p1, int *p2)
{
	int i = 0;
	for (; i < SIZE; i++){
		*p1 = *p2;
		p1++, p2++;
	}

}

void OddEven(int *p)
{
	int arr2[SIZE] = { 0 };
	ArrCopy(arr2, p);     //保证原数组自身发生变化
	int i = 0;
	//奇数放在数组前半部分
	for (; i < SIZE / 2; i++){
		*(p + i) = arr2[2 * i];
	}
	//偶数放在数组后半部分
	int j = 0;
	for (; i < SIZE; i++,j++){
		*(p + i) = arr2[2 * j + 1];
	}
}

int main()
{
	int arr1[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	OddEven(arr1);

	int i = 0;
	for (; i < SIZE; i++){
		printf("%d ", arr1[i]);
	}

	system("pause");
	return 0;
}
原创文章 5 获赞 1 访问量 181

猜你喜欢

转载自blog.csdn.net/qq_44408326/article/details/106164072