Part 1:C语言实现打印菱形
如上图所示,是使用C语言打印的一个菱形,小编这里使用指针的方式来解决该问题(也可通过观察规律实现)。
在解决该问题时,我们通常分为两步来实现菱形的打印,第一步是打印菱形的上半部分,第二步是打印菱形的下半部分。
<1>打印菱形的上半部分
问题分析:如图所示,如果我们将上半部分的每行看成一个一维数组,那么第一行数组的内容除了中间位为星号,其他的都是空格,然后之后的每行都是在上一行的基础上向两端依次扩展一位,直到遍历完整个数组。
实现:通过分析,我们已经知道了上半部分是如何实现的,那么具体该怎么编码实现呢?
首先,我们需要定义一个一维数组,初始化该数组内部的全部元素为空格;然后,定义两个指针变量 start 和 end ,用于在每次的循环过程中修改数组向两端扩展的元素为星号。细心的你肯定已经发现了每行的星号都是奇数,因此在写代码的过程中定义数组时,要注意定义为奇数。由于数组的下标是从0开始的,因此在开始的时候,我们只需要给接收数组的指针加上数组长度的一半,使得指针指向数组中间位置。
在这里,我们需要清楚的是:由于我们是使用指针对数组的内存进行操作,因此每次向外扩展时,不仅扩展的元素是星号,同时它们之间的元素(即上一行的元素)也是星号。
<2>打印菱形的下半部分
问题分析:与上半部分相似,下半部分可以看成是对一个全是星号的数组,每次修改两端的两个星号。
实现:经过上半部分的操作,两个指针变量 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;
}