c語言基礎
- C語言一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特色迅速在全世界普及和推廣。C語言不但執行效率高並且可移植性好,能夠用來開發應用軟件、驅動、操做系統等。C語言也是其它衆多高級語言的鼻祖語言,因此說學習C語言是進入編程世界的必修課。
- helloword
#include<stdio.h>
int main()
{
printf("Hello Word ");
return 0;
}
- 簡單來講,一個C程序就是由若干頭文件和函數組成
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- #include <stdio.h>就是一條預處理命令,它的做用是通知C語言編譯系統在對C程序進行正式編譯以前需作一些預處理工做
- 函數就是實現代碼邏輯的一個小的單元。
- 注:在最新的C標準中,main函數前的類型爲int而不是void
c數據類型
- 標識符:編程時給變量或者函數起的名字就是標識符
- C 語言規定:標識符能夠是字母(A~Z,a~z)、數字(0~9)、下劃線_組成的字符串,而且第一個字符必須是字母或下劃線。
- 標識符時還有注意如下幾點:
- (1)標識符的長度最好不要超過8位,由於在某些版本的C中規定標識符前8位有效,當兩個標識符前8位相同時,則被認爲是同一個標識符。
- (2)標識符是嚴格區分大小寫的
- (3)標識符最好選擇有意義的英文單詞組成作到"見名知意",不要使用中文
- (4)標識符不能是C語言的關鍵字
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
變量及賦值
- 變量就是能夠變化的量,而每一個變量都會有一個名字(標識符)。
- 變量佔據內存中必定的存儲單元。使用變量以前必須先定義變量,
- 要區分變量名和變量值是兩個不一樣的概念
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 變量定義的通常形式爲:數據類型 變量名;
- 多個類型相同的變量:數據類型 變量名, 變量名, 變量名...;
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注意:在定義中不容許連續賦值,如int a=b=c=5;是不合法的
- 變量的賦值分爲兩種方式:1.先聲明再賦值 2.聲明的同時賦值
//先聲明,再賦值
int num;
num = 100;
//聲明的同時賦值
int x = 10;
基本數據類型
- C語言中,數據類型可分爲:基本數據類型,構造數據類型,指針類型,空類型四大類。
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 基本數據類型是最簡單也最經常使用的:整型,實型與字符型
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注:int、short int、long int是根據編譯環境的不一樣,所取範圍不一樣。而其中short int和long int至少是表中所寫範圍,可是int在表中是以16位編譯環境寫的取值範圍。另外 c語言int的取值範圍在於他佔用的字節數 ,不一樣的編譯器,規定是不同。ANSI標準定義int是佔2個字節,TC是按ANSI標準的,它的int是佔2個字節的。可是在VC裏,一個int是佔4個字節的。
- 浮點數據是指帶小數的數字,精度的不一樣又分爲3種:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
不可改變的常量
- 在程序執行過程當中,值不發生改變的量稱爲常量。C語言的常量能夠分爲直接常量和符號常量
- 直接常量也稱爲字面量,是能夠直接拿來使用,無需說明的量,好比:
- 整型常量:1三、0、-13;
- 實型常量:13.3三、-24.4;
- 字符常量:‘a’、‘M’
- 字符串常量:」I love you」
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 在C語言中,能夠用一個標識符來表示一個常量,稱之爲符號常量。符號常量在使用以前必須先定義,其通常形式爲:
#define 標識符 常量值
- 常量的標示符通常習慣使用大寫字母,變量的標示符通常習慣使用小寫字母,加以區分。下面是一個使用符號常量的小例子:
#include <stdio.h>
#define PI 3.14 //定義常量及常量值
int main()
{
printf("小明今天又獲得%d元零花錢\n",PI );
return 0;
}
自動類型轉換
- 自動轉換髮生在不一樣數據類型運算時,在編譯的時候自動完成。自動轉換遵循的規則就比如小盒子能夠放進大盒子裏面同樣,下圖表示了類型自動轉換的規則。
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
#include <stdio.h>
int main()
{
char c = 'a';
int n = c; //將c賦值給n
float f = c; //將c賦值給f
double d = c; //將c賦值給d
printf("%d\n",n);
printf("%f\n",f);
printf("%lf\n",d);
return 0;
}
- 注:字節小的能夠向字節大的自動轉換,但字節大的不能向字節小的自動轉換
強制類型轉換
- 強制類型轉換是經過定義類型轉換運算來實現的。其通常形式爲:**(數據類型) (表達式) **
- 例如:
#include <stdio.h>
int main()
{
double num = 2.5; //定義浮點型變量num並賦值爲2.5
printf("num的整數部分是%d\n",(int) num);
return 0;
}
- 強制類型轉換是應注意如下幾點:
- 數據類型和表達式都必須加括號,如把(int)(x/2+y)寫成(int)x/2+y則成了把x轉換成int型以後再除2再與y相加了
- 轉換後不會改變原數據的類型及變量值,只在本次運算中臨時性轉換。
- 強制轉換後的運算結果不遵循四捨五入原則
c語言中運算符
- C語言中的運算是什麼?C語言中的運算就是對數據進行操做、處理的過程。那麼運算符又幹什麼的呢?運算符就是指定該運算的處理方式。
- c語言中運算符包括:
- 算術運算符
- 賦值運算符
- 關係運算符
- 邏輯運算符
- 三目運算符
算術運算符
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注:C語言中沒有乘方這個運算符,也不能用×,÷等算術符號。 ### 自增與自減運算符 -自增運算符爲「++」,其功能是使變量的值自增1;自減運算符爲「--」,其功能是使變量值自減1。它們常用在循環中。自增自減運算符有如下幾種形式:
- 注意:不管是a++仍是++a都等同於a=a+1,在表達式執行完畢後a的值都自增了1,不管是a--仍是--a都等同於a=a-1,在表達式執行完畢後a的值都自減小1 -例如:編程
#include <stdio.h>
int main()
{
int x = 0;
printf("x=%d\n",x++);//x=0
printf("x=%d\n",++x);//x=2
return 0;
}
賦值運算符
- C語言中賦值運算符分爲簡單賦值運算符和複合賦值運算符
- 簡單賦值運算符 "="
- 複合賦值運算符就是在簡單的運算符「=」以前加上其餘運算符如:+=、-=、*=、/=、%=
- 注意:複合運算符中運算符和等號之間是不存在空格的
關係運算符
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 關係表達式的值是「真」和「假」,在c語言中用整數1和0表示
邏輯運算符
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 邏輯運算的值也是有兩種分別爲「真」和「假」,C語言中用整型的1和0來表示。其求值規則以下:
-
- 與運算(&&)
- 參與運算的兩個變量都爲真時,結果才爲真,不然爲假。例如:5>=5 && 7>5 ,運算結果爲真;
-
- 或運算(||)
- 參與運算的兩個變量只要有一個爲真,結果就爲真。 兩個量都爲假時,結果爲假。例如:5>=5||5>8,運算結果爲真;
-
- 非運算(!)
- 參與運算的變量爲真時,結果爲假;參與運算量爲假時,結果爲真。例如:!(5>8),運算結果爲真
三目運算符
- C語言中的三目運算符:「?:」,其格式爲: ** 表達式1 ? 表達式2 : 表達式3;**
- 執行過程是:
- 先判斷表達式1的值是否爲真,若是是真的話執行表達式2;若是是假的話執行表達式3。
#include <stdio.h>
int main()
{
//定義小編兜裏的錢
double money = 12 ;
//定義打車回家的費用
double cost = 11.5 ;
printf("小編能不能打車回家呢:");
//輸出y小編就打車回家了,輸出n小編就不能打車回家
printf( money > cost ? "y" :"n" );
return 0;
}
運算符優先級
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 優先級別爲1的優先級最高,優先級別爲10的優先級別最低。
- 不必去死記運算符的優先級順序,記住最高優先級別的,在開發中就會無敵啦
c程序中結構語句
分支結構之簡單if語句
if(表達式)
{
執行代碼塊;
}
- 其語義是:若是表達式的值爲真,則執行其後的語句,不然不執行該語句。 其過程可表示爲下圖:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
#include <stdio.h>
int main()
{
int height = 100;
//補全全部代碼
if(height >= 180);
{
printf("%s\n","恭喜小明能夠參加校籃球隊");
}
return 0;
}
### 分支結構之簡單if-else語句數組
- 在C語言中就要用到if-else語句了,簡單的if-else語句的基本結構以下:
if(表達式)
{
執行代碼塊1;
}
else
{
執行代碼塊2;
}
- 其主義是:若是表達式的值爲真,則執行代碼塊1,不然執行代碼塊2。其執行過程可表示爲下圖:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注意:if()後面沒有分號,直接寫{},else後面也沒有分號,直接寫{}
- 例如:
#include <stdio.h>
int main()
{
int year = 2014; //今年是2014年
//補全一下代碼
if(year%4 == 0 && year%100 != 0 || year%400 ==0 )
{
printf("%s\n","今年是閏年");
}else{
printf("%s\n","今年是平年");
}
return 0;
}
分支結構之多重if-else語句
- 在C語言中就要用到多重if-else語句,其結構以下:
if(表達式1)
{
執行代碼塊1;
}
else if(表達式2)
{
執行代碼塊2;
}
else
{
執行代碼塊3;
}
- 其語義是:依次判斷表達式的值,當出現某個值爲真時,則執行對應代碼塊,不然執行代碼塊n。 if-else-if語句的執行過程以下圖所示:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
#include <stdio.h>
int main()
{
int score = 7200;
if(score>=10000)//完善一下代碼
{
printf("%s\n","鑽石玩家");
}
else if(score>=5000&&score<=10000)
{
printf("%s\n","白金玩家");
}
else if(score>=1000&&score<=5000)
{
printf("%s\n","青銅玩家");
}
else(score<1000)
{
printf("%s\n","普通玩家");
}
return 0;
}
分支結構之嵌套if-else語句
- C語言中嵌套if-else語句。嵌套if-else語句的意思,就是在if-else語句中,再寫if-else語句。其通常形式爲:
if(表達式)
{
if(表達式)
{
執行代碼塊
}
else
{
執行代碼 塊
}
}
else
{
執行代碼塊
}
- 其執行過程爲:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 例如:
#include <stdio.h>
int main()
{
int results = 98; //results爲所考成績
int ranking = 2; //ranking爲所考排名
if(results > 90)
{
if(ranking <= 3)
{
printf("%s\n","吃大餐")
}
else
{
printf("%s\n", "買玩具")
}
}
else
{
printf("%s\n","沒有獎勵")
}
循環結構之while循環
while(表達式)
{
執行代碼塊
}
- 其中表達式表示循環條件,執行代碼塊爲循環體。while語句的語義是:計算表達式的值,當值爲真(非0)時, 執行循環體代碼塊。其執行過程可用下圖表示:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 使用while語句應注意如下幾點:
- 一、while語句中的表達式通常是關係表達或邏輯表達式,當表達式的值爲假時不執行循環體,反之則循環體一直執行。
- 二、必定要記着在循環體中改變循環變量的值,不然會出現死循環(無休止的執行)。
- 三、循環體若是包括有一個以上的語句,則必須用{}括起來,組成複合語句。
- 例如:
#include <stdio.h>
int main()
{
int i,sum=0;
i=1;
while( i <= 100 ) //循環條件應該是什麼呢?
{
sum=sum+i;
i++; //這裏是否是應該改變循環變量的值
}
printf("100之內全部整數之和爲:%d\n", sum);
return 0;
}
循環結構之do-while循環
do
{
執行代碼塊
}while(表達式);//注意:這裏有分號
- do-while循環語句的語義是:它先執行循環中的執行代碼塊,而後再判斷while中表達式是否爲真,若是爲真則繼續循環;若是爲假,則終止循環。所以,do-while循環至少要執行一次循環語句。其執行過程可用下圖表示:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注意:使用do-while結構語句時,while括號後必須有分號。
- 例如:
#include <stdio.h>
int main()
{
int number=200;
int year=2014;
do{
year++;
number = number * 0.2;
}while(number<1000);
printf("到%d年招工規模突破1000人\n", year);
return 0;
}
循環結構之for循環(一)
for(表達式1;表達式2;表達式3)
{
執行代碼塊
}
- 執行過程 以下:
- 第一步:執行表達式1,對循環變量作初始化
- 第二步:判斷表達式2,若其值爲真(非0),則執行for循環體中執行代碼塊,而後向下執行;若其值爲假(0),則結束循環;
- 第三步:執行表達式3;
- 第四步:執行for循環中執行代碼塊後執行第二步;
- 第五步:循環結束,程序繼續向下執行。
- 如圖過程:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
#include <stdio.h>
int main()
{
// 定義變量sum, num
int sum, num;
sum = 0;
for(num = 0; num <= 10 ; num++ ) //for循環條件與num的變化值
{
sum += num; //計算每次數字之間的和sum
}
printf("10之內數的和爲:%d", sum);
return 0;
}
循環結構之for循環(二)
- 在for循環中,表達式1是一個或多個賦值語句,它用來控制變量的初始值;表達式2是一個關係表達式,它決定何時退出循環;表達式3是循環變量的步進值,定義控制循環變量每循環一次後按什麼方式變化。這三部分之間用分號(;)分開。
- 使用for語句應該注意:
- 一、for循環中的「表達式一、二、3」都可能夠缺省,但分號(;)不能缺省。
- 二、省略「表達式1(循環變量賦初值)」,表示不對循環變量賦初始值。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 三、省略「表達式2(循環條件)」,不作其它處理,循環一直執行(死循環)。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 四、省略「表達式3(循環變量增量)」,不作其餘處理,循環一直執行(死循環)。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 注:死循環可使用後面即將講到的break解決
- 表達式1能夠是設置循環變量的初值的賦值表達式,也能夠是其餘表達式。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 六、表達式1和表達式3能夠是一個簡單表達式也能夠是多個表達式以逗號分割。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 運行結果爲:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 七、表達式2通常是關係表達式或邏輯表達式,但也但是數值表達式或字符表達式,只要其值非零,就執行循環體。
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 八、各表達式中的變量必定要在for循環以前定義。如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
循環結構之三種循環比較
- while、do-while和for三種循環在具體的使用場合上是有區別的,以下:
- 一、在知道循環次數的狀況下更適合使用for循環;
- 二、在不知道循環次數的狀況下適合使用while或者do-while循環,若是有可能一次都不循環應考慮使用while循環,若是至少循環一次應考慮使用do-while循環
- 可是從本質上講,while,do-while和for循環之間是能夠相互轉換的,如:小明被老師罰抄10次computer這個單詞,分別用三種語法寫:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
循環結構之多重循環
- 多重循環就是在循環結構的循環體中又出現循環結構。
- 在實際開發中通常最多用到三層重循環。由於循環層數越多,運行時間越長,程序越複雜,因此通常用2-3層多重循環就能夠了。另外不一樣循環之間也是能夠嵌套的。
- 多重循環在執行的過程當中,外層循環爲父循環,內層循環爲子循環,父循環一次,子循環須要所有執行完,直到跳出循環。父循環再進入下一次,子循環繼續執行...
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)
{
/* 觀察每行的空格數量,補全循環條件 */
for( j = i; j < 5 ; j++ )
{
printf(" "); //輸出空格
}
/* 觀察每行*號的數量,補全循環條件 */
for( k = 0 ; k<2*i-1 ; k++ )
{
printf("*"); //每行輸出的*號
}
printf("\n"); //每次循環換行
}
return 0;
}
結束語句之break語句
- 在C語言中,可使用break跳出循環,代碼實現以下:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 用break語句時注意如下幾點:
- 一、在沒有循環結構的狀況下,break不能用在單獨的if-else語句中
- 二、在多層循環中,一個break語句只跳出當前循環。
結束語句之continue語句
- 在C語言中,可使用continue語句跳出本次循環,代碼實現以下:
#include <stdio.h>
int main()
{
int i, sum;
for(i=1, sum=0; i<=20; i++)
{
if( i % 3 == 0 ) //能被3整除這個條件如何寫呢?
{
continue; //應該用哪一個循環結束語句呢?
}
sum += i;
}
printf("sum=%d\n", sum);
return 0;
}
- continue語句的做用是結束本次循環開始執行下一次循環。
- break語句與continue語句的區別是:break是跳出當前整個循環,continue結束本次循環開始下一次循環
分支結構之switch語句
- C語言還提供了一種用於多分支選擇的switch語句:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 在使用switch語句時還應注意如下幾點:
- 一、在case後的各常量表達式的值不能相同,不然會出現錯誤。
- 二、在case子句後若是沒有break;會一直日後執行一直到遇到break;纔會跳出switch語句。
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
涵數
自定義函數
- C語言提供了大量的庫函數,好比stdio.h提供輸出函數,可是仍是知足不了咱們開發中的一些邏輯,因此這個時候須要本身定義函數,自定義函數的通常形式:
[數據類型說明] 函數名稱([參數])
{
執行代碼塊;
return (表達式)
}
- 注意:
- 一、[]包含的內容能夠省略,數據類型說明省略,默認是int類型函數;參數省略表示該函數是無參函數,參數不省略表示該函數是有參函數;
- 二、函數名稱遵循標識符命名規範
- 三、自定義函數儘可能放在main函數以前,若是要放在main函數後面的話,須要在main函數以前先聲明自定義函數,聲明格式爲:[數據類型說明] 函數名稱([參數]);
- 例如:
#include <stdio.h>
/* 自定義整型函數 sayLove() */
int sayLove()
{
//在這裏輸入輸出語句printf,輸出內容爲I Love imooc
printf("%d\n",'love');
return 0;
}
/* 自定義整型函數 dividLine() */
int dividLine()
{
printf("%s\n", "*************");
return 0;
}
/* 主函數 */
int main()
{
return 0;
}
函數的調用
函數名([參數]);
- 注意:
- 一、對無參函數調用的時候能夠將[]包含的省略。
- 二、[]中能夠是常數,變量或其它構造類型數據及表達式,個參數之間用逗號分隔
- 例如:
#include <stdio.h>
/* 自定義整型函數 sayLove() */
int sayLove()
{
//在這裏輸入輸出語句printf,輸出內容爲I Love imooc
printf("%s\n", "Love");
return 0;
}
/* 自定義整型函數 dividLine() */
int dividLine()
{
printf("%s\n", "*************");
return 0;
}
/* 主函數 */
int main()
{
/* 調用所寫函數 */
sayLove();
dividLine();
return 0;
}
有參數和無參數
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 有參函數和無參函數的惟一區別在於:函數()中多了一個參數列表。
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
形參與實參
- 形參是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數
- 實參是在調用時傳遞該函數的參數
- 函數的形參和實參具備如下特色:
- 形參只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。所以,形參只有在函數內部有效。函數調用結束返回主調函數後則不能再使用該形參變量。
- 實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,它們都必須具備肯定的值,以便把這些值傳送給形參。所以應預先用賦值等辦法使實參得到肯定值。
- 在參數傳遞時,實參和形參在數量上,類型上,順序上應嚴格一致,不然會發生類型不匹配」的錯誤。
- 例如:
#include <stdio.h>
int getGirth(int a,int b,int c)
{
if( (a+b)<=c || (a+c)<=b || (b+c)<=a ) //判斷是否爲三角形
{
printf("不構成三角形\n");
return 0;
}
else
{
int cirf = a + b + c ; //計算三角形周長
return cirf;
}
}
int main()
{
/* 定義三角形三邊長 */
int a, b, c;
a = 3;
b = 4;
c = 5;
printf("三角形的周長是:%d\n", getGirth(a,b,c)); //調用周長函數
return 0;
}
函數的返回值
- 函數的返回值是指函數被調用以後,執行函數體中的程序段所取得的並返回給主調函數的值。
- 函數的返回值要注意如下幾點:
-
- 函數的值只能經過return語句返回主調函數。return語句的通常形式爲:
return 表達式 或者爲: return (表達式);
-
- 函數值的類型和函數定義中函數的類型應保持一致。若是二者不一致,則以函數返回類型爲準,自動進行類型轉換。
- 例如:
返回一個字符型數據,用代碼表示就是
char option()
{
return 'A'
}
int number()
{
return 100;
}
void noResult()
{
執行代碼塊
}
- 注意:void函數中能夠有執行代碼塊,可是不能有返回值,另void函數中若是有return語句,該語句只能起到結束函數運行的功能。其格式爲:return;
遞歸函數
- 遞歸就是一個函數在它的函數體內調用它自身
- 例如:計算n的階乘可使用如下代碼:
#include <stdio.h>
int factorial(int n){
int result;
if(n < 0)
{
printf("輸入錯誤!");
return 0;
}
else if(n == 0 || n == 1)
{
result = 1;
}
else
{
result = factorial(n - 1) * n;
}
return result;
}
int main()
{
int n = 5;
printf("%d的階乘=%d", n, factorial(n));
return 0;
}
局部變量和全局變量
- 局部變量也稱爲內部變量,做用域僅限於函數內
- 全局變量也稱爲外部變量,其做用域是整個源程序
- 例如:
#include <stdio.h>
int x = 1;//全局變量
int fn1(int x){
int y,z;//局部變量
z = 2;
y = x+z;
printf("y=%d\n", y);
return 0;
}
int main()
{
fn1(2)l//輸出4
int y = 10;
printf("x+y=%d", y+x);//輸出11
return 0;
}
數組
- 如何聲明一個數組:
- 數據類型 數組名稱[長度];
- C語言中的數組初始化是有三種形式的,分別是:
- 一、 數據類型 數組名稱[長度n] = {元素1,元素2…元素n};
- 二、 數據類型 數組名稱[] = {元素1,元素2…元素n};
- 三、 數據類型 數組名稱[長度n]; 數組名稱[0] = 元素1; 數組名稱[1] = 元素2; 數組名稱[n-1] = 元素n;
- 獲取數組
- 取數組元素時: 數組名稱[元素所對應下標];
- 例如:
- 如:初始化一個數組 int arr[3] = {1,2,3}; 那麼arr[0]就是元素1。
- 注意:
- 一、數組的下標均以0開始;
- 二、數組在初始化的時候,數組內元素的個數不能大於聲明的數組長度;
- 三、若是採用第一種初始化方式,元素個數小於數組的長度時,多餘的數組元素初始化爲0;
- 四、在聲明數組後沒有進行初始化的時候,靜態(static)和外部(extern)類型的數組元素初始化元素爲0,自動(auto)類型的數組的元素初始化值不肯定。
- 例如:
#include <stdio.h>
int main()
{
//第一種形式
int arrFirst[3] ={1,2,4};
//第二種形式
int arrSecond[] ={1,2,3};
//第三種形式
int arrThird[3];
//給arrThird數組每一個元素初始化
arrThird[0] = 1;
arrThird[1] = 2;
arrThird[2] = 3;
//輸出第一個數組中的第二個元素
printf("%d\n",arrFirst[1]);
//輸出第二個數組中的第二個元素
printf("%d\n", arrSecond[1]);
//輸出第三個數組中的第二個元素
printf("%d\n", arrThird[1]);
return 0;
}
數組的遍歷
- 數組遍歷時要注意如下幾點:
- 一、最好避免出現數組越界訪問,循環變量最好不要超出數組的長度,好比:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 二、C語言的數組長度一經聲明,長度就是固定,沒法改變,而且C語言並不提供計算數組長度的方法。
- 因爲C語言是沒有檢查數組長度改變或者數組越界的這個機制,可能會在編輯器中編譯並經過,可是結果就不能確定了,所以仍是不要越界或者改變數組的長度
- 例如:
#include <stdio.h>
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//補全代碼實現對數組arr的遍歷
int i;
for( i = 0; i < 10; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
數組做爲函數參數
- 一、整個數組看成函數參數,即把數組名稱傳入函數中,例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 二、數組中的元素看成函數參數,即把數組中的參數傳入函數中,例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 數組做爲函數參數時注意如下事項:
- 一、數組名做爲函數實參傳遞時,函數定義處做爲接收參數的數組類型形參既能夠指定長度也能夠不指定長度。
- 二、數組元素做爲函數實參傳遞時,數組元素類型必須與形參數據類型一致。
- 例如:
#include <stdio.h>
void Maxs(int arr[], int value)
{
int max = arr[0];
int index = 0;
int i;
for(i=1;i<5;i++){
if(arr[i]>max){
max = arr[i];
index = i;
}
}
arr[index] = value;
}
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {10,20,30,40,50};
int i;
Maxs(arr1,arr2[0]);
for(i=0;i<5;i++){
printf("%d\n", arr1[i]);
}
return 0;
}
字符串與數組
- 在C語言中,是沒有辦法直接定義字符串數據類型的
- 用數組來定義字符串有如下兩種格式:
- 一、char 字符串名稱[長度] = "字符串值";
- 二、char 字符串名稱[長度] = {'字符1','字符2',...,'字符n','\0'}; 注意:
- 一、[]中的長度是能夠省略不寫的;
- 二、採用第2種方式的時候最後一個元素必須是'\0','\0'表示字符串的結束標誌;
- 三、採用第2種方式的時候在數組中不能寫中文。
- 在輸出字符串的時候要使用:printf(「%s」,字符數組名字);或者puts(字符數組名字);。例如:
#include <stdio.h>
/* 定義say函數 */
void say(char string[]) //數組參數應該怎麼寫呢?
{
printf(" %s \n ",string); //打印字符串
}
int main()
{
//定義字符串數組
char string[] = "l love you";
char str2 = {"i","love","you","\0"};
say(string);
say(str2);
return 0;
}
字符串函數
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 使用字符串函數注意如下事項:
- 一、strlen()獲取字符串的長度,在字符串長度中是不包括‘\0’並且漢字和字母的長度是不同的。好比:
char str1[] = '小樣你';
char str2[] = {'i','l','o','e','\0'};
printf("字符串str1長度=%d\n",strlen(str1));//9
printf("字符串str1長度=%d\n",strlen(str2));//4
}
- 二、strcmp()在比較的時候會把字符串先轉換成ASCII碼再進行比較,返回的結果爲0表示s1和s2的ASCII碼相等,返回結果爲1表示s1比s2的ASCII碼大,返回結果爲-1表示s1比s2的ASCII碼小,例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 三、strcpy()拷貝以後會覆蓋原來字符串且不能對字符串常量進行拷貝,好比:
#include <stdio.h>
int main()
{
char str1[] = "love";
strcpy(str1,"i love you");
printf("%s\n",str1);
}
- 四、strcat在使用時s1與s2指的內存空間不能重疊,且s1要有足夠的空間來容納要複製的字符串,如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
多維數組
- 多維數組的定義格式是:
- 數據類型 數組名稱[常量表達式1][常量表達式2]...[常量表達式n];
- 例如:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 定義了一個名稱爲num,數據類型爲int的二維數組。其中第一個[3]表示第一維下標的長度,第二個[3]表示第二維下標的長度 如圖:
![在這裏輸入圖片標題 輸入圖片說明](http://static.javashuo.com/static/loading.gif)
- 多維數組的初始化與一維數組的初始化相似也是分兩種:
- 一、數據類型 數組名稱[常量表達式1][常量表達式2]...[常量表達式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
- 二、數據類型 數組名稱[常量表達式1][常量表達式2]...[常量表達式n]; 數組名稱[下標1][下標2]...[下標n] = 值;
- 多維數組初始化要注意如下事項:
- 一、採用第一種始化時數組聲明必須指定列的維數。由於系統會根據數組中元素的總個數來分配空間,當知道元素總個數以及列的維數後,會直接計算出行的維數;
- 二、採用第二種初始化時數組聲明必須同時指定行和列的維數。
- 例如:
#include <stdio.h>
void print(int arr[2][2])
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
//使用第一種方式初始化方式聲明並初始化二維數組arr1
int arr1[2][2]={{10,20},{30,40}};
print(arr1);
printf("*****\n");
//使用第二種方式初始化方式聲明並初始化二維數組arr2
int arr2[2][2];
arr2[0][0]=10;
arr2[0][1]=20;
arr2[1][0]=30;
arr2[1][1]=40;
print(arr2);
return 0;
}