一:字串相比較
題目:編寫程式碼實現,模擬使用者登入情景,並且只能登入3次。(只允許輸入3次密碼,密碼正確則提示輸入成功,如果三次都輸入錯誤,則退出程式)
這裡就是用到了strcmp這個函式,其實這個函式是讓兩個字串同時從左到右轉換成ASCLL碼,之後兩個字元,前面的減去後面的,如果全部減完為0,
那麼證明這兩個字串是相同的。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char password[100]; 6 int i = 0; 7 for (i = 0; i < 3; i++) 8 { 9 printf("請輸入密碼:>"); 10 scanf("%s", password); 11 // 假設密碼是:abcd 12 if ((strcmp(password, "abcd")) == 0) // 這裡是字串的函式,用來比較兩個函式,如果比較的兩個字串相等,就返回0 13 { 14 printf("密碼輸入正確。"); 15 break; 16 } 17 else 18 { 19 printf("密碼輸入錯誤,請再次輸入。"); 20 } 21 } 22 if (i == 3) 23 { 24 printf("三次密碼均輸入錯誤,退出程式"); 25 } 26 27 return 0; 28 }
二:指標變數的大小
指標變數的大小是根據作業系統多少位決定的!!!
直接看程式碼
1 #include <stdio.h> 2 3 void fun(int *a) 4 { 5 printf("%zu\n", sizeof(a)); // 這裡計算的是指標變數,指標變數是根據系統來分配的 6 // X86是4-----32位,8位一個位元組,所以32/8=4 7 // X64是8-----64位,8位一個位元組,所以64/8=8,我的電腦是64位的,所以,就是8 8 } 9 10 int main() 11 { 12 int a[10] = {0}; 13 printf("%zu\n", sizeof(a)); 14 printf("%zu\n", sizeof(a[0])); 15 fun(a); 16 return 0; 17 }
結果就是:
40
4
8
三:rand函式
rand()函式是c語言裡面產生隨機變數的函式,但是一直只使用這個的話,產生的隨機數的結果都是一樣的
所以怎麼解決這個問題呢?
這裡變用到了srand()函式,設定隨機數生成器種子的函式srand(),會隨機生成種子,用這個函式會產生不同的rand()函式序列,但是就是跟二維矩陣差不多的意思,這個函式也有問題,就是生成的種子也會一樣,所以怎麼解決生成隨機數種子一樣的問題呢?
便用到了這個答案來解決:時間戳----time()函式,這個函式就是會隨著時間不斷地變化,很好的解決了srand()隨機產生種子的問題
下面就是一個例子:
題目:做一個小遊戲--猜大小。電腦隨機出一個隨機數(0-100),選擇猜大小
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 void menu() 6 { 7 printf("***********************************\n"); 8 printf("******* 1.play game ********\n"); 9 printf("******* 0.exit ********\n"); 10 printf("***********************************\n"); 11 printf("請選擇輸入的數字:"); 12 } 13 14 void game() 15 { 16 // 生成1~100的隨機數 17 // 這裡用到了時間戳----配上標頭檔案:time.h 18 19 int num = 0; 20 int ret = rand() % 100 + 1;//這裡 21 printf("這次的隨機數是:%d\n", ret); 22 printf("請輸入1~100之前的數字.\n"); 23 24 while (1) 25 { 26 scanf("%d", &num); 27 if (num > ret) 28 { 29 printf("猜大了!\n"); 30 } 31 else if (num < ret) 32 { 33 printf("猜小了!\n"); 34 } 35 else 36 { 37 printf("恭喜你才對了!\n"); 38 break; 39 } 40 } 41 } 42 43 int main() 44 { 45 46 int num = 0; 47 srand((unsigned int)time(NULL)); 48 /* 49 srand()函式的返回值是:unsigend int 型別,而time()時間戳函式的返回型別是time_t型別,所以需要進行強制轉換 50 time()這裡面的指標變數是獲取的時間,但是也可以設定沒有,而指標變數的沒有------NULL 51 */ 52 do 53 { 54 menu(); 55 scanf("%d", &num); 56 switch (num) 57 { 58 case 0: 59 printf("退出遊戲!\n"); 60 break; 61 case 1: 62 game(); // 猜數字的邏輯 63 break; 64 default: 65 printf("輸入錯誤,請重新選擇。\n"); 66 break; 67 } 68 } while (num != 0); 69 70 return 0; 71 }
還有就是為什麼不把這串程式碼放到game函式里面,srand((unsigned int)time(NULL));
原因有兩點:一:如果你將這行程式碼放在game()函式里面,意味著每次呼叫game()函式時,都會重新呼叫srand()函式來初始化種子,那麼生成的隨機數種子可能會重複,因為時 間戳可能會是一樣的
二:浪費資源,讓系統執行變慢
四:goto函式
這個函式不能跨越函式進行使用,比如在main裡面使用goto()函式,如果其外部有一個自己命名的函式,之後執行goto()函式,就跳不過去
這個函式主要運用場景:多層迴圈巢狀,跳不出來,便可以用goto()函式來進行break,從而直接免除死迴圈的危險
例如:
1 #include <stdio.h> 2 3 int main() { 4 int i, j; 5 int found = 0; // 用於標記是否找到特定條件,以便退出迴圈 6 7 // 外層迴圈 8 for (i = 0; i < 5; ++i) { 9 // 內層迴圈 10 for (j = 0; j < 5; ++j) { 11 if (i * j > 10) { 12 found = 1; // 找到特定條件 13 goto end_loops; // 使用goto退出迴圈 14 } 15 } 16 } 17 18 end_loops: 19 if (found) { 20 printf("特定條件滿足,退出迴圈。\n"); 21 } else { 22 printf("迴圈正常結束。\n"); 23 } 24 25 return 0; 26 }
五: 函式
形參---實參
先看程式碼
1 #include <stdio.h> 2 3 void swap(int num1, int num2) 4 { 5 int mid = 0; 6 mid = num1; 7 num1 = num2; 8 num2 = mid; 9 } 10 11 // 當實參傳遞給形參時,形參是實參的一份臨時複製 12 // 對形參的修改不會影響到實參 13 14 int main() 15 { 16 // 交換兩個整數 17 int num1 = 0; 18 int num2 = 0; 19 scanf("%d %d", &num1, &num2); 20 printf("%d %d\n", num1, num2); 21 swap(num1, num2); 22 printf("%d %d\n", num1, num2); 23 return 0; 24 }
結果:(假設輸入:20 45)
20 45
20 45--------值傳遞
為什麼都一樣呢,因為,在main函式里面,變數num1和num2建立了屬於他們兩個單獨的地址,當程式執行到swap函式()的時候,程式給這個swap()函式內部的num1和num2變數重新整了一份新的空間來存放資料,所以這個swap()函式內部空間再怎麼變化,都與主函式main()函式無關,就像我在程式碼裡面所說的一樣,實參傳遞給形參的時候,形參是實參的一份臨時複製,形參的改變不會影響到實參
那怎麼改變使其影響到呢?
這裡便運用到了指標變數,利用指標變數傳遞地址,來改變原本值的變化,直接看程式碼
1 #include<stdio.h> 14 void swap(int *pn1, int *pn2) 15 { 16 int mid = *pn1; 17 *pn1 = *pn2; 18 *pn2 = mid; 19 } 20 21 int main() 22 { 23 int num1 = 0; 24 int num2 = 0; 25 scanf("%d %d", &num1, &num2); 26 printf("%d %d\n", num1, num2); 27 swap(&num1, &num2); 28 printf("%d %d\n", num1, num2); 29 return 0; 30 }
這裡的結果就是:(輸與上面一樣:20 45)
20 45
45 20------地址傳遞
六:素數
題目:列印100~200之間的素數
(先講一下什麼是素數:除了1與其本身,不能被其他數整除的整數叫素數,例如:2,3,5,7,11等等)
直接上程式碼:
1 #include <stdio.h> 2 int main() 3 { 4 int count = 0; 5 for (int i = 100; i < 200; i++) 6 { 7 int flag = 0; 8 for (int j = 2; j < i; j++) 9 { 10 if (i % j == 0) 11 { 12 flag = 1; 13 break; 14 } 15 else 16 { 17 printf("%d ", i); 18 count++; 19 break; 20 } 21 22 } 23 printf("count=%d\n", count); 24 25 return 0; 26 }
我這裡就是出現了一個明顯的錯誤,我當時沒有想到,後來才明白的,這個是內部迴圈每次都會除,當一開始的時候,不能被整除的話,可能直接就退出迴圈了,就比如105,這個就不是素數,因為一開始不能被2整除,但是一眼就可以看出來,105%5=0,這個是我一開始沒有想到的,後來借鑑了csdn,知道了整一個標誌位,直接看標誌位來確認這一整個迴圈是否全部完成,最終的結果來看是否是素數,直接上程式碼
1 // 題目:列印100~200之間的素數(素數,除了1和它本身不能被其他數整除的數字,例如2、3、5、7等等) 2 #include <stdio.h> 3 int main() 4 { 5 int count = 0; 6 for (int i = 100; i < 200; i++) 7 { 8 int flag = 0; 9 for (int j = 2; j < i; j++) 10 { 11 if (i % j == 0) 12 { 13 flag = 1; 14 break; 15 } 16 } 17 if (flag == 0) 18 { 19 printf("%d ", i); 20 count++; 21 } 22 } 23 printf("count=%d\n", count); 24 25 return 0; 26 }
這裡我才知道這樣,內迴圈全部完整的執行以便才能算是,計算出是否完全是素數
注:現在已老實,求放過,隨心所感筆記,就是隨便寫寫