C語(yǔ)言基礎(chǔ)(三)

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

define的使用

  1. define可以為類型定義別名
#define INT int
  1. define可以為數(shù)值定義別名,在為數(shù)值定義別名時(shí),可以達(dá)到定義一個(gè)常量的效果
#define KILLED 0 //宏定義(取別名)
  1. 使用#define的好處:
  • 增強(qiáng)閱讀性:加強(qiáng)了代碼的可讀性
  • 可操作性:便于代碼的修改。當(dāng)多出使用#define定義的別名,而別名對(duì)應(yīng)值需要修改時(shí),可直接在#define處快速修改

冒泡排序

  1. 原理:依次從頭開始將第一個(gè)數(shù)和下一個(gè)數(shù)進(jìn)行比較,大的沉底,通過(guò)一次循環(huán)的到一個(gè)最大的數(shù),重復(fù)該操作直到排序結(jié)束
  2. 實(shí)現(xiàn)方式:每次遍歷整個(gè)數(shù)組,找到最大的一個(gè)數(shù)沉底。如果數(shù)組有N個(gè)元素,第一次需要遍歷N-1次(沉第一個(gè)數(shù)據(jù)),第二次需要遍歷N-2次(沉第二個(gè)數(shù)據(jù))
    ......總共需要比較N-1次
  3. 代碼如何實(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;
}

選擇排序

  1. 原理:先默認(rèn)一個(gè)數(shù)是最小的,依次和其他的數(shù)進(jìn)行比較,通過(guò)交換位置讓該值始終保持最小。這樣每一次循環(huán)都會(huì)得到一個(gè)最小的值,重復(fù)該操作直到排序結(jié)束
  2. 代碼如何實(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;
}

插入排序

  1. 原理:對(duì)于未排序數(shù)據(jù),通過(guò)構(gòu)建有序序列在已排序序列中從后向前掃描,找到相應(yīng)的位置并插入
  2. 代碼如何實(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)用

  1. 函數(shù):一組一起執(zhí)行一個(gè)任務(wù)的語(yǔ)句(函數(shù)就是代碼塊,一個(gè)功能對(duì)應(yīng)一個(gè)函數(shù));每個(gè)C程序都至少有一個(gè)函數(shù),即主函數(shù)main()
  2. 函數(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ǔ)句
  1. 函數(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);
  1. 調(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; } 
  1. 函數(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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容