C語言程序設計
chapter 1 順序結構
0. 前言
人類區別於動物的主要特性就是有自己的文化,懂得學習和交流,而這一切都無法離開“語言”這一工具。人與人之間可以通過中文、英文亦或是日文等進行溝通交流。隨着機器的誕生,解放了很大的人力,於是人類開始希望借助於機器來完成某些工作,最大程度上實現“偷懶“,其實我更願意理解為 "人類將一些低級的、機械的工作交給機器完成,而人類自身將更多的精力耗費在更具有挑戰性的工作上。那么由此就催生出了一個問題 “人類怎樣同機器進行交流呢?”。
於是人類就通過使用一串一串的指令來指揮機器進行某項活動,隨着不斷的升級和完善,計算機程序語言也開始誕生了,人類可以通過計算機程序語言和機器進行交互。
1972—1973年間,美國貝爾實驗室的D.M.Ritchie 在B語言的基礎上設計出了C語言。最初的C語言只是為描述和實現UNIX操作系統提供一種工作語言而設計的。隨着UNIX的日益廣泛使用,C語言也迅速得到推廣。
1978年以后,C語言先后移植到大、中、小和微型計算機上。C語言便很快風靡全世界,成為世界上應用最廣泛的程序設計高級語言。以UNIX第7版中的C語言編譯程序為基礎。
並且在之后人們對其新增了一些特性,於是就有了一個新的名字“C++”,意指是對C語言的增強。C++由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現(最初這種語言被稱作“C with Classes”帶類的C)。開始,C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。今天C/C++已成為世界主流編程語言之一。
接下來我們將學習C語言,上車請系好安全帶,即將開車了。
1. 編程的概念
程序:為實現特定目標或解決特定問題而用計算機語言編寫的一系列指令序列。
計算機語言:人與計算機之間通信的語言。計算機語言有很多種,比如BASIC語言、PASCAL語言、C語言、C++語言、Java語言等,每種計算機語言都有自身定義的規則,即使是同一種語言也有不同的版本,內部規則也會有少許不同。
編程:可以簡單的理解為程序員為了解決特定問題,按照自己的思路,在遵循特定的計算機語言規則下編寫程序的過程。
面向過程:以解決問題本身作為解決目標。
面向對象:以問題根源作為解決目標。
2. 編程軟件
工欲善其事,必先利其器,一個好的編譯軟件可以使我們的學習事半功倍。
現在對於初學者常用的編譯軟件很多, 如:VC6.0,CodeBlocks,Dev-C++
本次課程使用Dev-C++軟件,主要是使用方便,小巧,對於如何下載和安裝,請查看以下鏈接,點擊可跳轉:
程序語言都是在某個環境下編譯運行的,我們需要配置編譯器,目前有很多IDE(Integrated Development Environment),集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務,所以我們只需要下載一個即可。目前市面上較多的有Dev-C++、VScode等,初學者建議使用Dev-C++。
Dev-C++下載鏈接:https://pc.qq.com/detail/16/detail_163136.html
VScode:https://code.visualstudio.com/
VSCode(全稱:Visual Studio Code)是一款由微軟開發且跨平台的免費源代碼編輯器。該軟件支持語法高亮、代碼自動補全(又稱 IntelliSense)、代碼重構、查看定義功能,並且內置了命令行工具和 Git 版本控制系統。用戶可以更改主題和鍵盤快捷方式實現個性化設置,也可以通過內置的擴展程序商店安裝擴展以拓展軟件功能。
3. 鍵盤和鼠標的使用
鼠標的介紹
鼠標分為:左右鍵,滾輪
左鍵用於選擇和確認,一般可單擊(表示選擇),雙擊(表示確認)
右鍵用於項目提示和調出選項選擇框,一般將其放在我們要操作的項目上,右鍵單擊,就會出現一個新的小框,供我們選擇,這時候選擇應當使用:左鍵
滾輪用於上下翻頁(部分可以左右翻頁),如果和 Ctrl 結合使用,會出現大小縮放的效果,即放大縮小。
鍵盤快捷鍵
| 作用 | 快捷鍵 | 作用 | 快捷鍵 | 作用 | 快捷鍵 |
|---|---|---|---|---|---|
| 縮放 | Ctrl+滾動滾輪 | 縮小 | Ctrl + '-'(鍵盤按鍵) | 放大 | Ctrl + '+'(鍵盤按鍵) |
| 中英文切換 | Ctrl + 空格 | 輸入法切換 | Ctrl + shift | 大小寫切換 | CapsLock |
| 全選 | Ctrl + A | 復制 | Ctrl + C | 粘貼 | Ctrl + V |
| 刪除 | Delete / Backspace | 剪切 | Ctrl + X | 查找 | Ctrl + F |
| 新建 | Ctrl + N | 保存 | Ctrl + S | 回退 | Ctrl + Z |
如果我們要使用:#, %, /, "",+,(), * 等鍵盤上的復合型按鍵怎么調出來呢?
需要先按住 Shift ,再按對應的按鍵(記住:此時 Shift不能松開, 上述快捷鍵 Ctrl 也是一樣)
如果程序編輯頁面的定位符變成了一個黑色小方塊,那么按一下鍵盤上的:Insert
注意:書寫程序時,全部的代碼都是在英文狀態下編寫的,也就是輸入法的狀態為 English
4. 注釋
注釋是指在程序中,寫給我們開發者自己看的內容,這部分內容不被編譯器編譯運行。即使我們不寫或者刪除都不會對程序產生影響。
也就是說編譯器在編譯代碼時,會忽略注釋的內容
注釋通常放在一行代碼的上方,或者一條語句的末尾。
// 注釋內容 :單行注釋符,用於單獨一行的注釋;
/* 注釋內容 */ :多行注釋符,用於對多行進行注釋,也稱 塊注釋。注釋內容可以為中文,外文,亂碼等任意符號,且可以換行,即使你突然靈感爆發,在這里寫上一個千字文章也未嘗不可。
在devC++編譯器中注釋的快捷鍵為:Ctrl +/
5. 常用的數據類型
| 數據類型 | 類型標識符 | 存儲大小 | 數據范圍 |
|---|---|---|---|
| 字符型 | char | 1B | [-2^7, 2^7-1] |
| 短整型 | short | 2B | [-2^15, 2^15-1] |
| 整型 | int | 4B | [-2^31, 2^31-1] |
| 單精度浮點數 | float | 4B | [-2^128, 2^128] |
| 雙精度浮點數 | double | 8B | [-2^1024, 2^1024] |
| 長整型 | long | 4B | [-2^31, 2^31-1] |
| 長長整型 | long long | 8B | [-2^63, 2^63-1] |
| 無符號整型 | unsigned int | 4B | [0, 2^32-1 ] |
| 無符號長整型 | unsigned long | 4B | [0, 2^32-1] |
| 無符號長長整型 | unsigned long long | 8B | [0, 2^64-1] |
補充知識: sizeof 關鍵字
作用:利用sizeof關鍵字可以統計數據類型所占內存大小
語法:sizeof(數據類型或變量)
6. 變量名
變量:類似於我們數學上所學習的 x、y
作用:給一段指定的內存空間起名,方便操作這段內存
語法:數據類型 變量名 = 初始值;
變量名:在計算機語言中變量表示某個存儲數據空間的名稱。
它的命名有如下規則:
(1)變量名中只能出現字母(A~Z,a~z)、數字(0~9)或者下划線。
(2)第一個字符不能是數字。
(3)不能是C++關鍵字。所謂關鍵字,即C++中已經定義好的有特殊 含義的單詞。
(4)區分大小寫。
變量名補充:
(1)對變量名(也就是標識符)的長度沒有統一規定,隨着系統的不同而有不同的規定,一般來說,C++編譯器可以識別前31個字符,所以標識符的長度不要超過31位。
(2)給標識符命名時,爭取做到見名知意的效果,方便自己和他人的閱讀。
關鍵字
關鍵字(keyword)又稱保留字,是整個語言范圍內預先保留的標識符。
每個關鍵字都有特殊的含義。經過預處理后,關鍵字從預處理記號(preprocessing-token)中區別出來,剩下的標識符作為記號(token),用於聲明對象、函數、類型、命名空間等。不能聲明與關鍵字同名的標識符(變量,函數等)。
C語言一共有32個關鍵字,如下表所示:
| 關鍵字 | 說明 |
|---|---|
| auto | 聲明自動變量 |
| short | 聲明短整型變量或函數 |
| int | 聲明整型變量或函數 |
| long | 聲明長整型變量或函數 |
| float | 聲明浮點型變量或函數 |
| double | 聲明雙精度變量或函數 |
| char | 聲明字符型變量或函數 |
| struct | 聲明結構體變量或函數 |
| union | 聲明共用數據類型 |
| enum | 聲明枚舉類型 |
| typedef | 用以給數據類型取別名 |
| const | 聲明只讀變量 |
| unsigned | 聲明無符號類型變量或函數 |
| signed | 聲明有符號類型變量或函數 |
| extern | 聲明變量是在其他文件正聲明 |
| register | 聲明寄存器變量 |
| static | 聲明靜態變量 |
| volatile | 說明變量在程序執行中可被隱含地改變 |
| void | 聲明函數無返回值或無參數,聲明無類型指針 |
| if | 條件語句 |
| else | 條件語句否定分支(與 if 連用) |
| switch | 用於開關語句 |
| case | 開關語句分支 |
| for | 一種循環語句 |
| do | 循環語句的循環體 |
| while | 循環語句的循環條件 |
| goto | 無條件跳轉語句 |
| continue | 結束當前循環,開始下一輪循環 |
| break | 跳出當前循環 |
| default | 開關語句中的“其他”分支 |
| sizeof | 計算數據類型長度 |
| return | 子程序返回語句(可以帶參數,也可不帶參數)循環條件 |
補充: C++關鍵字如下
| 作用類型 | 關鍵字 |
|---|---|
| 數據類型 | void,int,char,float,double,bool,w_char |
| 類型定義 | struct,union,enum,class,typedef |
| 常量值 | true,false |
| 類型修飾符 | long,short,singed,unsigned |
| 類型限定符 | const,volatile,restrict |
| 存儲說明符 | auto,register,static,extern,thread_local,mutable |
| 其它修飾符 | inline,asm |
| 循環控制 | for,while,do |
| 跳轉控制 | break,continue,return,goto |
| 分支結構 | if,else,switch,case,default |
| 內存管理 | new, delete |
| 運算符 | sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq |
| 訪問限定符 | this,friend,virtual,mutable,explicit,operator |
| 類訪問修飾符 | private,protected,public |
| 模板 | template,typename |
| 命名空間 | namespace,using |
| 異常處理 | throw,try,catch |
7. 運算符
算術運算符
| 符號 | 作用 | 使用 | 備注 |
|---|---|---|---|
| + | 加 | 1+2=3 | |
| - | 減 | 1-2=-1 | |
| * | 乘 | 1*2=2 | |
| / | 除 | 1/2=0 1.0/2=0.5 |
如果/兩邊都為整數,則結果取整; 如果有一個是浮點數,則結果為浮點數 |
| % | 模,取余數 | 1%2=1 | %符號兩邊必為整數 |
| ++ | 加1 | a++; ++a; |
a++:先使用再加 ++a :先加再使用 |
| -- | 減1 | a--; --a; |
a--:先使用再減 --a:先減再使用 |
賦值運算符
| 符號 | 使用 | 作用 |
|---|---|---|
| += | a += 2; | 等同於 a = a + 2; |
| -= | a -= 2; | 等同於 a = a - 2; |
| *= | a *= 2; | 等同於 a = a * 2; |
| /= | a /= 2; | 等同於 a = a / 2; |
| %= | a %= 2; | 等同於 a = a % 2; |
算數運算符的4個注意
- a / b,若 a,b均為整數,則結果為整數,若其中一個為浮點數,則結果為浮點數;
- a % b ,要求:a, b均為整數;
- 遵循算數的自然特征,如分母不為0;
- 防止數據長度溢出。
補充:賦值運算符
-
由於賦值運算符
=右邊的表達式也可以是賦值表達式,因此,下述形式 :變量=(變量=表達式);
是成立的,從而形成嵌套的情形。其展開之后的一般形式為:變量=變量=…=表達式;
例如a=b=c=d=e=5;,它實際上等價於:e=5;d=e;c=d;b=c;a=b; -
在進行賦值運算時,如果賦值運算符兩邊的數據類型不同,系統將會自動進行類型轉換,即將賦值運算符右邊的數據類型轉換成左邊的變量類型。當左邊是整型而右邊是實型時,將去掉小數部分並截取該整型對應的有效位數。
8. 數學表達式
| 函數名 | 格式 | 功能 | 舉例 |
|---|---|---|---|
| 向下取整 | floor(x) | 不大於x的最大整數 | floor(3.14)=3 |
| 向上取整 | ceil(x) | 不小於x的最小整數 | ceil(3.14)=4 |
| 指數函數 | pow(x,y) | 計算y個x的乘積 | pow(3,2)=3*3=9 |
| 平方根函數 | sqrt(x) | 求x的平方根 | sqrt(9)=3 |
| 絕對值函數 | abs(x) | 求x的絕對值 | abs(-3)=3 |
| 隨機值函數 | rand() | 隨機生成一個0~pow(2,16)-1的整數 | rand()=41 |
| 自然數指數函數 | exp(x) | 求實數x的自然指數ex | exp(1)=2.718282 |
| 自然對數函數 | log(x) | 求實數x的自然數對數 | log(1)=0 |
使用前需導入頭文件:#include<math.h>
9. 常量
常量的作用:用於記錄程序中不可更改的數據
常量的書寫:大寫
常量的特性:只讀不可寫
兩種定義常量的方式
方式一: const int X = 2;
定義的常量X=2,且不能修改,否則報錯,如以下程序就會報錯:
const int X = 2;
X = 3; //error
一般我們將常量定義在外面,但是也可以定義在main中。
方式二:#define 常量名 常量值
預編譯指令,也稱宏定義,通常在文件上方定義,表示一個常量
如:#define PI 3.14,相當於PI = 3.14,以后就可以直接使用 PI。
注意:const所謂的常量是指只讀變量,並不是真正意義上的常量。
10. 運算符補充
| 類型 | 作用 |
|---|---|
| 1.算術運算符 | 用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種。 |
| 2.關系運算符 | 用於比較運算。包括大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)和不等於(!=)六種。 |
| 3.邏輯運算符 | 用於邏輯運算。包括與(&&)、或(||)、非(!)三種。 |
| 4.位操作運算符 | 參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。 |
| 5.賦值運算符 | 用於賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。 |
| 6.條件運算符 | 這是一個三目運算符,用於條件求值(?:)。 |
| 7.逗號運算符 | 用於把若干表達式組合成一個表達式(,)。 |
| 8.指針運算符 | 用於取內容(*)和取地址(&)二種運算。 |
| 9.求字節數運算符 | 用於計算數據類型所占的字節數(sizeof)。 |
| 10.特殊運算符 | 有括號(),下標[],成員(->,.)等幾種。 |
說明:大體的運算順序是:先乘除,再加減,后賦值
或者:! > 算術運算符 > 關系運算符 > && > || > 賦值運算符
如果真的記不住,那么可以通過()來改變運算優先順序,()內先運算。
| 優先級 | 運算符 | 名稱或含義 | 使用形式 | 結合方向 | 說明 |
|---|---|---|---|---|---|
| 1 | [ ] | 數組下標 | a[100] | 左到右 | |
| ( ) | 圓括號 | a*(b+c) | |||
| . | 成員選擇(對象) | a.b | |||
| -> | 成員選擇(指針) | a->b | |||
| 2 | +, - | 正運算符,負運算符 | +a,-a | 右到左 | 單目運算符 |
| ! | 邏輯非運算符 | ||||
| ~ | 按位取反運算符 | ||||
| ++,-- | 自增運算符,自減運算符 | ++a, a++,--a, a-- | |||
| *,& | 取值運算符,取址運算符 | *a,&a | |||
| (type) | 強制類型轉換 | (int)a | |||
| sizeof | 長度運算符 | sizeof(float) | |||
| 3 | *,/,% | 乘,除,取余 | a%b | 左到右 | 雙目運算符 |
| 4 | +,- | 加,減 | a+b | ||
| 5 | << ,>> | 左移, 右移 | a>>1, b<<c | ||
| 6 | >, >= | 大於, 大於等於 | a > b, a >= b | ||
| <, <= | 小於, 小於等於 | a < b, a <= b | |||
| 7 | ==, != | 等於,不等於 | a == b, a != b | ||
| 8 | & | 按位與 | a&b | ||
| 9 | ^ | 按位異或 | a^b | ||
| 10 | | | 按位或 | a|b | ||
| 11 | && | 邏輯與 | a&&b | ||
| 12 | || | 邏輯或 | a||b | ||
| 13 | ? : | 條件運算符 | a?b:c | 右到左 | 三目運算符 |
| 14 | = | 賦值 | |||
| *=, /=, %= | 乘(除/取余)后賦值 | ||||
| +=, -= | 加(減)后賦值 | ||||
| <<=, >>= | 左(右)移后賦值 | ||||
| &=, |=, ^= | 按位與(或/異或)后賦值 | ||||
| 15 | , | 逗號運算符 | int a, b; | 左到右 |
11. 類型轉換
- 自動類型轉換
- 強制類型轉換
- 字符型和整型的轉換
1.自動類型轉換
在不同數據類型的混合運算中,編譯器會隱式地進行數據類型轉換,稱為自動類型轉換。
自動類型轉換遵守以下規則:
(1)若參與運算的數據類型不同,則先轉換成同一類型,然后進行運算。
(2)轉換按數據長度增加的方向進行,以保證精度不降低。例如int類型和long long類型運算時,先把int轉換為long long后再運算。
(3)在賦值運算中,賦值號兩邊的數據類型不一樣時,將把右面表達式的類型轉換為左邊變量的類型。如果右邊表達式的數據類型長度比左邊的長時,將丟失一部分數據。
即:char -->short -->int --> float -->double
2.強制類型轉換
當自動類型轉換不能實現目的時,可以顯示的進行類型轉換,稱為強制類型轉換。
強制類型轉換的一般形式是: (類型名)(表達式) (類型名)變量
如(double)a 是將a轉換為double型,
(int)(x + y) 是將 x+y 的值轉換為整型,
(float)5/3 是將 5 的值轉換成float型,再與 3 運算。
double為雙精度浮點型,float為單精度浮點型,區別在於他們的精度不同。
3.字符型和整型的轉換
將一個字符放到內存單元時,實際上並不是把該字符本身放到內存中,而是將該字符的ASCII代碼放到存儲單元中。
如字符變量c1的值是'a',c2的值是'b',則在變量中存放的是 'a' 的ASCII碼97,'b' 的ASCII碼98
12. C語言輸入輸出
| 基本輸入輸出格式 | 輸入 | 輸出 |
|---|---|---|
| 符號 | scanf | printf |
| int類型的輸入輸出 | scanf("%d",&a); | printf("%d",a); |
| float類型的輸入輸出 | scanf("%f %f",&a, &b); | printf("%f %f",a, b); |
| double類型的輸入輸出 | scanf("%lf",&a); | printf("%lf",a); |
注意:使用前需要導入頭文件#include<stdio.h>
#include<stdio.h>
int main(){
int a;
scanf("%d", &a); //輸入並賦值給a,注意輸入有符號&,輸出沒有
printf("a = %d\n", a); //輸出a的值,並換行
float b;
scanf("%f", &b);
printf("b = %f\n", b); //輸出b,默認保留小數后6位
printf("b = %.4f\n", b);//輸出b,保留小數后4位
double c;
scanf("%lf", &c);
printf("c = %6.4lf\n", c);//輸出c,寬度為6,保留小數后4位
long long d;
scanf("%ld", &d);
printf("d = %ld\n", d);//輸出d
//也可以一起使用
printf("a = %d b = %f c = %lf d = %lld\n",a,b,c,d);
printf("a = %d b = %2.3f c = %3.4lf d = %lld\n",a,b,c,d);
return 0;
}
函數名:scanf
功 能:執行格式化輸入
用 法:int scanf(char *format[,argument,...]);
scanf()函數是通用終端格式化輸入函數,它從標准輸入設備(鍵盤) 讀取輸入的信息。
可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。
其調用格式為: scanf("<格式化字符串>",<地址表>);
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
| 格式表示 | 意義 |
|---|---|
| %c | 一個(ASCII)字符,一個漢字實際上在內存中要占據兩個字符的位置。 |
| %s | 一串字符,字符串。 |
| %nd %ld | 一個十進制整數,n為輸出占位寬度。 printf(“%12d”,a); 如a為數字8,則前面補齊11個空格, ld表示 長整型數據 |
| %nx %nX | 一個十六進制整數,n為輸出占位寬度。 |
| %no | 一個八進制整數,n為輸出占位寬度。 |
| %n.mf | 單精度浮點數,n代表該浮點數的占位寬度,.m代表小數點后保留幾位 a為12.2324,printf(“%.3”,a); 12.232,自動四舍五入。 |
| %n.mlf | 雙精度浮點數,n代表該浮點數的占位寬度,.m代表小數點后保留幾位 a為12.2324,printf(“%.3”,a); 12.232,自動四舍五入。 |
| %E | 輸出科學計數法,12.12 輸出為 1.212000E+001,只適用 float,double。 |
| %p | 指針(變量的地址) |
| %% | 輸出時有用,表示輸出一個% |
注意:格式在輸入時不能有,在輸出時可以有也可以沒有
注意:%為變量占位符,\只在printf中使用,為特殊字符的轉義字符
13. 轉義字符
作用:用於表示一些不能顯示出來的ASCII字符
現階段我們常用的轉義字符有: \n \\ \t
| 轉義字符 | 含義 | ASCII碼值(十進制) |
|---|---|---|
| \a | 警報 | 007 |
| \b | 退格(BS) ,將當前位置移到前一列 | 008 |
| \f | 換頁(FF),將當前位置移到下頁開頭 | 012 |
| \n | 換行(LF) ,將當前位置移到下一行開頭 | 010 |
| \r | 回車(CR) ,將當前位置移到本行開頭 | 013 |
| \t | 水平制表(HT) (跳到下一個TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \\ | 代表一個反斜線字符"\" | 092 |
| ' | 代表一個單引號(撇號)字符 | 039 |
| " | 代表一個雙引號字符 | 034 |
| ? | 代表一個問號 | 063 |
| \0 | 數字0 | 000 |
| \ddd | 8進制轉義字符,d范圍0~7 | 3位8進制 |
| \xhh | 16進制轉義字符,h范圍0 ~ 9,a ~ f,A ~ F | 3位16進制 |
14. 實例練習
1.地球人口承載力估計【小學奧數7653】
假設地球上的新生資源按恆定速度增長。照此測算,地球上現有資源加上新生資源可供x億人生活a年,或供y億人生活b年。為了能夠實現可持續發展,避免資源枯竭,地球最多能夠養活多少億人?
輸入:一行,包括四個正整數 x,a,y,b,兩個整數之間用單個空格隔開。x>y,a<b,ax<by,各整數均不大於10000
輸出:一個實數z,表示地球最多養活z億人,舍入到小數點后兩位。
樣例輸入: 110 90 90 210
樣例輸出: 75.00
本題題解
本題目主要找到平衡點,也就是不變量來建立等式
本題目所求的是避免資源枯竭,地球最多能夠養活多少億人,也就是說在現有資源不被消耗的情況下,剛好將新增資源消耗完畢的時候,能養活多少人,也就是要求出新生資源的增長速度。
由於題目中說明新生資源按恆定速度增長,證明新生資源的增長速度是一個定量,那么我們假設該定量為 m.
又地球上現有資源加上新生資源可供x億人生活a年,或供y億人生活b年。
首先,現有資源一定是一個定量,新生資源由於ab的變化在發生變化,所以我們可以建立以下等式
現有資源 = x*a - m*a;
現有資源 = y*b - m*b;
所以 m = (x*a-y*b)/(a-b);
所以標程(針對本題的解答程序)如下:
#include<stdio.h>
int main(){
int x,a,y,b;
scanf("%d %d %d %d",&x, &a, &y, &b);
double z = 1.0*(x*a-y*b)/(a-b);
printf("%.2lf", z);
return 0;
}
2.數學中經典的"雞兔同籠"問題,已知頭共30個,腳共90只,問籠中的雞和兔各有多少只?
解決方案一:
聽我口令,所有動物,提起一只腳
聽我口令,所有動物,提起第二只腳
好了,現在着地的還有90-30-30=30只腳
由於雞只有兩只腳,所以這時候的全部雞都是跪着的,
這30只腳應當都是兔子的,每只兔子有4只腳,提起2只,還剩2只
所以兔子的數量為:30/2=15只
所以雞的數量為30-15只
解決方案二:
差值求解
假設都為兔,則 缺少 30*4 - 90 = 30支腳
所以這 缺少的腳就是雞, 所以雞的數量 = 30/2=15;
兔的數量 = 30-15;
解決方案三:
列方程,設雞 x只,兔 y只, 則
x + y = 30
2*x + 4*y = 90
解得 x = 15, y = 15
解決方案四:
循環遍歷,假設 雞兔都為0只,每次遞增+1,直到滿足方案三中方程的xy出現
輸出結果
#include<stdio.h>
int main(){
int x,y;
x = (30*4-90)/2;
y = 30-x;
printf("%d %d\n", x, y);
return 0;
}
3.計算並聯電阻的阻值
對於阻值為r1和r2的電阻,其並聯電阻阻值公式計算如下:R = 1/(1/r1 + 1/r2)。
輸入兩個電阻阻抗大小,浮點型。輸出並聯之后的阻抗大小,結果保留小數點后2位。
輸入:兩個電阻阻抗大小,浮點型,以一個空格分開。
輸出:並聯之后的阻抗大小,結果保留小數點后2位
樣例輸入:1 2
樣例輸出:0.67
#include<stdio.h>
int main(){
double r1,r2,R;
scanf("%lf%lf", &r1, &r2);
R = 1/(1/r1+1/r2);
printf("%.2lf\n", R);
return 0;
}
4.海倫公式
傳說古代的敘拉古國王海倫二世發現的公式,利用三角形的三條邊長來求取三角形面積。已知△ABC中的三邊長分別為a,b,c,求△ABC的面積。(提示:海倫公式)
#include<stdio.h>
#include<math.h>
int main(){
double a, b, c, p, s;
scanf("%lf%lf%lf", &a, &b, &c);
p = (a+b+c)/2;
s = sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.2lf\n", s);
return 0;
}
