##1.C語言的基本介紹??
·一個(gè)程序由一個(gè)或多個(gè)源程序組成搂妻,一個(gè)源程序文件中有且只有一個(gè)main函數(shù)。包括預(yù)處理指令`#include`,全局聲明邓厕,函數(shù)定義详恼。
·函數(shù)是C的重要組成部分,包括函數(shù)首部和函數(shù)體挽铁。
·最重要的一點(diǎn)敞掘,也是我學(xué)習(xí)C++后搞混的渐逃,程序總是從main函數(shù)開始執(zhí)行民褂,沒有main函數(shù)是會(huì)報(bào)錯(cuò)的赊堪。
·同時(shí)一個(gè)良好的編程習(xí)慣應(yīng)該包含注釋部分。
##2.程序靈魂——算法介紹??
###2.1什么是算法??
·首先程序是由算法加數(shù)據(jù)結(jié)構(gòu)這兩大類組成的脊僚,當(dāng)然還有一些細(xì)節(jié)遵绰,聲明啊椿访,注釋等。
·算法分兩大類加酵,一類是數(shù)值運(yùn)算猪腕,一類是非數(shù)值運(yùn)算算法钦勘,而不管是什么算法彻采,都是為了在一件事情中找到一定規(guī)律去做朵栖,按計(jì)劃好的去實(shí)現(xiàn)避免出
###2.2算法特性??
·有窮性陨溅,一個(gè)算法應(yīng)該包含有限的操作步驟绍在。
·確定性偿渡。算法中每一個(gè)步驟都應(yīng)該是確定的。
·有零個(gè)或多個(gè)輸入吉拳。
·有一個(gè)或多個(gè)輸出留攒。
·有效性嫉嘀,算法每一個(gè)步驟都應(yīng)該有效執(zhí)行。
###2.3算法基本結(jié)構(gòu)??
·順序結(jié)構(gòu)
·循環(huán)結(jié)構(gòu)
·選擇結(jié)構(gòu)
##3.順序結(jié)構(gòu)及一些C的基礎(chǔ)要點(diǎn)??
###3.1數(shù)據(jù)表現(xiàn)形式??
·常量
????常量分為整型拭宁,實(shí)型杰标,字符型彩匕,字符串和符號常量推掸。而字符常量中有一種轉(zhuǎn)義字符,以'\'開頭登渣,最常見的是'\n'胜茧,表示換行。符號常量例子`#define PI 3.14`??
·變量
????變量必須先定義后使用雹顺。??
·常變量
????'const int a = 1;'??
`標(biāo)識(shí)符
????C語言規(guī)定標(biāo)識(shí)符只能由數(shù)字,字母或下劃線組成廊遍,數(shù)字不能開頭嬉愧。??
###3.2整型數(shù)據(jù)???
·分類
|類型|字節(jié)數(shù)|取值|
| --- | --- | --- |
|int|4|-2^31~(2^31-1)|
|unsigned int|4|0~(2^32-1)|
|short|2|-2^15~(2^15-1)|
|unsigned short|2|0~2^16-1|
|long|4|-2^31~(2^31-1)|
|unsigned long|4|0~(2^32-1)|
###3.3字符型數(shù)據(jù)????
沒啥就一樣
###3.4浮點(diǎn)型數(shù)據(jù)????
·float,double喉前,long double
##4.選擇結(jié)構(gòu)程序設(shè)計(jì)??
這里也沒啥就是if和switch没酣,然后需要搞一下運(yùn)算優(yōu)先級。
·關(guān)系運(yùn)算符優(yōu)先級
????<,>,<=,>=,==,!=,這里前四種的運(yùn)算優(yōu)先級相同且高于后兩種的運(yùn)算優(yōu)先級卵迂。??
·邏輯運(yùn)算符優(yōu)先級
????裕便!高于&&高于||。??
????且非的運(yùn)算優(yōu)先級是最高的见咒,然后是算數(shù)運(yùn)算符,到關(guān)系運(yùn)算符改览,到&&和||下翎,最后是賦值運(yùn)算符。??
·條件運(yùn)算符
????條件運(yùn)算符有一個(gè)條件表達(dá)式恃疯,由兩個(gè)符號漏设?和:組成,必須一起使用今妄,及`表達(dá)式1?表達(dá)式2:表達(dá)式3`???
```
max=(a>b)?a:b??
//等價(jià)于??
if (a>b)??max=a;??
else max=b;??
//同樣也可以寫成??
a>b?printf("%d",a):printf("%d",b)??
```
##5.循環(huán)結(jié)構(gòu)程序筆記??
處理一些需要重復(fù)的問題鸳碧,可以選擇循環(huán)結(jié)構(gòu)盾鳞。
###5.1 while語句????
·while語句就是只要當(dāng)循環(huán)條件表達(dá)式為真,就執(zhí)行循環(huán)體語句瞻离。
```
?#include<stdio.h>??
int main()???
{??
????int i=1,m=0??
????while(i<100)??
????{??
????????m=m+i;??
????????i++;??
????}??
????printf("m=%d",m);??
????return 0;??
}??
```
###5.2 do...while語句??
·特點(diǎn)就是先無條件執(zhí)行一遍循環(huán)體腾仅,然后判斷循環(huán)條件是否成立。
###5.3 for語句??
·for語句是用到最多的循環(huán)語句套利,一般形式是for(表達(dá)式1推励;表達(dá)式2;表達(dá)式3)下面接語句
????表達(dá)式1:設(shè)置初始條件肉迫,只執(zhí)行一次
????表達(dá)式2:循環(huán)條件表達(dá)式验辞,判斷是否循環(huán)
????表達(dá)式3:循環(huán)調(diào)整語句
###5.4 循環(huán)的終止結(jié)束??
·break語句提前終止循環(huán),也可以跳出switch語句喊衫。
·continue語句提前結(jié)束本次循環(huán)跌造,不繼續(xù)走下面的程序,而不結(jié)束整個(gè)循環(huán)。
##6.利用數(shù)組處理批量數(shù)據(jù)??
·數(shù)組是一組有序數(shù)據(jù)的集合壳贪,數(shù)組中每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類型陵珍,用一個(gè)數(shù)組名和下標(biāo)來唯一的確定數(shù)組中的元素。
###6.1 一維數(shù)組初始化??
·在定義是賦初始值违施。
????`int a[10]={0,1,2,3,4,5,6,7,8,9};`??
·可以只給一部分賦值
·也可以賦值0互纯,`int a[10]={0,1,2,3,4,5,6,7,8,9};`或者`int a[10]={0}`
·也可以不指定數(shù)組長度
###6.2 冒泡法??
```?
??#include <stdio.h>??
int main()??
{??
?????int a[10];??
????int i,j,t;??
????printf("input 10 numbers:\n");??
????for(i=0;i<10;i++)??
????????scanf("%d",&a[i]);???
????printf("\n");??
????for(j=0;j<9;j++)??
????{??
????????for(i=0;i<9-j;i++)??
????????{??
????????????if(a[i]>a[i+1])??????
????????????{??
????????????????t=a[i];??
????????????????a[i]=a[i+1];??
????????????????a[i+1]=t;??
????????????}??
????????}??
????}???
????printf("the sorted number:\n");??
????for(i=0;i<10;i++)??
????????printf("%d",a[i]);??
????printf("\n");??
????return 0;??
}???
```
###6.3字符數(shù)組???
·如果花括號內(nèi)提供初值個(gè)數(shù)大于數(shù)組長度,則報(bào)錯(cuò)磕蒲。如果初值個(gè)數(shù)小于數(shù)組長度伟姐,則置賦值前面哪些元素,后面空的填\0,即空字符亿卤。
·C語言規(guī)定字符串結(jié)束標(biāo)志,以字符\0作為結(jié)束標(biāo)志愤兵。如果字符數(shù)組中存在字符,前九個(gè)都不是空字符排吴,而第十個(gè)是\0秆乳,認(rèn)為數(shù)組中有一個(gè)字符串,有效字符九個(gè)钻哩。
·在向內(nèi)存中存儲(chǔ)時(shí)屹堰,系統(tǒng)會(huì)自動(dòng)在最后加一個(gè)'\0',那么就有了下面這個(gè)
```??
?char c[]="i am happy";??
//等價(jià)于??
char c[]={"i am happy"};??
//等價(jià)于??
char c[]={'i','','a','m','','h','a','p','p','y','\0'};??
//而不與下面這個(gè)等價(jià)??
char c[]={'i','','a','m','','h','a','p','p','y'}街氢;??
//前三者長度為11扯键,最后一個(gè)為10??
```
·字符數(shù)組輸出不包括'\0','printf("%s",c)'珊肃。
###6.4 一些字符串相關(guān)函數(shù)
·puts——輸出字符串荣刑,其作用是將一個(gè)字符串(以\0結(jié)束)輸出到終端。'puts(str);'
`gets——輸入字符串伦乔,從終端輸入一個(gè)字符串厉亏,得到一個(gè)函數(shù)值。
·strcat——字符串拼接烈和,'strcat(str1爱只,str2)',將str2拼接到str1后面,str1必須足夠大招刹。
·strcpy和strncpy——字符串復(fù)制恬试,'strcpy(str1,str2)',將str2復(fù)制到str1中,從起始位開始疯暑,str1也需要足夠大训柴。'strncpy(str1,str2,2)',將str2中前2個(gè)復(fù)制到str1中。取代str1中前兩個(gè)字符缰儿。
strcmp——字符串比較函數(shù)畦粮。'strcmp(str1,str2)',將兩個(gè)字符串從左至右比,若全部相同則字符串相等宣赔,出現(xiàn)不同预麸,以第一個(gè)不同為準(zhǔn)。結(jié)果由函數(shù)值帶回儒将,相同0吏祸,str1>str2,返回一個(gè)正整數(shù)钩蚊,str1
·strlen——測字符串長度贡翘,不包括\0。
·strlwr——轉(zhuǎn)換小寫
·strupr——轉(zhuǎn)換大寫
##7.指針??
###7.1 什么是指針??
·vc中為int分配4個(gè)字節(jié)砰逻,float四個(gè)字節(jié)鸣驱,char一個(gè)字節(jié),內(nèi)存區(qū)每一個(gè)字節(jié)有一個(gè)編號蝠咆,這就是地址踊东,地址指向的是該變量單元,地址稱為指針刚操。
·'i_pointer = &i;'表示將i的地址存放到i_pointer中闸翅,i的地址是2000,那i_pointer的值就是2000菊霜,這個(gè)2000是i的地址坚冀。這時(shí)i=3,那么*i_pointer=3鉴逞;*i_pointer表示i_pointer所指對象记某。此時(shí),*i_pointer是指針华蜒,指向一個(gè)地址辙纬,i_pointer是指針變量,存放地址的變量叭喜。
###7.2 指針變量定義和初始化
·類型名 * 指針變量名
????'int * p;'??
·**初始化(這是定義加初始化,不是指針變量的賦值過程蓖谢,區(qū)分N嬖獭!)**
????'int * p = &a;'//定義指針變量p闪幽,指向a啥辨。??
**定義時(shí) 指針變量前面的'*'表示該變量為指針型變量,指針變量名是p盯腌,不是'*p'溉知。**
·一個(gè)變量的指針包含兩個(gè)方面,以是以存儲(chǔ)單元編號表示的純地址,一是指向的存儲(chǔ)單元的數(shù)據(jù)類型级乍。
###7.3 字符串指針??
```??
·char *string = "hello world";??
等價(jià)于??
char *string舌劳;??
string = "hello world";??
//把字符串第一個(gè)元素地址賦值給指針變量string,輸出的時(shí)候會(huì)自動(dòng)加1玫荣。??
```
##8.自建數(shù)據(jù)類型??
###8.1結(jié)構(gòu)體??
·聲明
????struct 結(jié)構(gòu)體名??
????{成員列表}甚淡;??
????//成員聲明需要有類型聲明,***類型名 成員名***??
·在聲明同時(shí)定義變量
????struct 結(jié)構(gòu)體名??
????{成員列表??
????}變量名列表捅厂;??
·定義結(jié)構(gòu)體數(shù)組
????struct 結(jié)構(gòu)體名??
????{成員列表}數(shù)組名[數(shù)組長度]贯卦;??
·結(jié)構(gòu)體指針
????p指向一個(gè)結(jié)構(gòu)體變量stu。下面三種用法等價(jià)??
- stu.num(stu.成員名)
- (*p).成員名
- p->num
·枚舉
聲明
????enum [枚舉名]{枚舉元素列表};??
????//枚舉元素不能賦值??
????enum Weekday{a焙贷,b撵割,c};??
定義變量
????enum Weekday??workday辙芍;??
????//???枚舉類型???枚舉變量??
????workday = a啡彬;?
##9。對文件的輸入輸出??
·一個(gè)文件要有一個(gè)唯一的文件標(biāo)識(shí)沸手,文件標(biāo)識(shí)包括三部分:
-?文件路徑
-?文件名主干
-?文件后綴
????'C:\temp\file.dat'??
·映像文件-在內(nèi)存中以二進(jìn)制形式存儲(chǔ)的外遇,不加轉(zhuǎn)換的輸出到外存,就是二進(jìn)制文件契吉,可以認(rèn)為它就是存儲(chǔ)在內(nèi)存的數(shù)據(jù)的映像跳仿。
·文本文件-要求在外存上以ASCII代碼形式存儲(chǔ),則需要在存儲(chǔ)前進(jìn)行轉(zhuǎn)換捐晶。
·fopeen(文件名菲语,使用文件方式);
|文件使用方式|???????含??????義??????|指定文件不存在|
|--|--|--|
|r(只讀)|打開一個(gè)已存在的文件輸入數(shù)據(jù)|出錯(cuò)???|
|w(只寫)|打開一個(gè)文本文件寫入數(shù)據(jù)|建立新文件|
|a(追加)|向文本文件尾添加數(shù)據(jù)|出錯(cuò)|
|r+(讀寫)|打開一個(gè)文本文件讀寫|出錯(cuò)???|
|w+(讀寫)|打開一個(gè)新的文本文件讀寫|建立新文件|
????如果不能打開文件惑灵,fopen函數(shù)將帶回一個(gè)出錯(cuò)信息山上,返回一個(gè)空指針NULL。??
????'if((fp=fopen("file","r"))==NULL)'??
·關(guān)閉文件 fclose(文件指針)英支;
·讀寫一個(gè)字符
????fgetc(fp)從fp指向的文件讀入一個(gè)字符??
????fputc(ch佩憾,fp)將字符ch寫到文件指針變量fp所指文件。??
·讀寫一個(gè)字符串
????fgets(str干花,n妄帘,fp)n是要求得到的個(gè)數(shù),但實(shí)際只從fp所指文件中讀入n-1個(gè)字符池凄,最后加一個(gè)'\0',這樣得到字符串共有n個(gè)字符抡驼,放到字符數(shù)組str中。讀完前遇到'\n'或文件結(jié)束符EOF肿仑,讀入結(jié)束致盟,但遇到的'\n'也將作為字符讀入碎税,函數(shù)出錯(cuò)返回NULL。??
·格式化方法讀寫文本文件
????fprintf(文件指針馏锡,格式字符串雷蹂,輸出列表);??
????fscanf(文件指針眷篇,格式字符串萎河,輸出列表);??