欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
c語(yǔ)言入門(mén)這一篇就夠了

內容來(lái)自慕課網(wǎng),個(gè)人學(xué)習筆記。加上了mtianyan標簽標記知識點(diǎn)。

C語(yǔ)言入門(mén) -> Linux C語(yǔ)言編程基本原理與實(shí)踐 -> Linux C語(yǔ)言指針與內存 -> Linux C語(yǔ)言結構體

https://www.imooc.com/course/programdetail/pid/37

c語(yǔ)言入門(mén)

C語(yǔ)言一經(jīng)出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特點(diǎn)迅速在全世界普及和推廣。C語(yǔ)言不但執行效率高而且可移植性好,可以用來(lái)開(kāi)發(fā)應用軟件、驅動(dòng)、操作系統等。C語(yǔ)言也是其它眾多高級語(yǔ)言的鼻祖語(yǔ)言,所以說(shuō)學(xué)習C語(yǔ)言是進(jìn)入編程世界的必修課。

hello,world

#include<stdio.h> int main(){    /*在雙引號中間輸入Hello World*/     printf("Hello World");    return 0; }

注:在最新的C標準中,main函數前的類(lèi)型為int而不是void

c語(yǔ)言的具體結構

簡(jiǎn)單來(lái)說(shuō),一個(gè)C程序就是由若干頭文件函數組成。

  • #include <stdio.h>就是一條預處理命令, 它的作用是通知C語(yǔ)言編譯系統在對C程序進(jìn)行正式編譯之前需做一些預處理工作。

  • 函數就是實(shí)現代碼邏輯的一個(gè)小的單元。

必不可少之主函數

一個(gè)C程序有且只有一個(gè)主函數,即main函數。

  • C程序就是執行主函數里的代碼,也可以說(shuō)這個(gè)主函數就是C語(yǔ)言中的唯一入口。

  • main前面的int就是主函數的類(lèi)型.

  • printf()格式輸出函數,這里就記住它的功能就是在屏幕上輸出指定的信息

  • return是函數的返回值,根據函數類(lèi)型的不同,返回的值也是不同的。

  • \n是轉義字符中的換行符。(注意:C程序一定是從主函數開(kāi)始執行的)

良好習慣之規范

  1. 一個(gè)說(shuō)明或一個(gè)語(yǔ)句占一行,例如:包含頭文件、一個(gè)可執行語(yǔ)句結束都需要換行。
  2. 函數體內的語(yǔ)句要有明顯縮進(jìn),通常以按一下Tab鍵為一個(gè)縮進(jìn)。
  3. 括號要成對寫(xiě),如果需要刪除的話(huà)也要成對刪除。
  4. 當一句可執行語(yǔ)句結束的時(shí)候末尾需要有分號。
  5. 代碼中所有符號均為英文半角符號。

程序解釋——注釋

注釋是寫(xiě)給程序員看的,不是寫(xiě)給電腦看的。

C語(yǔ)言注釋方法有兩種:

多行注釋?zhuān)?/* 注釋內容 */

單行注釋?zhuān)?//注釋一行

有名有姓的C(標識符)

C語(yǔ)言規定,標識符可以是字母(A~Z,a~z)、數字(0~9)、下劃線(xiàn)_組成的字符串,并且第一個(gè)字符必須是字母或下劃線(xiàn)。在使用標識符時(shí)還有注意以下幾點(diǎn):

  1. 標識符的長(cháng)度最好不要超過(guò)8位,因為在某些版本的C中規定標識符前8位有效,當兩個(gè)標識符前8位相同時(shí),則被認為是同一個(gè)標識符。
  2. 標識符是嚴格區分大小寫(xiě)的。例如Imoocimooc 是兩個(gè)不同的標識符。
  3. 標識符最好選擇有意義的英文單詞組成做到”見(jiàn)名知意”,不要使用中文。
  4. 標識符不能是C語(yǔ)言的關(guān)鍵字。想了解更多C語(yǔ)言關(guān)鍵字的知識。

變量及賦值

變量就是可以變化的量,而每個(gè)變量都會(huì )有一個(gè)名字(標識符)。變量占據內存中一定的存儲單元。使用變量之前必須先定義變量,要區分變量名變量值是兩個(gè)不同的概念。

變量定義的一般形式為:數據類(lèi)型 變量名;

多個(gè)類(lèi)型相同的變量:數據類(lèi)型 變量名, 變量名, 變量名…;

注意:在定義中不允許連續賦值,如int a=b=c=5;是不合法的。

變量的賦值分為兩種方式:

  1. 先聲明再賦值
  2. 聲明的同時(shí)賦值

基本數據類(lèi)型

C語(yǔ)言中,數據類(lèi)型可分為:

  1. 基本數據類(lèi)型
  2. 構造數據類(lèi)型
  3. 指針類(lèi)型
  4. 空類(lèi)型四大類(lèi)

最常用的整型, 實(shí)型與字符型(char,int,float,double):

整型數據是指不帶小數的數字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):

注:

  • int short int long int根據編譯環(huán)境的不同,所取范圍不同。
  • 而其中short intlong int至少是表中所寫(xiě)范圍, 但是int在表中是以16位編譯環(huán)境寫(xiě)的取值范圍。
  • 另外 c語(yǔ)言int的取值范圍在于他占用的字節數 ,不同的編譯器,規定是不一樣。
  • ANSI標準定義int是占2個(gè)字節,TC是按ANSI標準的,它的int是占2個(gè)字節的。但是在VC里,一個(gè)int是占4個(gè)字節的。

浮點(diǎn)數據是指帶小數的數字。

生活中有很多信息適合使用浮點(diǎn)型數據來(lái)表示,比如:人的體重(單位:公斤)、商品價(jià)格、圓周率等等。

因為精度的不同又分為3種(float,double,long double):

注:C語(yǔ)言中不存在字符串變量,字符串只能存在字符數組中,這個(gè)后面會(huì )講。

格式化輸出語(yǔ)句

格式化輸出語(yǔ)句,也可以說(shuō)是占位輸出,是將各種類(lèi)型的數據按照格式化后的類(lèi)型及指定的位置從計算機上顯示。

其格式為:printf("輸出格式符",輸出項);

當輸出語(yǔ)句中包含普通字符時(shí),可以采用一下格式:

printf("普通字符輸出格式符", 輸出項);

注意:格式符個(gè)數要與變量、常量或者表達式的個(gè)數一一對應

不可改變的常量

在程序執行過(guò)程中,值不發(fā)生改變的量稱(chēng)為常量。

mtianyan: C語(yǔ)言的常量可以分為直接常量和符號常量。

  • 直接常量也稱(chēng)為字面量,是可以直接拿來(lái)使用,無(wú)需說(shuō)明的量,比如:
    • 整型常量:13、0、-13;
    • 實(shí)型常量:13.33、-24.4;
    • 字符常量:‘a(chǎn)’、‘M’
    • 字符串常量:”I love imooc!”

在C語(yǔ)言中,可以用一個(gè)標識符來(lái)表示一個(gè)常量,稱(chēng)之為符號常量。符號常量在使用之前必須先定義,其一般形式為:

#define 標識符 常量值 
#include <stdio.h>#define POCKETMONEY 10    //定義常量及常量值int main(){    // POCKETMONEY = 12;  //小明私自增加零花錢(qián)對嗎?    printf("小明今天又得到%d元零花錢(qián)\n", POCKETMONEY);    return 0;  }

符號常量不可以被改變。

自動(dòng)類(lèi)型轉換

數據類(lèi)型存在自動(dòng)轉換的情況.
自動(dòng)轉換發(fā)生在不同數據類(lèi)型運算時(shí),在編譯的時(shí)候自動(dòng)完成。

char類(lèi)型數據轉換為int類(lèi)型數據遵循ASCII碼中的對應值.

注:

字節小的可以向字節大的自動(dòng)轉換,但字節大的不能向字節小的自動(dòng)轉換

char可以轉換為int,int可以轉換為double,char可以轉換為double。但是不可以反向。

強制類(lèi)型轉換

強制類(lèi)型轉換是通過(guò)定義類(lèi)型轉換運算來(lái)實(shí)現的。其一般形式為:

(數據類(lèi)型) (表達式)

其作用是把表達式的運算結果強制轉換成類(lèi)型說(shuō)明符所表示的類(lèi)型

在使用強制轉換時(shí)應注意以下問(wèn)題:

  1. 數據類(lèi)型和表達式都必須加括號, 如把(int)(x/2+y)寫(xiě)成(int)x/2+y則成了把x轉換成int型之后再除2再與y相加了。
  2. 轉換后不會(huì )改變原數據的類(lèi)型及變量值,只在本次運算中臨時(shí)性轉換。
  3. 強制轉換后的運算結果不遵循四舍五入原則。

運算符號

C語(yǔ)言中運算符:

※ 算術(shù)運算符※ 賦值運算符※ 關(guān)系運算符※ 邏輯運算符※ 三目運算符

算術(shù)運算符

c語(yǔ)言基本運算符:

除法運算中注意

如果相除的兩個(gè)數都是整數的話(huà),則結果也為整數,小數部分省略,如8/3 = 2;

而兩數中有一個(gè)為小數,結果則為小數,如:9.0/2 = 4.500000。

mtianyan: 取余運算中注意

該運算只適合用兩個(gè)整數進(jìn)行取余運算,如:10%3 = 1;

mtianyan: notes: 而10.0%3則是錯誤的;運算后的符號取決于被模數的符號,如(-10)%3 = -1;10%(-3) = 1;

mtianyan: %%表示這里就是一個(gè)%符.

注:C語(yǔ)言中沒(méi)有乘方這個(gè)運算符,也不能用×, ÷等算術(shù)符號。

自增與自減運算符

  • 自增運算符為++,其功能是使變量的值自增1
  • 自減運算符為--,其功能是使變量值自減1。

它們經(jīng)常使用在循環(huán)中。自增自減運算符有以下幾種形式:

賦值運算符

C語(yǔ)言中賦值運算符分為簡(jiǎn)單賦值運算符復合賦值運算符

簡(jiǎn)單賦值運算符=號了,下面講一下復合賦值運算符:

復合賦值運算符就是在簡(jiǎn)單賦值符=之前加上其它運算符構成.

例如+=、-=、*=、/=、%=

分析:定義整型變量a并賦值為3,a += 5;這個(gè)算式就等價(jià)于a = a+5; 將變量a和5相加之后再賦值給a

注意:復合運算符中運算符和等號之間是不存在空格的。

關(guān)系運算符

C語(yǔ)言中的關(guān)系運算符:

關(guān)系表達式的值是,在C程序用整數10表示。

注意:>=, <=, ==, !=這種符號之間不能存在空格。

邏輯運算符

C語(yǔ)言中的邏輯運算符:

邏輯運算的值也是有兩種分別為,C語(yǔ)言中用整型的1和0來(lái)表示。其求值規則如下:

  • 與運算 &&

參與運算的兩個(gè)變量都為真時(shí),結果才為真,否則為假。例如:5>=5 && 7>5 ,運算結果為真;

  • 或運算 ||

參與運算的兩個(gè)變量只要有一個(gè)為真,結果就為真。 兩個(gè)量都為假時(shí),結果為假。例如:5>=5||5>8,運算結果為真;

  • 非運算!

參與運算的變量為真時(shí),結果為假;參與運算量為假時(shí),結果為真。例如:!(5>8),運算結果為真。

三目運算符

C語(yǔ)言中的三目運算符:?:,其格式為:

表達式1 ? 表達式2 : 表達式3; 

執行過(guò)程是:

先判斷表達式1的值是否為真,如果是真的話(huà)執行表達式2;如果是假的話(huà)執行表達式3。

#include <stdio.h>int main(){    //定義小編兜里的錢(qián)    double money =12.0      ;     //定義打車(chē)回家的費用    double cost =11.5       ;      printf("小編能不能打車(chē)回家呢:");     //輸出y小編就打車(chē)回家了,輸出n小編就不能打車(chē)回家    printf("%c\n",money>=cost?'y':'n'                        );    return 0;}

運算符大比拼之優(yōu)先級比較

各種運算符號的順序:

優(yōu)先級別為1的優(yōu)先級最高,優(yōu)先級別為10的優(yōu)先級別最低。

分支結構之簡(jiǎn)單if語(yǔ)句

C語(yǔ)言中的分支結構語(yǔ)句中的if條件語(yǔ)句。

簡(jiǎn)單if語(yǔ)句的基本結構如下:

if(表達式){執行代碼塊;}

其語(yǔ)義是:如果表達式的值為真,則執行其后的語(yǔ)句,否則不執行該語(yǔ)句。

注意:if()后面沒(méi)有分號,直接寫(xiě){}

分支結構之簡(jiǎn)單if-else語(yǔ)句

簡(jiǎn)單的if-else語(yǔ)句的基本結構:

語(yǔ)義是: 如果表達式的值為真,則執行代碼塊1,否則執行代碼塊2。

注意:

if()后面沒(méi)有分號,直接寫(xiě){},else后面也沒(méi)有分號,直接寫(xiě){}

分支結構之多重if-else語(yǔ)句

C語(yǔ)言中多重if-else語(yǔ)句,其結構如下:

語(yǔ)義是:依次判斷表達式的值,當出現某個(gè)值為真時(shí),則執行對應代碼塊,否則執行代碼塊n。

注意:當某一條件為真的時(shí)候,則不會(huì )向下執行該分支結構的其他語(yǔ)句。

分支結構之嵌套if-else語(yǔ)句

C語(yǔ)言中嵌套if-else語(yǔ)句。嵌套if-else語(yǔ)句的意思,就是在if-else語(yǔ)句中,再寫(xiě)if-else語(yǔ)句。其一般形式為:

循環(huán)結構之while循環(huán)

反復不停的執行某個(gè)動(dòng)作就是江湖人稱(chēng)的循環(huán) 。

C語(yǔ)言中有三種循環(huán)結構,先看一下C語(yǔ)言while循環(huán)的結構

其中表達式表示循環(huán)條件,執行代碼塊為循環(huán)體。

while語(yǔ)句的語(yǔ)義是:計算表達式的值,當值為真(非0)時(shí), 執行循環(huán)體代碼塊。

  1. while語(yǔ)句中的表達式一般是關(guān)系表達或邏輯表達式,當表達式的值為假時(shí)不執行循環(huán)體,反之則循環(huán)體一直執行。

  2. 一定要記著(zhù)在循環(huán)體中改變循環(huán)變量的值,否則會(huì )出現死循環(huán)(無(wú)休止的執行)。

  3. 循環(huán)體如果包括有一個(gè)以上的語(yǔ)句,則必須用{}括起來(lái),組成復合語(yǔ)句。

循環(huán)結構之do-while循環(huán)

C語(yǔ)言中的do-while循環(huán),一般形式如下:

do-while循環(huán)語(yǔ)句的語(yǔ)義是:

它先執行循環(huán)中的執行代碼塊,然后再判斷while中表達式是否為真,如果為真則繼續循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執行一次循環(huán)語(yǔ)句。

注意:mtianyan: 使用do-while結構語(yǔ)句時(shí),while括號后必須有分號。

循環(huán)結構之for循環(huán)(一)

c語(yǔ)言中for循環(huán)一般形式:

它的執行過(guò)程如下:

  1. 執行表達式1,對循環(huán)變量做初始化;
  2. 判斷表達式2,若其值為真(非0),則執行for循環(huán)體中執行代碼塊,然后向下執行;若其值為假(0),則結束循環(huán);
  3. 執行表達式3,(i++)等對于循環(huán)變量進(jìn)行操作的語(yǔ)句;
  4. 執行for循環(huán)中執行代碼塊后執行第二步;第一步初始化只會(huì )執行一次。
  5. 循環(huán)結束,程序繼續向下執行。

注意:for循環(huán)中的兩個(gè)分號一定要寫(xiě)

循環(huán)結構之for循環(huán)(二)

在for循環(huán)中:

  • 表達式1是一個(gè)或多個(gè)賦值語(yǔ)句,它用來(lái)控制變量的初始值;
  • 表達式2是一個(gè)關(guān)系表達式,它決定什么時(shí)候退出循環(huán);
  • 表達式3是循環(huán)變量的步進(jìn)值,定義控制循環(huán)變量每循環(huán)一次后按什么方式變化。
  • 這三部分之間用分號 ; 分開(kāi)。

使用for語(yǔ)句應該注意

  1. for循環(huán)中的“表達式1、2、3”均可不寫(xiě)為空,但兩個(gè)分號(;;)不能缺省。
  2. 省略“表達式1(循環(huán)變量賦初值)”,表示不對循環(huán)變量賦初始值。
  3. 省略“表達式2(循環(huán)條件)”,不做其它處理,循環(huán)一直執行(死循環(huán))。
  4. 省略“表達式3(循環(huán)變量增減量)”,不做其他處理,循環(huán)一直執行(死循環(huán))。
  5. 表達式1可以是設置循環(huán)變量的初值的賦值表達式,也可以是其他表達式。
  6. 表達式1和表達式3可以是一個(gè)簡(jiǎn)單表達式也可以是多個(gè)表達式以逗號分割。
  7. 表達式2一般是關(guān)系表達式邏輯表達式,但也可是數值表達式或字符表達式,只要其值非零,就執行循環(huán)體。
  8. 各表達式中的變量一定要在for循環(huán)之前定義。

怎么獲得一個(gè)數的百位,十位和個(gè)位

  • 百位數:num/100 可以獲得,因為 int 是整數型,小數部分會(huì )省略。比如 765/100 的結果是7
  • 十位數:num%100/10 。比如765%100先得到65,65/10得到6
  • 個(gè)位數:num%10。765%10得到5

循環(huán)結構之三種循環(huán)比較

while, do-while和for三種循環(huán)在具體的使用場(chǎng)合上是有區別的,如下:

  1. 知道循環(huán)次數的情況下更適合使用for循環(huán);
  2. 在不知道循環(huán)次數的情況下適合使用while或者do-while循環(huán):
    • 如果有可能一次都不循環(huán)應考慮使用while循環(huán)
    • 如果至少循環(huán)一次應考慮使用do-while循環(huán)。

但是從本質(zhì)上講,while,do-while和for循環(huán)之間是可以相互轉換的。

循環(huán)結構之多重循環(huán)

多重循環(huán)就是在循環(huán)結構的循環(huán)體中又出現循環(huán)結構。

在實(shí)際開(kāi)發(fā)中一般最多用到三層重循環(huán)。

因為循環(huán)層數越多,運行時(shí)間越長(cháng),程序越復雜,所以一般用2-3層多重循環(huán)就可以了。另外不同循環(huán)之間也是可以嵌套的。

多重循環(huán)在執行的過(guò)程中,外層循環(huán)為父循環(huán),內層循環(huán)為子循環(huán),

父循環(huán)一次,子循環(huán)需要全部執行完,直到跳出循環(huán)。父循環(huán)再進(jìn)入下一次,子循環(huán)繼續執行…

mtianyan: 打印三角形星星堆

#include <stdio.h>int main(){    int i, j, k;    for(i=1; i<5; i++)    {        /* 觀(guān)察每行的空格數量,補全循環(huán)條件 */        for(j=i; j<5; j++)          {            printf(" ");    //輸出空格        }        /* 觀(guān)察每行*號的數量,補全循環(huán)條件 */        for( k=0;k<2*i-1;k++)         {            printf("*");   //每行輸出的*號        }        printf("\n");     //每次循環(huán)換行    }    return 0;}

使用for循環(huán)打印9×9乘法表

#include <stdio.h>int main() {     // 定義相乘數字i,j以及結果result    int i, j, result;     for(i=9;i>=1;i--)     {        for(j=1;j<=i;j++)        {            printf("%d*%d=%d ",i,j,result=i*j);        }        printf("\n");     }    return 0;}

結束語(yǔ)句之break語(yǔ)句

那么循環(huán)5次的時(shí)候,需要中斷不繼續訓練。在C語(yǔ)言中,可以使用break語(yǔ)句進(jìn)行該操作.

使用break語(yǔ)句時(shí)注意以下幾點(diǎn):

  1. 在沒(méi)有循環(huán)結構的情況下,break不能用在單獨的if-else語(yǔ)句中。
  2. 在多層循環(huán)中,一個(gè)break語(yǔ)句只跳出當前循環(huán)。

結束語(yǔ)句之continue語(yǔ)句

那么循環(huán)5次的時(shí)候,需要中斷后繼續訓練。在C語(yǔ)言中,可以使用continue語(yǔ)句進(jìn)行該操作

continue語(yǔ)句的作用是結束本次循環(huán)開(kāi)始執行下一次循環(huán)。

break語(yǔ)句與continue語(yǔ)句的區別是:

break是跳出當前整個(gè)循環(huán),continue是結束本次循環(huán)開(kāi)始下一次循環(huán)。

分支結構之switch語(yǔ)句

switch語(yǔ)句結構如下:

mtianyan: switch語(yǔ)句時(shí)還應注意以下幾點(diǎn):

  1. 在case后的各常量表達式的值不能相同,否則會(huì )出現錯誤。
  2. 在case子句后如果沒(méi)有break;會(huì )一直往后執行一直到遇到break;才會(huì )跳出switch語(yǔ)句。
  3. switch后面的表達式語(yǔ)句只能是整型或者字符類(lèi)型。
  4. 在case后,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái)。
  5. 各case和default子句的先后順序可以變動(dòng),而不會(huì )影響程序執行結果。
  6. default子句可以省略不用。

mtianyan: switch與if語(yǔ)句的應用(計算是該年的第幾天)

#include <stdio.h>int main() {     /* 定義需要計算的日期 */    int date = 0;    int year = 2008;    int month = 8;    int day = 8;    switch(month)    {        case 12:date+=30;        case 11:date+=31;        case 10:date+=30;        case 9:date+=31;        case 8:date+=31;        case 7:date+=30;        case 6:date+=31;        case 5:date+=30;        case 4:date+=31;        case 3:        if((year%4==0&&year%100!=0)||year%400==0)        {            date+=29;        }        else        {            date+=28;        }        case 2:        date+=31;        case 1:        date+=day;        printf("%d年%d月%d日是該年的第%d天",year,month,day,date);        break;        default:        printf("error");        break;    }    return 0;}

正確: continue只能用在循環(huán)體內

臭名遠揚之goto語(yǔ)句

C語(yǔ)言中也有這樣的語(yǔ)句,就是goto語(yǔ)句,goto語(yǔ)句是一種無(wú)條件分支語(yǔ)句.

goto 語(yǔ)句的使用格式為:

goto 語(yǔ)句標號;

自創(chuàng )函數

C語(yǔ)言提供了大量的庫函數: 比如stdio.h提供輸出函數

自定義函數的一般形式:

注意:

  1. [] 包含的內容可以省略,數據類(lèi)型說(shuō)明省略,默認是 int 類(lèi)型函數; 參數省略表示該函數是無(wú)參函數,參數不省略表示該函數是有參函數;
  2. 函數名稱(chēng)遵循標識符命名規范;
  3. mtianyan: 自定義函數盡量放在 main 函數之前,如果要放在main函數后面的話(huà), 需要在main函數之前先聲明自定義函數,聲明格式為:
[數據類(lèi)型說(shuō)明] 函數名稱(chēng)([參數]);

函數調用

我們需要用到自定義的函數的時(shí)候,就得調用它,那么在調用的時(shí)候就稱(chēng)之為函數調用。

在C語(yǔ)言中,函數調用的一般形式為:

函數名([參數]); 

注意:

  1. 對無(wú)參函數調用的時(shí)候可以將[]包含的省略。
  2. []中可以是常數,變量或其它構造類(lèi)型數據及表達式,多個(gè)參數之間用逗號分隔。

有參與無(wú)參

在函數中不需要函數參數的稱(chēng)之為無(wú)參函數,在函數中需要函數參數的稱(chēng)之為有參函數。

有參和無(wú)參函數的一般形式如下:

有參函數和無(wú)參函數的唯一區別在于:函數 () 中多了一個(gè)參數列表。

  • 有參函數更為靈活,輸出的內容可以隨著(zhù)n的改變而隨意變動(dòng),只要在main函數中傳遞一個(gè)參數就可以了
  • 而在無(wú)參函數中輸出的相對就比較固定,當需要改動(dòng)的時(shí)候還需要到自定義的方法內改變循環(huán)變量的值。

mtianyan: 形參與實(shí)參

函數的參數分為形參實(shí)參兩種。

  • 形參是在定義函數名和函數體的時(shí)候使用的參數,目的是用來(lái)接收調用該函數時(shí)傳入的參數。

就類(lèi)似小明,說(shuō)了的話(huà)而不實(shí)際行動(dòng);

  • 實(shí)參是在調用時(shí)傳遞該函數的參數。

就如小剛能實(shí)際行動(dòng)起來(lái)。

函數的形參和實(shí)參具有以下特點(diǎn):

  • 形參只有在被調用時(shí)才分配內存單元,在調用結束時(shí),即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。

函數調用結束返回主調函數后則不能再使用該形參變量。

  • 實(shí)參可以是常量、變量、表達式、函數等。

無(wú)論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數調用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值等辦法使實(shí)參獲得確定值。

  • 在參數傳遞時(shí),實(shí)參和形參在數量上,類(lèi)型上,順序上應嚴格一致,否則會(huì )發(fā)生類(lèi)型不匹配的錯誤。

函數的返回值

函數的返回值是指函數被調用之后,執行函數體中的程序段所取得的并返回給主調函數的值。

函數的返回值要注意以下幾點(diǎn):

  • 函數的值只能通過(guò)return語(yǔ)句返回主調函數。

return語(yǔ)句的一般形式為:

return 表達式   或者為:  return (表達式);
  • 函數值的類(lèi)型和函數定義中函數的類(lèi)型應保持一致。

notes: 如果兩者不一致,則以函數返回類(lèi)型為準,自動(dòng)進(jìn)行類(lèi)型轉換。

  • 沒(méi)有返回值的函數,返回類(lèi)型void。

注意:

void 函數中可以有執行代碼塊,但是不能有返回值.

mtianyan: void函數中如果有return語(yǔ)句,該語(yǔ)句只能起到結束函數運行的功能。其格式為: return;

遞歸函數(一)

遞歸就是一個(gè)函數在它的函數體內調用它自身。

執行遞歸函數將反復調用其自身,每調用一次就進(jìn)入新的一層。

注意遞歸函數必須有結束條件

遞歸函數(二)

5的階乘這個(gè)例子進(jìn)行一下剖析,看一看他的運算過(guò)程:

程序在計算5的階乘的時(shí)候,先執行遞推,當n=1或者n=0的時(shí)候返回1,再回推將計算并返回。由此可以看出遞歸函數必須有結束條件。

遞歸函數特點(diǎn):

  1. 每一級函數調用時(shí)都有自己的變量,但是函數代碼并不會(huì )得到復制,如計算5的階乘時(shí)每遞推一次變量都不同;
  2. 每次調用都會(huì )有一次返回,如計算5的階乘時(shí)每遞推一次都返回進(jìn)行下一次;
  3. 遞歸函數中,位于遞歸調用前的語(yǔ)句和各級被調用函數具有相同的執行順序;
  4. 遞歸函數中,位于遞歸調用后的語(yǔ)句的執行順序和各個(gè)被調用函數的順序相反;
  5. 遞歸函數中必須有終止語(yǔ)句。

一句話(huà)總結遞歸:自我調用且有完成狀態(tài)

任務(wù)
猴子第一天摘下N個(gè)桃子,當時(shí)就吃了一半,還不過(guò)癮,就又多吃了一個(gè)。第二天又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天都吃前一天剩下的一半零一個(gè)。到第10天在想吃的時(shí)候就剩一個(gè)桃子了,問(wèn)第一天共摘下來(lái)多少個(gè)桃子?并反向打印每天所剩桃子數。

#include <stdio.h>int getPeachNumber(int n)  {    int num;        if(n==10)    {       return 1;          }     else    {        num = (getPeachNumber(n+1)+1)*2;          printf("第%d天所剩桃子%d個(gè)\n", n, num);     }    return num;}int main(){    int num = getPeachNumber(1);    printf("猴子第一天摘了:%d個(gè)桃子。\n", num);    return 0;}

遞歸demo。

有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數,他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2人大兩歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大兩歲。最后 問(wèn)第1個(gè)人,他說(shuō)是10歲。請問(wèn)第5個(gè)人多大?

程序分析:
利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第5個(gè)人歲數,需知道第4人的歲數,依次類(lèi)推,推到第1人(10歲),再往回推。

#include <stdio.h> int dfs(int n) {    return n == 1 ? 10 : dfs(n - 1) + 2;}int main() {    printf("第5個(gè)人的年齡是%d歲", dfs(5));     return 0;} 

局部與全局

C語(yǔ)言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。

  • 局部變量也稱(chēng)為內部變量。局部變量是在函數內作定義說(shuō)明的。其作用域僅限于函數內, 離開(kāi)該函數后再使用這種變量是非法的。在復合語(yǔ)句中也可定義變量,其作用域只在復合語(yǔ)句范圍內。
  • 全局變量也稱(chēng)為外部變量,它是在函數外部定義的變量。它不屬于哪一個(gè)函數,它屬于一個(gè)源程序文件。其作用域是整個(gè)源程序。

變量存儲類(lèi)別

mtianyan: C語(yǔ)言根據變量的生存周期來(lái)劃分,可以分為靜態(tài)存儲方式和動(dòng)態(tài)存儲方式。

  • 靜態(tài)存儲方式:是指在程序運行期間分配固定的存儲空間的方式。靜態(tài)存儲區中存放了在整個(gè)程序執行過(guò)程中都存在的變量,如全局變量。
  • 動(dòng)態(tài)存儲方式:是指在程序運行期間根據需要進(jìn)行動(dòng)態(tài)的分配存儲空間的方式。動(dòng)態(tài)存儲區中存放的變量是根據程序運行的需要而建立和釋放的,通常包括:函數形式參數;自動(dòng)變量;函數調用時(shí)的現場(chǎng)保護和返回地址等。

C語(yǔ)言中存儲類(lèi)別又分為四類(lèi):

  • 自動(dòng)(auto)、
  • 靜態(tài)(static)、
  • 寄存器的(register)
  • 外部的(extern)。

1、用關(guān)鍵字auto定義的變量為自動(dòng)變量,auto可以省略,auto不寫(xiě)則隱含定為“自動(dòng)存儲類(lèi)別”,屬于動(dòng)態(tài)存儲方式。如:

2、用static修飾的為靜態(tài)變量,如果定義在函數內部的,稱(chēng)之為靜態(tài)局部變量;如果定義在函數外部,稱(chēng)之為靜態(tài)外部變量。如下為靜態(tài)局部變量:

注意:靜態(tài)局部變量屬于靜態(tài)存儲類(lèi)別,在靜態(tài)存儲區內分配存儲單元,在程序整個(gè)運行期間都不釋放;靜態(tài)局部變量在編譯時(shí)賦初值,即只賦初值一次;如果在定義局部變量時(shí)不賦初值的話(huà),則對靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對數值型變量)或空字符(對字符變量)。

3、為了提高效率,C語(yǔ)言允許將局部變量得值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字register作聲明。例如:

mtianyan: 注意:只有局部自動(dòng)變量和形式參數可以作為寄存器變量;一個(gè)計算機系統中的寄存器數目有限,不能定義任意多個(gè)寄存器變量;局部靜態(tài)變量不能定義為寄存器變量。

4、用extern聲明的的變量是外部變量,外部變量的意義是某函數可以調用在該函數之后定義的變量。如:

內部函數與外部函數

  • 在C語(yǔ)言中不能被其他源文件調用的函數稱(chēng)謂內部函數 ,內部函數由static關(guān)鍵字來(lái)定義,因此又被稱(chēng)謂靜態(tài)函數,形式為:
    static [數據類(lèi)型] 函數名([參數])
  • 這里的static是對函數的作用范圍的一個(gè)限定,限定該函數只能在其所處的源文件中使用,因此在不同文件中出現相同的函數名稱(chēng)的內部函數是沒(méi)有問(wèn)題的。
  • 在C語(yǔ)言中能被其他源文件調用的函數稱(chēng)謂外部函數 ,外部函數由extern關(guān)鍵字來(lái)定義,形式為:
    extern [數據類(lèi)型] 函數名([參數])
  • C語(yǔ)言規定,在沒(méi)有指定函數的作用范圍時(shí),系統會(huì )默認認為是外部函數,因此當需要定義外部函數時(shí)extern也可以省略。

靜態(tài)變量只賦值一次

外部函數練習

hello.c

#include <stdio.h>#include "test.c"   //引用test.c文件extern void printLine()     //這里定義的方法對嗎?{   printf("**************\n");   }int main(){    say();    return 0;}

test.c

#include <stdio.h>void printLine();static void say(){printLine();printf("I love imooc\n");printf("good good study!\n");printf("day day up!\n");printLine();}

對于hello.c來(lái)說(shuō),直接引入了test.c文件。那么就可以調用testc中的static方法say()
而對于test.c并沒(méi)有引入,可以通過(guò)聲明來(lái)調用另一個(gè)源文件中暴露出來(lái)的方法。

綜合練習

北京市出租車(chē)打車(chē)計費規則如下:
1. 每公里單價(jià)計費2.3元
2. 起步價(jià)13元(包含3公里)
3. 晚上23點(diǎn)(含)至次日凌晨5點(diǎn)(不含)打車(chē),每公里單價(jià)計費加收20%。
4. 每次乘車(chē)加收1元錢(qián)的燃油附加稅。
小明每天上下班都要打車(chē),公司和家的距離為12公里,上午上班時(shí)間為9點(diǎn),下午下班時(shí)間為6點(diǎn)。
請編寫(xiě)一個(gè)小程序計算小明每天打車(chē)的總費用。

#include <stdio.h>float taxifee(int clock,int miles){    float money;    if(miles<=3)    {        money=14;        printf("費用為14\n");    }    else    {        if(clock>=23 || clock<5)        {            money=13+1+2.3*(miles-3)*1.2;            printf("夜間車(chē)費為:%f\n",money);        }        else        {            money=13+1+2.3*(miles-3);            printf("日間車(chē)費為:%f\n",money);        }    }    return money;    }int main(){    printf("打的總費用:%.1f\n",taxifee(9,12)+taxifee(18,12));    return 0;}

數組初體驗

程序中也需要容器,只不過(guò)該容器有點(diǎn)特殊,它在程序中是一塊連續的,大小固定并且里面的數據類(lèi)型一致的內存空間,它還有個(gè)好聽(tīng)的名字叫數組??梢詫到M理解為大小固定,所放物品為同類(lèi)的一個(gè)購物袋,在該購
物袋中的物品是按一定順序放置的。

我們來(lái)看一下如何聲明一個(gè)數組:

數據類(lèi)型 數組名稱(chēng)[長(cháng)度];

數組只聲明也不行啊,看一下數組是如何初始化的。說(shuō)到初始化,C語(yǔ)言中的數組初始化是有三種形式的,分別是:

  1. 數據類(lèi)型 數組名稱(chēng)[長(cháng)度n] = {元素1,元素2…元素n};
  2. 數據類(lèi)型 數組名稱(chēng)[] = {元素1,元素2…元素n};
  3. 數據類(lèi)型 數組名稱(chēng)[長(cháng)度n]; 數組名稱(chēng)[0] = 元素1; 數組名稱(chēng)[1] = 元素2; 數組名稱(chēng)[n-1] = 元素n;

我們將數據放到數組中之后又如何獲取數組中的元素呢?

獲取數組元素時(shí): 數組名稱(chēng)[元素所對應下標];

如:初始化一個(gè)數組 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。

注意:

  1. 數組的下標均以0開(kāi)始;
  2. 數組在初始化的時(shí)候,數組內元素的個(gè)數不能大于聲明的數組長(cháng)度;
  3. mtianyan: 如果采用第一種初始化方式,元素個(gè)數小于數組的長(cháng)度時(shí),多余的數組元素初始化為0;
  4. 在聲明數組后沒(méi)有進(jìn)行初始化的時(shí)候,靜態(tài)(static)和外部(extern)類(lèi)型的數組元素初始化元素為0,自動(dòng)(auto)類(lèi)型的數組的元素初始化值不確定。

數組的遍歷

數組就可以采用循環(huán)的方式將每個(gè)元素遍歷出來(lái),而不用人為的每次獲取指定某個(gè)位置上的元素,例如我們用for循環(huán)遍歷一個(gè)數組:

注意以下幾點(diǎn):

  1. 最好避免出現數組越界訪(fǎng)問(wèn),循環(huán)變量最好不要超出數組的長(cháng)度.
  2. C語(yǔ)言的數組長(cháng)度一經(jīng)聲明,長(cháng)度就是固定,無(wú)法改變,并且C語(yǔ)言并不提供計算數組長(cháng)度的方法。

由于C語(yǔ)言是沒(méi)有檢查數組長(cháng)度改變或者數組越界的這個(gè)機制,可能會(huì )在編輯器中編譯并通過(guò),但是結果就不能肯定了,因此還是不要越界或者改變數組的長(cháng)度

c語(yǔ)言獲取數組長(cháng)度

int length = sizeof(arr)/sizeof(arr[0]);

數組作為函數參數

數組可以由整個(gè)數組當作函數的參數,也可以由數組中的某個(gè)元素當作函數的參數:

  1. 整個(gè)數組當作函數參數,即把數組名稱(chēng)傳入函數中,例如:

  1. 數組中的元素當作函數參數,即把數組中的參數傳入函數中,例如:

數組作為函數參數時(shí)注意以下事項:

  1. 數組名作為函數實(shí)參傳遞時(shí),函數定義處作為接收參數的數組類(lèi)型形參既可以指定長(cháng)度也可以不指定長(cháng)度。
  2. 數組元素作為函數實(shí)參傳遞時(shí),數組元素類(lèi)型必須與形參數據類(lèi)型一致。

mtianyan: 數組的應用(一)[冒泡排序]

以升序排序為例冒泡排序的思想:相鄰元素兩兩比較,將較大的數字放在后面,直到將所有數字全部排序。就像小學(xué)排隊時(shí)按大小個(gè)排一樣,將一個(gè)同學(xué)拉出來(lái)和后面的比比,如果高就放后面,一直把隊伍排好。

#include <stdio.h>int 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("\n************排隊前*************\n");    for(i=0;i<10;i++)    {        if(i != 9)               printf("%1.2f, ", arr[i]);  //%1.2f表示小數點(diǎn)前一位,小數點(diǎn)后精確到兩位        else            printf("%1.2f", arr[i]);    //%1.2f表示小數點(diǎn)前一位,小數點(diǎn)后精確到兩位    }    for(i=8; i>=0; i--)    {        for(j=0;j<=i;j++)        {            if( arr[j]>arr[j+1])      //當前面的數比后面的數大時(shí)            {                double temp;    //定義臨時(shí)變量temp                temp=arr[j];//將前面的數賦值給temp                arr[j]=arr[j+1];             //前后之數顛倒位置                arr[j+1]=temp;//將較大的數放在后面                }                         }                    }    printf("\n************排隊后*************\n");    for(i=0;i<10;i++)    {        if(i != 9)               printf("%1.2f, ", arr[i]);  //%1.2f表示小數點(diǎn)前一位,小數點(diǎn)后精確到兩位             else            printf("%1.2f", arr[i]);    //%1.2f表示小數點(diǎn)前一位,小數點(diǎn)后精確到兩位    }    return 0;    }

數組的應用(二)[數組查找功能]

當我們購物之后,拎著(zhù)購物袋回到家,會(huì )一一檢查購物袋中的物品看是否缺少或者都是想購之物。

那么應用到程序中,可以使用數組查找功能,看看是否存在該數據,如果存在并返回該元素的下標。

#include <stdio.h>int getIndex(int arr[5],int value){    int i;    int index;    for(i=0;i<5;i++)    {       /* 請完善數組查詢(xún)功能 */       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\n",value,index);                 }    else    {        printf("%d在數組中不存在。\n",value);        }    return 0;    }

字符串與數組

C語(yǔ)言中,是沒(méi)有辦法直接定義字符串數據類(lèi)型的,但是我們可以使用數組來(lái)定義我們所要的字符串。一般有以下兩種格式:

  1. char 字符串名稱(chēng)[長(cháng)度] = “字符串值”;
  2. char 字符串名稱(chēng)[長(cháng)度] = {‘字符1’,’字符2’,…,’字符n’,’\0’};

注意:

  1. []中的長(cháng)度是可以省略不寫(xiě)的;
  2. 采用第2種方式的時(shí)候最后一個(gè)元素必須是’\0’,’\0’表示字符串的結束標志;
  3. 采用第2種方式的時(shí)候在數組中不能寫(xiě)中文。
    在輸出字符串的時(shí)候要使用:printf(“%s”,字符數組名字);或者puts(字符數組名字);。

mtianyan:字符串函數

常用的字符串函數如下(strlen,strcmp,strcpy,strcat,atoi):

使用字符串函數注意以下事項:

  1. strlen()獲取字符串的長(cháng)度,在字符串長(cháng)度中是不包括‘\0’而且漢字和字母的長(cháng)度是不一樣的。比如:

  1. strcmp()在比較的時(shí)候會(huì )把字符串先轉換成ASCII碼再進(jìn)行比較,返回的結果為0表示s1和s2的ASCII碼相等,返回結果為1表示s1比s2的ASCII碼大,返回結果為-1表示s1比s2的ASCII碼小,例如:

  1. strcpy()拷貝之后會(huì )覆蓋原來(lái)字符串且不能對字符串常量進(jìn)行拷貝,比如:

  1. strcat在使用時(shí)s1與s2指的內存空間不能重疊,且s1要有足夠的空間來(lái)容納要復制的字符串,如:

多維數組

多維數組的定義格式是:
數據類(lèi)型 數組名稱(chēng)[常量表達式1][常量表達式2]…[常量表達式n];

定義了一個(gè)名稱(chēng)為num,數據類(lèi)型為int的二維數組。其中第一個(gè)[3]表示第一維下標的長(cháng)度,就像購物時(shí)分類(lèi)存放的購物;第二個(gè)[3]表示第二維下標的長(cháng)度,就像每個(gè)購物袋中的元素。

多維數組的初始化與一維數組的初始化類(lèi)似也是分兩種:

  1. 數據類(lèi)型 數組名稱(chēng)[常量表達式1][常量表達式2]…[常量表達式n] = {{值1,..,值n},{值1,..,值n},…,{值1,..,值n}};
  2. 數據類(lèi)型 數組名稱(chēng)[常量表達式1][常量表達式2]…[常量表達式n]; 數組名稱(chēng)[下標1][下標2]…[下標n] = 值;

多維數組初始化要注意以下事項:

  1. 采用第一種始化時(shí)數組聲明必須指定列的維數。mtianyan: 因為系統會(huì )根據數組中元素的總個(gè)數來(lái)分配空間,當知道元素總個(gè)數以及列的維數后,會(huì )直接計算出行的維數;
  2. 采用第二種初始化時(shí)數組聲明必須同時(shí)指定行和列的維數。

二維數組定義的時(shí)候,可以不指定行的數量,但是必須指定列的數量

二維數組定義的時(shí)候,可以不指定行的數量,但是必須指定列的數量。

多維數組的遍歷

多維數組也是存在遍歷的,和一維數組遍歷一樣,也是需要用到循環(huán)。不一樣的就是多維數組需要采用嵌套循環(huán)

注意:多維數組的每一維下標均不能越界

綜合練習:

#include <stdio.h>#define N 10//打印分數 void printScore(int score[]){    int i;    printf("\n");    for(i=0;i<N;i++)    {        printf("%d ",score[i]);                   }    printf("\n");     }//計算考試總分 int getTotalScore(int score[]){    int sum = 0;    int i;    for(i=0;i<N;i++)    {        sum+=score[i];                    }     return sum;}//計算平均分 int getAvgScore(int score[]){    return getTotalScore(score)/N;   }//計算最高分 int getMax(int score[]){    int max = -1;    int i;    for(i=0;i<N;i++)    {        if(score[i]>max)        {            max = score[i];                      }                    }     return max;}//計算最低分 int getMin(int score[]){    int min =100;    int i;    for(i=0;i<N;i++)    {        if(score[i]< min)        {            min = score[i];                      }                    }     return min;}//分數降序排序 void sort(int score[]){    int i,j;    for(i=N-2;i>=0;i--)    {        for(j=0;j<=i;j++)        {            if(score[j]<score[j+1])            {                int temp;                temp = score[j];                score[j] = score[j+1];                 score[j+1]=temp;                              }                         }                       }    printScore(score);     }int main(){    int score[N]={67,98,75,63,82,79,81,91,66,84};    int sum,avg,max,min;    sum = getTotalScore(score);    avg = getAvgScore(score);    max = getMax(score);    min = getMin(score);    printf("總分是:%d\n",sum);    printf("平均分是:%d\n",avg);    printf("最高分是:%d\n",max);    printf("最低分是:%d\n",min);    printf("----------成績(jì)排名---------\n");    sort(score);    return 0;    }
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言學(xué)習隨筆
vbscript 教程
Java編程入門(mén)學(xué)習之 Java語(yǔ)法基礎
學(xué)c語(yǔ)言最重要的知識點(diǎn)總結為學(xué)c語(yǔ)言發(fā)愁的同學(xué)轉走背一下吧(指針星號在非變量定義的時(shí)候它是一個(gè)操作符訪(fǎng)問(wèn)指針所指向存儲空間)
C Primer 第5版
項目三 數碼管顯示
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久