重溫c語言之,7天開整,就是隨便的寫寫,第六天

我是一个小笨蛋發表於2024-11-05

一:字串相比較

  題目:編寫程式碼實現,模擬使用者登入情景,並且只能登入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 }

  這裡我才知道這樣,內迴圈全部完整的執行以便才能算是,計算出是否完全是素數

注:現在已老實,求放過,隨心所感筆記,就是隨便寫寫

相關文章