C語言學習之打印菱形、數組奇偶排序

 Part 1:C語言實現打印菱形windows

如上圖所示,是使用C語言打印的一個菱形,小編這裏使用指針的方式來解決該問題(也可經過觀察規律實現)。數組

在解決該問題時,咱們一般分爲兩步來實現菱形的打印,第一步是打印菱形的上半部分,第二步是打印菱形的下半部分。函數

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

問題分析:如圖所示,若是咱們將上半部分的每行當作一個一維數組,那麼第一行數組的內容除了中間位爲星號,其餘的都是空格,而後以後的每行都是在上一行的基礎上向兩端依次擴展一位,直到遍歷完整個數組。spa

實現:經過分析,咱們已經知道了上半部分是如何實現的,那麼具體該怎麼編碼實現呢?3d

首先,咱們須要定義一個一維數組,初始化該數組內部的所有元素爲空格;而後,定義兩個指針變量 start end ,用於在每次的循環過程當中修改數組向兩端擴展的元素爲星號。細心的你確定已經發現了每行的星號都是奇數,所以在寫代碼的過程當中定義數組時,要注意定義爲奇數。因爲數組的下標是從0開始的,所以在開始的時候,咱們只須要給接收數組的指針加上數組長度的一半,使得指針指向數組中間位置。指針

在這裏,咱們須要清楚的是:因爲咱們是使用指針對數組的內存進行操做,所以每次向外擴展時,不只擴展的元素是星號,同時它們之間的元素(即上一行的元素)也是星號。
<2>打印菱形的下半部分
code

問題分析:與上半部分類似,下半部分能夠當作是對一個全是星號的數組,每次修改兩端的兩個星號。blog

實現:通過上半部分的操做,兩個指針變量 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;
}
相關文章
相關標籤/搜索