浙江大學翁愷教你C語言程序設(shè)計!C語言基礎(chǔ)入門!

一起學習的兄弟可以去我主頁,我在另外一個up主那里,看完了所有翁愷課程,有詳細筆記,這里我就不復(fù)制過來了,要看可以在
“蘇杭zzz”這里找到


變量定義的一般形式就是:類型名稱+變量名稱+;
如:int price;
int amount;
int price,amount

在scanf里讀取什么東西,需在該東西前加&否則無法讀取
整數(shù)除法會省略小數(shù)點后面的數(shù),要求有小數(shù)點的數(shù)值,需要使用浮點數(shù)




數(shù)據(jù)類型:
1.整數(shù):int,printf(“%d”,...)
scanf(“%d”,...)
2.帶小數(shù)點的數(shù):double,printf(“%f”,...),scanf(“%lf”,...)
3.運算符(operator):是指進行運算的動作,比如加法運算符“+”,減法運算符“-”
算子(operand):是指參與運算的值,這個值可能是常數(shù),也可能是變量,還可能是一個方法的返回值
4.兩個整數(shù)的運算結(jié)果只能是整數(shù)
整數(shù)運算沒有小數(shù)部分,因此要使用浮點數(shù),若在設(shè)置變量,則變量的賦值有小數(shù),因此用double,而不用int,輸出時,有小數(shù),因此使用%f,而不是%d

一般自左向右
單目+-和賦值=自右向左

賦值運算會把右邊的式子先算完,再來和左邊的變量結(jié)合,如:
total*=sum+12
total=total*(sum+12)



如果
if(條件成立){
...
}


優(yōu)先級:所有的關(guān)系運算符的優(yōu)先級比算數(shù)運算符的低,但是比賦值運算符的高




else,if后面可以沒有大括號,但只有那一句是有效的
注意:寫程序是寫步驟,而不是寫關(guān)系和說明。(非常重要)
區(qū)分內(nèi)嵌式和級聯(lián)

使用級聯(lián)時:大于,從上往下數(shù)字大到小;小于,從上往下數(shù)字小到大。


平均數(shù)代碼的選擇,一個判斷做兩次會浪費,如下

隨機數(shù):每次召喚rand()就得到一個隨機的整數(shù)

兩種形式:1.i=0;i<n
2.i=1;i<=n

小套路:做求和的程序時,記錄結(jié)果的變量應(yīng)該初始化為0,而做求積的變量時記錄結(jié)果的變量應(yīng)該初始化為1。

循環(huán)內(nèi)定義


這里while循環(huán)的i雖然也只在循環(huán)內(nèi)使用,但由于進入while前需判斷,故應(yīng)在循環(huán)前就定義int=i




枚舉:

在除號倆邊有一個是浮點數(shù),則計算機會把另一個數(shù)也變成浮點數(shù)
整數(shù)逆序:
d=x%10
ret=ret*10+d
整數(shù)逆序只適用于末尾沒有0的數(shù)

gcd:最大公因數(shù)
關(guān)注 0與一個數(shù)的最大公約數(shù)是這個數(shù)本身,所以0與0的最大公約數(shù)是0。





sizeof是靜態(tài)運算符它的結(jié)果在編譯時刻就決定了
不要在sizeof的括號內(nèi)做運算,這些運算是不會做的







八進制輸出用%o,十六進制用%x
如果賦值帶字母,則小寫x就輸出小寫的a,大寫的X就輸出大寫的A









超過范圍的浮點數(shù):
printf輸出inf表示超過范圍的浮點數(shù):+-∞
printf輸出nan表示不存在的浮點數(shù)








承接上文:對于printf,任何小于int的類型會被轉(zhuǎn)換成int;float會被轉(zhuǎn)換成double。
但是scanf不會,要輸入short,需要%hd

bool:#include <stdbool.h>
之后就可以使用bool和true、false

x∈(4,6)表示為x>4&&x<6
回憶:邏輯運算符<關(guān)系運算符,單目>雙目
優(yōu)先級:所有的關(guān)系運算符的優(yōu)先級比算數(shù)運算符的低,但是比賦值運算符的高


條件運算符:1.問號?前是條件,問號后面是條件滿足時的值,冒號:后面是條件不滿足是的值。

2.條件運算符的優(yōu)先級高于賦值運算符,但是低于其他運算符
3.自右向左結(jié)合
逗號運算符:

目前來說逗號運算符只有在for循環(huán)中使用
for(i=0,j=10;i<j;i++,j--)
函數(shù)是一塊代碼,接受零個或多個函數(shù),做一件事情,并返回零個或一個值

調(diào)用函數(shù)
1.函數(shù)名(參數(shù)值);
2.()起到了表示函數(shù)調(diào)用的重要作用
3.即使沒有參數(shù)也需要()

可以賦值給變量;
可以再傳遞給函數(shù);
甚至可以丟棄;



聲明:檢查你對函數(shù)的調(diào)用是不是對的,以及和定義匹不匹配。
把函數(shù)的頭取出來加上分號;就變成函數(shù)原型

上圖最后一點注意
當你值和函數(shù)頭里的參數(shù)類型不匹配時,數(shù)據(jù)會發(fā)生混亂



本地變量



1.定義函數(shù)時后面的()是參數(shù)表,用來填入?yún)?shù),當沒有參數(shù)時,填(void),或者不填,但是不填表示參數(shù)表未知,并不代表沒有參數(shù)。最好確認沒有參數(shù)后填進void,否則當你值和函數(shù)頭里的參數(shù)類型不匹配時,數(shù)據(jù)會發(fā)生混亂。當然,int main()同樣
2.在調(diào)用函數(shù)時,括號里的逗號不是運算符,如:f(a,b),但如果是f((a,b)),那就是了,區(qū)別就是傳了倆個還是一個參數(shù)進去
3.注意:c語言不允許嵌套定義,一個函數(shù)里允許放別的函數(shù)的聲明,但不允許放別的函數(shù)的定義。
4.給return返回值時,不要加括號,雖然沒影響,但是容易誤解return也是定義函數(shù),把參數(shù)i的值傳進return
int main()返回return 0;是有意義的,有程序會查看


數(shù)組


右邊叫右值
賦值號右邊是讀取,左邊是寫入
數(shù)組的單元
1.數(shù)組的每個單元就是數(shù)組類型的一個變量。
2.使用數(shù)組時放在【】中的數(shù)字叫做下標或索引,下標從0開始記數(shù)。


這里的下標自動從0開始計數(shù),故循環(huán)內(nèi)不用初始化cnt,否則無法定義數(shù)組d
統(tǒng)計數(shù)的個數(shù)

數(shù)組運算

int count[number];
for ( i=0;i<number;i++ ) {
count[i]=0;
}可以表示為:
int count[n]={};
其中大括號中第一個數(shù)字給數(shù)組的第一個單元賦值,其余沒寫的賦值0

數(shù)組的大小







使用平方根sqrt()必須寫入#include <math.h>





a[i,j]=a[j],逗號運算符,從左向右,取逗號右邊為運算結(jié)果
二維數(shù)組的初始化

大括號中的大括號也可以不打,二維數(shù)組在內(nèi)存中的排列跟一維數(shù)組是一樣的,將這個矩陣從左上角到右下角,用這些數(shù)字逐行的填滿,為了讓人類讀者容易理解,可以加大括號
tic-tac-toe游戲制作步驟:



行列代碼基本相同

&a==a==&a[0]==&a[1]地址相同
指針p的值是某個變量的地址
*p是一個int所以p是一個指針

指針:定義一個指針要*+一個變量->*p,這算是一個指針
int* p=int *p只是星號位置不同,定義倆個指針需要倆個星號不能理解為int *p,q;而是int *p,*q;



*是一個單目運算符,用來訪問指針的值所表示的地址上的變量
當*p作為一個整體時,可以看作是一個·整數(shù)
數(shù)組參數(shù):
在函數(shù)參數(shù)表中是等價的
一般函數(shù)的參數(shù)與調(diào)用他的地方是沒有聯(lián)系的,指針改變了這種情況


數(shù)組在傳入函數(shù)前后地址沒發(fā)生改變,但sizeof改變,傳進函數(shù)里的數(shù)組的大小是指針的大小,實際傳進后就變成指針了。
故沒法在函數(shù)里頭用sizeof得出正確的函數(shù)個數(shù),且在中括號里定義大小也沒有用。
在參數(shù)表里把數(shù)組寫成指針的樣子也是可以的




要么是指針不可修改,要么是通過指針不可修改


