iT邦幫忙

DAY 29
1

30天C語言巔峰之路系列 第 29

30天C語言巔峰之路(Day29:陣列-一維與多維陣列)

陣列
陣列聽起來很專業,其實就是跟電腦要一個大箱子,裡面有n個相同大小的空間,讓我們來存放資料,說專業一點,陣列就是跟記憶起要一塊「連續」的空間供我們使用。
陣列的用途在於存放大筆資料,例如說50人的成績,如果沒有陣列就要宣告50個變數耶,那光是命名變數名稱就很耗費時間。
陣列大多都跟迴圈雙劍合璧一起使用。

陣列架構
宣告:DataType arrayName[size]
DataType:資料型態
arrayName:陣列名稱
size:陣列大小

Ex:int score[5]

※注意:宣告[5]是指5個位置,是從0到4並不是從1到5。

一維陣列
一維陣列就是有一個變數名稱後面接「一個」中括號的宣告,就是一維陣列。

例如:
int score[5]

同時也可以在宣告時給值,同時給值的時候可以不用寫陣列大小,編譯器會自行判定,沒給值初始則是,。
Ex:int score[5]={1,2,3,4,5} = int socre[]={1,2,3,4,5}
以下有幾個範例讓大家了解陣列的使用。

Source Code

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i,English[5],Math[]={10,50,80,100,20};
	
for(i=0;i<5;i++)
	{
		printf("Input English score:");
		scanf("%d",&English[i]);	
	}
	
printf("English:");
	for(i=0;i<5;i++)
		printf("%d ,",English[i]);
	
	printf("\nMath:");
	for(i=0;i<5;i++)
		printf("%d ,",Math[i]);
	printf("\n");
	
	system("PAUSE");
	return 0;	
}

執行結果

先宣告5個未使用的English陣列,跟5個已放值的Math陣列,配合for迴圈讀入並輸出值。
陣列只是放東西的盒子,用法跟前面的變數沒有太大的不同。

多維陣列
多維陣列就是一維以上的陣列就稱為多維陣列,其實通常我們都只用到二維陣列而已,再多也容易搞混,後面會用「結構體」代替多維陣列。
以二維陣列為例,宣告方法如下:

DataType arrayName[size1][ size2];

其中size1和size2為第一個維度和第二個維度,但這邊的2個維度不可以像前面1個維度一樣省略。
舉例:前面一個維度的陣列只能放一個人的成績,現在要放多人多個成績則使用2個維度的陣列,2個維度各放「人」與「成績」。
宣告:int score[2][3] = {{90,70,75},{100,40,20}};//表示有2個人, 3個成績。
下面放一個2維陣列應用

Source Code

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int card[52],count,player[4][13],i,j,tmp,rnd;
	srand(time(NULL));
	for(i=0;i<52;i++)
		card[i]=i;//將牌放入盒子
	
	for(i=0;i<52;i++)
	{//洗牌
		tmp = card[i];
		rnd = rand()%52;
		card[i] = card[rnd];
		card[rnd] = tmp;
	} 
	
	for(i=0;i<52;i++)
		player[i%4][i/4]=card[i];//發牌
	
	for(j=0;j<4;j++)
	{
		printf("player[%d]=",j);
		for(i=0;i<13;i++)
		{
			if(player[j][i]<10)
				printf("0");//排版
			printf("%d",player[j][i]);	
			if(i<12)
				printf(", ");//最後一個數字不用逗點	
		}
		printf("\n");
	}
	printf("\n");
	system("PAUSE");
	return 0;
}

執行結果

為了讓程式碼容納在一頁中,有些for和if裡面程式碼只有一行的我就沒括號了,但是要記住沒括號只執行一行。
http://black31.wordpress.com/2008/05/22/c-%E9%9A%A8%E6%A9%9F%E4%BA%82%E6%95%B8-rand-srand/
rand()和srand()由於我不知道要放在哪個章節,它又很簡單所以這邊提供網址給大家參考。

洗牌的原理就是把第一張牌到最後一張牌依序用亂數和其他牌交換,陣列2數交換屬於三方傳球式
tmp = card[i];先保留
card[i] = card[rnd]將其中一方蓋掉;
card[rnd] = tmp;再將另一方蓋掉
如果不用3方傳球,就只能單方面蓋掉,不能達到互相交換。
player[i%4][i/4]=card[i]

接下來就是發牌了,這邊發牌是採1->2->3->4->1...的順序發牌,陣列第一個維度[] 是4個人物,順序是0->1->2->3->0...,第二個維度[] 則是13張牌,順序是0->0->0->0->1->1->1->1->2->2->2->2->...

所以結合起來就變成

0->1->2->3->0->1->2->3->0->1->2->3->;... 0->1->2->3

0->0->0->0->1->1->1->1->2->2->2->2->...12->2->12->12

接著就輸出了,輸出裡面有用一些判斷是來對輸出資料做個排版。


上一篇
30天C語言巔峰之路(Day28:迴圈-跳出與返回)
下一篇
30天C語言巔峰之路(Day30:結束與開始)
系列文
30天C語言巔峰之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言