學習內容
全局變量與局部變量
switch語句
for循環(huán)
while循環(huán)
Break與Continue關鍵字
printf與scanf相關
數(shù)組
rand() 與 srand()函數(shù)
循環(huán)訓練demon之ATM
循環(huán)訓練demon之記數(shù)字
數(shù)組訓練之不同隨機數(shù)
1.全局變量與局部變量
因為變量作用域的不同,分為了局部變量與全局變量
全局變量
在所有函數(shù)外部定義的變量
作用域是從聲明時刻開始,到程序結束局部變量
函數(shù)內部定義的變量
作用域僅限于函數(shù)內部, 離開該函數(shù)后就是無效的,再使用就會報錯
- 在同一源文件中,允許全局變量和局部變量同名,在局部變量作用域內,同名的全局變量不起作用
- 允許在不同的函數(shù)中使用相同的變量名,他們代表不同變量
- 當全局變量與局部變量重名的時候,起作用的是局部變量,全局變量被屏蔽掉
- 局部變量不能賦值為同名全局變量的值
#include <stdio.h> int a = 3;//全局變量 int main(){ int a = 4;//局部變量 printf("a = %d",a); return 0; } 輸出: a = 4
2.switch語句
一個變量有多種值的情況下,不同值對應的情況不同,根據(jù)不同的值執(zhí)行不同的語句
switch(表達式){ case 常量表達式1: 語句 1; case 常量表達式2: 語句 2; ...... case 常量表達式n: 語句 n; default: 語句 n+1; }
- 表達式必須是一個常量(int,char類型等)或者枚舉類型
- 表達式與常量表達式必須都是相同的數(shù)據(jù)類型
- 當表達式的值等于某個常量表達式的值之后,執(zhí)行該表達式之后的語句
- 當語句中出現(xiàn) break 的時候,語句中斷,并跳出 switch
- 如果 case 語句不包含 break,控制流將會繼續(xù)后續(xù)的 case,直到遇到 break 為止
- 一個 switch 語句可以有一個可選的 default case,出現(xiàn)在 switch 的結尾
//通過輸入1-3來判斷輸入的結果 int main(){ int a = 0; printf("請輸入一個數(shù)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; } 輸出: 請輸入一個數(shù)1-3:3 你輸入的是3
3.for循環(huán)
for( init ; condition ; increment ){ 語句 // init : 循環(huán)變量賦初值(表達式1) //condion : 循環(huán)條件(表達式2) //increment : 循環(huán)變量增值(表達式3) }
- 循環(huán)控制變量的定義和初始化只執(zhí)行一次
- 表達式1、表達式2和表達式3之間是用分號
;
隔開的- for(表達式1;表達式2;表達式3)的后面不要加(
;
)分號- for 循環(huán)的循環(huán)條件(condition)是決定循環(huán)的次數(shù)
- for( ; ; )與while(1) 等價,都是死循環(huán),不停的執(zhí)行語句
int main(){ //輸出1-10 之間的整數(shù) for(int i = 1; i <=10; i++){ printf("i = %d\n", i); } //輸出不停輸出1-10之間的整數(shù) for(int i = 1; i <= 10; i++){ printf("i = %d\n", i); if(i == 10){ i = 0; } } //死循環(huán) for(; ;) { } return 0; } 輸出: 第一個循環(huán)輸出 i = 1 到 i =10; 第二個循環(huán)持續(xù)輸出 i = 1 到 i =10 ; 第三個循環(huán)死循環(huán),一直加載,從未停止;
4.while循環(huán)
while(表達式){ 語句塊 } //表達式:循環(huán)條件 //語句塊:循環(huán)體
- 先計算“表達式”的值,當值為真時, 執(zhí)行“語句塊”
- 執(zhí)行完“語句塊”,再次計算表達式的值,如果為真,繼續(xù)執(zhí)行“語句塊”
- 重復執(zhí)行這個過程,直到表達式的值為假,就退出循環(huán),執(zhí)行 while 語句后面的代碼
//使用while循環(huán)打印1-100的和 int main(){ int i=1;//控制循環(huán)條件 int sum=0;//總和 while(i<=100){ sum+=i; i++; } printf("sum = %d\n",sum); return 0; } 輸出: sum = 5050
5.Break與Continue關鍵字
Break
在 switch 語句,當遇到 break 時,不再執(zhí)行 switch 中的任何語句
在 while,for 循環(huán)當中,當遇到 break 時,會終止循環(huán)而執(zhí)行整個循環(huán)語句后面的代碼
Continue
跳過循環(huán)體中剩余的語句而強制進入下一次循環(huán) (只用于 while、for 循環(huán)語句當中)
6.printf與scanf相關
緩沖區(qū):輸入輸出流
printf
向終端輸出字符串
先將字符串內容輸入到緩沖區(qū),之后再依次輸出緩沖區(qū)內容printf
scanf
接收終端的輸入
在緩沖區(qū)里讀數(shù)據(jù),當緩沖區(qū)里有對應類型數(shù)據(jù),就從緩沖區(qū)里面取數(shù)據(jù)
如果沒有對應類型數(shù)據(jù),就等待用戶輸入數(shù)據(jù)scanfgetchar(): 從緩沖區(qū)讀取一個字符
#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 的地址里面,此時緩沖區(qū)還剩下\n
輸入 B,按下回車之后,此時緩沖區(qū)里面為\nB\n
getchar()從緩沖區(qū)里面拿走一個\n,緩沖里還剩下B\n
之后取出 B 放到 b 的地址里,此時緩沖區(qū)還剩下\n
因為緩沖區(qū)里面有字符\n
,scanf就將緩沖里的內容放到 c 的地址里
所以當我們輸入A,B之后,就直接輸出了結果
7.數(shù)組
數(shù)組:用于儲存多個相同類型數(shù)據(jù)的集合
數(shù)組相關
- 能夠存儲數(shù)據(jù) 就必須要有內存
- 如何定義一個數(shù)值的同時為他分配內存
- 數(shù)組定義時必須明確知道數(shù)組的大小
- 數(shù)組名就是數(shù)組的首地址
聲明數(shù)組
在C 語言中,聲明一個數(shù)組,需要指定元素的類型和元素的數(shù)量
//數(shù)組聲明格式 type arrayName [arraySize]; //arrayName:數(shù)組名字 //[]:數(shù)組標識 //type:數(shù)組存儲類型 //arraySize:數(shù)組大小
初始化數(shù)組
- C 語言當中,可以逐個初始化數(shù)組,也可以使用一個初始化語句。大括號 { } 之間的值的數(shù)目不能大于我們在數(shù)組聲明時在方括號 [ ] 中指定的元素數(shù)目。
int a[4] = {2,45,21,45};
- 如果您省略掉了數(shù)組的大小,數(shù)組的大小則為初始化時元素的個數(shù)。
int a[] = {2,3,564,7};
- 在定義時期明確指定數(shù)組的大小
int temp[5];
數(shù)組元素賦值
a[3] = 56; //將數(shù)組第4個位置的值賦為56
8.rand() 與 srand()函數(shù)
rand()函數(shù)
函數(shù)頭文件:stdlib.h
函數(shù)定義:int rand(void)
函數(shù)功能:產生一個隨機數(shù)
返回值: 返回0至RAND_MAX之間的隨機整數(shù)值
srand()函數(shù)
函數(shù)頭文件:stdlib.h
函數(shù)定義:void srand(unsigned int seed)
函數(shù)功能:設置隨機數(shù)種子
函數(shù)說明:通常可以用getpid()(獲取當前進程的進程識別碼)或者time(NULL)(獲取當前系統(tǒng)的時間信息)來充當種子,保持每次運行時種子是不一樣的#include <stdio.h> #include <time.h> #include <stdlib.h> int main(){ for(int i = 0;i < 5;i++){ //產生1-10以內的數(shù)字 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.循環(huán)訓練demon之ATM
#include <stdio.h> int main(){ int old = 123;//原始密碼 int input;//輸入密碼 int wrongTime = 3; //錯誤次數(shù) printf("**********************\n"); printf(" 歡迎使用建設銀行系統(tǒng)\n"); printf("**********************\n"); printf("請輸入密碼:"); for(int i = 1;i <= wrongTime; i++){ scanf("%d", &input); //判斷密碼 if(input == old){ //密碼正確 break; } if(i == wrongTime){ printf("錯誤次數(shù)過多!\n"); return 1; } //密碼不正確 printf("密碼不正確,請重新輸入密碼:"); } int choice;//接收用戶選擇 char goon;//是否繼續(xù) 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; } //提示是否繼續(xù) for(;1<2;){ printf("是否繼續(xù)(y/n):"); getchar(); scanf("%c", &goon); if(goon == 'y'){ break; } if (goon == 'n'){ exit(EXIT_SUCCESS); } printf("輸入無效 "); } } return 0; }
10.循環(huán)訓練demon之記數(shù)字
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> int main(){ int count = 3;//記錄每次生成多少個隨機數(shù) while(1){ unsigned int seed = time(NULL); //設置產生種子的時間固定 //設置隨機數(shù)的種子 srand(seed); for(int i = 0; i < count; i++){ //生成一個隨機數(shù) 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); //獲取對應的生成的隨機數(shù) int old = rand() % 9 + 1; //比較輸入的和隨機數(shù)是否相同 if (temp != old){ printf("錯誤 退出!\n"); exit(EXIT_SUCCESS); } } printf("正確!\n"); //增加產生數(shù)字的個數(shù) count++; } return 0; }
11.數(shù)組訓練之不同隨機數(shù)
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int array[4] = {}; srand(time(NULL));//初始化隨機種子 for (int i = 0; i < 4; i++){ //產生一個隨機數(shù) int temp = rand() % 4; if (i == 0){//第一個隨機數(shù) 直接保存到數(shù)組 array[i] = temp; }else{ //判斷前面是否已經(jīng)存在了 int j = 0; for(; j <i; j++){ //比較j對應的值和temp是否相同 if(array[j] == temp){ //重復了 打印重復了的數(shù)字 printf("重復了:%d\n",temp); break; } } //判斷是怎么出來的 if (j == i){ //將i前面的比較一遍都沒發(fā)現(xiàn)重復的 //保存temp值 array[i] = temp; }else{ //重復了 //重新回到當前這一次 i--; } } } //輸出 for (int i = 0; i< 4; i++){ printf("%d ", array[i]); } return 0; }