真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

系統(tǒng)學(xué)習(xí)之C復(fù)習(xí)(4)數(shù)組-創(chuàng)新互聯(lián)

一:一維數(shù)組的創(chuàng)建和初始化

數(shù)組:一組相同類型元素的合集。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、息烽ssl等。為超過千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的息烽網(wǎng)站制作公司

int n? = 10;

int arr[n] = {0};

但是 n 不可以變化

C99中引入了變長數(shù)組的概念,允許數(shù)組的大小用變量指定。

如果編譯器不支持的C99中的變長數(shù)組,則不能使用

數(shù)組的初始化:在創(chuàng)建的時候賦值?

不完全初始化:不賦值完,后續(xù)默認(rèn)0;

? int arr[] = {1,2,3,4} 不賦數(shù)組大小,系統(tǒng)默認(rèn)分配。

? int arr[10];????????數(shù)組不賦值系統(tǒng)分配隨機值。

二:一維數(shù)組的使用 三:一維數(shù)組在內(nèi)存中的存儲

打印數(shù)組中每個元素中的地址——%p? ?(16進制)

#include#includeint main()
{
?? ?char arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?int i = 0;
?? ?int sz = sizeof(arr1) / sizeof(arr1[0]); ? ?//計算數(shù)組元素個數(shù)。
?? ?for (i = 0; i< sz; i++)
?? ?{
?? ??? ?printf("&arr1[%d] = %p\n", i, &arr1[i]);
?? ?}
?? ?return 0;
}

一組數(shù)組在內(nèi)存是連續(xù)的。隨著數(shù)組下標(biāo)的增加,地址由低到高。

用指針訪問數(shù)組

#include#includeint main()
{
?? ?char arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?int i = 0;
?? ?int sz = sizeof(arr1) / sizeof(arr1[0]); ? ?//計算數(shù)組元素個數(shù)。

    char* p = &arr1[0];

?? ?for (i = 0; i< sz; i++)
?? ?{
?? ??? ?printf("&arr1[%d] = %p<=====>%p\n", i, &arr1[i],p+i);
?? ?}
?? ?return 0;
}
四:二維數(shù)組的創(chuàng)建和初始化

int arr[3][5];? //三行五列

int arr[3][5] = {{1,2},{3,4},{5,6}};? ? ? ? //?一個{}一行

可以省略行,不可以省略 列

? int arr[][5] = {1,2,3,4,5,6,7};? ? ? ? //此時只有兩行,系統(tǒng)自動發(fā)配行

? int? arr[][5] = {{1,2},{3,4},{5,6}};? ?//此時三行

五:二維數(shù)組的使用

二維數(shù)組的訪問:

int main()
{
	//int arr[3][5] = {1,2,3,4,5,6,7};	//三行五列
	int arr[][5] = { {1,2},{3,4},{5,6} };
	int i = 0;
    //for (i = 0; i< sizeof(arr) / arr[0]; i++)//0 1 2 
	for (i = 0; i< 3; i++)//0 1 2  行
	{
		int j = 0;
		for (j = 0; j< 5; j++)     //列
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
六:二維數(shù)組在內(nèi)存中的存儲

和一維數(shù)組一樣。連續(xù)的。 第一列的最后一位與第二列的第一位相連。

七:數(shù)組越界

請程序員本身注意。

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    for(i=0;i<=10;i++)    //此處越界,c語言本身不檢查。
    {
        printf("%d ",arr[i]);
    }
    return  0;
}
八:數(shù)組作為函數(shù)參數(shù) 冒泡排序的錯誤方式

冒泡排序

數(shù)字中2個相鄰的元素進行比較,如果不滿足順序則交換。

距離

若: 9 8 7 6 5 4 3 2 1? ? ? ? 排序為升序

第一次:? ? ? ? ? ? ? ? ? ? ? ? 第二次:

8 9 7 6 5 4 3 2 1 0? ? ? ? ? ? ? ? ?7 8 6 5 4 3 2 1 0 9

8 7 9 6 5 4 3 2 1 0? ? ? ? ? ? ? ? ?7 6 8 5 4 3 2 1 0 9

8 7 6 9 5 4 3 2 1 0? ? ? ? ? ? ? ? ?……

……

8 7 6 5 4 3 2 1 0 9

一趟冒泡排序搞定一個

int bubble_sort(int* arr)
{
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i< sz; i++)
	{
		//每一趟冒泡排序
		int j = 0;
		for (j = 0; j< sz - 1 - i; j++)
		{
			if (arr[j] >arr[j + 1])	//交換 
			{
				int  tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	bubble_sort(arr);
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
//此時 輸出依舊依舊是9 8 7 6 5 4 3 2 1 0

經(jīng)過調(diào)試,我們發(fā)現(xiàn)sz = 1;

首先,數(shù)組名是什么?

printf("%p\n",arr);

printf("%p\n",&arr[0]);
//這兩者輸出一致

數(shù)組名就是數(shù)組的首元素的地址;

? 有2個例外:

? &數(shù)組名 與?sizeof(數(shù)組名),此時數(shù)組名不是數(shù)組首元素的地址,是代表整個數(shù)組

??

arr 與?&arr[0] 都是數(shù)組首元素地址,? &arr是數(shù)組地址。?

所以,函數(shù)中的 sz 計算的1;

修改:將sz的計算放到函數(shù)外計算,作為參數(shù)傳進去。

int bubble_sort(int* arr, int sz)
{
	int i = 0;
	//int sz = sizeof(arr) / sizeof(arr[0]);
	//因為傳進來的是數(shù)組首元素地址,所以 sz = 1;
	//將此計算大小移出計算,作為參數(shù)傳進來。
	for (i = 0; i< sz; i++)
	{
		//每一趟冒泡排序
		int j = 0;
		for (j = 0; j< sz - 1 - i; j++)
		{
			if (arr[j] >arr[j + 1])	//交換 
			{
				int  tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i< sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

三子棋

先 確定框架,

再 測試基本邏輯是否運行?

最后編寫game內(nèi)容

首先 基本框架與邏輯?

#define _CRT_SECURE_NO_WARNINGS 1
#include#include "game.h"

void menu()
{
	printf("***************\n");
	printf("**按1開始游戲**\n");
	printf("**按0結(jié)束游戲**\n");
	printf("***************\n");
}

void game()
{
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲");
			break;
		default:
			printf("請選擇1or0\n");
			break;
		}
	} while (input);
	return  0;
}

然后 新建一個 game.h和game.c文件,進行模塊化

游戲的內(nèi)容都在game.c里面寫,主函數(shù)調(diào)用即可。

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)//row  行 col 列
{
	int i = 0;
	for (i = 0; i< row; i++)
	{
		int j = 0;
		for (j = 0; j< col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; i++)
	{
		int j = 0;
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		printf("---|---|---\n");
	}
}

//這段代碼的效果限制了 列的生成,倘若生成 10*10,那么依舊只顯示3列。 為此,修改成如下

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i< row; i++)
	{
		int j = 0;
		for (j = 0; j< col; j++)	//每打印一個數(shù)據(jù),后面跟一個 |
		{
			printf(" %c ", board[i][j]);
			if(j

棋盤構(gòu)成了。隨后棋手入場。

電腦和玩家 各自下棋。

電腦和玩家 各自下棋。

void game()
{
	//存放下棋的數(shù)據(jù)
	char board[ROW][COL] = { 0 };
	//初始化棋盤為全空額
	InitBoard(board, ROW, COL);
	//打印棋盤
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//電腦下棋
		conputer_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
	}
}
//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋\n");
		printf("請輸入坐標(biāo):>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x<= row && y >= 1 && y<= col)
		{
			//下棋
			if (board[x - 1][y - 1] == ' ')//判斷該坐標(biāo)是否被占用(是否已經(jīng)被下子)
			{
				board[x - 1][y - 1] = '*';
				break;		//記得brak退出 前面在死循環(huán)
			}
			else
			{
				printf("該坐標(biāo)已被占用,請重新輸入\n");
			}
		}
		else
			printf("非法坐標(biāo),請重新輸入\n");
	}
}
//電腦下棋
void conputer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	//使用rand()生成隨機數(shù)前需要調(diào)用
	//srand((unsigned int)time(NULL));	#include#includeprintf("電腦下棋\n");
	while (1)
	{
		x = rand() % row;	//0~ROW-1	
		y = rand() % col;	//0~COL-1
		//落子的地方需要就判斷是否有子
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

選手下完棋子后,需要判斷游戲狀態(tài)?。

死種游戲狀態(tài):? ? ? ? 令:

玩家贏? ? ? ? —— 返回 ' * '

電腦贏? ? ? ? —— 返回 ' # '

平局? ? ? ? ? ? —— 返回 ' Q?'?

繼續(xù)? ? ? ? ????—— 返回 ' C '

每一次 落子后就需要判斷。

char ret = 0;
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判斷輸贏 
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//電腦下棋
		conputer_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判斷輸贏 
		ret = is_win(board, ROW, COL);
		if(ret != 'C')
		{
			break;
		}
	}
	if ('*' == ret)
	{
		printf("玩家贏了\n");
	}
	else if ('#' == ret)
	{
		printf("你給電腦贏了??\n");
	}
	else if('Q' == ret)
	{
		printf("平局\n");
	}

判斷 橫、豎 、對角線 ,棋盤滿子? 等四種情況

char is_win(char board[ROW][COL], int row, int col)
{
	// 判斷橫豎三,對角線是否三個相同的
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 0; i< row; i++)//判斷ROW行
	{
		for (j = 1; j< col; j++)
		{
			if (board[i][j] == board[i][j - 1]  && board[i][j] != ' ')
			{
				count++;
			}
			if (count == GAME_COUNT - 1)
			{
				return board[i][j];
			}
		}
		count = 0;
	}
	for (j = 0; j< col; j++)//判斷COL列
	{
		for (i = 1; i< row; i++)
		{
			if (board[i][j] == board[i-1][j] && board[i][j] != ' ')
			{
				count++;
			}
			if (count == GAME_COUNT - 1)
			{
				return board[i][j];
			}
		}
		count = 0;
	}

	for (i = 1, j = 1; i<= row || j<= col; i++, j++)	//判斷對角線
	{
		if (board[i][j] == board[i - 1][j - 1] && board[i][j] != ' ')
		{
			count++;
		}
		if (count == GAME_COUNT - 1)
		{
			return board[i][j];
		}
		count = 0;
	}
	if (FULL == is_full(board, ROW, COL))//判斷平局
	{
		return 'Q';	
	}
	return 'C';
}
//檢測是否棋盤滿子
int is_full(char board[ROW][COL],int row, int col)
{
?? ?int i = 0;
?? ?int j = 0;
?? ?for (i = 0; i< row; i++)//判斷ROW行
?? ?{
?? ??? ?for (j = 0; j< col; j++)
?? ??? ?{
?? ??? ??? ?if (board[i][j] == ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return 1;
}

用count++計數(shù),? ?當(dāng)有一次相同時,count 計數(shù)+1,

每一行或者每一列 檢測完畢的時候count清零。為下一行重新檢測

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站欄目:系統(tǒng)學(xué)習(xí)之C復(fù)習(xí)(4)數(shù)組-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/didjej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部