主頁 > 軟體設計 > C語言中的選擇與輪回,選擇結構與回圈結構

C語言中的選擇與輪回,選擇結構與回圈結構

2021-07-27 08:11:04 軟體設計

內容導讀

  • 1.C語言的選擇——選擇分支結構
    • 1.0分支結構概述
    • 1.1if分支陳述句
      • 1.1.1if...結構
      • 1.1.2if...else...結構
      • 1.1.3if...else if...else...結構
      • 1.1.4分支結構的嵌套
    • 1.2switch分支陳述句
    • 1.3運算式
      • 1.3.1關系運算子和關系運算式
      • 1.3.2邏輯運算子和邏輯運算式
      • 1.3.3條件運算子和條件運算式
  • 2.C語言的輪回——回圈結構
    • 2.0回圈結構概述
    • 2.1while回圈
    • 2.2do...while回圈
    • 2.3for回圈
    • 2.4三種回圈陳述句的比較
    • 2.5改變回圈執行的狀態(break和continue)
      • 2.5.1break
      • 2.5.2continue
    • 2.6go ... to陳述句
  • 3.程式實體
    • 3.1二分查找
    • 3.2猜數字游戲

作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!

1.C語言的選擇——選擇分支結構

1.0分支結構概述

在這里插入圖片描述
如上圖所示,這就是一個分支結構,也叫選擇結構,
在C語言有兩種選擇陳述句

  1. if陳述句,用來實作兩個或多個分支的選擇結構
  2. switch陳述句,用來實作多分支的選擇結構

1.1if分支陳述句

1.1.1if…結構

在這里插入圖片描述

語法結構
if (運算式)
{
	陳述句;
}
#include <stdio.h>
//如果年齡大于或等于18歲,就表示成年了,
int main()
{
	int age = 18;//年齡
	if (age >= 18)
	{
		printf("成年啦!\n");
	}
	return 0;
}

1.1.2if…else…結構

在這里插入圖片描述

語法結構
if (運算式)
{
	陳述句1;
}
else
{
	陳述句2;
}
	
#include <stdio.h>
//如果年齡大于或等于18歲,就表示成年了,否則未成年,
int main()
{
	int age = 18if (age >= 18)
	{
		printf("雖然成年啦,但是我還不想長大!\n");
	}
	else
	{
		printf("我要快快長大!\n");
	}
	return 0;
}

1.1.3if…else if…else…結構

在這里插入圖片描述

語法結構
if (運算式1)
{
	陳述句1;
}
else if (運算式2)
{
	陳述句2}
...
//else if數量無限制,最后的else可以用也可以不用
else
{
	陳述句n;
}
#include <stdio.h>
//如果年齡0-12 童真
//13-22青春
//23-32 活力
//33-42 穩重
//43-52 成熟
//53+   老當益壯
int main()
{
	int age = 18;
	if (age <= 12)
	{
		printf("童真\n");
	}
	else if (age >= 13 && age <=22)
	{
		printf("青春\n");
	}
	else if (age >= 23 && age <= 32)
	{
		printf("活力\n");
	}
	else if (age >= 33 && age <= 42)
	{
		printf("穩重\n");
	}
	else if (age >= 43 && age <=52)
	{
		printf("成熟\n");
	}
	else
	{
		printf("老當益壯\n");
	}
	return 0;
}

1.1.4分支結構的嵌套

在這里插入圖片描述
使用嵌套結構需要注意if與else的配對關系,
else總是與它上面的最近的未配對的if配對,
比如,下面這個結構
在這里插入圖片描述
編程式者把else寫在與第1個if(外層if)同一列上,意圖是使else與第1個if對應,但實際上else是與第2個if配對,因為它們相距最近,
所以我們在撰寫代碼時,要將代碼寫規范,不要寫成這個樣子,容易出錯,
如果if與else的數目不一樣,為實作程式設計者的思想,可以加花括號來確定配對關系,
在這里插入圖片描述

1.2switch分支陳述句

引子】要求按照考試成績的等級輸出百分制分數段,A等為85分以上,B等為70~84分,C等為60~69分,D等為 60分以下,成績的等級由鍵盤輸入,

#include <stdio.h>
int main()
{
	char grade;
	scanf("%c",&grade);
	printf("Your score:");
	switch(grade)
	{
	case 'A': printf("85~100\n");break;
	case 'B': printf("70~84\n");break;
	case 'C': printf("60~69\n");break;
	case 'D': printf("<60\n");break;    
	default:  printf("enter data error!\n");
	}
	return 0;
}

在這里插入圖片描述
等級grade定義為字符變數,從鍵盤輸入一個大寫字母,賦給變數grade,switch得到grade的值并把它和各case中給定的值(′A′,′B′,′C′,′D′之一)相比較,如果和其中之一相同(稱為匹配),則執行該case后面的陳述句(即printf陳述句),
如果輸入的字符與′A′,′B′,′C′,′D′都不相同,就執行default后面的陳述句,
注意在每個case后面后的陳述句中,最后都有一個break陳述句,它的作用是使流程轉到switch陳述句的末尾(即右花括號處),
再比如,輸入1-5輸出的是“weekday”;輸入6-7輸出“weekend”

#include <stdio.h>
//switch輸入1-5輸出的是“weekday”;輸入6-7輸出“weekend”
int main()
{
    int day = 0;
    switch(day)
   {
        case 1case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0; 
   }
switch(運算式)
{
case	常量1 : 陳述句1
case	常量2 : 陳述句2
  ?	      ?		  ?
case	常量n : 陳述句n
default :	   陳述句n+1
}

(1) 括號內的“運算式”,其值的型別應為整數型別(包括字符型),
(2) 花括號內是一個復合陳述句,內包含多個以關鍵字case開頭的陳述句行和最多一個以default開頭的行,case后面跟一個常量(或常量運算式),它們和default都是起標號作用,用來標志一個位置,執行switch陳述句時,先計算switch后面的“運算式”的值,然后將它與各case標號比較,如果與某一個case標號中的常量相同,流程就轉到此case標號后面的陳述句,如果沒有與switch運算式相匹配的case常量,流程轉去執行default標號后面的陳述句,
(3) 可以沒有default標號,此時如果沒有與switch運算式相匹配的case常量,則不執行任何陳述句,
(4) 各個case標號出現次序不影響執行結果,
(5) 每一個case常量必須互不相同;否則就會出現互相矛盾的現象,
(6) case標號只起標記的作用,在執行switch陳述句時,根據switch運算式的值找到匹配的入口標號,在執行完一個case標號后面的陳述句后,就從此標號開始執行下去,不再進行判斷,因此,一般情況下,在執行一個case子句后,應當用break陳述句使流程跳出switch結構,最后一個case子句(今為default子句)中可不加break陳述句,
(7) 在case子句中雖然包含了一個以上執行陳述句,但可以不必用花括號括起來,會自動順序執行本case標號后面所有的陳述句,當然加上花括號也可以,
(8) 多個case標號可以共用一組執行陳述句,
好習慣:
1.在最后一個 case 陳述句的后面加上一條 break陳述句,(之所以這么寫是可以避免出現在以前的最后一個 case 陳述句后面忘了添加 break陳述句),
2.在每個 switch 陳述句中都放一條default子句是個好習慣,甚至可以在后邊再加一個 break ,

1.3運算式

在上面的分支陳述句中,都牽涉到了運算式,在上述結構中,運算式的作用是判斷,如果運算式為真,則執行后面對應的陳述句,否則跳過其陳述句,
在c語言中0表示假,非0表示真,
這里的“運算式”可以是關系運算式、邏輯運算式,甚至是數值運算式,
現在就讓我們深入運算式在分支結構和回圈中的作用以及一些細節問題,

1.3.1關系運算子和關系運算式

在C語言中,比較符(或稱比較運算子)稱為關系運算子,所謂“關系運算”就是“比較運算”,將兩個數值進行比較,判斷其比較的結果是否符合給定的條件,

在這里插入圖片描述
前4種關系運算子的優先級別相同,后2種也相同,前4種高于后2種,
關系運算子的優先級低于算術運算子,
關系運算子的優先級高于賦值運算子,
在這里插入圖片描述
用關系運算子將兩個數值或數值運算式連接起來的式子,稱為關系運算式
關系運算式的值是一個邏輯值,即“真”或“假”,
在C的邏輯運算中,以“1”代表“真”,以“0”代表“假”,
在這里插入圖片描述

1.3.2邏輯運算子和邏輯運算式

用邏輯運算子將關系運算式或其他邏輯量連接起來的式子就是邏輯運算式,

在這里插入圖片描述
1. “&&”和“‖”是雙目運算子,要求有兩個運算物件(運算元); “!”是單目運算子,只要有一個運算物件,
2. 優先次序:!(非)→&&(與)→‖(或), 即“!”為三者中最高的; 邏輯運算子中的“&&”和“‖”低于關系運算子,“!”高于算術運算子,
3. 邏輯運算結果不是0就是1,不可能是其他數值,而在邏輯運算式中作為參加邏輯運算的運算物件可以是0(“假”)或任何非0的數值(按“真”對待),

在邏輯運算式的求解中,并不是所有的邏輯運算子都被執行,只是在必須執行下一個邏輯運算子才能求出運算式的解時,才執行該運算子,
在這里插入圖片描述
既然關系運算式和邏輯運算式的值是0和1,而且在判斷一個量是否為“真”時,以0代表“假”,以非0代表“真”,那么就可以理解為什么在if陳述句中運算式可以是任何數值運算式,
在這里插入圖片描述
比如閏年的判斷

判別用year表示的某一年是否閏年,可以用一個邏輯運算式來表示,閏年的條件是符合下面二者之一: ①能被4整除,但不能被100整除,如2020,②能被400整除,如2000,

#include <stdio.h>
int main()
{
	int year = 0;
	printf("在1900-2048年之間是閏年的年份有:\n");
	for (year = 1900; year <= 2048; year++)
	{
		if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
		{
			printf("%d ",year);
		}
	}
	return 0;
}

在這里插入圖片描述

1.3.3條件運算子和條件運算式

在這里插入圖片描述
比如下面這一個判斷陳述句

if (a>b)
	max=a;
else 
	max=b;

也可以寫成

max=(a>b) ? a : b;
//或
a>b ? (max=a) : (max=b);  //運算式2和運算式3是賦值運算式

框圖
在這里插入圖片描述
條件運算子由兩個符號(?和:)組成,必須一起使用,要求有3個操作物件,稱為三目(元)運算子,它是C語言中唯一的一個三目運算子
條件運算子的執行順序: 先求解運算式1,若為非0(真)則求解運算式2,此時運算式2的值就作為整個條件運算式的值,若運算式1的值為0(假),則求解運算式3,運算式3的值就是整個條件運算式的值,

例如,輸入一個字符,判別它是否為大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換,然后輸出最后得到的字符,

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char ch;
	scanf("%c",&ch);
	ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
	printf("%c\n",ch);
	return 0;
}

在這里插入圖片描述
條件運算式“(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch”的作用是: 如果字符變數ch的值為大寫字母,則條件運算式的值為(ch+32),即相應的小寫字母,32是小寫字母和大寫字母ASCII的差值,如果ch的值不是大寫字母,則條件運算式的值為ch,即不進行轉換,

2.C語言的輪回——回圈結構

2.0回圈結構概述

為什么要使用回圈結構?
當你要輸入100個或者以上學生的成績時,你會意識到非常麻煩,如果不使用回圈這就意味著你要寫100輸入函式進行成績的錄入,好吧,如果你覺得還不夠麻煩,那10000,1000000個學生成績錄入呢?可想而知,根本是不可能完成的任務,
回圈結構分為三類,while回圈,do…while回圈,for回圈,
有了回圈結構,無論是百萬個資料還是千萬個資料的錄入都是非常輕松的,

2.1while回圈

![在這里插入圖片描述](https://img-blog.csdnimg.cn/

while(運算式) 
{
	陳述句;
}

while陳述句可簡單地記為: 只要當回圈條件運算式為真(即給定的條件成立),就執行回圈體陳述句,
“陳述句”就是回圈體,回圈體可以是一個簡單的陳述句,可以是復合陳述句(用花括號括起來的若干陳述句),
執行回圈體的次數是由回圈條件控制的,這個回圈條件就是上面一般形式中的“運算式”,它也稱為回圈條件運算式,當此運算式的值為“真” (以非0值表示)時,就執行回圈體陳述句;為“假” (以0表示)時,就不執行回圈體陳述句,
while回圈的特點是先判斷條件運算式,后執行回圈體陳述句,

比如,計算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//計算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,列印出結果
int main()
{
	double a = 1.0;
	double sum = 0.0;
	int i = 1;
	for (i = 1; i <= 100; i++)
	{
		sum += a / i;
		a = -a;
	}
	printf("%lf", sum);
	return 0;
}

在這里插入圖片描述
計算1+2+3+…+100的值,

#include<stdio.h>
int main()
{
	int i=1,sum=0;			//定義變數i的初值為1,sum的初值為0  
	while(i<=100)				//當i>100,條件運算式i<=100的值為假,不執行回圈體
	{						//回圈體開始
		sum=sum+i;			//第1次累加后,sum的值為1
		i++;					//加完后,i的值加1,為下次累加做準備
	}						//回圈體結束
	printf("sum=%d\n",sum);	//輸出1+2+3…+100的累加和
	return 0;
}

在這里插入圖片描述

我們以第二個問題為例,介紹while回圈的相關細節問題,
程式執行的框圖
在這里插入圖片描述
(1) 回圈體如果包含一個以上的陳述句,應該用花括號括起來,作為復合陳述句出現,
(2) 不要忽略給i和sum賦初值,否則它們的值是不可預測的,結果顯然不正確,
(3) 在回圈體中應有使回圈趨向于結束的陳述句,如本例中的“i++;”陳述句,如果無此陳述句,則i的值始終不改變,回圈永遠不結束,

2.2do…while回圈

在這里插入圖片描述

do
{
	陳述句;
}
while(運算式)

do…while陳述句與while陳述句非常相似,僅僅只有一個不同點,
那就是do…while陳述句先無條件地執行回圈體,然后判斷回圈條件是否成立,
就是說,無論運算式為真還是假,回圈體內的陳述句至少會回圈一次,
同理,計算1+2+3+…+100的值,

#include <stdio.h>
int main()
{
	int i=1,sum=0;
	do 
	{
		sum=sum+i;
		i++;
	}while(i<=100);
	printf("sum=%d\n",sum);
	return 0;
}

在這里插入圖片描述
在這里插入圖片描述
在一般情況下,用while陳述句和用do…while陳述句處理同一問題時,若二者的回圈體部分是一樣的,那么結果也一樣,
但是如果while后面的運算式一開始就為假(0值)時,兩種回圈的結果是不同的,

2.3for回圈

在這里插入圖片描述

for(運算式1;運算式2;運算式3)
{
	陳述句;
} 

相當于

運算式1;
while (運算式2)
{
	陳述句;
	運算式3;
}

for陳述句更為靈活,不僅可以用于回圈次數已經確定的情況,還可以用于回圈次數不確定而只給出回圈結束條件的情況,它完全可以代替while陳述句,

運算式1: 設定初始條件,只執行一次,可以為零個、一個或多個變數設定初值,

運算式2: 是回圈條件運算式,用來判定是否繼續回圈,在每次執行回圈體前先執行此運算式,決定是否繼續執行回圈,

運算式3: 作為回圈的調整,例如使回圈變數增值,它是在執行完回圈體后才進行的,
for陳述句的執行程序如下:
(1) 求解運算式1,
(2) 求解運算式2,若此條件運算式的值為真(非0),則執行for陳述句中的回圈體,然后執行第(3)步,若為假(0),則結束回圈,轉到第(5)步,
(3) 求解運算式3,
(4) 轉回步驟(2)繼續執行,
注意: 在執行完回圈體后,回圈變數的值“超過”回圈終值,回圈結束,
(5) 回圈結束,執行for陳述句下面的一個陳述句,

關于for回圈的運算式
“運算式1”可以省略,即不設定初值,但運算式1后的分號不能省略,例如: for(;i<=100;i++),應當注意: 由于省略了運算式1,沒有對回圈變數賦初值,因此,為了能正常執行回圈,應在for陳述句之前給回圈變數賦以初值,
運算式2也可以省略,即不用運算式2來作為回圈條件運算式,不設定和檢查回圈的條件,此時回圈無終止地進行下去,也就是認為運算式2始終為真,
運算式3也可以省略,但此時程式設計者應另外設法保證回圈能正常結束,
甚至可以將3個運算式都可省略,即不設初值,不判斷條件(認為運算式2為真值),回圈變數也不增值,無終止地執行回圈體陳述句,顯然這是沒有實用價值的,
運算式1可以是設定回圈變數初值的賦值運算式,也可以是與回圈變數無關的其他運算式,運算式3也可以是與回圈控制無關的任意運算式,但不論怎樣寫for陳述句,都必須使回圈能正常執行,
運算式1和運算式3可以是一個簡單的運算式,也可以是逗號運算式,即包含一個以上的簡單運算式,中間用逗號間隔,
運算式2一般是關系運算式或邏輯運算式,但也可以是數值運算式或字符運算式,只要其值為非零,就執行回圈體,
for陳述句的回圈體可為空陳述句,把本來要在回圈體內處理的內容放在運算式3中,作用是一樣的,可見for陳述句功能強,可以在運算式中完成本來應在回圈體內完成的操作,
C 99允許在for陳述句的“運算式1”中定義變數并賦初值,

回圈和分支結構一樣,都可以嵌套使用,但要注意的是代碼一定要寫規范,不要亂七八糟的寫,容易出錯,
在這里插入圖片描述

2.4三種回圈陳述句的比較

(1) 3種回圈都可以用來處理同一問題,一般情況下它們可以互相代替,
(2) 在while回圈和do…while回圈中,只在while后面的括號內指定回圈條件,因此為了使回圈能正常結束,應在回圈體中包含使回圈趨于結束的陳述句(如i++,或i=i+1等),
for回圈可以在運算式3中包含使回圈趨于結束的操作,甚至可以將回圈體中的操作全部放到運算式3中,因此for陳述句的功能更強,凡用while回圈能完成的,用for回圈都能實作,
(3) 用while和do…while回圈時,回圈變數初始化的操作應在while和do…while陳述句之前完成,而for陳述句可以在運算式1中實作回圈變數的初始化,
(4) while回圈、do…while回圈和for回圈都可以用break陳述句跳出回圈,用continue陳述句結束本次回圈,

2.5改變回圈執行的狀態(break和continue)

2.5.1break

作用:使流程跳到回圈體之外,接著執行回圈體下面的陳述句,
注意:break陳述句只能用于回圈陳述句和switch陳述句之中,而不能單獨使用,

#include <stdio.h>
int main()
{
 	int i = 1;
	while(i<=10)
 	{
 		if(i == 5)
 			break;
 		printf("%d ", i);
 		i = i+1;
 	}
 	return 0; 
 }

比如運行這個代碼結果會是什么呢?

1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10

會是上面答案之一嗎?我們來運行一下
在這里插入圖片描述
答案是 1 2 3 4
break在while回圈中的作用:
其實在回圈中只要遇到break,就停止后期的所有的回圈,直接終止回圈,
所以,while中的break是用于永久終止回圈的,

2.5.2continue

作用:結束本次回圈,即跳過回圈體中下面尚未執行的陳述句,轉到回圈體結束點之前,在for回圈中,接著執行for陳述句中的“運算式3”,然后進行下一次是否執行回圈的判定,
同樣,我們再來看一個程式會輸出什么?

#include <stdio.h>
int main()
{
 	int i = 1;
 	while(i<=10)
 	{
 		if(i == 5)
 			continue;
 		printf("%d ", i);
 		i = i+1;
 	}
 	return 0; 
 }

這里代碼輸出的結果是什么?

1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10

會是上面答案之一嗎?同樣我們運行一下
在這里插入圖片描述
程式一直沒有結束了,死回圈了,
因為在i=5時由于continue的作用,continue后面的陳述句全部跳過,包括i=i+1,所以后面i的值一直為5,進入死回圈,
那改一下,試試下面這個回圈會輸出什么?

#include <stdio.h>
int main()
{
 	int i = 1;
 	while(i<=10)
 	{
    	i = i+1;
 		if(i == 5)
 			continue;
 		printf("%d ", i);
 	}
 	return 0; 
 }

在這里插入圖片描述
continue在while回圈中的作用就是:
continue是用于終止本次回圈的,也就是本次回圈中continue后邊的代碼不會再執行,而是直接跳轉到while陳述句的判斷部分,進行下一次回圈的入口判斷,

break陳述句和continue陳述句的區別
continue陳述句只結束本次回圈,而非終止整個回圈,break陳述句結束整個回圈,不再判斷執行回圈的條件是否成立,
在這里插入圖片描述

2.6go … to陳述句

C語言中提供了可以隨意濫用的 goto陳述句和標記跳轉的標號,
從理論上 goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼,
但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,例如一次跳出兩層或多層回圈,
這種情況使用break是達不到目的的,它只能從最內層回圈退出到上一層的回圈,
下面是使用goto陳述句的一個例子:
一個關機程式

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char str[22] = { 0 };
	//啟用系統關機
	system("shutdown -s -t 90");
	again:
		printf("請輸入:‘我是豬’,否則你的計算機將在1分30秒內關機,如果輸入“我是豬”則取消關機,\n");
		scanf("%s", str);
		if (0 == strcmp(str, "我是豬"))
		{
			system("shutdown -a");
			break;
		}
		else
		{
			printf("沒用的!別掙扎了!快承認吧!電腦馬上就關機了!\n");
			goto again;
		}
	return 0;
	}

在這里插入圖片描述
這個關機程式使用回圈也是可以輕松實作的,由于使用goto陳述句容易搞混開發者的順序邏輯,所以能不用就不用,
回圈實作關機程式

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char str[22] = { 0 };
	//啟用系統關機
	system("shutdown -s -t 90");
	while (1)
	{
		printf("請輸入:‘我是豬’,否則你的計算機將在1分30秒內關機,如果輸入“我是豬”則取消關機,\n");
		scanf("%s", str);
		if (0 == strcmp(str, "我是豬"))
		{
			system("shutdown -a");
			break;
		}
		else
		{
			printf("沒用的!別掙扎了!快承認吧!電腦馬上就關機了!\n");
		}
	}
	return 0;
}

3.程式實體

3.1二分查找

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//二分查找
int main()
{
	int left = 0, mid = 0, right = 0;
	int arr[] = { 1,3,4,5,7,8,9,12,23,34,98,100 };
	int search = 0;
	int flag = 0;
	scanf("%d", &search);
	right = sizeof(arr) / sizeof(arr[0]) - 1;

	while (left <= right)
	{	
		mid = (left + right) / 2;
		if (arr[mid] < search)
		{
			left = mid + 1;
		}
		else if (arr[mid] > search)
		{
			right = mid - 1;
		}
		else
		{
			flag = 1;
			break;
		}
	}
	if(flag)
		printf("找到了,下標是%d\n", mid);
	else
		printf("沒找到,\n");

	return 0;
}

在這里插入圖片描述

3.2猜數字游戲

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//猜數游戲
//1. 電腦隨機生成一個區間之間的數字
//2. 玩家猜數字
//   如果猜對了,就提示:猜對了
//   如果猜錯了,就提示:猜大了,或者猜小了,直到猜正確
//3. 反復玩
void meau();//選單
void game();//猜數

//時間戳 time.h  unsigned int time(&p)
//亂數 stdlib.h   rand() 根據亂數種子生成亂數
//                  srand(long long int)  亂數種子設定
//因為時間戳是不斷變化的,所以可以以時間戳設定亂數種子
//但是不能頻繁呼叫strand(),因為頻繁呼叫生成的亂數并不是很隨機

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//亂數種子
	do 
	{
		meau();
		printf("是否開始猜數字游戲(數字范圍為1-100),請選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲!\n");
			break;
		default:
			printf("無效輸入,請輸入數字0或1");
			break;
		}
	} while (input);
	return 0;
}
void meau()
{
	printf("*********************************\n");
	printf("*********************************\n");
	printf("***********1 開始游戲************\n");
	printf("***********0 退出游戲************\n");
	printf("*********************************\n");
	printf("*********************************\n");
}
void game()
{
	int guess = 0;//用戶猜數資料
	int cnt = 1;//統計用戶猜中數字所花次數
	int ret = 0;//亂數
	
	ret = (2 * rand() % 10 + 1) * rand() % 100 + 1;//保證生成的數在1-100以內
	//printf("%d\n", ret);//開掛
	while (1)
	{
		printf("請開動你的小腦瓜,猜一個數字吧!->猜");
		scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了!\n");
			cnt++;
		}
		else if (guess > ret)
		{
			printf("猜大了!\n");
			cnt++;
		}
		else
		{
			if (cnt == 1)
				printf("太厲害了!你猜%d次就猜中了!這就是傳說中的一發入魂嗎!\n",cnt);
			else if (cnt >1 && cnt <=3)
				printf("哎呦!不錯哦!才猜%d次就猜中了!\n", cnt);
			else if(cnt>3 && cnt<=10)
				printf("還可以,一般般!你猜了%d次猜中了!\n", cnt);
			else
				printf("嘖嘖嘖,你太拉了!猜了%d次才猜中!太一般了!\n", cnt);
			break;
		}
	}

}

在這里插入圖片描述
覺得文章寫得不錯的老鐵們,點贊評論關注走一波!謝謝啦!
C語言專欄下期預告:

C語言之函式那些事

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290331.html

標籤:其他

上一篇:對于浮點型別的深入理解(洗掉線主演)

下一篇:putchar與getchar函式的細節及運用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more