C语言程序设计课件_第1页
C语言程序设计课件_第2页
C语言程序设计课件_第3页
C语言程序设计课件_第4页
C语言程序设计课件_第5页
已阅读5页,还剩338页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C語言程式設計

第一章C語言概述1.1C語言的發展歷史及其特點1.1.1電腦語言的發展歷史UNIX操作系統1969-1972主要用組合語言編寫B語言1970缺乏豐富的數據類型,以字長編址C語言1971在B語言基礎上加入豐富的數據類型和強有力的數據結構ANSIC1988美國國家標準化協會公佈C標準ANSI/ISO1989國際標準化組織採用了ANSIC標準ISOC1994國際標準化組織修訂標準1.1.2C語言的發展歷史1、語言簡練、緊湊,使用方便、靈活;

2、運算符豐富;

3、數據類型豐富;

4、可讀性好、可移植性好,應用性廣;5、包含大量的標準化庫函數;6、C語言是結構化的語言;7、C語言支持模組化程式設計。1.1.3C語言的特點

1.2簡單的C語言程式介紹例1.1#include<stdio.h>void

main(){

printf("ThisisaCprogram.\n");}/*檔包含*//*主函數*//*函數體開始*//*輸出語句*//*函數體結束*/

說明:main-主函數名,void-函數類型每個C程式必須有一個主函數main{}是函數開始和結束的標誌,不可省每個C語句以分號結束使用標準庫函數時應在程式開頭一行寫:

#include<stdio.h>StandardInput&Output說明:本程式的作用是輸出一行資訊:ThisisaCprogram.1.2.1簡單的C語言程式例1.2求兩數之和

#include<stdio.h>

voidmain()/*求两数之和*/

{

inta,b,sum;/*聲明,定義變數為整型*/

/*以下3行為C語句*/

a=123;b=456;

sum=a+b;

printf(″sumis%d\n″,sum);

}說明:

/*……*/表示注釋。注釋只是給人看的,對編譯和運行不起作用。所以可以用漢字或英文字元表示,可以出現在一行中的最右側,也可以單獨成為一行。說明:輸出一行資訊:sumis579integer例1.3求2個數中較大者。

#include<stdio.h>

voidmain()/*主函数*/

{

intmax(intx,inty);/*對被調用函數max的聲明*/

inta,b,c;/*定義變數a、b、c*/

scanf(″%d,%d″,&a,&b);/*輸入變數a和b的值*/

c=max(a,b);/*調用max函數,將得到的值賦給c*/

printf(″max=%d\n″,c);/*輸出c的值*/

}程式運行情況如下:8,5↙(輸入8和5賦給a和b)max=8(輸出c的值)intmax(intx,inty){

intz;if(x>y)z=x;elsez=y;return(z);

}說明:本程式包括main和被調用函數max兩個函數。max函數的作用是將x和y中較大者的值賦給變數z。return語句將z的值返回給主調函數main。

1、一個完整的C語言程式,是由一個main()函數(又稱主函數)和若干個其他函數結合而成的,或僅由一個main()函數構成。函數是C語言程式的基本單位。

2、一個C語言程式,總是從main()函數開始執行,而不論其在程式中的位置。當主函數執行完畢時,亦即程式執行完畢。習慣上,將主函數main()放在最前頭。

3、一個函數由兩部分組成:函數返回值的類型函數名(函數參數表){[聲明語句部分];執行語句部分;

}1.2.2C語言的特點函數首部函數體小結:(1)C程式總是從main函數開始執行的,與main函數的位置無關。(2)所有語句都必須以分號";"結束,函數的最後一個語句也不例外。(3)程式行的書寫格式自由,既允許1行內寫幾條語句,也允許1條語句分寫在幾行上。(4)允許使用注釋C語言的注釋格式為:/*……*/(5)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數scanf和printf等函數來完成的。C對輸入輸出實行“函數化”。1.3.1上機運行環境常用的有TurboC2.0、TurboC++3.0、VisualC++6.0等。

TurboC++3.0:具有方便、直觀和易用的介面,雖然它也是DOS環境下的集成環境,但是可以把啟動TurboC++3.0集成環境的DOS執行檔tc.exe生成快捷方式,也可以用滑鼠操作。VisualC++6.0:基於Windows環境的一種面向對象的可視化編程環境,作為一個功能非常強大的可視化應用程式開發工具,是電腦界公認的最優秀的應用開發工具之一。

1.3C語言程式的上機操作1.3.2上機運行步驟

1、編輯

生成C根源程式檔,擴展名為.C(VisualC++6.0中的扩展明为.cpp)

2、編譯

生成目標檔,擴展名為.obj

3、連接

將目標程式和庫函數及其他目標程式連接起來,生成可執行檔,檔擴展名為.exe

4、運行

運行程式,得到結果1.3.3VisualC++6.0上機環境1、啟動VisualC++6.0應用程式2、建立一個新的工作空間3、建立一個新的工程4、建立原始檔案5、編輯C原始檔案6、連編應用程式7、執行應用程式8、關閉工作區一個程式應包括兩個方面的內容:對數據的描述:在程式中要指定數據的類型和數據的組織形式,即數據的結構。(datastructure)對操作的描述:即操作步驟,也就是演算法(algorithm)。數據和操作的關係:數據是操作的對象,操作的目的是對數據進行加工,以得到期望的結果。著名電腦科學家沃思提出一個公式:

數據結構+演算法=程式

1.4C語言演算法

廣義地說,為解決一個問題而採取的方法和步驟,就稱為“演算法”。用電腦解決問題的步驟,即電腦演算法。電腦演算法可分為兩大類別:數值運算演算法:求數值解,例如求方程的根、求函數的定積分等。非數值運算:包括的面十分廣泛,最常見的是用於事務管理領域,例如圖書檢索、人事管理、行車調度管理等。1.4.1演算法的概念1.4.2演算法的特性有窮性:包含有限的操作步驟。確定性:演算法中的每一個步驟都應當是確定的。有零個或多個輸入:輸入是指在執行演算法時需要從外界取得必要的資訊。有一個或多個輸出:演算法的目的是為了求解,“解”就是輸出。有效性:演算法中的每一個步驟都應當能有效地執行,並得到確定的結果。1.4.3演算法的描述

可以用不同的方法表示演算法,常用的有:自然語言傳統流程圖結構化流程圖電腦語言自然語言就是人們日常使用的語言,可以是漢語或英語或其他語言。用自然語言表示通俗易懂,但文字冗長,容易出現“歧義性”。自然語言表示的含義往往不大嚴格,要根據上下文才能判斷其正確含義,描述包含分支和迴圈的演算法時也不很方便。因此,除了那些很簡單的問題外,一般不用自然語言描述演算法。1、用自然語言表示演算法2、用流程圖表示演算法

美國國家標準化協會ANSI(AmericanNationalStandardInstitute)規定了一些常用的流程圖符號:起止框判斷框處理框輸入/輸出框注釋框流程線連接點開始1=>p1=>ip×i=>pi+1=>ii≤5真結束假輸出p的值例1-4求5!的演算法流程圖步驟1:令p=1步驟2:令i=1步驟3:使pxi,並將乘積放入p中。通常表示為pxi=>p步驟4:使i的值加1,表示為i+1=>I步驟5:如果i不大於5,返回到步驟3繼續向下執行;否則演算法結束。p中的值即最後結果。三種基本結構:Bohra和Jacopini提出了以下三種基本結構:

順序結構、選擇結構、迴圈結構用這三種基本結構作為表示一個良好演算法的基本單元。BA順序結構條件PAB成立不成立選擇結構條件PA成立不成立迴圈結構條件PA成立不成立當型---while型迴圈條件PA假真直到型---until型迴圈1973年兩名美國學者提出了一種新的流程圖形式,並用二人名字的第一個字母組合命名了該流程圖。即N-S流程圖,也稱盒圖。三種基本結構的表示:順序結構選擇結構迴圈結構3、用N-S流程圖表示演算法4、用電腦語言表示演算法概念:用電腦實現演算法。電腦是無法識別流程圖和偽代碼的。只有用電腦語言編寫的程式才能被電腦執行。因此在用流程圖或偽代碼描述出一個演算法後,還要將它轉換成電腦語言程式。特點:用電腦語言表示演算法必須嚴格遵循所用的語言的語法規則,這是和偽代碼不同的。用處:要完成一件工作,包括設計演算法和實現演算法兩個部分。設計演算法的目的是為了實現演算法。應當強調說明:寫出了C程式,仍然只是描述了演算法,並未實現演算法。只有運行程式才是實現演算法。應該說,用電腦語言表示的演算法是電腦能夠執行的演算法。什麼是數據類型?數據結構+演算法=程式C語言中以“數據類型”形式存在對數據的描述對操作的描述

2.1C語言的基本數據類型C語言提供了以下一些數據類型。

數據類型指針類型空類型(無值類型)void構造類型數組類型結構類型struct聯合類型

union基本類型舉枚類型enum整型int字元型char實型(浮點型)單精確度實型

float雙精度實型

double概念:在程式運行過程中,其值不能被改變的量。在程式中以兩種形式出現:直接常量(字面常量)和符號常量。2.2.1整型常量(1)十進位整數。如:123,-456,4。√045,12D×

(2)八進制整數。以0頭的數是八進制數,通常是無符號數。如:0123,073,0101。017777。√256,03A2×(3)十六進制整數。以0x開頭的數是16進制數,通常是無符號數。如:0x123,0xffff。√023,23D×2.2常量兩種表示形式小數0.123指數3e-3注意:字母e(或E)之前必須有數字,且e/E後面的指數必須為整數:1e3、1.8e-3、-123e-6、-.1e-3

e3、2.1e3.5、.e3、e

2.2.2實型常量規範化的指數形式:在字母e(或E)之前的小數部分中,小數點左邊應有一位(且只能有一位)非零的數字。例如:123.456可以表示為:

123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,其中的1.23456e2稱為“規範化的指數形式”。2.2.3字元常量(1)用單引號括起來的一個字元是字元型常量(2)只能包含一個字元例‘a’,’A’,‘1’√‘abc’、“a”×

字元形式含義

\n換行,從當前位置移到下一行開頭

\t水準製錶(跳到下一個tab位置)\b退格,將當前位置移到前一列

\r回車,將當前位置移到本行開頭

\'單撇號字元

\\反斜杠字元

\"雙撇號字元

\ddd1~3位8進制數所代表的字元

\xhh1~2位16進制數所代表的字元

C語言還允許使用一種特殊形式的字元常量,就是以反斜杠"\"開頭的轉義字元。例2.1轉義字元的使用

#include<stdio.h>

voidmain()

{inta,b,c;a=1;b=2;c=3;printf(“%d\n\t%d%d\n%d%d\t\b%d\n”,a,b,c,a,b,c);

}顯示幕上的運行結果:1231232.2.4字串常量字串常量是一對雙撇號括起來的字元序列合法的字串常量:“Howdoyoudo.”,“CHINA”,“a”,“$123.45”可以輸出一個字串,如printf(“Howdoyoudo.”);字元與字串的區別有哪些?2.2.5符號常量用一個識別字代表一個常量。格式:#define常量名字面常量舉例:#definePRICE100

#definePI3.14#defineC1’a’習慣上常量名用大寫符號常量的定義放在函數外面。例2.2符號常量的使用

#definePRICE30

#include<stdio.h>

voidmain()

{intnum,total;

num=10;

total=num*PRICE;

printf(″total=%d\n″,total);}識別字就是一個名字在程式執行過程中,可以改變的量稱為變數。1、識別字就是一個名字(如常量名、變數名、函數名…)。2、組成:只能由字母、數字、下劃線組成。且第一個字元必須為字母或下劃線。例:sum,_total,month,Student_name,BASIC,li_ling√M.D.John,¥123,3D64,a>b×3、C語言的關鍵字不能用作變數名。4、在選擇變數名和其他識別字時,應注意做到“見名知意”,即選有含意的英文單詞(或其縮寫)作識別字。例如,name(姓名)、age(年齡)5、建議變數名的長度最好不要超過8個字元。識別字2.3變數2.3.1整型變數

類型類型說明符長度數的範圍基本型int

2位元組

-32768~32767

短整型short

2位元組

-215~215-1

長整型long4位元組

-231~231-1

無符號整型unsigned2位元組

0~65535无符号短整型unsignedshort2位元組

0~65535

無符號長整型unsignedlong4位元組

0~(232-1)1、整型變數的分類2、整型變數的說明程式中用到的變數必須“先說明,後使用”。變數說明的一般格式:類型說明符變數名,變數名,…;例如:

inta,b;(指定變數a、b為整型)

unsignedshortc,d;(指定變數c、d為無符號短整型)

longe,f;(指定變數e、f為長整型)3、整型常量的尾碼(1)一個整數,如果其值在-32768~+32767範圍內,認為它是int型。(2)一個整數,如果其值超過了上述範圍,而在-2147483637~+2147483647範圍內,則認為它是為長整型。(3)一個整常量後面加一個字母u或U,認為是unsignedint型,如12345u。4)在一個整常量後面加一個字母l或L,則認為是longint型常量。例如:123l432L0L2.3.2實型變數類型位數數的範圍有效數字float32

10-37~10386~7位double型64

10-307~1030815~16位longdouble12810-4931~10493218~19位1、實型變數的分類(單精確度型、雙精度型、長雙精度型)2、實型變數的說明

floata,b;(指定變數a,b為單精確度型)

doublec,d;(指定變數c,d為雙精度型)

3、實型常量的尾碼實型常數,系統按雙精度來處理,但如是在數的後面加字母f或F(如1.65f,64.87F),這樣編譯系統就會把它們按單精確度處理。例2.3float和double的應用

#include<stdio.h>

voidmain()

{floata;

doubleb;

a=5555.55555;

b=5555.5555555555;

printf(“%f\n%f”,a,b);

}2.3.3字元型變數字元型變數用來存放字元常量,注意只能放一個字元。字元變數的定義形式如下:charc1,c2;可以用下麵語句對c1,c2賦值:

c1=‘a’;c2=‘b’;一個字元變數在內存中占一個位元組。

將一個字元常量放到一個字元變數中,實際上並不是把該字符本身放到記憶體單元中去,而是將該字元的相應的ASCII代碼放到存儲單元中。例:字元變數ch中存放字元'a',其ASCII碼為97,在內存中以二進位形式存放,其格式如下:ch01100001注意:字元型數據與整型數據在存儲方式上的相似性使得兩者之間可以通用。一個字元數據既可以以字元形式輸出,也可以以整數形式輸出。但字元型數據的表示範圍是:0~255。例2.4向字元變數賦以整數。

#include<stdio.h>

voidmain()

{charc1,c2;

c1=97;

c2=98;

printf(“%c%c\n”,c1,c2);

printf(“%d%d\n”,c1,c2);

說明:在第3和第4行中,將整數97和98分別賦給c1和c2,它的作用相當於以下兩個賦值語句:c1=′a′;c2=′b′; 因為’a’和’b’的ASCII碼為97和98運行結果:

ab

9798例2.5大小寫字母的轉換

#include<stdio.h>

voidmain()

{charc1,c2;

c1=‘a’;

c2=‘b’;

c1=c1-32;

c2=c2-32;

printf(“%c%c″,c1,c2);

}說明:程式的作用是將兩個小寫字母a和b轉換成大寫字母A和B。從ASCII代碼表中可以看到每一個小寫字母比它相應的大寫字母的ASCII碼大32。C語言允許字元數據與整數直接進行算術運算。

運行結果:AB

2.4運算符與運算式1、算術運算符

+-*/%2、關係運算符><==>=<=!=

3、邏輯運算符!&&||4、位運算符<<>>~|^&5、賦值運算符=及其擴展賦值運算符6、條件運算符?:7、逗號運算符,8、指針運算符*&9、求位元組數運算符sizeof10、強制類型轉換運算符(類型)11、分量運算符.12、下標運算符[]13、其他如函數調用運算符()分類運算符C的運算符有以下幾類:2.4.1算術運算符和算術運算式

1、算術運算符+(加法運算符,或正值運算符,如:3+5、+3)-(減法運算符,或負值運算符,如:5-2、-3)*(乘法運算符,如:3*5)/(除法運算符,如:5/3)%(模運算符,或稱求餘運算符,如:7%4的值為3)++(自增運算符,如:i++、++i)--(自減運算符,如:i--,--i)雙目運算符左結合單目運算符右結合自增、自減運算符

作用是使變數的值增1或減1如:

++i(在使用i之前,先使i的值加1)--i(在使用i之前,先使i的值減1)i++(在使用i之後,使i的值加1)i--(在使用i之後,使i的值減1)注意:兩個整數相除的結果為整數,舍去小數部分。當商為負數時,多採用“向零取整”的方法。例:

5/3=1

-5/3=

-1求餘運算的兩側均應為整數例:5%3=2例:假設i,j均已說明,且i=3;①j=++i;

i的值先變成4,再賦給j,j的值也為4②j=i++;先將i的值3賦給j,j的值為3,然後i變為4例2.7自增、自減運算符的應用#include“stdio.h”voidmain(){inti,m,n,j,k;i=10;m=i++;n=++i;j=i--;k=--I;printf(“%d,%d,%d,%d\n”,m,n,j,k);}2、算術運算式用算術運算符和括弧將運算對象(也稱運算元)連接起來的、符合C語法規則的式子,稱為C算術運算式。運算對象包括常量、變數、函數等。例如:a*b/c-1.5+‘a’是一個合法的運算式。2.4.2賦值運算符與賦值運算式1、簡單賦值運算符與賦值運算式賦值符號“=”就是賦值運算符,它的作用是將一個數據賦給一個變數。如“a=3”的作用是執行一次賦值操作(或稱賦值運算)。把常量3賦給變數a。也可以將一個運算式的值賦給一個變數。如:b=4;a=b+3;

由賦值運算符將一個變數和一個運算式連接起來的式子稱為“賦值運算式”。一般形式為:<變數><賦值運算符><運算式>

例如:“a=5”是一個賦值運算式簡單賦值運算符=複合算術賦值運算符+=,-=,*=,/=,%=複合位運算賦值運算符&=,|=,^=,>>=,<<=2、變數賦初值(1)C語言允許在定義變數的同時使變數初始化。如:inta=3;//指定a為整型變數,初值為3

floatf=3.56;//指定f為浮點型變數,初值為3.56charc=‘a’;//指定c為字元變數,初值為‘a’(2)可以使被定義的變數的一部分賦初值。如:inta,b,c=5;表示指定a、b、c為整型變數,但只對c初始化,c的初值為5。相當於:inta,b,c;c=5;(3)如果對幾個變數賦以同一個初值,應寫成:inta=3,b=3,c=3;表示a、b、c的初值都是3。不能寫成∶inta=b=c=3;3、類型轉換

賦值運算式要求左右兩邊的數據類型要相同,如果不一致,在賦值時要進行類型轉換。包括自動轉換和強制類型轉換兩種方法。doublefloatlongunsignedintchar,short高低(1)自動類型轉換轉換規則若參與運算的運算量類型不同,則先轉換成同一種類型,然後進行運算;轉換按數據長度增加的方向進行,以保證精度不降低;所有實型運算都以雙精度進行,即使僅含float型,也要先轉換成double型,再運算。char和short型參與運算時,必須先轉換為int型。在賦值運算中,賦值符號兩邊的數據類型不同時,把賦值號右邊的類型自動換成左邊變數的類型。10+‘a’+i*f-d/e

若inti;floatf;doubled;longe;i=2;f=2.5;d=3.9;e=3;下邊運算式的值是多少??例2.9自動轉換類型的應用#include“stdio.h”voidmain(){inta,b;floatx=23.54;charc1=‘d’;a=x;b=c1;printf(“%d,%d\n”,a,b);}(2)強制類型轉換可以利用強制類型轉換運算符將一個運算式轉換成所需類型。一般形式:(<類型名>)<運算式>例如:(double)a將a轉換成double類型(int)(x+y)将x+y的值轉換成整型(float)(5%3)將5%3的值轉換成float型例2.10強制類型轉換。

#include<stdio.h>

voidmain()

{floatx;

inti;

x=3.6;

i=(int)x;

printf("x=%f,i=%d\n",x,i);

}運行結果:

x=3.600000,i=3說明:有兩種類型轉換,一種是在運算時不必用戶指定,系統自動進行的類型轉換,如3+6.5。第二種是強制類型轉換。當自動類型轉換不能實現目的時,可以用強制類型轉換。4、複合賦值運算符及運算式在賦值符“=”之前加上其他運算符,可以構成複合賦值運算符。例如:a+=3等價於a=a+3x*=y+8等價於x=x*(y+8)x%=3等價於x=x%3以“a+=3”為例來說明,它相當於使a進行一次自加(3)的操作。即先使a加3,再賦給a。注意:如果b是包含若干項的運算式,則相當於它有括弧。如:

①x%=y+3

②x%=(y+3)③x=x%(y+3)(不要錯寫成x=x%y+3)

5、對賦值運算式求解的過程

求賦值運算符右側的“運算式”的值;②賦給賦值運算符左側的變數。例如:賦值運算式“a=3*5”的值為15,執行運算式後,變數a的值也是15。

賦值運算式中的“運算式”,又可以是一個賦值運算式。例如:a=(b=5)分析:請分析下麵的賦值運算式∶(a=3*5)=4*3

賦值運算式也可以包含複合的賦值運算符。如:a+=a-=a*a分析:若a的初值為12,則執行上述運算式後a=?能否寫成:a=3*5=4*32.4.3逗號運算符與逗號運算式逗號運算符:

將兩個或多個運算式連接起來,又稱為“順序求值運算符”。

如:3+5,6+8逗號運算式的一般形式:

運算式1,運算式2,運算式3,……,運算式n求解過程:從運算式1開始求解,逐個求解運算式2、運算式3、……運算式n;整個逗號運算式的值是運算式n的值。

逗號運算符是所有運算符中級別最低的。例:(1)a=3*5,a*4

(2)(a=3*5,a*4),a+5(3)x=(a=3,6*3)

(4)x=a=3,6*3注意:並不是任何地方出現的逗號都是作為逗號運算符。例如函數參數也是用逗號來間隔的。如:printf(“%d,%d,%d”,a,b,c);2.4.5關係運算符和關係運算式關係運算符及其優先次序(從左到右)<(小於)<=(小於或等於)>(大於)>=(大於或等於)==(等於)!=(不等於)優先順序相同(高)優先順序相同(低)算術運算符——關係運算符——賦值運算符高低優先順序別:如:c>a+ba==b<ca=b<cc>(a+b)a==(b<c)a=(b<c)關係運算式用關係運算符將兩個運算式(可以是算術運算式或關係運算式,邏輯運算式,賦值運算式,字元運算式)接起來的式子,稱關係運算式例:a>b,a+b>b+c,(a=3)>(b=5),’a’<‘b’,(a>b)>(b<c)

關係運算式的值是一個邏輯值,即“真”或“假”。例:關係運算式“a>b”的值為“真”,運算式的值為1。已知:(a=3b=2c=1d=0)0a==b>cd==a>b+c1d=a>b+c?思考C語言中沒有專用的邏輯值,1代表真,0代表假例2.13用C運算式描述下列條件(1)整數x為偶數;(2)整數m不是n的倍數;X%2==0m%n!=02.4.6邏輯運算符和邏輯運算式1.邏輯運算符及其優先次序(1)&&(邏輯與)(2)||(邏輯或)(3)!(邏輯非)優先次序:賦值<||<&&<關係

<算術<!2.邏輯運算式用邏輯運算符將關係運算式或邏輯量連接起來的式子就是邏輯運算式。邏輯運算式的值應該是一個邏輯量“真”或“假”。例:a&&b若a,b為真,則a&&b為真(1)

a||b若a,b之一為真,則a||b為真(1)

。!a若a為真,則!a為假(0)

。例:設a=4,b=5:!a的值為0a&&b的值為1a||b的值為1!a||b的值為14&&0||2的值為1!a&&(5>3)||b的值為1任何非零的數值被認作“真”例:(m=a>b)&&(n=c>d)當a=1,b=2,c=3,d=4,m和n的原值為1時,由於“a>b”的值為0,因此m=0,而“n=c>d”不被執行,因此n的值不是0而仍保持原值1。在邏輯運算式的求解中,並不是所有的邏輯運算符都要被執行。(1)a&&b&&c只有a為真時,才需要判斷b的值,只有a和b都為真時,才需要判斷c的值。(2)a||b||c只要a為真,就不必判斷b和c的值,只有a為假,才判斷b。a和b都為假才判斷c2.4.4條件運算符和條件運算式條件運算符是C語言中唯一的一個三目運算符。格式:運算式1?運算式2∶運算式3執行過程:先求解運算式1,若為真,則求解運算式2,此時運算式2的值就作為整個條件運算式的值。若運算式1的值假,則求解運算式3,表達式3的值就是整個條件運算式的值。

條件運算符優先順序高於賦值運算符,低於關係運算符和算術運算符。例2.12輸入一個字元,判別它是否大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換。然後輸出最後得到的字元。

#include<stdio.h>

voidmain()

{charch;

scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z')?(ch+32):ch;

printf("%c\n",ch);

}

2.5位運算符與位運算所謂位運算,就是參與運算的量按二進位進行運算。C語言提供的位運算符有:

運算符含義運算符含義

&按位與~取反|按位或<<左移∧按位異或>>右移(1)位運算符中除~以外,均為雙目(元)運算符,即要求兩側各有一個運算量。(2)運算量只能是整型或字元型的數據,不能為實型數據。2.5.1按位與運算符&

參加運算的兩個數據,按二進位位進行“與”運算。如果兩個相應的二進位位都為1,則該位的結果值為1;否則為0。即:0&0=0,0&1=0,1&0=0,1&1=1例:3&5並不等於8,應該是按位與運算:00000011(3)&00000101(5)00000001(1)

注意:如果參加&運算的是負數(如-3&-5),則要以補數形式表示為二進位數,然後再按位進行“與”運算。

兩個相應的二進位位中只要有一個為1,該位的結果值為1。即0|0=0,0|1=1,1|0=1,1|1=1例:

060|017,將八進制數60與八進制數17進行按位或運算。00110000|0000111100111111

2.5.2按位或運算符|

異或運算符∧也稱XOR運算符。它的規則是:若參加運算的兩個二進位位同號則結果為0(假)

異號則結果為1(真)即:0∧0=0,0∧1=1,1∧0=1,1∧1=0即:071∧052=023(八進制數)00111001

^

0010101000010011

例:2.5.3按位異或運算符^~是一個單目(元)運算符,用來對一個二進位數按位取反,即將0變1,將1變0。例如,~025是對八進制數25(即二進位數00010101)按位求反。

0000000000010101(~)

1111111111101010(八進制數177752)2.5.4取反運算符~

左移運算符是用來將一個數的各二進位位全部左移若干位。

例如:a=<<2

將a的二進位數左移2位,右補0。若a=15,即二進位數00001111,左移2位得00111100,(十進位數60)

高位左移後溢出,捨棄。2.5.5左移運算符<<例如:a=017時:

a的值用二進位形式表示為00001111,捨棄低2位11:a>>2=000000112.5.6右移運算符>>

右移運算符是用來將一個數的各二進位位全部右移若干位。如:a>>2表示将a的各二進位位右移2位,移到右端的低位被捨棄,對無符號數,高位補0。

3.1數據輸入輸出的概念所謂輸入輸出是以電腦主機為主體而言的輸出:從電腦向外部輸出設備(顯示器,印表機)輸出數據。輸入:從輸入設備(鍵盤,滑鼠,掃描器)向電腦輸入數據。C語言本身不提供輸入輸出語句,輸入和輸出操作是由C函數庫中的函數來實現的。例如:字元輸入函數:getchar字符输出函数:putchar格式输入函数:scanf格式输出函数:printf字串輸入函數:gets字串輸出函數:puts

在使用系統庫函數時,要用預編譯命令“#include”將有關的“頭檔”包括到用戶原始檔案中。例如:在調用標準輸入輸出庫函數時,檔開頭應該有:

#include“stdio.h”

或:

#include<stdio.h>3.2字元數據的輸入輸出3.2.1字元輸出函數(putchar()函數)一般形式:putchar(c)

函數作用:向終端輸出一個字元等價與printf(“%c”,c);

字元型變數整型變數例3.1輸出單個字元。

#include<stdio.h>

voidmain()

{

chara,b,c;

a=‘B’;b=‘O’;c=‘Y’;

putchar(a);putchar(b);

putchar(c);putchar(‘\n’);

}運行結果:BOYputchar(a);putchar(‘\n’);putchar(b);putchar(‘\n’);putchar(c);putchar(‘\n’);運行結果:BOY3.2.2字元輸入函數(getchar()函数)一般形式:getchar()函數作用:從終端輸入一個字元。函數值:從輸入設備得到的字元。等價於scanf(“%c”,&c);括弧內什麼也沒有例3.2輸入單個字元。

#include<stdio.h>

voidmain()

{

charc;

c=getchar();

putchar(c);

putchar(‘\n’);

}運行程式:

從鍵盤輸入字元‘a’

按Enter鍵

屏幕上将显示输出的字符‘a’

a

a

用getchar()得到的字元可以賦給字元型變數、整型變數,或作為運算式的一部分,如c=getchar()+32;

putchar(c);

又如:3.3.1格式輸出函數函數作用:向終端(或系統隱含指定的輸出設備)輸出若干個任意類型的數據。一般格式:printf(“格式控制”,輸出表列)3.3格式輸入與輸出printf("sum=%d\n%c",x,ch);普通字元格式說明轉義字元輸出列表例例3.1#include<stdio.h>voidmain(){inta,b;a=3;b=4;printf("輸出結果為:");printf("%d%d\n",a,b);printf("a=%d,b=%d\n",a,b);printf("a+b=%d",a+b);}輸出結果為:34a=3,b=4a+b=7_輸出%d:以帶符號的十進位形式輸出整數%o:以八進制無符號形式輸出整數%x:以十六進制無符號形式輸出整數%u:以無符號十進位形式輸出整數%c:以字元形式輸出,只輸出一個字元%s:輸出字串%f:以小數形式輸出單,雙精度數,隱含輸出六位小數%e:以指數形式輸出實數%g:選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0幾種常見的格式符的修飾符:l:用於長整型整數,可加在格式符d,o,x,u前面m(代表一個正整數):數據最小寬度n(代表一個正整數):對實數,表示輸出n位小數;對字串,表示截取的字元個數-:輸出的數字或字元在域內向左靠格式說明必須以%開始,以格式字元結束。一般形式如下:

格式說明的一般形式d格式符。用來輸出十進位整數。幾種用法:①%d:按十進位整型數據的實際長度輸出。②%md:m為指定的輸出字段的寬度。如果數據的位數小於m,則左端補以空格,若大於m,則按實際位數輸出。例:printf(″%4d,%4d″,a,b);

若a=123,d=12345,則輸出結果為

_123,12345③%ld:輸出長整型數據。

例:longa=135790;/*定義a為長整型變數*/printf(″%ld″,a);(2)o格式符。以八進制整數形式輸出。輸出的數值不帶符號,符號位也一起作為八進制數的一部分輸出。例:inta=-1;printf("%d,%o",a,a);

-1在內存單元中的存放形式(以補數形式存放)如下:

1111111111111111

輸出為:-1,177777不會輸出帶負號的八進制整數。對長整數(long型)可以用“%lo”格式輸出。還可以指定字段寬度。例:printf("%8o",a);

輸出為:__177777。(數字前有2個空格)(3)x格式符。以十六進制數形式輸出整數。同樣不會出現負的十六進制數。例:

inta=-1;

printf(″%x,%o,%d″,a,a,a);輸出結果為:ffff,177777,-1可以用“%lx”輸出長整型數,也可以指定輸出字段的寬度。例:“%12x”(4)u格式符,用來輸出unsigned型數據。一個有符號整數(int型)也可以用%u格式輸出;一個unsigned型數據也可以用%d格式輸出;unsigned型數據也可用%o或%x格式輸出。(5)c格式符,用來輸出一個字元。如:char

d=‘a’;

printf(“%c”,d);輸出字元a。一個整數,只要它的值在0~255範圍內,可以用“%c”使之按字符形式輸出,在輸出前,系統會將該整數作為ASCII碼轉換成相應的字元;一個字元數據也可以用整數形式輸出。

(6)s格式符輸出字串.①%s。例如:

printf(“%s”,“CHINA”)輸出字串CHINA②%ms,輸出的字串占m列,若串長大於m,則全部輸出,若串長小於m,則左補空格。③%-ms,若串長小於m,字串向左靠,右補空格。④%m.ns,輸出占m列,只取字串中左端n個字元,輸出在m列的右側,左補空格。⑤%-m.ns,n個字元輸出在m列的左側,右補空格,若n>m,m自動取n值,以保證n個字元正常輸出。例3.4字串的輸出。

#include<stdio.h>

voidmain()

{

printf(“%3s,%7.2s,%.4s,%-5.3s\n”,“CHINA”,“CHINA”,“CHINA”,“CHINA”);

}運行結果:

CHINA,CH,CHIN,CHI

(7)f格式符。用來以小數形式輸出實數(包括單雙精度)有以下幾種用法:①%f。不指定字段寬度,由系統自動指定字段寬度,使整數部分全部輸出,並輸出6位小數。應當注意,在輸出的數字中並非全部數字都是有效數字。單精確度實數的有效位數一般為7位。②%m.nf。指定輸出的數據共占m列,其中有n位小數。如果數值長度小於m,則左端補空格。③%-m.nf與%m.nf基本相同,只是使輸出的數值向左端靠,右端補空格。

例3.5輸出實數時的有效位數。

#include<stdio.h>

voidmain()

{floatx,y;

doublea,b;

x=111111.111;y=222222.222;

a=1111111111111.111111111;b=2222222222222.222222222;

printf(“%f,%f”,x+y,a+b);}

運行結果:

333333.328125,3333333333333.333010例3.6輸出實數時指定小數位數。

#include<stdio.h>

voidmain()

{

floatf=123.456;

printf(“%f%10f%10.2f%.2f%-10.2f\n”,f,f,f,f,f);

}運行結果:

123.455994123.455994123.46123.46123.46

(8)e格式符,以指數形式輸出實數。可用以下形式:①%e。不指定輸出數據所占的寬度和數字部分的小數位數,有的系統自動指定給出數字部分的小數位數為6位,指數部分占5位。例:printf(“%e”,123.456);輸出:

1.234560

e+0026列5列所輸出的實數共占13列寬度。(注:不同系統的規定略有不同)②%m.ne和%-m.ne。m、n和“-”字元的含義與前相同。此處n指擬輸出的數據的小數部分(又稱尾數)的小數位數。若f=123.456,則:printf("%e%10e%10.2e%.2e%-10.2e",f,f,f,f,f);輸出如下:1.234560e+002

1.234560e+002

1.23e+002

1.23e+002

1.23e+00213列13列10列9列10列說明:未指定n,自動使n=6.超過給定的10列,乃突破10列的限制,按實際長度輸出。第3個數據共占10列,小數部分占2列,左補空格。只指定n=2,未指定m,自動使m等於數據應占的長度。第5個數據應占10列,數值只有9列,由於是“%-10.2e”,數值向左靠,右補一個空格。(注:有的C系統的輸出格式與此略有不同)

(9)g格式符,用來輸出實數.

它根據數值的大小,自動選f格式或e格式(選擇輸出時占寬度較小的一種),且不輸出無意義的零。例:若f=123.468,則printf(″%f%e%g″,f,f,f);輸出如下:123.468000

1.234680e+002

123.46810列13列10列說明:用%f格式輸出占10列,用%e格式輸出占13列,用%g格式時,自動從上面兩種格式中選擇短者(今以%f格式為短)故占10列,並按%f格式用小數形式輸出,最後3個小數位為無意義的0,不輸出,因此輸出123.468,然後右補3個空格。%g格式用得較少。3.2.2.格式輸入函數函數作用:按照變數在內存的地址將變數值存進去。一般格式:scanf(“格式控制”,地址表列)如果在%後有一個“*”附加說明符,表示跳過它指定的列數。例如:scanf(“%2d%*3d%2d”,&a,&b);如果輸入12_345_67%*3d表示讀入3位整數但不賦給任何變數。例3.7用scanf函數輸入數據。

#include<stdio.h>

voidmain()

{

inta,b,c;

scanf(“%d%d%d”,&a,&b,&c);

printf(“%d,%d,%d\n”,a,b,c);

}運行情況:

345(輸入a,b,c的值)

3,4,5(输出a,b,c的值)a在內存中的地址&是地址運算符“%d%d%d”表示要按十進位整數形式輸入3個數據。輸入數據時,在兩個數據之間以一個或多個空格間隔,也可以用Enter鍵、Tab鍵。下麵輸入均合法:(1)3__4____5(2)34_5(3)3(按Tab鍵)45輸入數據的分隔:inputa,b,c:1234A=12,b=3.000000,c=4.000000輸入1234567系統自動把12賦給a,把345賦給b,67賦給c輸出結果為:a=12,b=345.000000,c=67.000000使用scanf函數時應注意的問題:1、scanf函數中的“格式控制”後面應當是變數地址,而不應是變數名。

2、輸入數據時不能規定精度,例如scanf(“%7.2f”,&a);×3、如果在“格式控制”字串中除了格式說明以外還有其他字元,則在輸入數據時在對應位置應輸入與這些字元相同的字元。4、在用“%c”格式輸入字元時,空格字元和“轉義字元”都作為有效字元輸入。3.4常用數學函數的使用1、sin函數—正弦函數原型:doublesin(doublex);2、sqrt函數—平方根函數原型:doublesqrt(doublex);3、log10函數—求常用對數函數原型:doublelog10(doublex);4、log函數—求自然對數函數原型:doublelog(doublex);5、exp函數—求e的x次方函數原型:doubleexp(doublex);6、pow函數—求x的y次方函數原型:doublepow(doublex,doubley);7、abs函數—求整數的絕對值函數原型:Intabs(inti);8、fabs函數—求實數絕對值函數原型:doublefabs(doublex);說明:(1)在使用這些數學函數時,在程式開頭必須加上#include<math.h>(2)函數的調用格式為:函數名(參數,參數……)例3.11輸入三角形的三邊長,求三角形面積。假設:三個邊長a,b,c能構成三角形。已知面積公式:area=s=(a+b+c)*0.5開始輸入三邊長計算s計算面積結束3.5順序結構程式設計BA#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,s,area;

scanf(″%f,%f,%f″,&a,&b,&c);

s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n”,a,b,c,s);

printf(“area=%7.2f\n”,area);}運行情況:

3,4,6

a=3.00,b=4.00,c=6.00,s=6.50

area=5.33例3.12從鍵盤輸入一個大寫字母,要求改用小寫字母輸出。

#include<stdio.h>

voidmain()

{charc1,c2;

c1=getchar();

printf(“%c,%d\n”,c1,c1);

c2=c1+32;

printf(“%c,%d\n”,c2,c2);

}運行情況:

A↙

A,65

a,97

例3.13求ax2+bx+c=0方程的根,a,b,c由鍵盤輸入,a≠0,且b2-4ac>0。

4.1概述4.1.1C語句概述通常一個C程式由若干個函數組成,每一個函數又包括聲明部分和執行部分,執行部分又由幹條語句組成,每條語句總是以“;”結束。語句是用來對數據進行加工(完成操作任務),是構成程式的基本單位,注意:C語句都是用來完成一定操作的,出現在函數體的執行部分,作用是向電腦系統發出操作指令。聲明部分的內容不應稱為語句。如inta;不是一個C語句。C語句控制語句函數調用語句由一次函數調用加一個分號構成一個語句。運算式語句空語句複合語句if()~else~switch()for()~while()~do~while()continuebreakgotoreturnif(x>y)z=x;elsez=y;printf("Hello!");由運算式加一個分號構成一個語句。a=3;;由{}將一些語句括起來。{t=a;a=b;b=t;}C語句分類4.1.2結構化程式設計方法自頂向下,逐步細化模組化設計,結構化編碼4.2選擇結構程式設計1.if語句的三種基本形式(1)if(運算式e)語句例:

if(x>y)printf(“%d”,x);運算式e語句真(非0)假(0)(單分支)4.2.1if語句注意:在C語言中,運算式e的值為非0時,系統均按“真值”處理如:if(‘a’)printf(“O.K.”);x=-5;if(x)printf(“O.K.”);y=0;if(y==0)printf(“O.K.”);if(y)printf(“O.K.”);#include<stdio.h>voidmain(){floata,b,t;scanf(“%f,%f”,&a,&b);if(a>b){t=a;a=b;b=t;}printf(“%5.2f,%5.2f\n”,a,b);}3,4

3.00,4.00……if(a>b){t=a;a=b;b=t;}…………if(a>b)t=a;a=b;b=t;……當某些語句作為一個整體出現的時候,必須是複合語句的形式。3,4

4.00,0.00例4.1輸入兩個實數,按代數值由小到大的順序輸出這兩個數。例4.2輸入三個數a,b,c,要求按由小到大的順序輸出。if(a>b)將a和b對換if(a>c)將a和c對換if(b>c)將b和c對換#include<stdio.h>

voidmain()

{

floata,b,c,t;

scanf(″%f,%f,%f″,&a,&b,&c);

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%5.2f,%5.2f,%5.2f\n",a,b,c);

}(2)if(運算式)語句1else語句2例:

if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

條件

語句1

語句2YN雙分支例4.3輸入任意三個整數,求三個數中的最大值。#include<stdio.h>voidmain(){inta,b,c,max;scanf(“%d,%d,%d”,&a,&b,&c);if(a>b)max=a;

elsemax=b;

if(max<c)max=c;

printf(“max=%d\n”,max);}#include<stdio.h>voidmain(){inta,b,c,max;scanf(“%d,%d,%d”,&a,&b,&c);max=a;

if(max<b)max=b;

if(max<c)max=c;

printf(“max=%d\n”,max);}#include<math.h>#include<stdio.h>voidmain(){floata,b,c,p,s;scanf(“%f,%f,%f”,&a,&b,&c);if(a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论