目的:掌握用C語(yǔ)言編程的基本技能
內(nèi)容:1. #define的使用
???2. 冒泡排序
???3. 選擇排序
???4. 插入排序
???5. 函數(shù)及其應(yīng)用
???6. 殺人小游戲?qū)崙?zhàn)
???7. 猜數(shù)字小游戲?qū)崙?zhàn)
define的使用
- define可以為類型定義別名
#define INT int
- define可以為數(shù)值定義別名,在為數(shù)值定義別名時(shí),可以達(dá)到定義一個(gè)常量的效果
#define KILLED 0 //宏定義(取別名)
- 使用#define的好處:
- 增強(qiáng)閱讀性:加強(qiáng)了代碼的可讀性
- 可操作性:便于代碼的修改。當(dāng)多出使用#define定義的別名,而別名對(duì)應(yīng)值需要修改時(shí),可直接在#define處快速修改
冒泡排序
- 原理:依次從頭開始將第一個(gè)數(shù)和下一個(gè)數(shù)進(jìn)行比較,大的沉底,通過(guò)一次循環(huán)的到一個(gè)最大的數(shù),重復(fù)該操作直到排序結(jié)束
- 實(shí)現(xiàn)方式:每次遍歷整個(gè)數(shù)組,找到最大的一個(gè)數(shù)沉底。如果數(shù)組有N個(gè)元素,第一次需要遍歷N-1次(沉第一個(gè)數(shù)據(jù)),第二次需要遍歷N-2次(沉第二個(gè)數(shù)據(jù))
......總共需要比較N-1次- 代碼如何實(shí)現(xiàn):兩層循環(huán) 。第一層循環(huán)控制總共需要遍歷多少次(N-1次) ;第二層循環(huán)控制每次需要遍歷多少次才能找到最大的數(shù)(每次從頭i=0開始,讓i和i+1
進(jìn)行比較,確保i+1是最大的數(shù))#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10;i++){//控制總共遍歷次數(shù) //開始每一次遍歷 找到一個(gè)最大的數(shù)沉底 for(int j = 0;j < 10 - i;j++){ //讓j和j+1的值進(jìn)行比較 if(num[j] > num[j+1]){ //交換j和j+1的值 int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } //輸出結(jié)果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
選擇排序
- 原理:先默認(rèn)一個(gè)數(shù)是最小的,依次和其他的數(shù)進(jìn)行比較,通過(guò)交換位置讓該值始終保持最小。這樣每一次循環(huán)都會(huì)得到一個(gè)最小的值,重復(fù)該操作直到排序結(jié)束
- 代碼如何實(shí)現(xiàn):兩層循環(huán)。外層循環(huán)控制需要遍歷多少次(N-1次);內(nèi)層循環(huán)遍歷出當(dāng)前最小的數(shù)
#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10 - 1;i++){//控制次數(shù) //取出i對(duì)應(yīng)的數(shù),默認(rèn)是最小的數(shù) int temp = num[i]; //從i后面開始查找當(dāng)前最小的數(shù),放到i的位置 for(int j = i + 1;j < 10;j++){ //讓temp和i后面的每一個(gè)數(shù)進(jìn)行比較 //temp始終保存最小的那個(gè)數(shù) if(num[j] < temp){ //交換 int n = temp; temp = num[j]; num[j] = n; } } //當(dāng)前的temp值是最小的,寫入i對(duì)應(yīng)的位置 num[i] = temp; } //輸出結(jié)果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
插入排序
- 原理:對(duì)于未排序數(shù)據(jù),通過(guò)構(gòu)建有序序列在已排序序列中從后向前掃描,找到相應(yīng)的位置并插入
- 代碼如何實(shí)現(xiàn):兩層循環(huán)。外層循環(huán)控制需要遍歷多少次(N-1次);內(nèi)層循環(huán)找到這個(gè)數(shù)的位置
#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10 - 1;i++){//控制次數(shù) //判斷i和i+1的大小 if(num[i] > num[i+1]){ //換位置 int temp = num[i]; num[i] = num[i+1]; num[i+1] = temp; //讓i對(duì)應(yīng)的值和前面所有的值進(jìn)行比較 for(int j = i;j > 0;j--){ //j和j-1進(jìn)行比較 if(num[j] > num[j-1]){ //當(dāng)前這個(gè)位置就是這個(gè)數(shù)的位置 break; }else{ //j和j-1換位置 int temp = num[j]; num[j] = num[j-1]; num[j-1] = temp; } } } } //輸出結(jié)果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
函數(shù)及其應(yīng)用
- 函數(shù):一組一起執(zhí)行一個(gè)任務(wù)的語(yǔ)句(函數(shù)就是代碼塊,一個(gè)功能對(duì)應(yīng)一個(gè)函數(shù));每個(gè)C程序都至少有一個(gè)函數(shù),即主函數(shù)main()
- 函數(shù)聲明:告訴編譯器函數(shù)的名稱,返回類型和參數(shù),而函數(shù)的實(shí)際主體可以單獨(dú)定義。在函數(shù)聲明中,參數(shù)的名稱并不重要,只有參數(shù)的類型是必需的。
- function_name(名稱):這是函數(shù)的實(shí)際名稱。函數(shù)名和參數(shù)列表一起構(gòu)成函數(shù)簽名
- return_type(返回類型):一個(gè)函數(shù)可以返回一個(gè)值。它是函數(shù)返回的值的數(shù)據(jù)類型。有些函數(shù)執(zhí)行所需的操作而不返回值時(shí),return_type是關(guān)鍵字void
- parameter(參數(shù)):參數(shù)就像是占位符(函數(shù)可能不包含參數(shù))。當(dāng)函數(shù)被調(diào)用時(shí),你向參數(shù)傳遞一個(gè)值,這個(gè)值被稱為實(shí)際參數(shù)。參數(shù)列表包括函數(shù)參數(shù)的類型、順序、數(shù)量。如果函數(shù)要使用參數(shù),則必須聲明接受參數(shù)值的變量,這些變量稱為函數(shù)的形式參數(shù)。形式參數(shù)就像函數(shù)內(nèi)的的其他局部變量,在進(jìn)入函數(shù)時(shí)被創(chuàng)建,退出函數(shù)時(shí)被銷毀
- body of the function(函數(shù)主體):函數(shù)主體包含一組定義函數(shù)執(zhí)行任務(wù)的語(yǔ)句
- 函數(shù)的定義提供函數(shù)的實(shí)際主體,定義函數(shù)有兩種方式:
- 聲明和實(shí)現(xiàn)一起
int add(int a,int b){ int sum = a + b; return sum; }
- 先聲明,后實(shí)現(xiàn)
int minus(int a,int b);
- 調(diào)用函數(shù):通過(guò)調(diào)用函數(shù)的函數(shù)名
- 當(dāng)程序調(diào)用函數(shù)時(shí),程序控制權(quán)會(huì)轉(zhuǎn)移給被調(diào)用的函數(shù)
- 被調(diào)用的函數(shù)執(zhí)行已定義的任務(wù),當(dāng)函數(shù)的返回語(yǔ)句被執(zhí)行或到達(dá)函數(shù)的結(jié)束括號(hào)時(shí),會(huì)把程序控制權(quán)交還給主程序
add(1,2){ int result = add(3,3); return 0; }
- 函數(shù)的應(yīng)用
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> /*產(chǎn)生一個(gè)隨機(jī)數(shù) 返回值:int 函數(shù)名:generateNumber 參數(shù):min max */ int generateNumber(int min,int max); //產(chǎn)生4個(gè)隨機(jī)數(shù) 保存到數(shù)組中 void initArray(int array[],int count); //判斷數(shù)組中是否包含一個(gè)數(shù)字 bool isNumberExist(int array[],int temp,int num); //輸出數(shù)組 void show(int array[],int num); int main(){ int org[4] = {}; initArray(org,4); show(org,4); return 0; } int generateNumber(int min,int max){ srand(time(NULL)); return rand()%(max - min + 1) + min; } void initArray(int array[],int count){ for(int i = 0;i < count;i++){ //獲取隨機(jī)數(shù) int temp = generateNumber(1,9); //判斷當(dāng)前數(shù)組里面是否存在 bool result = isNumberExist(array,temp,4); if(result == true){ i--; }else{ array[i] = temp; } } } bool isNumberExist(int array[],int temp,int num){ for(int i =0;i < num;i++){ if(array[i] == temp){ return true; } } return false; } void show(int array[],int num){ for(int i = 0;i < num;i++){ printf("%d",array[i]); } printf("\n"); }
殺人小游戲?qū)崙?zhàn)
#include <stdio.h> #define KILLED 0 int main(){ int num[50] = {};//保存每個(gè)人的編號(hào) int count;//保存輸入的人數(shù) int killnum;//被殺的人的編號(hào) printf("請(qǐng)輸入?yún)⑴c人數(shù):"); scanf("%d",&count); //開始編號(hào) for(int i = 0;i < count;i++){ num[i] = i + 1; } printf("請(qǐng)輸入殺人的編號(hào):"); scanf("%d",&killnum); //開始游戲 int current = 0;//記錄當(dāng)前報(bào)數(shù)的位置 int totalkilled = 0;//記錄當(dāng)前死亡人數(shù) for(int i = 0;i < count;i++){ //i指向的這個(gè)人開始報(bào)數(shù) if(num[i] != KILLED){ current++; } //判斷當(dāng)前編號(hào)是不是死亡編號(hào) if(current == killnum){ printf("死忙編號(hào)%d\n",num[i]); num[i] = KILLED;//殺掉 current = 0;//還原 totalkilled++; //當(dāng)還剩一個(gè)的時(shí)候就退出循環(huán) if(totalkilled == count - 1){ break; } } //判斷是否到末尾 if(i == count - 1){ i = -1; } } for(int i = 0;i < count;i++){ printf("%d",num[i]); } return 0; }
猜數(shù)字小游戲?qū)崙?zhàn)
游戲規(guī)則:電腦自動(dòng)產(chǎn)生四個(gè)不重復(fù)的在1-9之間的隨機(jī)數(shù),接著對(duì)產(chǎn)生的隨機(jī)數(shù)按從小到大的順序排好,玩家對(duì)這四個(gè)數(shù)進(jìn)行猜測(cè)并輸入電腦。如果猜測(cè)的數(shù)字的位置和數(shù)值都正確提示A,如果猜測(cè)的數(shù)字的數(shù)值正確而位置錯(cuò)誤提示B。例如:猜測(cè)的數(shù)字中,如果四個(gè)數(shù)字全部猜對(duì)則提示4A,如果一個(gè)數(shù)字的數(shù)值和位置都正確而有三個(gè)數(shù)字的數(shù)值正確位置錯(cuò)誤則提示1A3B
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int org[4] = {};//保存隨機(jī)數(shù) int input[4] = {};//保存用戶輸入 int aCount = 0; int bCount = 0; //產(chǎn)生隨機(jī)數(shù) srand(time(NULL));//播種子 for(int i = 0;i < 4;i++){ //產(chǎn)生一個(gè)隨機(jī)數(shù) int temp = rand()%9 + 1; if(i == 0){ //第一個(gè)數(shù)直接保存 org[i] = temp; }else{ //判斷之前這個(gè)數(shù)是否存在 int j = 0; for(;j < i;j++){ if(temp == org[j]){ //重復(fù)了 break; } } //判斷for循環(huán)怎么出來(lái)的 if(i == j){ //不重復(fù) 保存 org[i] = temp; }else{ //重復(fù)了 i--; } } } for(int i = 0;i < 4-1;i++){ for(int j = 0;j < 4 - i - 1;j++){ if(org[j] > org[j+1]){ int temp = org[j]; org[j] = org[j+1]; org[j+1] = temp; } } } //開始游戲 while(1){ //提示輸入 printf("請(qǐng)輸入猜測(cè)的數(shù)字:"); for (int i = 0; i < 4; i++) { scanf("%d", &input[i]); } //開始 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (org[i] == input[j]) { //數(shù)字存在 判斷位置 if (i == j){ aCount++; }else{ bCount++; } } } } //提示用戶結(jié)果 printf("%dA%dB\n", aCount, bCount); //判斷是否正確 if( aCount == 4){ printf("全對(duì)!!!!\n"); break; }else{ aCount = 0; bCount = 0; } } return 0; }