?
#includeint main() { /*在雙引號中間輸入Hello World*/ ????printf("Hello?World");?//在屏幕打印輸出Hello World return 0; }
?
????注:在最新的C標準中,main函數前的類型為int而不是void
C語言的具體結構
????簡單來說,一個C程序就是由若干頭文件和函數組成。
????#include
????函數就是實現代碼邏輯的一個小的單元。
必不可少之主函數
????一個C程序有且只有一個主函數,即main函數。
C程序就是執行主函數里的代碼,也可以說這個主函數就是C語言中的唯一入口
而main前面的int就是主函數的類型
printf()是格式輸出函數,這里就記住它的功能就是在屏幕上輸出指定的信息
return是函數的返回值,根據函數類型的不同,返回的值也是不同的
是轉義字符中的換行符。(注意:C程序一定是從主函數開始執行的)
寫代碼的良好習慣
一個說明或一個語句占一行,例如:包含頭文件、一個可執行語句結束都需要換行
函數體內的語句要有明顯縮進,通常以按一下Tab鍵為一個縮進
括號要成對寫,如果需要刪除的話也要成對刪除
當一句可執行語句結束的時候末尾需要有分號
代碼中所有符號均為英文半角符號
程序解釋——注釋
??? C語言注釋方法有兩種:
?
多行注釋:/*?注釋內容?*/ 單行注釋://注釋一行
?
C標識符
??? C語言規定,標識符可以是字母(A~Z,a~z)、數字(0~9)、下劃線_組成的字符串,并且第一個字符必須是字母或下劃線。在使用標識符時還有注意以下幾點:
標識符的長度最好不要超過8位,因為在某些版本的C中規定標識符前8位有效,當兩個標識符前8位相同時,則被認為是同一個標識符
標識符是嚴格區分大小寫的。例如Imooc和imooc 是兩個不同的標識符
標識符最好選擇有意義的英文單詞組成做到"見名知意",不要使用中文
標識符不能是C語言的關鍵字。想了解更多C語言關鍵字的知識
變量定義與賦值
????變量就是可以變化的量,而每個變量都會有一個名字(標識符)。變量占據內存中一定的存儲單元。使用變量之前必須先定義變量,要區分變量名和變量值是兩個不同的概念。
????變量定義與賦值的一般形式如下。
????注意:在定義中不允許連續賦值,如下操作是不合法的。
?
int a=b=c=5; //不合法的賦值操作
?
????變量的賦值分為兩種方式:
先聲明再賦值
聲明的同時賦值
基本數據類型
??? C語言中的數據類型如下圖所示。
????最常用的整型、實型與字符型(char,int,float,double):
????整型數據是指不帶小數的數字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):
????注意:
int short int long int是根據編譯環境的不同,所取范圍不同
而其中short int和long int至少是表中所寫范圍, 但是int在表中是以16位編譯環境寫的取值范圍
另外 c語言int的取值范圍在于他占用的字節數 ,不同的編譯器,規定是不一樣
ANSI標準定義int是占2個字節,TC是按ANSI標準的,它的int是占2個字節的。但是在VC里,一個int是占4個字節的
????浮點數據是指帶小數的數字。
????生活中有很多信息適合使用浮點型數據來表示,比如:人的體重(單位:公斤)、商品價格、圓周率等等。
????因為精度的不同又分為3種(float,double,long double):
格式化輸出語句
????格式化輸出語句,也可以說是占位輸出,是將各種類型的數據按照格式化后的類型及指定的位置從計算機上顯示。其格式為:
?
printf("輸出格式符",輸出項);
?
????當輸出語句中包含普通字符時,可以采用一下格式:
?
printf("普通字符輸出格式符", 輸出項);
?
????注意:格式符的個數要與變量、常量或者表達式的個數相對應。
不可改變的常量
????在程序執行過程中,值不發生改變的量稱為常量,比如:
????在C語言中,可以用一個標識符來表示一個常量,常量在使用之前必須先定義,其一般形式為:
?
#include#define POCKETMONEY 10 //定義常量及常量值 int main() { // POCKETMONEY = 12; //小明私自增加零花錢對嗎? printf("小明今天又得到%d元零花錢 ", POCKETMONEY); return 0; }
?
????符號常量不可以被改變。
自動類型轉換
????數據類型存在自動轉換的情況。
????自動轉換發生在不同數據類型運算時,在編譯的時候自動完成。
??? char類型數據轉換為int類型數據遵循ASCII碼中的對應值。
????注意:
字節小的可以向字節大的自動轉換,但字節大的不能向字節小的自動轉換
char可以轉換為int,int可以轉換為double,char可以轉換為double
強制類型轉換
????強制類型轉換是通過定義類型轉換運算來實現的。其一般形式為:
?
(數據類型) (表達式)
?
????其作用是把表達式的運算結果強制轉換成類型說明符所表示的類型。在使用強制轉換時應注意以下問題:
數據類型和表達式都必須加括號, 如把(int)(x/2+y)寫成(int)x/2+y則成了把x轉換成int型之后再除2再與y相加了
轉換后不會改變原數據的類型及變量值,只在本次運算中臨時性轉換
強制轉換后的運算結果不遵循四舍五入原則
C語言基本運算符
????除法運算中注意:
如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2
而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000
????取余運算中注意:
該運算只適合用兩個整數進行取余運算,如:10%3 = 1
運算后的符號取決于被模數的符號,如(-10)%3 = -1,而10%(-3) = 1
自增與自減運算符
????自增運算符為++,其功能是使變量的值自增1。
????自減運算符為--,其功能是使變量值自減1。
????它們經常使用在循環中,自增自減運算符有以下幾種形式:
賦值運算符
??? C語言中賦值運算符分為簡單賦值運算符和復合賦值運算符。
????例如:
?
a?=?3;?? ?//變量a并賦值為3 a?+=?5;?? //這個算式就等價于a?=?a+5,將變量a和5相加之后再賦值給a
?
????注意:復合運算符中運算符和等號之間是不存在空格的。
關系運算符
????C語言中的關系運算符:
????關系表達式的值是真和假,在C程序中用整數1和0表示。
????注意:>=, <=, ==, !=這種符號之間不能存在空格。
邏輯運算符
????C語言中的邏輯運算符:
????邏輯運算的值也是有兩種分別為真和假,C語言中用整型的1和0來表示。其求值規則如下:
與運算 &&
????參與運算的兩個變量都為真時,結果才為真,否則為假。例如:5>=5 && 7>5 ,運算結果為真。
或運算 ||
????參與運算的兩個變量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如:5>=5||5>8,運算結果為真
非運算!
????參與運算的變量為真時,結果為假;參與運算量為假時,結果為真。例如:!(5>8),運算結果為真
三目運算符
??? C語言中的三目運算符,其格式為:
?
表達式1 ? 表達式2 : 表達式3;
?
????程序執行過程是:
????判斷表達式1的值是否為真,如果是真的話執行表達式2,如果是假的話執行表達式3。
運算符大比拼之優先級比較
????各種運算符號的順序:
????優先級別為1的優先級最高,優先級別為10的優先級別最低。
分支結構之簡單if語句
??? C語言中的分支結構語句中的if條件語句。
????簡單if語句的基本結構如下:
?
if(表達式) { 執行代碼塊; }
?
????其語義是:如果表達式的值為真,則執行其后的語句,否則不執行該語句。
????注意:if()后面沒有分號,直接寫{}。
分支結構之簡單if-else語句
????簡單的if-else語句的基本結構:
????語義是: 如果表達式的值為真,則執行代碼塊1,否則執行代碼塊2。
????注意:if()后面沒有分號,直接寫{},else后面也沒有分號,直接寫{}。
分支結構之多重if-else語句
??? C語言中多重if-else語句,其結構如下:
????語義是:依次判斷表達式的值,當出現某個值為真時,則執行對應代碼塊,否則執行代碼塊n。
????注意:當某一條件為真的時候,則不會向下執行該分支結構的其他語句。
分支結構之嵌套if-else語句
??? C語言中嵌套if-else語句。嵌套if-else語句的意思,就是在if-else語句中,再寫if-else語句。其一般形式為:
循環結構之while循環
????反復不停的執行某個動作就是江湖人稱的循環 。
??? C語言中有三種循環結構,先看一下C語言while循環的結構:
????其中表達式表示循環條件,執行代碼塊為循環體。
??? while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體代碼塊。
while語句中的表達式一般是關系表達或邏輯表達式,當表達式的值為假時不執行循環體,反之則循環體一直執行
一定要記著在循環體中改變循環變量的值,否則會出現死循環(無休止的執行)
循環體如果包括有一個以上的語句,則必須用{}括起來,組成復合語句
循環結構之do-while循環
??? C語言中的do-while循環,一般形式如下:
??? do-while循環語句的語義是:
????它先執行循環中的執行代碼塊,然后再判斷while中表達式是否為真,如果為真則繼續循環;如果為假,則終止循環。因此,do-while循環至少要執行一次循環語句。
????注意:使用do-while結構語句時,while括號后必須有分號。
循環結構之for循環
??? C語言中for循環一般形式:
????它的執行過程如下:
執行表達式1,對循環變量做初始化
判斷表達式2,若其值為真(非0),則執行for循環體中執行代碼塊,然后向下執行;若其值為假(0),則結束循環
執行表達式3,(i++)等對于循環變量進行操作的語句
執行for循環中執行代碼塊后執行第二步;第一步初始化只會執行一次
循環結束,程序繼續向下執行
????注意:for循環中的兩個分號一定要寫
????在for循環中:
表達式1是一個或多個賦值語句,它用來控制變量的初始值
表達式2是一個關系表達式,它決定什么時候退出循環
表達式3是循環變量的步進值,定義控制循環變量每循環一次后按什么方式變化
這三部分之間用分號分開
結束語句之break語句
????需要中斷循環,在C語言中可以使用break語句進行該操作,使用break語句時注意以下幾點:
在沒有循環結構的情況下,break不能用在單獨的if-else語句中。
在多層循環中,一個break語句只跳出當前循環。
結束語句之continue語句
??? continue語句的作用是結束本次循環開始執行下一次循環。
????break語句與continue語句的區別是:
??? break是跳出當前整個循環,continue是結束本次循環開始下一次循環。
分支結構之switch語句
????switch語句結構如下:
??? switch語句時還應注意以下幾點:
在case后的各常量表達式的值不能相同,否則會出現錯誤
在case子句后如果沒有break;會一直往后執行**一直到遇到break;**才會跳出switch語句
switch后面的表達式語句只能是整型或者字符類型
在case后,允許有多個語句,**可以不用{}**括起來
各case和default子句的先后順序可以變動,而不會影響程序執行結果
default子句可以省略不用
自定義函數
????自定義函數的一般形式:
????注意:
[]中包含的內容可以省略,數據類型說明省略時默認是int類型函數
參數省略時表示該函數是無參函數,參數不省略表示該函數是有參函數
函數調用
????需要用到自定義函數的時候,就得調用它,在C語言中,函數調用的一般形式為:
?
函數名([參數]);
?
????注意:對無參函數調用的時候可以將[]包含的省略。
有參與無參
????在函數中不需要函數參數的稱之為無參函數,在函數中需要函數參數的稱之為有參函數。
????有參和無參函數的一般形式如下:
????有參函數和無參函數的唯一區別在于:函數 () 中多了一個參數列表。
形參與實參
????函數的參數分為形參和實參兩種。
????形參是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數。
????實參是在調用時傳遞該函數的參數。
????函數的形參和實參具有以下特點:
形參只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效
實參可以是常量、變量、表達式、函數等
在參數傳遞時,實參和形參在數量上,類型上,順序上應嚴格一致,否則會發生類型不匹配的錯誤
函數的返回值
????函數的返回值是指函數被調用之后,執行函數體中的程序段所取得的并返回給主調函數的值。
????函數的返回值要注意以下幾點:
函數的值只能通過return語句返回主調函數
????return語句的一般形式為:
?
return 表達式
?
????或者為:??
?
return (表達式);
?
函數值的類型和函數定義中函數的類型應保持一致
????如果兩者不一致,則以函數返回類型為準,自動進行類型轉換。
沒有返回值的函數,返回類型為void
遞歸函數
????遞歸就是一個函數在它的函數體內調用它自身,遞歸函數必須有結束條件。
????執行遞歸函數將反復調用其自身,每調用一次就進入新的一層。
????一句話總結遞歸:自我調用且有完成狀態。
????例題:
????有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第3個人,又說比第2人大兩歲。問第2個人,說比第1個人大兩歲。最后 問第1個人,他說是10歲。請問第5個人多大?
????程序分析:
????利用遞歸的方法,遞歸分為回推和遞推兩個階段。要想知道第5個人歲數,需知道第4人的歲數,依次類推,推到第1人(10歲),再往回推。
?
#includeint dfs(int n) { return n == 1 ? 10 : dfs(n - 1) + 2; } int main() {? printf("第5個人的年齡是%d歲", dfs(5)); return 0; }
?
局部與全局
??? C語言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。
局部變量也稱為內部變量。局部變量是在函數內作定義說明的。其作用域僅限于函數內, 離開該函數后再使用這種變量是非法的。在復合語句中也可定義變量,其作用域只在復合語句范圍內
全局變量也稱為外部變量,它是在函數外部定義的變量。它不屬于哪一個函數,它屬于一個源程序文件。其作用域是整個源程序
變量存儲類別
??? C語言根據變量的生存周期來劃分,可以分為靜態存儲方式和動態存儲方式。
????靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。靜態存儲區中存放了在整個程序執行過程中都存在的變量,如全局變量。
????動態存儲方式:是指在程序運行期間根據需要進行動態的分配存儲空間的方式。動態存儲區中存放的變量是根據程序運行的需要而建立和釋放的,通常包括:函數形式參數;自動變量;函數調用時的現場保護和返回地址等。
??? C語言中存儲類別又分為四類:
自動(auto)
靜態(static)
寄存器的(register)
外部的(extern)
????用關鍵字auto定義的變量為自動變量,auto可以省略,auto不寫則隱含定為“自動存儲類別”,屬于動態存儲方式。如:
????用static修飾的為靜態變量,如果定義在函數內部的,稱之為靜態局部變量;如果定義在函數外部,稱之為靜態外部變量。如下為靜態局部變量:
????注意:靜態局部變量屬于靜態存儲類別,在靜態存儲區內分配存儲單元,在程序整個運行期間都不釋放;靜態局部變量在編譯時賦初值,即只賦初值一次;如果在定義局部變量時不賦初值的話,則對靜態局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。
????為了提高效率,C語言允許將局部變量得值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關鍵字register作聲明。例如:
????注意:只有局部自動變量和形式參數可以作為寄存器變量;一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變量;局部靜態變量不能定義為寄存器變量。
????用extern聲明的的變量是外部變量,外部變量的意義是某函數可以調用在該函數之后定義的變量。如:
內部函數與外部函數
????在C語言中不能被其他源文件調用的函數稱謂內部函數 ,內部函數由static關鍵字來定義,因此又被稱謂靜態函數,形式為:
?
static [數據類型] 函數名([參數])
?
????這里的static是對函數的作用范圍的一個限定,限定該函數只能在其所處的源文件中使用,因此在不同文件中出現相同的函數名稱的內部函數是沒有問題的。
????在C語言中能被其他源文件調用的函數稱謂外部函數 ,外部函數由extern關鍵字來定義,形式為:
?
extern [數據類型] 函數名([參數])
?
??? C語言規定,在沒有指定函數的作用范圍時,系統會默認認為是外部函數,因此當需要定義外部函數時extern也可以省略。
數組
????程序中也需要容器,只不過該容器有點特殊,它在程序中是一塊連續的,大小固定并且里面的數據類型一致的內存空間,它還有個好聽的名字叫數組。可以將數組理解為大小固定,所放物品為同類的一個購物袋,在該購物袋中的物品是按一定順序放置的。
????我們來看一下如何聲明一個數組:
?
數據類型 數組名稱[長度];
?
????數組只聲明也不行啊,看一下數組是如何初始化的。說到初始化,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開始
數組在初始化的時候,數組內元素的個數不能大于聲明的數組長度
mtianyan: 如果采用第一種初始化方式,元素個數小于數組的長度時,多余的數組元素初始化為0
在聲明數組后沒有進行初始化的時候,靜態(static)和外部(extern)類型的數組元素初始化元素為0,自動(auto)類型的數組的元素初始化值不確定
數組的遍歷
????數組就可以采用循環的方式將每個元素遍歷出來,而不用人為的每次獲取指定某個位置上的元素,例如我們用for循環遍歷一個數組:
????注意以下幾點:
最好避免出現數組越界訪問,循環變量最好不要超出數組的長度
C語言的數組長度一經聲明,長度就是固定,無法改變,并且C語言并不提供計算數組長度的方法
????由于C語言是沒有檢查數組長度改變或者數組越界的這個機制,可能會在編輯器中編譯并通過,但是結果就不能肯定了,因此還是不要越界或者改變數組的長度。
??? C語言獲取數組長度:
?
int length = sizeof(arr)/sizeof(arr[0]);
?
數組作為函數參數
????數組可以由整個數組當作函數的參數,也可以由數組中的某個元素當作函數的參數。
????整個數組當作函數參數,即把數組名稱傳入函數中,例如:
????數組中的元素當作函數參數,即把數組中的參數傳入函數中,例如:
????數組作為函數參數時注意以下事項:
數組名作為函數實參傳遞時,函數定義處作為接收參數的數組類型形參既可以指定長度也可以不指定長度
數組元素作為函數實參傳遞時,數組元素類型必須與形參數據類型一致
數組的應用-冒泡排序
????以升序排序為例冒泡排序的思想:相鄰元素兩兩比較,將較大的數字放在后面,直到將所有數字全部排序。就像小學排隊時按大小個排一樣,將一個同學拉出來和后面的比比,如果高就放后面,一直把隊伍排好。
?
#includeint main() { double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80}; int i,j; printf(" ************排隊前************* "); for(i=0;i<10;i++) { if(i != 9) printf("%1.2f, ", arr[i]); //%1.2f表示小數點前一位,小數點后精確到兩位 else printf("%1.2f", arr[i]); //%1.2f表示小數點前一位,小數點后精確到兩位 } for(i=8; i>=0; i--) { for(j=0;j<=i;j++) { if( arr[j]>arr[j+1]) //當前面的數比后面的數大時 { double temp; //定義臨時變量temp temp=arr[j];//將前面的數賦值給temp arr[j]=arr[j+1]; //前后之數顛倒位置 arr[j+1]=temp;//將較大的數放在后面 } } } printf(" ************排隊后************* "); for(i=0;i<10;i++) { if(i != 9) printf("%1.2f, ", arr[i]); //%1.2f表示小數點前一位,小數點后精確到兩位 else printf("%1.2f", arr[i]); //%1.2f表示小數點前一位,小數點后精確到兩位 } return 0; }
?
數組的應用-數組查找功能
????當我們購物之后,拎著購物袋回到家,會一一檢查購物袋中的物品看是否缺少或者都是想購之物。那么應用到程序中,可以使用數組查找功能,看看是否存在該數據,如果存在并返回該元素的下標。
?
#includeint getIndex(int arr[5],int value) { int i; int index; for(i=0;i<5;i++) { /* 請完善數組查詢功能 */ if(arr[i]==value) { index=i; break; } index=-1; } return index; } int main() { int arr[5]={3,12,9,8,6}; int value = 8; int index = getIndex(arr,value); //這里應該傳什么參數呢? if(index!=-1) { printf("%d在數組中存在,下標為:%d ",value,index); } else { printf("%d在數組中不存在。 ",value); } return 0; }
?
字符串與數組
??? C語言中,是沒有辦法直接定義字符串數據類型的,但是我們可以使用數組來定義我們所要的字符串。一般有以下兩種格式:
?
char 字符串名稱[長度] = “字符串值”; //[]中的長度是可以省略不寫的 char 字符串名稱[長度] = {‘字符1’,‘字符2’,…,‘字符n’,’0’}; //最后一個元素必須是’?’,’?’表示字符串的結束標志
?
????注意:在輸出字符串的時候可使用如下語句。
?
printf(“%s”,字符數組名字); puts(字符數組名字);
?
字符串函數
????常用的字符串函數如下(strlen,strcmp,strcpy,strcat,atoi):
????使用字符串函數注意以下事項:
??? strlen()獲取字符串的長度,在字符串長度中是不包括‘?’而且漢字和字母的長度是不一樣的。比如:
??? strcmp()在比較的時候會把字符串先轉換成ASCII碼再進行比較,返回的結果為0表示s1和s2的ASCII碼相等,返回結果為1表示s1比s2的ASCII碼大,返回結果為-1表示s1比s2的ASCII碼小,例如:
??? strcpy()拷貝之后會覆蓋原來字符串且不能對字符串常量進行拷貝,比如:
??? strcat在使用時s1與s2指的內存空間不能重疊,且s1要有足夠的空間來容納要復制的字符串,如:
多維數組
????多維數組的定義格式是:
?
數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n];
?
????定義了一個名稱為num,數據類型為int的二維數組。其中第一個[3]表示第一維下標的長度,就像購物時分類存放的購物;第二個[3]表示第二維下標的長度,就像每個購物袋中的元素。
????多維數組的初始化與一維數組的初始化類似也是分兩種:
?
數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}}; 數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n]; 數組名稱[下標1][下標2]…[下標n] = 值;
?
????多維數組初始化要注意以下事項:
采用第一種始化時數組聲明必須指定列的維數。mtianyan: 因為系統會根據數組中元素的總個數來分配空間,當知道元素總個數以及列的維數后,會直接計算出行的維數
采用第二種初始化時數組聲明必須同時指定行和列的維數
????二維數組定義的時候,可以不指定行的數量,但是必須指定列的數量。
多維數組的遍歷
????多維數組也是存在遍歷的,和一維數組遍歷一樣,也是需要用到循環。不一樣的就是多維數組需要采用嵌套循環。
????注意:多維數組的每一維下標均不能越界
????實例代碼:
?
#include#define N 10 //打印分數 void printScore(int score[]) { int i; printf(" "); for(i=0;i max) { max = score[i]; } } return max; } //計算最低分 int getMin(int score[]) { int min =100; int i; for(i=0;i =0;i--) { for(j=0;j<=i;j++) { if(score[j] ? ?
?
審核編輯:湯梓紅
評論
查看更多