C語言基礎(三)

目的:掌握用C語言編程的基本技能
內容:1. #define的使用
???2. 冒泡排序
???3. 選擇排序
???4. 插入排序
???5. 函數及其應用
???6. 殺人小游戲實戰(zhàn)
???7. 猜數字小游戲實戰(zhàn)

define的使用

  1. define可以為類型定義別名
#define INT int
  1. define可以為數值定義別名尘应,在為數值定義別名時挠唆,可以達到定義一個常量的效果
#define KILLED 0 //宏定義(取別名)
  1. 使用#define的好處:
  • 增強閱讀性:加強了代碼的可讀性
  • 可操作性:便于代碼的修改瘫絮。當多出使用#define定義的別名,而別名對應值需要修改時船惨,可直接在#define處快速修改

冒泡排序

  1. 原理:依次從頭開始將第一個數和下一個數進行比較,大的沉底缕陕,通過一次循環(huán)的到一個最大的數粱锐,重復該操作直到排序結束
  2. 實現方式:每次遍歷整個數組,找到最大的一個數沉底扛邑。如果數組有N個元素怜浅,第一次需要遍歷N-1次(沉第一個數據),第二次需要遍歷N-2次(沉第二個數據)
    ......總共需要比較N-1次
  3. 代碼如何實現:兩層循環(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;
}

選擇排序

  1. 原理:先默認一個數是最小的跨琳,依次和其他的數進行比較,通過交換位置讓該值始終保持最小桐罕。這樣每一次循環(huán)都會得到一個最小的值脉让,重復該操作直到排序結束
  2. 代碼如何實現:兩層循環(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;
}

插入排序

  1. 原理:對于未排序數據伟恶,通過構建有序序列在已排序序列中從后向前掃描碴开,找到相應的位置并插入
  2. 代碼如何實現:兩層循環(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;
}

函數及其應用

  1. 函數:一組一起執(zhí)行一個任務的語句(函數就是代碼塊潦牛,一個功能對應一個函數);每個C程序都至少有一個函數挡育,即主函數main()
  2. 函數聲明:告訴編譯器函數的名稱巴碗,返回類型和參數,而函數的實際主體可以單獨定義即寒。在函數聲明中橡淆,參數的名稱并不重要,只有參數的類型是必需的母赵。
  • function_name(名稱):這是函數的實際名稱逸爵。函數名和參數列表一起構成函數簽名
  • return_type(返回類型):一個函數可以返回一個值。它是函數返回的值的數據類型凹嘲。有些函數執(zhí)行所需的操作而不返回值時师倔,return_type是關鍵字void
  • parameter(參數):參數就像是占位符(函數可能不包含參數)。當函數被調用時周蹭,你向參數傳遞一個值趋艘,這個值被稱為實際參數。參數列表包括函數參數的類型凶朗、順序瓷胧、數量。如果函數要使用參數棚愤,則必須聲明接受參數值的變量搓萧,這些變量稱為函數的形式參數。形式參數就像函數內的的其他局部變量宛畦,在進入函數時被創(chuàng)建瘸洛,退出函數時被銷毀
  • body of the function(函數主體):函數主體包含一組定義函數執(zhí)行任務的語句
  1. 函數的定義提供函數的實際主體,定義函數有兩種方式:
  • 聲明和實現一起
int add(int a,int b){
   int sum = a + b;
   return sum;
} 
  • 先聲明刃永,后實現
int minus(int a,int b);
  1. 調用函數:通過調用函數的函數名
  • 當程序調用函數時货矮,程序控制權會轉移給被調用的函數
  • 被調用的函數執(zhí)行已定義的任務,當函數的返回語句被執(zhí)行或到達函數的結束括號時斯够,會把程序控制權交還給主程序
add(1,2){
  int result = add(3,3);
  return 0; } 
  1. 函數的應用
#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;
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末阵具,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子定铜,更是在濱河造成了極大的恐慌阳液,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揣炕,死亡現場離奇詭異帘皿,居然都是意外死亡,警方通過查閱死者的電腦和手機畸陡,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門鹰溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丁恭,你說我怎么就攤上這事曹动。” “怎么了牲览?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵墓陈,是天一觀的道長。 經常有香客問我竭恬,道長跛蛋,這世上最難降的妖魔是什么熬的? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任痊硕,我火速辦了婚禮,結果婚禮上押框,老公的妹妹穿的比我還像新娘岔绸。我一直安慰自己,他們只是感情好橡伞,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布盒揉。 她就那樣靜靜地躺著,像睡著了一般兑徘。 火紅的嫁衣襯著肌膚如雪刚盈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天挂脑,我揣著相機與錄音藕漱,去河邊找鬼欲侮。 笑死,一個胖子當著我的面吹牛肋联,可吹牛的內容都是我干的威蕉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼橄仍,長吁一口氣:“原來是場噩夢啊……” “哼韧涨!你這毒婦竟也來了?” 一聲冷哼從身側響起侮繁,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤虑粥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宪哩,有當地人在樹林里發(fā)現了一具尸體舀奶,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年斋射,在試婚紗的時候發(fā)現自己被綠了育勺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡罗岖,死狀恐怖涧至,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情桑包,我是刑警寧澤南蓬,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站哑了,受9級特大地震影響赘方,放射性物質發(fā)生泄漏。R本人自食惡果不足惜弱左,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一窄陡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆火,春花似錦跳夭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模狭,卻和暖如春颈抚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚼鹉。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工贩汉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留九妈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓雾鬼,卻偏偏與公主長得像萌朱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子策菜,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容