目的:掌握用C語言編程的基本技能
內容:1. #define的使用
???2. 冒泡排序
???3. 選擇排序
???4. 插入排序
???5. 函數及其應用
???6. 殺人小游戲實戰(zhàn)
???7. 猜數字小游戲實戰(zhàn)
define的使用
- define可以為類型定義別名
#define INT int
- define可以為數值定義別名尘应,在為數值定義別名時挠唆,可以達到定義一個常量的效果
#define KILLED 0 //宏定義(取別名)
- 使用#define的好處:
- 增強閱讀性:加強了代碼的可讀性
- 可操作性:便于代碼的修改瘫絮。當多出使用#define定義的別名,而別名對應值需要修改時船惨,可直接在#define處快速修改
冒泡排序
- 原理:依次從頭開始將第一個數和下一個數進行比較,大的沉底缕陕,通過一次循環(huán)的到一個最大的數粱锐,重復該操作直到排序結束
- 實現方式:每次遍歷整個數組,找到最大的一個數沉底扛邑。如果數組有N個元素怜浅,第一次需要遍歷N-1次(沉第一個數據),第二次需要遍歷N-2次(沉第二個數據)
......總共需要比較N-1次- 代碼如何實現:兩層循環(huán) 蔬崩。第一層循環(huán)控制總共需要遍歷多少次(N-1次) 恶座;第二層循環(huán)控制每次需要遍歷多少次才能找到最大的數(每次從頭i=0開始,讓i和i+1
進行比較沥阳,確保i+1是最大的數)#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++){//控制總共遍歷次數 //開始每一次遍歷 找到一個最大的數沉底 for(int j = 0;j < 10 - i;j++){ //讓j和j+1的值進行比較 if(num[j] > num[j+1]){ //交換j和j+1的值 int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } //輸出結果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
選擇排序
- 原理:先默認一個數是最小的跨琳,依次和其他的數進行比較,通過交換位置讓該值始終保持最小桐罕。這樣每一次循環(huán)都會得到一個最小的值脉让,重復該操作直到排序結束
- 代碼如何實現:兩層循環(huán)桂敛。外層循環(huán)控制需要遍歷多少次(N-1次);內層循環(huán)遍歷出當前最小的數
#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++){//控制次數 //取出i對應的數溅潜,默認是最小的數 int temp = num[i]; //從i后面開始查找當前最小的數术唬,放到i的位置 for(int j = i + 1;j < 10;j++){ //讓temp和i后面的每一個數進行比較 //temp始終保存最小的那個數 if(num[j] < temp){ //交換 int n = temp; temp = num[j]; num[j] = n; } } //當前的temp值是最小的,寫入i對應的位置 num[i] = temp; } //輸出結果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
插入排序
- 原理:對于未排序數據伟恶,通過構建有序序列在已排序序列中從后向前掃描碴开,找到相應的位置并插入
- 代碼如何實現:兩層循環(huán)。外層循環(huán)控制需要遍歷多少次(N-1次)博秫;內層循環(huán)找到這個數的位置
#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++){//控制次數 //判斷i和i+1的大小 if(num[i] > num[i+1]){ //換位置 int temp = num[i]; num[i] = num[i+1]; num[i+1] = temp; //讓i對應的值和前面所有的值進行比較 for(int j = i;j > 0;j--){ //j和j-1進行比較 if(num[j] > num[j-1]){ //當前這個位置就是這個數的位置 break; }else{ //j和j-1換位置 int temp = num[j]; num[j] = num[j-1]; num[j-1] = temp; } } } } //輸出結果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
函數及其應用
- 函數:一組一起執(zhí)行一個任務的語句(函數就是代碼塊潦牛,一個功能對應一個函數);每個C程序都至少有一個函數挡育,即主函數main()
- 函數聲明:告訴編譯器函數的名稱巴碗,返回類型和參數,而函數的實際主體可以單獨定義即寒。在函數聲明中橡淆,參數的名稱并不重要,只有參數的類型是必需的母赵。
- function_name(名稱):這是函數的實際名稱逸爵。函數名和參數列表一起構成函數簽名
- return_type(返回類型):一個函數可以返回一個值。它是函數返回的值的數據類型凹嘲。有些函數執(zhí)行所需的操作而不返回值時师倔,return_type是關鍵字void
- parameter(參數):參數就像是占位符(函數可能不包含參數)。當函數被調用時周蹭,你向參數傳遞一個值趋艘,這個值被稱為實際參數。參數列表包括函數參數的類型凶朗、順序瓷胧、數量。如果函數要使用參數棚愤,則必須聲明接受參數值的變量搓萧,這些變量稱為函數的形式參數。形式參數就像函數內的的其他局部變量宛畦,在進入函數時被創(chuàng)建瘸洛,退出函數時被銷毀
- body of the function(函數主體):函數主體包含一組定義函數執(zhí)行任務的語句
- 函數的定義提供函數的實際主體,定義函數有兩種方式:
- 聲明和實現一起
int add(int a,int b){ int sum = a + b; return sum; }
- 先聲明刃永,后實現
int minus(int a,int b);
- 調用函數:通過調用函數的函數名
- 當程序調用函數時货矮,程序控制權會轉移給被調用的函數
- 被調用的函數執(zhí)行已定義的任務,當函數的返回語句被執(zhí)行或到達函數的結束括號時斯够,會把程序控制權交還給主程序
add(1,2){ int result = add(3,3); return 0; }
- 函數的應用
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> /*產生一個隨機數 返回值:int 函數名:generateNumber 參數:min max */ int generateNumber(int min,int max); //產生4個隨機數 保存到數組中 void initArray(int array[],int count); //判斷數組中是否包含一個數字 bool isNumberExist(int array[],int temp,int num); //輸出數組 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++){ //獲取隨機數 int temp = generateNumber(1,9); //判斷當前數組里面是否存在 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"); }
殺人小游戲實戰(zhàn)
#include <stdio.h> #define KILLED 0 int main(){ int num[50] = {};//保存每個人的編號 int count;//保存輸入的人數 int killnum;//被殺的人的編號 printf("請輸入參與人數:"); scanf("%d",&count); //開始編號 for(int i = 0;i < count;i++){ num[i] = i + 1; } printf("請輸入殺人的編號:"); scanf("%d",&killnum); //開始游戲 int current = 0;//記錄當前報數的位置 int totalkilled = 0;//記錄當前死亡人數 for(int i = 0;i < count;i++){ //i指向的這個人開始報數 if(num[i] != KILLED){ current++; } //判斷當前編號是不是死亡編號 if(current == killnum){ printf("死忙編號%d\n",num[i]); num[i] = KILLED;//殺掉 current = 0;//還原 totalkilled++; //當還剩一個的時候就退出循環(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; }
猜數字小游戲實戰(zhàn)
游戲規(guī)則:電腦自動產生四個不重復的在1-9之間的隨機數囚玫,接著對產生的隨機數按從小到大的順序排好喧锦,玩家對這四個數進行猜測并輸入電腦。如果猜測的數字的位置和數值都正確提示A抓督,如果猜測的數字的數值正確而位置錯誤提示B燃少。例如:猜測的數字中,如果四個數字全部猜對則提示4A铃在,如果一個數字的數值和位置都正確而有三個數字的數值正確位置錯誤則提示1A3B
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int org[4] = {};//保存隨機數 int input[4] = {};//保存用戶輸入 int aCount = 0; int bCount = 0; //產生隨機數 srand(time(NULL));//播種子 for(int i = 0;i < 4;i++){ //產生一個隨機數 int temp = rand()%9 + 1; if(i == 0){ //第一個數直接保存 org[i] = temp; }else{ //判斷之前這個數是否存在 int j = 0; for(;j < i;j++){ if(temp == org[j]){ //重復了 break; } } //判斷for循環(huán)怎么出來的 if(i == j){ //不重復 保存 org[i] = temp; }else{ //重復了 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("請輸入猜測的數字:"); 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]) { //數字存在 判斷位置 if (i == j){ aCount++; }else{ bCount++; } } } } //提示用戶結果 printf("%dA%dB\n", aCount, bCount); //判斷是否正確 if( aCount == 4){ printf("全對!!!!\n"); break; }else{ aCount = 0; bCount = 0; } } return 0; }