數(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
#include int 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
#include printf("電腦下棋\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)查看詳情吧