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

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

6c1555302777729326ca3efa0910d9ec.png

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

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

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

6c1555302777729326ca3efa0910d9ec.png

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

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

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

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

<2>打印菱形的下半部分

6c1555302777729326ca3efa0910d9ec.png

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

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

#include

#include

#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

#include

#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;

}

来源:oschina

链接:https://my.oschina.net/u/4313107/blog/4282927

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值