C語言——第二次筆記

學習內容

  • 全局變量與局部變量

  • switch語句

  • for循環

  • while循環

  • Break與Continue關鍵字

  • printf與scanf相關

  • 數組

  • rand() 與 srand()函數

  • 循環訓練demon之ATM

  • 循環訓練demon之記數字

  • 數組訓練之不同隨機數

1.全局變量與局部變量

因為變量作用域的不同,分為了局部變量與全局變量

全局變量

在所有函數外部定義的變量
作用域是從聲明時刻開始,到程序結束

局部變量

函數內部定義的變量
作用域僅限于函數內部, 離開該函數后就是無效的,再使用就會報錯

  • 在同一源文件中,允許全局變量和局部變量同名,在局部變量作用域內,同名的全局變量不起作用
  • 允許在不同的函數中使用相同的變量名,他們代表不同變量
  • 當全局變量與局部變量重名的時候,起作用的是局部變量,全局變量被屏蔽掉
  • 局部變量不能賦值為同名全局變量的值
#include <stdio.h>
int a = 3;//全局變量
int main(){
  int a = 4;//局部變量 
  printf("a = %d",a);
 return 0;
}

輸出:
  a = 4

2.switch語句

一個變量有多種值的情況下,不同值對應的情況不同,根據不同的值執行不同的語句

switch(表達式){
    case 常量表達式1:
                 語句 1;
    case 常量表達式2:
                 語句 2;
         ......

    case 常量表達式n: 
                 語句 n;
    default: 
                 語句 n+1;
}
  • 表達式必須是一個常量(int,char類型等)或者枚舉類型
  • 表達式與常量表達式必須都是相同的數據類型
  • 當表達式的值等于某個常量表達式的值之后,執行該表達式之后的語句
  • 當語句中出現 break 的時候,語句中斷,并跳出 switch
  • 如果 case 語句不包含 break,控制流將會繼續后續的 case,直到遇到 break 為止
  • 一個 switch 語句可以有一個可選的 default case,出現在 switch 的結尾
//通過輸入1-3來判斷輸入的結果
int main(){
  int a = 0;
  printf("請輸入一個數1-3:");
  scanf("%d", &a);    
  switch(a){
      case 1:
          printf("你輸入的是1\n");
          break;
      case 2:
          printf("你輸入的是2\n");
          break;
      default:
          printf("你輸入的是3\n");
          break;
  }
  return 0;
}

輸出:
      請輸入一個數1-3:3
      你輸入的是3

3.for循環

  for( init ; condition ; increment ){
               語句
  //   init  : 循環變量賦初值(表達式1)
  //condion  : 循環條件(表達式2)
 //increment : 循環變量增值(表達式3)
   }
  • 循環控制變量的定義和初始化只執行一次
  • 表達式1、表達式2和表達式3之間是用分號 ; 隔開的
  • for(表達式1;表達式2;表達式3)的后面不要加(;)分號
  • for 循環的循環條件(condition)是決定循環的次數
  • for( ; ; )與while(1) 等價,都是死循環,不停的執行語句
int main(){
  //輸出1-10 之間的整數
  for(int i = 1; i <=10; i++){
      printf("i = %d\n", i);
  } 
   //輸出不停輸出1-10之間的整數
  for(int i = 1; i <= 10; i++){
      printf("i = %d\n", i);
      if(i == 10){
        i = 0;
      } 
  }
  //死循環
  for(; ;) {  
  }
  return 0;   
}
輸出:
     第一個循環輸出 i = 1 到 i =10;
     第二個循環持續輸出 i = 1 到 i =10 ;
     第三個循環死循環,一直加載,從未停止;

4.while循環

while(表達式){
  語句塊
}
//表達式:循環條件
//語句塊:循環體

  • 先計算“表達式”的值,當值為真時, 執行“語句塊”
  • 執行完“語句塊”,再次計算表達式的值,如果為真,繼續執行“語句塊”
  • 重復執行這個過程,直到表達式的值為假,就退出循環,執行 while 語句后面的代碼
//使用while循環打印1-100的和
int main(){
  int i=1;//控制循環條件
  int sum=0;//總和
   while(i<=100){
       sum+=i;
       i++;
  }
   printf("sum = %d\n",sum);
   return 0;
}

輸出:
   sum = 5050

5.Break與Continue關鍵字

  • Break

在 switch 語句,當遇到 break 時,不再執行 switch 中的任何語句
在 while,for 循環當中,當遇到 break 時,會終止循環而執行整個循環語句后面的代碼

  • Continue

跳過循環體中剩余的語句而強制進入下一次循環 (只用于 while、for 循環語句當中)

6.printf與scanf相關

緩沖區:輸入輸出流

  • printf

向終端輸出字符串
先將字符串內容輸入到緩沖區,之后再依次輸出緩沖區內容

printf
  • scanf

接收終端的輸入
在緩沖區里讀數據,當緩沖區里有對應類型數據,就從緩沖區里面取數據
如果沒有對應類型數據,就等待用戶輸入數據

scanf

getchar(): 從緩沖區讀取一個字符

#include <stdio.h>

int main(){
char a;
printf("請輸入a:"); 
scanf("%c", &a);

char b;
printf("請輸入b:");
getchar();
scanf("%c", &b);

char c; 
printf("請輸入c:");
scanf("%c", &c);

printf("\na=%c b=%c c=%c\n",a,b,c);
return 0;
}

輸出
請輸入a:A
請輸入b:B
請輸入c:
a=a b=b c=

輸入 A ,按下回車之后,緩沖流里面為 A\n
之后取出 A 放到 a 的地址里面,此時緩沖區還剩下 \n
輸入 B,按下回車之后,此時緩沖區里面為 \nB\n
getchar()從緩沖區里面拿走一個\n,緩沖里還剩下 B\n
之后取出 B 放到 b 的地址里,此時緩沖區還剩下 \n
因為緩沖區里面有字符 \n,scanf就將緩沖里的內容放到 c 的地址里
所以當我們輸入A,B之后,就直接輸出了結果

7.數組

數組:用于儲存多個相同類型數據的集合

數組相關
  • 能夠存儲數據 就必須要有內存
  • 如何定義一個數值的同時為他分配內存
  • 數組定義時必須明確知道數組的大小
  • 數組名就是數組的首地址
聲明數組

在C 語言中,聲明一個數組,需要指定元素的類型和元素的數量

//數組聲明格式
type arrayName [arraySize];
//arrayName:數組名字
//[]:數組標識
//type:數組存儲類型
//arraySize:數組大小
初始化數組
  • C 語言當中,可以逐個初始化數組,也可以使用一個初始化語句。大括號 { } 之間的值的數目不能大于我們在數組聲明時在方括號 [ ] 中指定的元素數目。
int a[4] = {2,45,21,45};
  • 如果您省略掉了數組的大小,數組的大小則為初始化時元素的個數。
int a[] = {2,3,564,7};
  • 在定義時期明確指定數組的大小
int temp[5];
數組元素賦值
a[3] = 56;
//將數組第4個位置的值賦為56

8.rand() 與 srand()函數

  • rand()函數

函數頭文件:stdlib.h
函數定義:int rand(void)
函數功能:產生一個隨機數
返回值: 返回0至RAND_MAX之間的隨機整數值

  • srand()函數

函數頭文件:stdlib.h
函數定義:void srand(unsigned int seed)
函數功能:設置隨機數種子
函數說明:通常可以用getpid()(獲取當前進程的進程識別碼)或者time(NULL)(獲取當前系統的時間信息)來充當種子,保持每次運行時種子是不一樣的

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
  for(int i = 0;i < 5;i++){
      //產生1-10以內的數字 
      int temp = rand()%9 + 1;
      printf("%d ",temp);
  }
  printf("\n");
  srand(time(NULL));//播種 
  for(int i = 0;i < 5;i++){
      int temp1 = rand()%9 + 1; 
      printf("%d ",temp1);
  }
return 0;
}

輸出:(第一次結果)
6 9 8 5 9
5 3 1 4 6
輸出:(第二次次結果)
6 9 8 5 9(與第一次相同)
5 2 1 7 2

9.循環訓練demon之ATM

#include <stdio.h>
int main(){ 
  int old = 123;//原始密碼 
  int input;//輸入密碼 
  int wrongTime = 3; //錯誤次數
  
  printf("**********************\n"); 
  printf("  歡迎使用建設銀行系統\n");
  printf("**********************\n");
  
  printf("請輸入密碼:");
  for(int i = 1;i <= wrongTime; i++){
      scanf("%d", &input);
      
      //判斷密碼
      if(input == old){
          //密碼正確
          break;
      } 
      
      if(i == wrongTime){
          printf("錯誤次數過多!\n");
          return 1;
      }
      //密碼不正確
      printf("密碼不正確,請重新輸入密碼:"); 
  } 
  
  int choice;//接收用戶選擇
  char goon;//是否繼續 
  for(; 1 < 2;){
      //主界面 
      printf("*****************************\n");
      printf("1.存款\n");
      printf("2.取款\n");
      printf("3.查詢\n");
      printf("4.更改密碼\n");
      printf("5.退出\n"); 
      printf("*****************************\n");
       
      //提示用戶選擇
      printf("請選擇操作:");
      scanf("%d", &choice);
      
      //判斷操作 
      switch(choice){
          case 1: //存款 
              int temp;//存款金額
              printf("請輸入存款金額:");
              scanf("%d", &temp);
              total += temp;
              printf("存款成功!可用余額為:%d\n",total);
              break;
          case 2: //取款 
              int temp2;//取款金額
              for(;1<2;){
                  printf("輸入取款金額:");
                  scanf("%d", &temp2);
                  if(temp2 > total){
                      printf("余額不足 "); 
                  }else{
                      total -= temp2;
                      printf("取款成功 余額為%d\n",total);
                      break;
                  }
              }
              break;
              printf("當前余額為:%d\n",total);
              break;
          case 4: //更改密碼
              int n1;//第一次輸入的密碼
              int n2;//第二次輸入的密碼
              for(;1<2;){
                  printf("請輸入新密碼:");
                  scanf("%d", &n1);
                  printf("請確認密碼:");
                  scanf("%d", &n2);               
                  if (n1 == n2){
                      printf("密碼設置成功!\n");
                      old = n1;
                      break;
                  } else{
                      printf("兩次輸入不一致!");
                  }
              } 
              break;
          default://退出 
              exit(EXIT_SUCCESS);//成功退出
              break;
      } 
      
      //提示是否繼續
      for(;1<2;){
          printf("是否繼續(y/n):");
          getchar();
          scanf("%c", &goon); 
          if(goon == 'y'){
              break; 
          }
          if (goon == 'n'){
              exit(EXIT_SUCCESS); 
          }
          printf("輸入無效 ");
      }
  }
  return 0;
}

10.循環訓練demon之記數字

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int main(){
  int count = 3;//記錄每次生成多少個隨機數
  while(1){
      unsigned int seed = time(NULL); //設置產生種子的時間固定
      
      //設置隨機數的種子
      srand(seed); 
      for(int i = 0; i < count; i++){
          //生成一個隨機數 
          int temp2 = rand() % 9 + 1;
          printf("%d ",temp2); 
      } 
      printf("\n");
  
      // 延時2s
      Sleep(2000);
  
      //刷新屏幕 
      system("cls");
      int temp;//定義用戶輸入的變量
      printf("請輸入:");
      //重新設種子和之前生成時的種子一樣
      srand(seed); 
      //接收用戶輸入 一個一個接收 
      for(int i = 0; i < count; i++){
          scanf("%d", &temp);
          //獲取對應的生成的隨機數
          int old = rand() % 9 + 1;
          //比較輸入的和隨機數是否相同 
          if (temp != old){
              printf("錯誤 退出!\n");
              exit(EXIT_SUCCESS); 
          } 
      }
      printf("正確!\n"); 
      //增加產生數字的個數 
      count++; 
  }
  return 0;
}

11.數組訓練之不同隨機數

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
int main(){
  int array[4] = {};
  srand(time(NULL));//初始化隨機種子
  for (int i = 0; i < 4; i++){
       //產生一個隨機數
      int temp = rand() % 4;  
      if (i == 0){//第一個隨機數 直接保存到數組 
          array[i] = temp;
      }else{
          //判斷前面是否已經存在了
          int j = 0; 
          for(; j <i; j++){
              //比較j對應的值和temp是否相同 
              if(array[j] == temp){
                  //重復了 打印重復了的數字
                  printf("重復了:%d\n",temp); 
                  break; 
              } 
          }
          //判斷是怎么出來的
          if (j == i){
              //將i前面的比較一遍都沒發現重復的
              //保存temp值
              array[i] = temp; 
          }else{
              //重復了
              //重新回到當前這一次 
              i--; 
          }
      } 
  }
  //輸出 
  for (int i = 0; i< 4; i++){
      printf("%d ", array[i]);
  }
  return 0;
}


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容