C語言 ——— 分支循環語句

目錄

分支循環語句

單分支

多分支

switch 分支語句

牛刀小試

判斷一個數是否是奇數

輸出 1-100之間?的奇數

計算 n 的階乘?

計算 1! + 2! + 3!?... + n!

在一個有序數組中查找具體的某一個數字?

打印 100-200 之間的素數

求兩個整數的最大公約數

getchar函數 和 putchar函數

getchar 函數

putchar 函數

代碼模擬實現用戶創建密碼場景

代碼模擬實現用戶登錄賬號場景,并且只能登錄三次?

猜數字游戲

實現要求

代碼實現

代碼解析

goto 語句

利用 goto語句 寫一個電腦關機程序


分支循環語句

單分支

單 if 語句:

int age = 0;
scanf("&d", &age);if (age >0 && age < 18)printf("未成年\n");

單 if else 語句:

int age = 0;
scanf("&d", &age);if (age >0 && age < 18)printf("未成年\n");
elseprintf("成年\n");

多分支

int age = 0;
scanf("&d", &age);if (age > 0 && age < 18)printf("青少年\n");
else if (age >= 18 && age < 30)printf("青年\n");
else if (age >= 30 && age < 50)printf("中年\n");
else if (age >= 50 && age < 70)printf("中老年\n");
else if (age >= 70 && age < 90)printf("老年\n");
elseprintf("老壽星\n");

注意:當條件判斷語句里是多條語句時,需要用大括號括起來

switch 分支語句

代碼演示:

int day = 0;
scanf("%d", &day);switch (day)
{
case 1:printf("星期一\n");break;
case 2:printf("星期二\n");break;
case 3:printf("星期三\n");break;
case 4:printf("星期四\n");break;
case 5:printf("星期五\n");break;
case 6:printf("星期六\n");break;
case 7:printf("星期七\n");break;
default:printf("輸入錯誤");break;
}return 0;

switch 的括號中只能是整型變量表達式,case 后面只能跟整型常量

每一個 case 下面的代碼執行完成后最好加上 break,否則就會一直往下執行

default 類比 if else 語句中的 else ,當所有 case 都不匹配的時候就會執行 default 下面的代碼


牛刀小試

判斷一個數是否是奇數

代碼演示:

int input = 0;
scanf("%d", &input);if (input % 2 == 1)printf("是奇數\n");
elseprintf("不是奇數\n");

任意一個奇數除以 2 之后的余數都是 1,所以利用 % 取模上 2 判斷余數是否為 1,是 1 就是奇數,否則就不是?

輸出 1-100之間?的奇數

代碼演示(方法1):

for (int i = 1; i <= 100; i++)
{if (i % 2 == 1)printf("%d ", i);
}

同樣是通過 % 取模關鍵字來判斷

代碼演示(方法2):?

for (int i = 1; i <= 100; i+=2)
{printf("%d ", i);
}

在 for 循環的條件中直接控制變量 i 只輸出奇數,這樣就不用 if 判斷?

計算 n 的階乘?

代碼演示:

int n = 0;
scanf("%d", &n);int factorial = 1;for (int i = 1; i <= n; i++)
{factorial = factorial * i;
}printf("%d! = %d\n",n, factorial);

通過循環列舉出 1-n 的值,并把它們的乘積累計到 factorial 變量中,最后?factorial 變量就是 n 的階乘

代碼驗證:

計算 1! + 2! + 3!?... + n!

代碼演示:

int n = 0;
scanf("%d", &n);int factorial = 1;
int sum = 0;for (int i = 1; i <= n; i++)
{factorial = factorial * i;sum = sum + factorial;
}printf("%d\n", sum);

把每個數的階乘累加在一起,就是?1! + 2! + 3!?... + n!

代碼驗證:

在一個有序數組中查找具體的某一個數字?

代碼演示:

int arr[] = { 1,3,4,6,8,9,11,24,33,54,66 };printf("請輸入要查找的數:");
int input = 0;
scanf("%d", &input);int right = sizeof(arr) / sizeof(arr[0]) - 1;
int left = 0;while (left <= right)
{int mid = (right + left) / 2;if (input > arr[mid]){left = mid + 1;}else if (input < arr[mid]){right = mid - 1;}else{printf("找到了,下標是:%d\n", mid);break;}
}if (left > right)
{printf("查找的數不存在\n");
}

此題利用的是二分查找算法,二分查找法的應用需以有序數組為前提,其核心步驟與流程如下:

  1. 初始化與定位:設定數組左右邊界下標leftright,據此計算中間元素下標mid,以獲取數組中間值。
  2. 比較與邊界調整:將待查找元素與中間值進行比較:
    • 若待查找元素大于中間值,則將左邊界left更新為mid + 1,縮小查找范圍至數組右半部分;
    • 若待查找元素小于中間值,則將右邊界right更新為mid - 1,縮小查找范圍至數組左半部分。
  3. 迭代與終止:在left <= right的循環條件下,持續更新mid,并重復比較操作。當找到目標元素時,循環終止;若循環條件不再滿足,即left > right,則表明數組中不存在目標元素,查找結束。

打印 100-200 之間的素數

代碼演示:

int main()
{for (int i = 101; i <= 200; i+=2){int flag = 1;for (int j = 2; j < sqrt(i); j++){if (i % j == 0){flag = 0;break;}}if (flag)printf("%d ", i);}return 0;
}

代碼解析:

素數又稱質數,它的特征是只能被 1 和它本身整除。例如 11,只能被 1 和 11 整除,2 到 10 都無法整除它。 由于偶數除了能被 1 和自身整除外,還能被 2 整除,所以偶數一定不是素數(2 除外,但本題范圍不涉及 2)

若要找出 100 到 200 之間的素數,可先排除偶數,使用 for 循環從 101 開始遍歷,每次遞增 2,以此避免對偶數進行判斷。 判斷一個數是否為素數時,可采用以下方法:在外部 for 循環遍歷每個待判斷的數,對每個數再用一個內部 for 循環來檢查它是否能被其他數整除

以判斷 102 為例,在內部 for 循環中,讓 102 依次對 2 到 100 之間的數取模。若存在一個數取模結果為 0,就表明 102 不是素數;若所有取模結果都不為 0,則 102 是素數。為方便判斷,可定義一個變量 flag 并初始化為 1,若取模結果為 0,就將 flag 賦值為 0 并跳出內部循環。當內部循環結束后,只需判斷 flag 的值,若為 1 則該數是素數,直接打印;若為 0 則不是素數

此外,內部 for 循環的范圍可優化。不需要從 2 遍歷到待判斷的數減 1,只需從 2 遍歷到該數平方根(sqrt 函數用于計算平方根)即可。因為若一個數 x 能寫成 x = m * n 的形式,那么 m 和 n 中至少有一個小于等于 sqrt(x)。這樣能減少不必要的計算,提高效率

求兩個整數的最大公約數

代碼演示:

int main()
{int m = 0;int n = 0;scanf("%d %d", &m, &n);int k = 0;while (k = m % n){m = n;n = k;}printf("%d\n", n);return 0;
}

代碼解析:

要求兩個整數的最大公約數,可以使用輾轉相除法,這種方法高效且原理巧妙。下面詳細解釋其計算過程

以兩個整數?m=24?和?n=18?為例,輾轉相除法的操作步驟如下:

  1. 計算?m?除以?n?的余數,將這個余數賦值給變量?k。在這個例子中,24%18=6,所以?k=6。
  2. 判斷?k?的值是否為?0。如果?k?不為?0,就把?n?的值賦給?m,把?k?的值賦給?n。在本例中,執行這一步后,m?變為?18,n?變為?6。
  3. 重復上述步驟,也就是持續進行?k=m%n?的計算,然后更新?m?和?n?的值(m=n;n=k),直到?k?的值為?0。
  4. 當?k?為?0?時,此時?n?的值就是?m?和?n?的最大公約數

輾轉相除法是一種非常實用的算法,它的核心在于巧妙地利用了余數的性質。每次用較大數除以較小數取余,再用除數和余數繼續這個過程,不斷縮小問題的規模。這樣一來,原本復雜的求最大公約數問題,就通過不斷迭代轉化為一個簡單的問題,避免了對大量可能的公約數進行逐一嘗試,從而顯著提高了計算效率。而且,這種算法邏輯清晰、代碼實現簡單,在實際應用中十分高效?


getchar函數 和 putchar函數

getchar 函數

getchar 函數的作用是從鍵盤上接收一個字符,當接收成功后的返回值是字符的 ASCLII 碼值,接收失敗就會返回 EOF

putchar 函數

putchar 函數的作用是把傳遞的參數打印在屏幕上,比如 putchar('w'); 那么屏幕上就會出現 w 字符

代碼模擬實現用戶創建密碼場景

char password[20] = { 0 };printf("請輸入密碼:");
scanf("%s", password);// 清空緩沖區
while (getchar() != '\n');char input = 0;
printf("請確認密碼(Y/N):");
scanf("%c", &input);if (input == 'Y')printf("確認成功\n");
else if (input == 'N')printf("退出確認\n");
elseprintf("確認失敗\n");return 0;

scanf 函數和 getchar 之類的接收數據函數,并不是從鍵盤上直接接收數據,而是從輸入緩沖區中拿數據,而從鍵盤上輸入的數據沒有被拿之前都是被存放在輸入緩沖區的

而 scanf 函數只會拿 '\n' 或者空格之前的字符,所以要利用 getchar 把緩沖區中多余的字符清理掉

代碼模擬實現用戶登錄賬號場景,并且只能登錄三次?

實現要求:

編寫代碼實現模擬用戶登錄賬號場景,并且只能登錄三次,只允許輸入三次密碼,如果密碼正確則提示登錄成功,如果三次均輸入錯誤,則退出程序

代碼演示:

char password[] = "123456";
char input_password[] = "      ";int chance = 0;while (chance < 3)
{printf("請輸入密碼:");scanf("%s", input_password);if (strcmp(input_password, password) == 0){printf("登錄成功\n");break;}else{printf("密碼錯誤\n");chance++;}
}if (chance == 3)printf("登錄失敗,退出程序\n");return 0;

strcmp?函數的作用是比較兩個字符串的大小關系,其返回值規則如下:

  1. 若返回?0:表示兩個字符串完全相等(每個對應位置的字符都相同)
  2. 若返回正數:表示第一個字符串大于第二個字符串。比較邏輯是從左到右逐個字符對比,直到找到第一個不相同的字符,此時第一個字符串中該位置字符的 ASCII 碼值大于第二個字符串對應位置字符的 ASCII 碼值
  3. 若返回負數:表示第一個字符串小于第二個字符串,原理同上,即第一個不相同字符的 ASCII 碼值小于第二個字符串對應字符的 ASCII 碼值

簡言之,strcmp?通過逐個字符比較 ASCII 碼值來判斷字符串的大小關系,返回值直接體現兩者的大小或相等關系


猜數字游戲

實現要求

編寫一個猜數字游戲程序,讓用戶猜測程序隨機生成的 1 - 100 之間的整數

  1. 開始與退出控制:程序啟動后,提示用戶輸入指令。輸入?1?開始新的一輪猜數字游戲;輸入?0?則直接退出程序;若輸入其他非 0 非 1 的整數,提示用戶重新輸入

  2. 猜數字過程:當用戶輸入?1?開始游戲后,程序隨機生成一個 1 - 100 之間的整數作為目標數字。用戶輸入猜測的數字,程序根據用戶輸入給出相應提示:

    • 若猜測的數字大于目標數字,提示 “猜大了”。
    • 若猜測的數字小于目標數字,提示 “猜小了”。
    • 若猜測的數字等于目標數字,提示 “猜對了”,此輪游戲結束,再次回到開始界面等待用戶輸入指令(1?開始新游戲,0?退出程序等)。
  3. 重復游戲:在一輪游戲結束后,用戶可根據自身意愿,通過輸入?1?繼續開啟新的一輪游戲,或輸入?0?退出程序。

代碼實現

void menu()
{printf("**********************************************\n");printf("*****     1. play            0. nxit     *****\n");printf("**********************************************\n");
}void game()
{printf("\n-----------   猜數字游戲開始   -----------\n");int input = 0;int Random_number = rand() % 100 + 1;while (1){printf("請輸入你猜的數字:");int ret = scanf("%d", &input);if (input > Random_number){printf("猜大了\n");}else if (input < Random_number){printf("猜小了\n");}else{printf("恭喜你,猜中了!!!\n");break;}}printf("-----------   猜數字游戲結束   -----------\n\n");}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("\n請輸入(1 or 0):");scanf("%d", &input);if (input == 1){game();}else if(input == 0){printf("退出游戲\n");}else{printf("輸入錯誤,請重新輸入\n");}} while (input);return 0;
}

代碼解析

代碼 1:srand((unsigned int)time(NULL));

srand?函數用于初始化隨機數生成器的種子。在 C 語言里,若不設定種子,rand?函數每次運行程序時產生的隨機數序列都是相同的

time(NULL)?會返回當前的時間戳,即從特定起始時間到現在所經過的秒數。由于時間是持續變化的,將?time(NULL)?的返回值強制轉換為?unsigned int?類型后作為?srand?函數的參數,就可以讓隨機數生成器的種子在每次運行程序時都不同

這樣,后續調用?rand?函數就能生成不同的隨機數序列,實現真正意義上的 “隨機”

代碼 2:int Random_number = rand() % 100 + 1;

rand?函數用于生成隨機整數。不過,它默認生成的是一個較大范圍的隨機數,且每次運行程序時的隨機數序列依賴于?srand?函數設定的種子。若要生成 1 到 100 之間的隨機整數,可以通過取模運算和加法運算來實現

rand() % 100?會對?rand?函數生成的隨機數取模 100,得到的結果范圍是 0 到 99。在此基礎上再加 1,最終得到的隨機數范圍就是 1 到 100。代碼將這個 1 到 100 之間的隨機數賦值給整型變量?Random_number


goto 語句

goto 語句介紹:

在C語言里,`goto` 語句能讓程序執行流程跳轉到指定的標簽處。使用時,要先定義一個標簽,格式為“標簽名:”,接著就能用 `goto` 標簽名; 來跳轉。不過,濫用 `goto` 會使代碼邏輯混亂、可讀性變差。所以僅在處理深度嵌套跳出等特殊情況時使用

goto 語句可以使用的場景:?

int main()
{for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){for (int k = 0; k < 10; k++){goto error;}}}error:return 0;
}

能直接跳出深度嵌套的情況

利用 goto語句 寫一個電腦關機程序

int main()
{char password[20] = { 0 };system("shutdown -s -t 60");printf("請注意,你的電腦將在1分鐘內關機,如果輸入“我是豬”三個字,就取消關機。\n請輸入:");again:scanf("%s", password);if (strcmp(password, "我是豬") == 0){system("shutdown -a");printf("正確輸入,已取消關機\n");}else{printf("輸入錯誤,請再次輸入:");goto again;}return 0;
}

system("shutdown -s -t 60"); 代碼解釋:

  • system?是 C 語言標準庫?<stdlib.h>?中的函數,它的作用是調用操作系統的命令行接口來執行特定的系統命令。
  • "shutdown -s -t 60"?是傳遞給?system?函數的系統命令字符串。其中,shutdown?是 Windows 操作系統中用于關機、重啟、注銷等操作的命令。
    • -s?表示關機操作,即讓計算機在指定時間后關閉。
    • -t 60?表示設置關機的倒計時時間,-t?是指定時間的參數,60?代表 60 秒。

綜合起來,system("shutdown -s -t 60");?的作用是讓程序調用系統命令,使計算機在 60 秒后自動關機。

system("shutdown -a"); 代碼解釋:

  • 同樣,system?函數調用系統命令行接口。
  • "shutdown -a"?是傳遞給?system?函數的命令字符串。其中,shutdown?是 Windows 系統用于關機等操作的命令,-a?是取消關機操作的參數。

所以,system("shutdown -a");?的作用是調用系統命令來取消之前設置的關機計劃,無論之前設置的是多少時間后關機,執行這行代碼后,關機計劃都會被取消

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76899.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Element UI、Element Plus 里的表單驗證的required必填的屬性不能動態響應?

一 問題背景 想要實現&#xff1a; 新增/修改對話框中(同一個)&#xff0c;修改時“備注”字段非必填&#xff0c;新增時"備注"字段必填 結果發現直接寫不生效-初始化一次性 edit: [{ required: true, message: "請輸入備注", trigger: "blur" }…

秀丸編輯器 使用技巧

參考資料 第II部?知っていると便利な秀丸の機能 検索テキストファイルの16進表示について秀丸エディタヘルプ目次秀丸エディタ&#xff31;&#xff06;&#xff21;集(第9.6版)&#xff08;HTML 形式&#xff09;テンプレート&#xff08;Ver9.43対応版&#xff09; 目錄 零…

【期末復習-考試】軟件質量測試與保考試題庫(選擇題+填空題)

軟件質量測試與保證考試題庫&#xff08;選擇題 填空題&#xff09; 一、軟件測試基礎理論&#xff08;200 題&#xff09; &#xff08;一&#xff09;選擇題&#xff08;100 題&#xff09; 軟件測試的根本目的是&#xff08; 發現軟件中的缺陷&#xff09;A. 證明軟件無…

數據結構與算法學習筆記(Acwing提高課)----動態規劃·數字三角形

數據結構與算法學習筆記----動態規劃數字三角形 author: 明月清了個風 first publish time: 2025.4.23 ps??終于開始提高課的題啦&#xff0c;借的人家的號看&#xff0c;以后給y總補票叭&#xff0c;提高課的題比之前的多很多啊哈哈哈哈&#xff0c;基本上每種題型都對應了…

阿里巴巴安全工程師面試題:BAS

阿里巴巴新發布了針對應屆生的安全工程師招聘崗位&#xff0c;崗位要求&#xff1a; 研究新型前沿攻防技術&#xff0c;驗證正向和防御安全產品能力的有效性&#xff0c;挖掘其規則或引擎漏洞&#xff0c;并利用BAS&#xff08;Breach and Attack Simulation&#xff09;建立自…

【正則表達式】正則表達式使用總結

正則表達式除了匹配普通字符外,還可以匹配特殊字符,這些特殊字符被稱為“元字符”。? 特殊字符(元字符) ?限定符?:用于指定正則表達式中某個組件的出現次數。常見的限定符包括: *:0次或多次 +:1次或多次 ?:0次或1次 {n}:恰好n次…

數據庫對象與權限管理-Oracle數據字典詳解

1. 數據字典概念講解 Oracle數據字典是數據庫的核心組件&#xff0c;它存儲了關于數據庫結構、用戶信息、權限設置和系統性能等重要的元數據信息。這些信息對于數據庫的日常管理和維護至關重要。數據字典在數據庫創建時自動生成&#xff0c;并隨著數據庫的運行不斷更新。 數據…

鏈表系列一>兩數相加

目錄 題目&#xff1a;解析&#xff1a;方法&#xff1a;代碼&#xff1a;鏈表常用技巧&#xff1a; 題目&#xff1a; 鏈接: link 解析&#xff1a; 方法&#xff1a; 代碼&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* …

FreeRTOS深度解析:隊列集(Queue Sets)的原理與應用

FreeRTOS深度解析&#xff1a;隊列集&#xff08;Queue Sets&#xff09;的原理與應用 什么是隊列集&#xff1f; 在FreeRTOS中&#xff0c;隊列集&#xff08;Queue Sets&#xff0c;英文名xQueueSet&#xff09;是一種強大的數據結構&#xff0c;用于高效管理多個隊列。它的…

QT creater和vs2017文件路徑問題

1. \\雙反斜杠&#xff0c;傳統寫法&#xff0c;需轉義 在 C/C 字符串中&#xff0c;\ 具有特殊含義&#xff0c;例如&#xff1a; \n 表示換行 \t 表示制表符 \" 表示雙引號 如果要表示一個真正的反斜杠&#xff0c;必須寫成 \\&#xff0c;否則編譯器會將其解釋為轉…

對流對象的理解

在c里&#xff0c;“流”可以理解為數據傳輸與操作的“介質”。 從輸入輸出角度來看&#xff0c;有輸入流&#xff08;比如cin&#xff09;和輸出流&#xff08;cout&#xff09;。對于輸入流&#xff0c;數據通過它從外部設備&#xff08;例如鍵盤&#xff09;“流入”程序內…

Visium HD多樣本拼片拆分

Visium HD實驗的時候一個捕獲區域內可以包含多個樣本拼片&#xff08;例如多個組織切片或不同樣本的排列&#xff09;是常見的實驗設計&#xff0c;多樣本拼片能夠提升實驗效率&#xff0c;單張玻片處理多個樣本&#xff0c;降低試劑和測序成本&#xff0c;后續分析的時候只需要…

進程(Process)詳解

進程&#xff08;Process&#xff09;詳解 一、基本定義 ?概念? 進程是計算機中程序的一次動態執行實例&#xff0c;包含程序代碼、數據及運行狀態&#xff0c;是操作系統進行資源分配和調度的基本單位?。與靜態的“程序”不同&#xff0c;進程是動態實體&#xff0c;隨程…

畢業論文超清pdf帶標簽導出

Word直接導出的pdf不夠清晰&#xff0c;使用打印導出的pdf又不帶書簽以及目錄跳轉功能這一問題&#xff0c;查閱網上資料使用Adobe DC似乎能夠解決但是下載安裝比較麻煩&#xff0c;于是寫了python程序解決該問題。 解決思路&#xff1a; 使用python腳本對兩個pdf文件進行合并…

NOIP2012提高組.同余方程

目錄 題目算法標簽: 數論, 擴展歐幾里得算法思路代碼 題目 203. 同余方程 算法標簽: 數論, 擴展歐幾里得算法 思路 簡單的擴展歐幾里得算法應用題, 擴展歐幾里得算法可以直接計算同余方程的通解, 因為求得是最小正整數解, 因此需要取模轉換為正整數 a x b y ≡ 1 ax by …

C++學習-入門到精通-【0】計算機和C++簡介

C學習-入門到精通-[0]計算機和C簡介 計算機和C簡介 C學習-入門到精通-[0]計算機和C簡介一、計算機的組成二、硬件和軟件三、數據的層次結構四、機器語言、匯編語言和高級語言五、C標準庫六、面向對象技術 一、計算機的組成 計算機是由多個不同功能的邏輯單元組成的&#xff1a…

macOS 系統設置息屏情況下,PHP等后臺腳本繼續執行

在 macOS 系統下&#xff0c;當屏幕息屏或合上蓋子時&#xff0c;后臺腳本程序是否會繼續運行&#xff0c;主要取決于以下幾個因素&#xff1a; 1. 系統睡眠狀態的影響 默認情況&#xff1a;合蓋/息屏后&#xff0c;Mac 會進入「睡眠模式」&#xff08;部分硬件休眠&#xff…

SpringBoot集成ActiveMQ異常處理機制:若未捕獲異常,消息會被重新投遞

一、問題描述 SpringBoot項目集成AvtiveMQ&#xff0c;作為消息消費者。如果在消費消息的方法中&#xff0c;拋出異常&#xff0c;會產生什么效果&#xff1f; 二、ActiveMQ異常處理機制&#xff08;AI問答僅供參考&#xff09; 在Spring Boot項目集成ActiveMQ作為消息消費者…

【Java學習筆記】random的使用

random使用方法 使用說明&#xff1a;返回的是(0<n<1)這個范圍中的任意帶正號的double值 代碼實例 public class helloworld{public static void main(String[] args){System.out.println(Math.random());} }生成0-100中的任意數代碼示例 public class Main {public …

(三)垂直分庫架構、分布式數據庫

文章目錄 垂直分庫架構/分布式數據庫什么是垂直分庫架構架構模型優缺點優點缺點 技術案例分布式數據庫架構模型優缺點優點缺點 技術案例 垂直分庫架構/分布式數據庫 什么是垂直分庫架構 根據業務的模塊劃分&#xff0c; 將不同業務的數據放到不同的數據庫中。 比如一個電子商城…