C語言程序設(shè)計(第3版)全套課件_第1頁
C語言程序設(shè)計(第3版)全套課件_第2頁
C語言程序設(shè)計(第3版)全套課件_第3頁
C語言程序設(shè)計(第3版)全套課件_第4頁
C語言程序設(shè)計(第3版)全套課件_第5頁
已閱讀5頁,還剩444頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

高級語言程序設(shè)計南京郵電大學(xué)計算機學(xué)院計算機軟件教學(xué)中心chap01_初識計算機程序與C語言_陳可佳_C教材第3版.pptchap02_初識C源程序及其數(shù)據(jù)類型_吳家皋_C教材第3版.pptchap03_運算符與表達(dá)式_吳家皋_C教材第3版.pptchap04_程序流程控制_郭劍_C教材第3版.pptchap05_函數(shù)的基本知識_陳可佳_C教材第3版.pptchap06_數(shù)組_朱旻如_C教材第3版.pptchap07_指針_劉林峰_C教材第3版.pptchap08_字符串_周劍_C教材第3版.pptchap09_編譯預(yù)處理與多文件工程程序_周劍_C教材第3版.pptchap10_結(jié)構(gòu)聯(lián)合枚舉_汪云云_C教材第3版.pptchap11_文件_朱立華_C教材第3版.pptchap12_學(xué)生成績管理系統(tǒng)的設(shè)計與實現(xiàn)_朱立華_C教材第3版2.ppt高級語言程序設(shè)計第01章初識計算機、程序與C語言內(nèi)容提要計算機及其組成

存儲器的基本知識計算機程序與計算機語言C語言簡介C程序的開發(fā)過程*進(jìn)制轉(zhuǎn)換知識

3計算機及其組成計算機:硬件系統(tǒng)+軟件系統(tǒng)

俗稱電腦,自動、高速處理海量數(shù)據(jù)歷史上的重要人物4巴貝奇原型機之父分析機(1834)圖靈計算機科學(xué)之父圖靈測試—AI之父馮諾依曼現(xiàn)代計算機之父“存儲程序”思想(1946)阿塔那索夫第一臺電子計算機—ABC機(1939)第一臺現(xiàn)代電子計算機5姓名:ENIAC(埃尼阿克)生日:1946年2月14日出生地:美國賓夕法尼亞大學(xué)作用:美國軍方用于計算彈道

構(gòu)成:17840支電子管

性能參數(shù):大小為80英尺×8英尺,重達(dá)28噸,功耗為170千瓦,運算速度為每秒5000次的加法運算造價:約為487000美元

計算機發(fā)展的四個時代6時代名稱起止年硬件軟件及應(yīng)用領(lǐng)域特點第1代電子管時代1946—1958邏輯元件采用真空電子管,主存采用汞延遲線、磁鼓、磁芯;外存采用磁帶采用機器語言、匯編語言編程。應(yīng)用領(lǐng)域以軍事和科學(xué)計算為主體積大、功耗高、可靠性差、速度慢(每秒幾千至幾萬次)、價格昂貴第2代晶體管時代1958—1964邏輯元件采用晶體管,主存儲器采用磁芯出現(xiàn)操作系統(tǒng),用高級語言及編譯程序開發(fā)程序。應(yīng)用在科學(xué)計算和事務(wù)處理、工業(yè)控制等體積縮小、能耗降低、可靠性提高、運算速度提高(每秒幾十萬次)第3代集成電路時代1964—1970邏輯元件采用中、小規(guī)模集成電路,主存儲器采用磁芯出現(xiàn)分時操作系統(tǒng)以及結(jié)構(gòu)化、模塊化程序設(shè)計方法。應(yīng)用領(lǐng)域進(jìn)入文字處理和圖形圖像處理等速度更快(每秒幾百萬次),可靠性更高,價格下降,通用化、系列化和標(biāo)準(zhǔn)化第4代大規(guī)模集成電路時代1970至今邏輯元件采用大規(guī)模和超大規(guī)模集成電路出現(xiàn)數(shù)據(jù)庫管理系統(tǒng)、網(wǎng)絡(luò)管理系統(tǒng)和面向?qū)ο笳Z言等。應(yīng)用領(lǐng)域逐步走向家庭集成度高,體積小,速度極快(每秒百萬至數(shù)億次),微型計算機1971年誕生76控制總線CPU運算器控制器存儲器接口輸入設(shè)備輸出設(shè)備地址總線數(shù)據(jù)總線計算機及其組成存儲器的基本知識存儲器類型:主存儲器(即內(nèi)存)輔助存儲器(即外存)高速緩存等代碼(指令)及數(shù)據(jù)以二進(jìn)制形式存儲在內(nèi)存存儲器內(nèi)容:由存儲單元組成,每個單元為1個字節(jié)(1B=8bit)每個單元對應(yīng)一個地址。

舉例:教室、座位、教室號9存儲器的基本知識存儲器的大小:包含多少個字節(jié)

n根地址總線,存儲器容量為:

2n存儲計量單位:B、KB、MB、GB、TB…1TB=210GB=220MB=230KB=240B1011計算機軟件系統(tǒng):系統(tǒng)軟件應(yīng)用軟件程序:一組命令的序列,實現(xiàn)目標(biāo)或解決問題用某種程序設(shè)計語言開發(fā)

程序設(shè)計語言:語法規(guī)則符號集計算機程序與計算機語言12C語言簡介13C語言的起源

A語言?B語言?ALGOL60-CPL(1963@劍橋)-BCPL(1967@劍橋)-B語言(1970@貝爾)-C語言(1973@貝爾)C語言的優(yōu)勢(1)簡潔緊湊(2)運算符、數(shù)據(jù)結(jié)構(gòu)豐富,功能強大(3)適用范圍廣(windows內(nèi)核)(4)可移植性好(多操作系統(tǒng)和機型)(5)運行效果高C程序的開發(fā)過程C程序的開發(fā)在特定的集成開發(fā)環(huán)境下進(jìn)行本教材程序在Visual

Studio

2000下實現(xiàn)舉例:一個C程序在VS2000下開發(fā)的全過程

Helloworld!程序#include<stdio.h>intmain(){printf(“helloworld!”);}C程序的開發(fā)過程編輯程序代碼的錄入,生成源程序*.c(*.cpp)編譯鏈接運行源程序目標(biāo)程序可執(zhí)行程序內(nèi)容程序設(shè)計語言代碼機器語言代碼機器語言代碼可執(zhí)行?不可以不可以可以擴展名.c.obj.exe語法分析查錯,翻譯生成目標(biāo)程序*.obj與其它目標(biāo)程序或庫鏈接裝配,生成可執(zhí)行程序*.exe進(jìn)制每位符號逢幾進(jìn)一位權(quán)n位數(shù)的不同個數(shù)例子(結(jié)果統(tǒng)一到十進(jìn)制)十0~91010i10n341=3*102+4*101+1*100=341二0~122i2n101=1*22+0*21+1*20=5八0~788i8n127=1*82+2*81+7*80=87十六0~9A~F1616i16n31D=3*162+1*161+13*160=797另:3位二進(jìn)制數(shù)相當(dāng)于1位八進(jìn)制數(shù):101011B=(53)8=53Q4位二進(jìn)制數(shù)相當(dāng)于1位十六進(jìn)制數(shù):11011001B=(D9)16=D9H=d9H二進(jìn)制及進(jìn)制轉(zhuǎn)換問題二進(jìn)制及進(jìn)制轉(zhuǎn)換問題十進(jìn)制數(shù)轉(zhuǎn)成N進(jìn)制數(shù):除N取余至商為零再逆序輸出余數(shù)

例如:十進(jìn)制數(shù)157轉(zhuǎn)化為八進(jìn)制數(shù)235的過程如下:N進(jìn)制數(shù)轉(zhuǎn)成十進(jìn)制數(shù):各位數(shù)符所代表的值乘以對應(yīng)位的位權(quán)再累計求和,通用公式可表達(dá)如下:S=AnAn-1…A1A0.A-1A-2…A-m

n=∑Ai×Nii=-m1578519832820二進(jìn)制及進(jìn)制轉(zhuǎn)換問題二進(jìn)制數(shù)與八進(jìn)制數(shù)的相互轉(zhuǎn)換:2到8,三合一;8到2,一分三3位二進(jìn)制數(shù)0000010100111001011101111位八進(jìn)制數(shù)01234567例:二進(jìn)制數(shù)

11010111110101000001,按每三位一組劃分,然后用對應(yīng)的一位八進(jìn)數(shù)來表示,得到

等效的八進(jìn)制數(shù)3276501

反過來,八進(jìn)制數(shù)

3276501

轉(zhuǎn)化為二進(jìn)制數(shù),只需要將每一位八進(jìn)制數(shù)轉(zhuǎn)化為對應(yīng)的三位二進(jìn)制數(shù),最前面多余的0刪除即可得到對應(yīng)的二進(jìn)制數(shù):11010111110101000001

二進(jìn)制及進(jìn)制轉(zhuǎn)換問題二進(jìn)制數(shù)與十六進(jìn)制數(shù)的相互轉(zhuǎn)換:2到16,四合一;16到2,一分四4位二進(jìn)制數(shù)000000010010001101000101011001111位十六進(jìn)制數(shù)012345674位二進(jìn)制數(shù)100010011010101111001101111011111位十六進(jìn)制數(shù)89ABCDEF例:二進(jìn)制數(shù)

11010111110101000001

,按每四位一組劃分,然后用對應(yīng)的一位十六進(jìn)數(shù)來表示,得到等效的十六進(jìn)制數(shù)D7D41;反之,將十六進(jìn)制數(shù)D7D41每一位拆成4位二進(jìn)制數(shù)就得到等效的二進(jìn)制數(shù)了

思考:如何看待101這個數(shù)?

二進(jìn)制、八進(jìn)制、十六進(jìn)制、十進(jìn)制20思考題??本章小結(jié)馮·諾依曼體系結(jié)構(gòu)和“程序存儲”的思想計算機的五大基本組件存儲器、存儲單元、內(nèi)存容量等什么是程序以及程序設(shè)計的主要步驟現(xiàn)有的程序設(shè)計語言簡介C語言的歷史和特點采用C語言進(jìn)行程序開發(fā)的過程進(jìn)制與進(jìn)制轉(zhuǎn)換21輸入理想的程序輸出快樂的人生高級語言程序設(shè)計南京郵電大學(xué)計算機學(xué)院計算機軟件教學(xué)中心高級語言程序設(shè)計第2章初識C源程序及其數(shù)據(jù)類型內(nèi)容提要C語言源程序的組成結(jié)構(gòu)及6種基本符號C語言基本數(shù)據(jù)類型常量的表示方法C語言基本數(shù)據(jù)類型變量的定義、初始化和輸入/輸出方法

25預(yù)測未來的最好辦法,就是把它創(chuàng)造出來。Thebestwaytopredictthefutureistoinventit.

——艾倫·凱(AlanKay),圖靈獎得主2.1C源程序及其符號C源程序的組成(例2_1)26#include<stdio.h>/*函數(shù)功能:計算兩個整數(shù)的乘積入口參數(shù):整型數(shù)a和b

返回值:整型數(shù)a和b之積*/intmultiply(inta,intb){

return(a*b);}2.1C源程序及其符號27/*主函數(shù)*/intmain(){

intx,y,product; printf("Pleaseinputtwointegers:"); scanf("%d%d",&x,&y); /*輸入兩個整型數(shù)x和y*/ product=multiply(x,y); /*調(diào)用函數(shù)multiply計算x

和y的乘積*/ printf("Theproductis%d\n",product);

/*輸出x

和y的乘積*/

return0;}Pleaseinputtwointegers:23<回車>Theproductis6C語言源程序(SourceProgram)的基本組成結(jié)構(gòu)函數(shù)(Function)是C語言源程序的基本單位,即C程序是由函數(shù)構(gòu)成的主函數(shù)(MainFunction)一個C程序有且只有一個名為main的函數(shù)用戶自定義函數(shù)(User-DefinedFunction)如:multiply函數(shù)庫函數(shù)(LibraryFunction)如:scanf和printf函數(shù)需要編譯預(yù)處理命令(PreprocessorDirective)

如:#include<stdio.h>28C語言源程序(SourceProgram)的基本組成結(jié)構(gòu)函數(shù)由函數(shù)首部(FunctionHeader)和函數(shù)體(FunctionBody)兩部分構(gòu)成/*函數(shù)首部*/<函數(shù)返回類型><函數(shù)名>(<形式參數(shù)表>){<若干語句> /*函數(shù)體*/}(在第5章中再詳細(xì)介紹函數(shù)概念)每條C語句都是以分號“;”結(jié)束的

/*……*/

的形式表示注釋(Comment)29C源程序中的6種基本符號關(guān)鍵字(Keyword),又稱為保留字是C語言中預(yù)先規(guī)定的具有固定功能和意義的單詞。C語言提供了32個關(guān)鍵字,詳見附錄B。標(biāo)識符(Identifier)以字母或下劃線開頭,后面跟字母、數(shù)字、下劃線的任意字符序列。(注意:大小寫敏感)運算符(Operator) C語言提供了34個運算符,詳見附錄D。30C源程序中的6種基本符號(4)

分隔符(Separator)

空格、回車、逗號、分號

(5)其它符號

{}、/**/、//(6)數(shù)據(jù)(Data)各種數(shù)據(jù)類型的字面值常量31問題:請找出例2_1中的6種符號2.2C語言中的數(shù)據(jù)類型32基本數(shù)據(jù)類型及其修飾符基本數(shù)據(jù)類型整型(int)實型:單精度型(float)、雙精度型(double)字符型(char)修飾符(Modifier)短的(short)、長的(long)有符號的(signed)、無符號的(unsigned)詳見表2_1sizeof(數(shù)據(jù)類型)獲得該數(shù)據(jù)類型所占內(nèi)存的字節(jié)數(shù)332.3常量常量(Constant)是計算機程序運行過程中其值不能發(fā)生改變的量。整型常量實型常量字符常量字符串常量符號常量34整型常量整型常量:十進(jìn)制、八進(jìn)制、十六進(jìn)制數(shù)三種形式來表示35(1)長整型常量:后綴L或l,如:125L,56l等(2)無符號整型常量:后綴U或u,如:60U,256u等(3)無符號長整型常量:后綴LU,Lu,lU或lu,如:360LU實型常量實型常量只采用十進(jìn)制表示:小數(shù)形式、指數(shù)形式兩種36(1)實型常量默認(rèn)表示double類型,float型加后綴F或f,如:3.14f,6.8e-5F等(2)longdouble類型的后綴為L或l字符常量字符常量用一對單引號將一個字符括起來表示如:‘A’,‘b’,‘5’,‘#’等ASCII表(參見附錄A)為每個字符定義唯一的整數(shù)編碼——ASCII碼如:‘A’的ASCII碼是65,‘5’的ASCII碼是53等轉(zhuǎn)義字符(EscapeCharacter)單引號括起的以反斜杠\開頭的字符序列來表示如:‘\n’表示換行符,‘\a’表示響鈴符,‘\t’表示制表符等(參見表2_4)37字符常量字符常量‘5’與整型常量5之間的區(qū)別與聯(lián)系區(qū)別:5表示一個整數(shù),而‘5’表示一個字符聯(lián)系:‘5’的ASCII碼為整數(shù)53,即:字符類型本質(zhì)上也是整型!數(shù)字與數(shù)字字符之間的轉(zhuǎn)換如:’5’-48

=>5,5+48=>’5’大小寫字母之間的轉(zhuǎn)換如:‘A’+32=>‘a(chǎn)’,‘a(chǎn)’-32=>‘A’38字符串常量用一對雙引號將零個或多個字符序列括起來如:“hello”,“Thisisaprogram”,“A”等每一個用雙引號括起來的字符串常量的末尾都添加一個空字符‘\0’作為結(jié)束標(biāo)記字符串常量的實際字符數(shù)總是比其雙引號中的字符數(shù)多139符號常量定義形式:#define<標(biāo)識符><字符串>如:#definePI3.14159注意:#define不是C語言語句,后面沒有分號若將上句寫成“#definePI3.14159;”,則PI將被替換成“3.14159;”(符號常量的具體用法在第9章介紹)402.4變量變量(Variable)是計算機程序運行過程中其值可以發(fā)生改變的量數(shù)據(jù)類型、變量名兩部分變量的定義及初始化變量的輸入、輸出用const限定變量41變量的定義及初始化“先定義、后使用”原則變量定義(VariableDefinition)的格式<數(shù)據(jù)類型><變量名1>[,<變量名2>,<變量名3>,…];變量定義語句的例子:inta; /*表示定義了一個整型變量a*/doublex,y,z;/*表示定義了三個雙精度實型變量,分 別為x,y,z*/charc; /*表示定義了一個字符型變量c*/longtotal; /*表示定義了一個長整型變量total,等價于longinttotal;*/42變量的定義及初始化在定義變量的同時給出初值,稱為變量的初始化格式如下:<數(shù)據(jù)類型><變量名1>=<初值1>[,<變量名2>=<初值2>,…];如:inta=1;/*定義整型變量a,初值為1*/doublex=1.23,y=2.236068; /*定義雙精度實型變量x,y,x的初值為1.23,y的初值為2.236068*/chard=‘T’+32;/*定義字符型變量d,初值為小寫字母't'*/doublez=x;/*定義變量z,初值為x的值,這里是1.23*/在變量定義及初始化后,可用賦值運算修改變量的值如:z=3.6;/*將變量z的值改為3.6*/43變量的輸入和輸出——scanf格式輸入函數(shù)scanf的用法scanf(<格式控制字符串>,<變量地址列表>);<格式控制字符串>:格式轉(zhuǎn)換說明符、輸入分隔符<變量地址列表>:若干輸入變量的地址例如:scanf("%d%d",&x,&y);scanf("%d,%d",&x,&y);44從鍵盤輸入:3└┘4<回車>

從鍵盤輸入:3,4<回車>

變量的輸入和輸出——scanf函數(shù)scanf的格式轉(zhuǎn)換說明符45變量的輸入和輸出——scanf函數(shù)scanf的格式修飾符46scanf("%2d%3d%4d",&a,&b,&c); 若從鍵盤輸入:1234567890<回車>則輸入結(jié)果:a=12,b=345,c=6789變量的輸入和輸出——printf格式輸出函數(shù)printf的用法printf(<格式控制字符串>,<輸出參數(shù)表>);<格式控制字符串>:格式轉(zhuǎn)換說明符、普通字符<輸出參數(shù)表>:需要輸出的數(shù)據(jù)項的列表例如:printf("Theproductis%d\n",product);47若此時product的值為6,則輸出結(jié)果為:Theproductis6<換行>變量的輸入和輸出——printf函數(shù)printf的格式轉(zhuǎn)換說明符48變量的輸入和輸出——printf例如:printf("%f,%f",3.14,3.14159265);49輸出結(jié)果為:3.140000,3.141593inta=127;printf("%d,%o,%x",a,a,a);輸出結(jié)果為:127,177,7fcharch='A';

printf("%c,%d",ch,ch);輸出結(jié)果為:A,65變量的輸入和輸出——printf函數(shù)printf的格式修飾符50變量的輸入和輸出——printf例如:printf("%.10f,%.10f",3.141592653589793,3.141592653589793f);51輸出結(jié)果為:3.1415926536,3.1415927410變量的輸入和輸出例2_2日期格式轉(zhuǎn)換52日期格式分類日期格式示

例標(biāo)準(zhǔn)YYYY-MM-DD2018-9-10中國YYYY年MM月DD日2018年9月10日美國MM/DD/YYYY9/10/2018英國DD/MM/YYYY10/9/2018在VS2010環(huán)境下運行該程序并分析運行結(jié)果變量的輸入和輸出例2_2日期格式轉(zhuǎn)換53思考題1:若日期輸入格式為YYYYMMDD,且嚴(yán)格按4位年、2位月和2位日的寬度進(jìn)行輸入,不足寬度的需在前面補0。程序應(yīng)如何修改?思考題2:若輸入scanf語句中的變量前忘寫了取地址符&,程序運行結(jié)果會怎樣?變量的輸入和輸出

——getchar、putchar字符型變量的輸入和輸出函數(shù)<變量>=getchar();putchar(<參數(shù)>);例2_3作業(yè)等級的輸入和輸出在VS2010環(huán)境下運行該程序并分析運行結(jié)果54思考題:若用戶從鍵盤輸入ABC<回車>,上例的運行結(jié)果會怎樣?用const修飾符限定變量只讀變量(Read-OnlyVariable)const<數(shù)據(jù)類型><只讀變量名1>=<值1>[,<只讀變量名2>=<值2>,…];例2_4計算圓的面積和周長55constdoublepi=3.14159;

/*定義只讀常量pi*/ 思考題:在程序中增加一條修改語句:pi=3.14;并再次編譯程序,觀察編譯器會給出什么錯誤提示信息?*2.5基本數(shù)據(jù)類型在計算機內(nèi)部的表示整型數(shù)據(jù)在內(nèi)存中的存儲形式原碼(TrueCode)反碼(Ones-ComplementCode)補碼(ComplementCode)整數(shù)都是以二進(jìn)制補碼的方式存儲的正數(shù)的補碼就是其原碼負(fù)數(shù)的補碼是其反碼+156整型數(shù)據(jù)在內(nèi)存中的存儲形式

short型整數(shù)-32645和-123的補碼57思考:為什么short整數(shù)的取值范圍為:-32768~32767?字符型數(shù)據(jù)在內(nèi)存中的存儲形式字符型數(shù)據(jù)的長度為1個字節(jié)在內(nèi)存中是以其對應(yīng)的ASCII碼(0~127)的二進(jìn)制形式存放存儲的。58實型數(shù)據(jù)在內(nèi)存中的存儲形式

二進(jìn)制的浮點方式將實數(shù)分為階碼和尾數(shù)兩部分進(jìn)行存貯59例如:十進(jìn)制數(shù)12.625對應(yīng)的二進(jìn)制數(shù)1100.101,則1100.101=0.1100101

2100尾數(shù)S=0.1100101,階碼j=100本章小結(jié)C語言源程序的組成結(jié)構(gòu)及6種基本符號C語言基本數(shù)據(jù)類型常量的表示方法變量的定義、輸入和輸出方法60輸入理想的程序輸出快樂的人生高級語言程序設(shè)計南京郵電大學(xué)計算機學(xué)院計算機軟件教學(xué)中心高級語言程序設(shè)計第03章運算符與表達(dá)式內(nèi)容提要運算符、表達(dá)式的基本概念常用運算符的運算規(guī)則、優(yōu)先級和結(jié)合性C語言數(shù)據(jù)類型轉(zhuǎn)換的方式64人們認(rèn)為計算機科學(xué)是天才的藝術(shù),但事實完全相反:只是很多人互相在對方的基礎(chǔ)上做事,就像一面由小石頭堆砌而成的墻。

——唐納德·克努特(DonaldKnuth),計算機科學(xué)家3.1什么是運算符與表達(dá)式運算符(Operator)表示數(shù)據(jù)的運算,實現(xiàn)對數(shù)據(jù)的各種操作運算對象(Operand)可以是常量、變量和函數(shù)運算符的分類按所需運算對象(操作數(shù))的個數(shù)分為三類:單目運算符(UnaryOperator)雙目運算符(BinaryOperator)三目運算符(TernaryOperator)653.1什么是運算符與表達(dá)式表達(dá)式(Expression)由運算符和運算對象組成任一個表達(dá)式都有一個確定的值,稱為該表達(dá)式的值。例如:3/*常量表達(dá)式,該表達(dá)式的值就是3*/a/*變量表達(dá)式,該表達(dá)式的值是變量a當(dāng)前的值*/a+b*c /*算術(shù)表達(dá)式,該表達(dá)式的值是算術(shù)運算的結(jié)果*/a=10/*賦值表達(dá)式,該表達(dá)式的值就是所賦的值10*/sin(1.2)/*函數(shù)表達(dá)式,該表達(dá)式的值是弧度1.2的正弦函數(shù)值*/663.2運算符的優(yōu)先級與結(jié)合性如何理解含有多個運算符的復(fù)雜表達(dá)式?優(yōu)先級(Precedence)級數(shù)越小,優(yōu)先級越高(詳見附錄D)結(jié)合性(Associativity)左結(jié)合、右結(jié)合673.2運算符的優(yōu)先級與結(jié)合性表達(dá)式語義的理解(子表達(dá)式的劃分)規(guī)則1:根據(jù)運算符的優(yōu)先級,優(yōu)先級高的運算符先與相應(yīng)的操作數(shù)構(gòu)成子表達(dá)式,優(yōu)先級低的運算符后與相應(yīng)的操作數(shù)構(gòu)成子表達(dá)式。(相當(dāng)于打小括號“()”)

如:x+y*z相當(dāng)于x+(y*z)規(guī)則2:當(dāng)兩個運算符的優(yōu)先級相同時,則根據(jù)運算符的結(jié)合性的結(jié)合方向進(jìn)行計算:左結(jié)合的從左到右打“()”;右結(jié)合的從右到左打“()”。如:x+y-z相當(dāng)于(x+y)-z

68注意:運算符的優(yōu)先級和結(jié)合性只與子表達(dá)式的劃分有關(guān),與計算次序無關(guān)!3.3常用運算符算術(shù)運算符關(guān)系運算符邏輯運算符條件運算符賦值及復(fù)合賦值運算符逗號運算符自增、自減運算符69算術(shù)運算符算術(shù)(Arithmetic)運算加、減、乘、除、求余、取負(fù)數(shù)等+、-、*、/、%、-

等(運算符)優(yōu)先級:

(取負(fù)數(shù))

*、/、%

+、

(減法)結(jié)合性:左結(jié)合(單目運算符“取負(fù)數(shù)”為右結(jié)合)算術(shù)表達(dá)式:3-1+5%4利用小括號()劃分子表達(dá)式:

((3-1)+(5%4))該表達(dá)式的值:3可利用()改變表達(dá)式的語義算術(shù)表達(dá)式:3-(1+5)%4的值為:1算術(shù)表達(dá)70算術(shù)運算符的幾點說明整數(shù)除、實數(shù)除(務(wù)必牢記?。┤纾?/2和1.0/2的結(jié)果不同:1/2=0,1.0/2=0.5求余運算符%兩個操作數(shù)都必須為整型,如:6.0%4是錯誤的余數(shù)的符號與被除數(shù)相同,如:6%(

4)=2,(

6)%(4)=

2。數(shù)學(xué)函數(shù)的使用(參見表3_2)如:sqrt(a*a+b*b),求a平方加b平方的算術(shù)平方根

71算術(shù)運算符例3_1計算拋物運動的射程72在VS2010環(huán)境下運行該程序并分析運行結(jié)果思考題:若將sin函數(shù)中的參數(shù)“2*theta/180.0*pi”改成“2*theta/180*pi”對上例的運行結(jié)果有無影響?關(guān)系運算符關(guān)系(Relational)運算小于、小于或等于、大于、大于或等于、等于、不等于

<、<=、>、>=、==、!=運算結(jié)果為邏輯值:真(1)、假(0)優(yōu)先級:<、<=、>、>=

==、!=

結(jié)合性:左結(jié)合若變量a=1,b=2,c=3,則:

a%2!=0 相當(dāng)于(a%2)!=0運行結(jié)果為:1

a+b>b+c 相當(dāng)于(a+b)>(b+c)運行結(jié)果為:0

a<b==b<c 相當(dāng)于(a<b)==(b<c)運行結(jié)果為:1‘A’<‘a(chǎn)’的結(jié)果為1,因為比較的是字符的ASCII碼73注意:==和=的區(qū)別!邏輯運算符邏輯(Logic)運算邏輯與、邏輯或、邏輯非&&、||、!優(yōu)先級&結(jié)合性(見表3_4)!優(yōu)先級高,單目運算符,右結(jié)合&&優(yōu)先級高于||,但低于關(guān)系和算術(shù)運算符;雙目運算符,左結(jié)合運算對象邏輯值:事實上可以是任何類型的值在C語言中:非0相當(dāng)于真;0相當(dāng)于假74邏輯運算符邏輯運算的真假值表a<b&&b<c相當(dāng)于(a<b)&&(b<c)a==b||c>d&&x<y相當(dāng)于(a==b)||((c>d)&&(x<y))75邏輯運算符例如:判斷一個字符ch是否為小寫字符的邏輯表達(dá)式為:'ch>='a'&&ch<='z'判斷某年y是否為閏年的條件是:y能被4整除,但不能被100整除;或者y能被400整除。其邏輯表達(dá)式為:((y%4==0)&&(y%100!=0))||(y%400==0)76邏輯短路現(xiàn)象當(dāng)僅通過第一操作數(shù)就能確定含邏輯運算符的表達(dá)式的結(jié)果時,第二操作數(shù)就不再計算。若變量a=1,b=2,c=3,下列表達(dá)式的運算結(jié)果為:(a>b)&&(c=c*2) 因a>b的結(jié)果為0,整個“&&”表達(dá)式的值就為0,發(fā)生邏輯短路,c=c*2沒運行,c值仍為3

(a<b)||(c=c*2)可同理分析不能寫成:'a'<=ch<='z'條件運算符條件(Conditional)運算符由兩個符號“?”和“:”組成<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>優(yōu)先級:低于算術(shù)、關(guān)系以及邏輯等運算符結(jié)合性:右結(jié)合,C語言中唯一的三目運算符若有兩個整數(shù)變量a和b,通過條件表達(dá)式求出a、b之中較大的數(shù)的值:

a>b?a:b

當(dāng)a=2,b=1時,上式的結(jié)果是2;當(dāng)a=1,b=2時,上式的結(jié)果是2。77賦值及復(fù)合賦值運算符賦值(Assignment)運算<變量>=<表達(dá)式>優(yōu)先級:低于前面所有運算符,僅高于逗號運算符結(jié)合性:右結(jié)合a=a+1,相當(dāng)于a=(a+1),注意與數(shù)學(xué)代數(shù)式的區(qū)別。a=b=c=1

相當(dāng)于a=(b=(c=1)),右結(jié)合

78賦值及復(fù)合賦值運算符復(fù)合賦值(CombinedAssignment)運算<變量><雙目運算符>=<表達(dá)式>等價于:<變量>=<變量><雙目運算符><表達(dá)式>算術(shù)復(fù)合賦值運算符:+=、=、*=、/=、%=優(yōu)先級&結(jié)合性:同賦值運算符若a=2,b=3,計算a*=b+1計算過程如下:(1)先將“=”右邊整體用小括號括起來:a*=(b+1)(2)再將復(fù)合賦值寫成等價的賦值表達(dá)式:a=a*(b+1)(3)最后進(jìn)行運算:a=2*(3+1)=8,即,變量a的值為879逗號運算符逗號(Comma)運算符<表達(dá)式1>,<表達(dá)式2>,…,<表達(dá)式n>按順序依次計算各表達(dá)式,整個表達(dá)式的值就是表達(dá)式n的計算結(jié)果優(yōu)先級&結(jié)合性:最低、左結(jié)合a=b=1+2,3*b

先計算a=b=1+2,得到a=b=3;再計算3*b,得到9,則該表達(dá)式的值為9,這時a和b的值都是3。a=(b=1+2,3*b)

先計算逗號表達(dá)式(b=1+2,3*b),有:b=1+2=3,3*b=9;再將逗號表達(dá)式的值9賦給a,則整個表達(dá)式的值就是9,這時a的值為9,b的值為3。80自增、自減運算符自增(Increment)、自減(Decrement)++、--使被操作的變量的值增加1或減少1優(yōu)先級:單目運算符,高于雙目運算符結(jié)合性:右結(jié)合分為兩類:“前++”和“前--”:++<變量>、--<變量>“后++”和“后--”

:<變量>++、<變量>--81自增、自減運算符運算規(guī)則“前++”、“前--”:先對變量自增、自減1運算,再將變量更新后的值作為自增、自減表達(dá)式的值。“后++”、“后--”:先將變量原來的值作為自增、自減表達(dá)式的值,再對變量自增、自減1運算。若a=1,則:b=++a;

相當(dāng)于a=a+1;b=a;

運行后a、b的值都為2。b=a++;

相當(dāng)于b=a;a=a+1;

運行后a的值為2,而b的值為1。c=(a++)+(++b);相當(dāng)于b=b+1;c=a+b;a=a+1;d=-b++;相當(dāng)于d=-b;b=b+1;823.4運算過程中的數(shù)據(jù)類型轉(zhuǎn)換自動類型轉(zhuǎn)換(ImplicitTypeConversation)表達(dá)式中的自動類型轉(zhuǎn)換賦值中的自動類型轉(zhuǎn)換強制類型轉(zhuǎn)換(ExplicitTypeConversation)類型轉(zhuǎn)換是C語言非常重要的概念!83表達(dá)式中的自動類型轉(zhuǎn)換轉(zhuǎn)換的原則:將參與運算的操作數(shù)轉(zhuǎn)換成其中占用內(nèi)存字節(jié)數(shù)最大的操作數(shù)的類型,即數(shù)據(jù)類型的長度由低向高進(jìn)行轉(zhuǎn)換,以防止計算精度的損失。具體轉(zhuǎn)換規(guī)則:見圖3_2舉例:'A'+32:將字符'A'轉(zhuǎn)成整型65,再與整型32相加,結(jié)果為整型97。1.0/2*3.0:將1.0/2中的整型2轉(zhuǎn)換成double型,計算1.0/2.0得0.5,再乘以3.0,最后的結(jié)果為double型1.5。1/2*3.0的計算結(jié)果為0.0,因為1/2為整除結(jié)果為0。84賦值中的自動類型轉(zhuǎn)換轉(zhuǎn)換規(guī)則:將右邊表達(dá)式的值轉(zhuǎn)成左邊變量的類型轉(zhuǎn)換時的問題:當(dāng)由低長度類型向高長度類型賦值時,數(shù)據(jù)直接可以轉(zhuǎn)換,不會出現(xiàn)數(shù)據(jù)信息丟失;但是反之,由高長度類型向低長度類型賦值時,就有可能出現(xiàn)數(shù)據(jù)精度下降、甚至數(shù)據(jù)溢出等問題。具體參見表3_785強制類型轉(zhuǎn)換由程序指定的類型轉(zhuǎn)換為強制類型轉(zhuǎn)換

(<類型>)<表達(dá)式>例如:inta=(int)3.14;計算過程是:將3.14強制轉(zhuǎn)換取整,再賦值,即a=3。

(double)1/2計算過程是:將1強制轉(zhuǎn)換為double型,再將2自動轉(zhuǎn)換為double型,最后做double型實數(shù)除法,結(jié)果為0.5。86例3_2驗證丟番圖的規(guī)則

87在VS2010環(huán)境下運行該程序并分析運行結(jié)果思考題:若將代碼第11行的強制類型轉(zhuǎn)換“(int)”刪除,重新編譯、運行該程序結(jié)果會怎樣?xx2+y2=z2yz

找兩個正整數(shù)a和b,若2ab為完全平方數(shù),則勾股定理方程的解為:*3.5位運算符88位運算(BitOperation)對字節(jié)或字內(nèi)的二進(jìn)制數(shù)位進(jìn)行測試、抽取、設(shè)置或移位等操作6種位運算符優(yōu)先級&結(jié)合性:參見表3_8位運算規(guī)則:參見表3_9、3_10、3_11本章小結(jié)運算符、表達(dá)式、優(yōu)先級、結(jié)合性七種常用運算符數(shù)據(jù)類型轉(zhuǎn)換整數(shù)除、邏輯短路、前/后綴自增/減等89輸入理想的程序輸出快樂的人生2014.9.2高級語言程序設(shè)計南京郵電大學(xué)計算機學(xué)院計算機軟件教學(xué)中心2018.10.14高級語言程序設(shè)計第04章程序流程控制內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例93內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例94語句與程序流程語句組成程序的基本元素以“;”作為結(jié)尾例i++;c=a;95語句的分類(1)表達(dá)式語句:表達(dá)式+“;”x=a>b?a:b;c=a=b;(2)函數(shù)調(diào)用語句:函數(shù)名(參數(shù)表)+“;”scanf("%d",&a);printf("%c",ch);96語句的分類(3)控制語句:控制各語句執(zhí)行的順序及次數(shù)條件判斷語句(if、switch)循環(huán)控制語句(while、do~while、for)中轉(zhuǎn)語句(break、continue、return)97語句的分類(4)復(fù)合語句:以一對大括號括起的0條或多條語句在邏輯上相當(dāng)于一條語句{ temp=x; x=y; y=temp;}作用:在程序的某些地方,語法上只允許出現(xiàn)一條語句,而程序員可能需要多條語句來完成程序功能,這時就可用復(fù)合語句。98語句的分類(5)空語句:一個分號構(gòu)成的語句表示什么事情也不需要做;作用:在程序某些地方,語法上要求必須有語句出現(xiàn),而程序員可能沒有代碼要寫,或者留待以后擴充,就可以寫一條空語句。99程序流程及其表示程序流程:代碼中各語句的執(zhí)行次序。C語言有三種基本結(jié)構(gòu):順序結(jié)構(gòu):順序執(zhí)行每一條語句選擇結(jié)構(gòu):有選擇的執(zhí)行部分語句循環(huán)結(jié)構(gòu):重復(fù)執(zhí)行某些語句100程序流程及其表示算法:為解決某個問題而采取的有限操作步驟描述程序流程或者算法的方法自然語言描述傳統(tǒng)流程圖NS流程圖偽代碼101程序流程及其表示流程圖由一系列圖標(biāo)符號組成,不同圖標(biāo)代表了不同的操作或流程方向。102程序的執(zhí)行總是從開始框開始,順著流程線的方向,經(jīng)過一系列處理,如輸入輸出(平行四邊形框)、選擇(菱形框)、賦值(矩形框)等,最終到達(dá)結(jié)束框。開始/結(jié)束框輸入/輸出處理判斷處理一般處理框流程線程序流程及其表示流程圖示例:從鍵盤讀入兩個數(shù)m、n,將其中的較大數(shù)賦值給p,并輸出。103N開始m>=n?輸入m,np=m輸出p的值結(jié)束Yp=n內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例104順序結(jié)構(gòu)基本思想:從前往后依次執(zhí)行每一條語句,每一條語句只執(zhí)行一次。課本例4.1:求三角形面積。從鍵盤上輸入三角形三條邊的邊長,求該三角形的面積并輸出至屏幕。設(shè)三條邊分別為a、b、c,可以根據(jù)如下數(shù)學(xué)公式來計算面積,其中p=(a+b+c)/2。105順序結(jié)構(gòu)#include<stdio.h>#include<math.h> /*包含了函數(shù)sqrt原型*/intmain(){ doubleedge1,edge2,edge3,p,area; printf("Enterthreeedgesofatriangle:"); /*提示用戶輸入*/ scanf("%lf%lf%lf",&edge1,&edge2,&edge3); /*從鍵盤讀入三條邊長*/ p=(edge1+edge2+edge3)/2; area=sqrt(p*(p-edge1)*(p-edge2)*(p-edge3)); /*使用數(shù)學(xué)公式求面積*/ printf("area=%lf\n",area); /*輸出面積*/ return0;}106說明根據(jù)公式求解三角型面積時,需要使用求平方根函數(shù)sqrt,其原型在math.h頭文件中,因此需“#include<math.h>”。運行該程序時,將首先從main函數(shù)的第一行開始,依次運行每一行的語句,每條語句也僅運行一遍,直至遇到return語句為止。思考題如果用戶輸入的三條邊不能構(gòu)成一個三角形,程序的運行結(jié)果如何?107內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例108選擇結(jié)構(gòu)選擇結(jié)構(gòu):程序中部分代碼的執(zhí)行受“預(yù)設(shè)條件”的控制。當(dāng)“預(yù)設(shè)條件”符合時才執(zhí)行這些語句。相關(guān)的控制語句ifif~elseswitch109if語句語法if(表達(dá)式)語句塊含義如果表達(dá)式為真,則執(zhí)行語句塊,否則不執(zhí)行。110N

表達(dá)式為真?語句塊Yif語句流程if~else語句語法if(表達(dá)式)

語句塊1else

語句塊2含義如果表達(dá)式為真,則執(zhí)行語句塊1,否則執(zhí)行語句塊2。111N

表達(dá)式為真?語句塊1Y語句塊2if~else語句流程if和if~else的說明表達(dá)式可以任何合法的C語言表達(dá)式,如加減、賦值、邏輯運算、關(guān)系運算等。語句塊可以是一條語句,也可以是多條語句組成的復(fù)合語句,此時需使用大括號。當(dāng)語句塊是單條語句時,雖然語法上可以不使用大括號,但是為了代碼的清晰性和層次性起見,推薦使用大括號。112條件語句的使用例4.2:年齡比較。從鍵盤讀入兩個人的年齡,比較并輸出年長者的年齡?;舅枷耄合葟逆I盤讀入兩個年齡age1和age2,使用if語句比較它們的大小后,將較大的那個數(shù)輸出即可。113例4.2#include<stdio.h>intmain(){ intage1,age2; printf("Enterageoftwopersons:"); scanf("%d%d",&age1,&age2);

if(age1>=age2) /*age1較大*/ { printf("theolderageis%d\n",age1); } else /*age2較大*/ { printf("theolderageis%d\n",age2); } return0;}114條件語句的使用例4.3:求三角形面積的改進(jìn)。對例4.1求三角形面積的代碼進(jìn)行改進(jìn),使得程序能夠?qū)Σ缓侠磔斎脒M(jìn)行一定的判別?;舅枷耄寒?dāng)讀取三條邊以后,首先進(jìn)行判別(三者均為正數(shù),且任意兩邊之和大于第三邊),然后再根據(jù)公式進(jìn)行求解。115例4.3主要代碼doubleedge1,edge2,edge3,p,area;…… /*從鍵盤讀入三條邊*/if(edge1>0&&edge2>0&&edge3>0&&edge1+edge2>

edge3&&edge1+edge3>edge2&&edge2+edge3>edge1) /*用戶輸入判斷*/{ p=(edge1+edge2+edge3)/2; area=sqrt(p*(p-edge1)*(p-edge2)*(p-edge3)); printf(“area=%f\n”,area);}else /*不合法時需提示用戶*/{ printf(“Errorinput!\n”);}116條件語句的使用例4.4:直角三角形判別。用戶從鍵盤輸入三個數(shù),判斷這三個數(shù)能否構(gòu)成一個三角形,如果可以,進(jìn)一步判斷它們能否構(gòu)成一個直角三角形。基本思想:程序在讀入三個數(shù)以后,借鑒上一例,首先判斷它們是否能構(gòu)成一個三角形。如果可以,繼續(xù)使用if語句,比較它們是否滿足勾股定理,以判斷它們是否能構(gòu)成一個直角三角形。117例4.4例4.4代碼見課本。說明本例是一個典型的if嵌套的例子,最多時有三層if語句。從本例中也可以看出,無論是if子句還是else子句,都可以進(jìn)行if嵌套。118例4.4說明本題中,判斷直角三角形需使用勾股定理,即兩條邊的平方和等于第三條邊的平方。但在編程實現(xiàn)時,代碼沒有使用“==”進(jìn)行計算。這是因為edge1、edge2、edge3均為double型數(shù)據(jù),而double型數(shù)據(jù)是不精確的,一般不使用“==”來進(jìn)行相等的判斷。如果要判斷兩個實型數(shù)據(jù)是否相等,合理的做法是,計算它們的差,如果該差值的絕對值小于一個較小的數(shù)(本例中是1E-2),就可近似認(rèn)為它們相等。

119關(guān)于if嵌套的進(jìn)一步說明if及if~else語句最多可實現(xiàn)兩種情形的判別,而使用if嵌套可判別兩種以上的情形。當(dāng)需要對多種情況進(jìn)行判別處理時,為結(jié)構(gòu)清晰起見,可使用如下的排版方式:if

(表達(dá)式1)

語句塊1else

if

(表達(dá)式2)

語句塊2else

if

(表達(dá)式3)

……else

語句塊n120在if嵌套中會出現(xiàn)多個if和else。如果沒有使用大括號明確,則存在else究竟與哪個if配對的問題。在這種情況下,C語言規(guī)定:else總是與它前面最近的、且沒有配對的if相匹配。為避免出現(xiàn)誤解,推薦每個語句塊都使用大括號,哪怕只有一條語句。121switch語句switch語句與if嵌套語句的功能類似,主要用于多種情況的判斷處理。語法:switch(表達(dá)式){case常量表達(dá)式1:語句系列1case常量表達(dá)式2:語句系列2…case常量表達(dá)式n:語句系列n[default:語句系列n+1]}122switch語句的說明switch后面的表達(dá)式可以為整型、字符型或者枚舉型,但不允許是實型。case后面必須為常量,且類型應(yīng)與switch中表達(dá)式的類型相同。switch語句的執(zhí)行過程是:首先計算switch后面表達(dá)式的值,然后與各case分支的常量進(jìn)行匹配,與哪個常量相等,就從該分支的語句序列開始執(zhí)行,直至遇到break或者switch語句塊的右大括號。123switch語句的說明default分支主要用于處理switch表達(dá)式與所有case常量都不匹配的情況。它在語法上可以省略,但推薦使用。124switch語句的使用例4.5月份天數(shù)計算。從鍵盤輸入年份和月份,計算該月份的天數(shù)并輸出。分析:從鍵盤讀入年份year和月份month后,根據(jù)month的值,使用switch語句,可以計算出這個月份的天數(shù)。其中,1月、3-12月的天數(shù)確定的,2月份則要根據(jù)year判斷是否是閏年。代碼見課本。125內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例126循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu):程序中的某些語句和代碼,在“預(yù)設(shè)條件”的控制下可以執(zhí)行多次。相關(guān)的控制語句whiledo~whilefor127while語句語法while(表達(dá)式){

語句塊}表達(dá)式可以是任何合法的C語言表達(dá)式,其計算結(jié)果用于判斷語句塊是否該被執(zhí)行。語句塊是需要重復(fù)執(zhí)行語句的集合,它也被稱為循環(huán)體。128while語句的執(zhí)行流程(1)計算表達(dá)式的值。若為真,則轉(zhuǎn)步驟(2);否則退出循環(huán),執(zhí)行while的后續(xù)語句。(2)執(zhí)行語句塊,并返回步驟(1)。129N

表達(dá)式為真?語句塊Ywhile語句的使用例4.6求累加和。從鍵盤讀入int型正整數(shù)n,計算

的值并輸出130分析:加法操作重復(fù)執(zhí)行。因此可設(shè)兩個變量sum和i,sum初值為0,i初值為1。然后把i加到sum上,重復(fù)n次,每次i的值加1。這樣就可以實現(xiàn)從1到n的累加。例4.6主要代碼i=1;sum=0;while(i<=n){ sum+=i; i++;}

131while語句說明本例中變量i承載了控制循環(huán)次數(shù)的作用,對于這類變量,我們稱之為循環(huán)控制變量。通常情況下,循環(huán)體內(nèi)都會有語句對循環(huán)控制變量進(jìn)行修改,以控制循環(huán)結(jié)束的時機。累加和后面要學(xué)的階乘是一重循環(huán)最典型的應(yīng)用,初學(xué)者應(yīng)好好體會。

132do~while語句do~while語句又稱直到型循環(huán)語句語法do{

語句塊}while(表達(dá)式);133do~while語句執(zhí)行流程(1)執(zhí)行語句塊,即循環(huán)體。(2)計算表達(dá)式的值。若為真,則轉(zhuǎn)(1);否則退出循環(huán),執(zhí)行下一條語句。134N語句塊Y

表達(dá)式為真?do~while的使用例4.7求階乘。從鍵盤讀入int型正整數(shù)n,計算n!并輸出。135分析:n!=1*2*3*…*n,乘法操作重復(fù)執(zhí)行。與上一題類似,可設(shè)兩個變量fac和i,fac初值為1,i初值為1。然后將i乘以fac,重復(fù)n次,每次i的值加1。這樣就可以實現(xiàn)從1到n的累乘。例4.7主要代碼intn,i;doublefac; …… /*輸入n的值*/i=1;fac=1;do{ fac*=i; i++;}while(i<=n);136do~while語句說明階乘變量fac定義成double類型,這時因為階乘運算很容易超出int的范圍。選用double類型可支持大一些的數(shù)。即便如此,VC環(huán)境下170以上的階乘也超出了double的范圍。

137for語句for語句是C語言中最常用、功能也最強大的循環(huán)控制語句語法for(表達(dá)式1;表達(dá)式2;表達(dá)式3){

語句塊}for語句有三個表達(dá)式,表達(dá)式2是控制循環(huán)的條件。138for語句執(zhí)行流程(1)計算表達(dá)式1。(2)計算表達(dá)式2。若為真,則轉(zhuǎn)(3);否則退出循環(huán)。(3)執(zhí)行語句塊,即循環(huán)體。(4)計算表達(dá)式3,轉(zhuǎn)(2)。139N語句塊Y

表達(dá)式2為真?表達(dá)式1表達(dá)式3for語句說明表達(dá)式1、表達(dá)式2、表達(dá)式3均可以省略。當(dāng)表達(dá)式2省略時,默認(rèn)其計算結(jié)果為真。140for語句的使用例4.8數(shù)列求和。已知一個數(shù)列如下,求該數(shù)列前1000項的和。141分析:欲求該數(shù)列的和,可設(shè)兩個變量sum和item,sum初值為0,item初值為數(shù)列的第一項1。然后把item加到sum上,重復(fù)1000次,每次循環(huán)時,對item的值進(jìn)行修改。這樣就可以實現(xiàn)數(shù)列元素的累加。i=1,2,......例4.8主要代碼inti,sign;doubleitem,sum;sum=0; /*初值置為0*/sign=1;for(i=1;i<=1000;i++){ item=sign/(2.0*i-1); /*計算每一次的累加項item*/ sum+=item; /*將累加項item加到總和sum上*/

sign=-sign; /*計算下一個累加項的符號sign*/}142例4.8說明本在求解累加項item時,使用了一定的編程技巧。item也可以直接根據(jù)通項公式求解:

item=pow(-1,i+1)/(2.0*i-1);其中,pow是冪函數(shù),使用時需包含頭文件math.h。該方法比較直觀,但函數(shù)調(diào)用及求冪計算的系統(tǒng)開銷相對較大,不如例題中的高效。143內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例144break與continuebreak與continue是兩個較為特殊的流程控制關(guān)鍵詞,主要用于循環(huán)的中斷控制。兩者的區(qū)別是:break是結(jié)束本層循環(huán)體的運行,退出本層循環(huán);continue只是結(jié)束本次循環(huán)體的運行,并未退出循環(huán)體。145break#include<stdio.h>

intmain(){ inti,n; for(i=1;i<=5;i++) { printf("Entern:"); scanf("%d",&n);

if(n<0) break; printf("n=%d\n",n); } printf("Theend.\n"); return0;}146運行結(jié)果Entern:3n=3Entern:4n=4Entern:-5Theend.continue#include<stdio.h>

intmain(){ inti,n; for(i=1;i<=5;i++) { printf("Entern:"); scanf("%d",&n);

if(n<0) continue; printf("n=%d\n",n); } printf("Theend.\n"); return0;}147運行結(jié)果Entern:3n=3Entern:4n=4Entern:-5Entern:-6Entern:7n=7Theend.例4.9說明在break例子中,當(dāng)用戶輸入-5時,for循環(huán)中斷,剩余的兩次循環(huán)不再執(zhí)行在continue例子中,當(dāng)用戶輸入-5、-6時,程序只是忽略了當(dāng)次循環(huán)剩余的語句“printf("n=%d\n",n);”,for語句循環(huán)體的執(zhí)行次數(shù)并沒有減少,仍然為5次。148內(nèi)容提要語句與程序流程順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)break與continue應(yīng)用舉例149循環(huán)嵌套在循環(huán)語句的循環(huán)體中,也可以再次出現(xiàn)循環(huán)語句,這種情況稱為循環(huán)嵌套。循環(huán)嵌套廣泛用于各類問題與算法中,如行列式求解、矩陣處理、排序、二維文本圖形打印等。

150加法表打印例4.10加法表打印。要求打印如下所示的九九加法表。1+1=22+1=3

2+2=43+1=4

3+2=5

3+3=64+1=5

4+2=6

4+3=7

4+4=85+1=6

5+2=7

5+3=8

5+4=9

5+5=106+1=7

6+2=8

6+3=9

6+4=10

6+5=11

6+6=127+1=8

7+2=9

7+3=10

7+4=11

7+5=12

7+6=13

7+7=148+1=9

8+2=10

8+3=11

8+4=12

8+5=13

8+6=14

8+7=15

8+8=169+1=10

9+2=11

9+3=12

9+4=13

9+5=14

9+6=15

9+7=16

9+8=17

9+9=18151加法表打印分析對于二維圖形或者矩陣的打印問題,一般需要兩重循環(huán)。外層循環(huán)控制輸出行數(shù),內(nèi)層循環(huán)控制每一行中的輸出項數(shù),而具體輸出內(nèi)容則可能與循環(huán)控制變量有關(guān)。本題中,加法表一共9行,所以外層循環(huán)控制變量i從1變化到9,內(nèi)存循環(huán)控制每一行輸出的加法等式數(shù)量,第i行不超過i個式子,因此內(nèi)層循環(huán)控制變量j從1變化到i,而每個式子具體輸出的內(nèi)容則包括“+”、“=”、循環(huán)控制變量i、循環(huán)控制變量j、i與j的和。152例4.10主要代碼inti,j;for(i=1;i<=9;i++) /*外層循環(huán):控制行數(shù)*/{ for(j=1;j<=i;j++)

/*內(nèi)存循環(huán):控制輸出的等式數(shù)*/ { printf("%d+%d=%2d",i,j,i+j);

/*輸出具體內(nèi)容*/ } printf("\n"); /*每行最后應(yīng)有一個回車換行*/}153梯形打印例4.11梯形打印。要求打印如下所示的等腰梯形。

************************分析:本圖形共4行,所以外層循環(huán)控制變量i從1變化到4。對每一行來說,它由空格、星號和回車組成,空格和星號的數(shù)量不相等,因此內(nèi)存循環(huán)需要兩個,分別用來控制空格數(shù)和星號數(shù)。154例4.11主要代碼inti,j;for(i=1;i<=4;i++) /*外層循環(huán):控制行數(shù)*/{

for(j=1;j<=4-i;j++) /*內(nèi)層循環(huán):控制空格數(shù)*/

{

printf("");

/*輸出空格*/

}

for(j=1;j<=2*i+1;j++)

/*內(nèi)層循環(huán):控制星號數(shù)*/

{

printf("*");

/*輸出星號*/

}

printf("\n");

/*輸出回車*/}155質(zhì)數(shù)判斷例4.12質(zhì)數(shù)判斷。從鍵盤輸入一個正整數(shù)n,判斷n是否為質(zhì)數(shù)。分析:質(zhì)數(shù)判斷的基本思路是,對于正整數(shù)n(n>1),用2~去除它,如果存在可以整除的情況,則n不是質(zhì)數(shù),否則必為質(zhì)數(shù)。156例4.12主要代碼k=(int)sqrt(n);for(i=2;i<=k;i++){ if(n%i==0) { break; }}if(i>k) printf("%disaprime.\n",n);else printf("%disnotaprime.\n",n);157例4.12說明本例需要確保n為正數(shù)。因此除了在輸入時對用戶進(jìn)行提示外,在讀取n時,也用do~while循環(huán)對用戶輸入進(jìn)行了判斷和限制。質(zhì)數(shù)判斷是C語言中較為經(jīng)典的題目,初學(xué)者應(yīng)認(rèn)真加以領(lǐng)會并掌握。158窮舉法例4.13百錢百雞問題。公雞5錢一只,母雞3錢一只,小雞1錢三只。一百錢買一百只雞,問公雞、母雞、小雞各幾只?分析:設(shè)公雞、母雞、小雞的數(shù)量分別為a、b、c,則有159百錢百雞問題分析方程數(shù)量少于變量個數(shù),因此有多個解。該方法的思路是,從問題出發(fā),對原問題進(jìn)行分析、建模,并對這個模型進(jìn)行求解,以模型的解作為原問題的解。160百錢百雞問題分析在計算機領(lǐng)域中,解決此問題有另一個思路:首先判斷問題的解空間,也即解的可能范圍是多少,進(jìn)而在此空間上搜尋符合題意的解。窮舉法就是這類方法的一個典型代表:它把解空間之內(nèi)的所有解都挨個嘗試一遍,判斷是否符合問題的要求,符合的就作為求解結(jié)果。161百錢百雞問題分析在本題中,a、b、c的可能范圍分別是[0,20]、[0,33]和[0,100]這樣解空間就是[0,0,0][0,0,1]…[20,33,100]在此空間內(nèi),符合方程組的就是問題的解。162例4.13主要代碼inta,b,c;for(a=0;a<=20;a++){ for(b=0;b<=33;b++) { for(c=0;c<=100;c++) { if(a+b+c==100&&15*a+9*b+c==300) { printf("%d,%d,%d\n",a,b,c); } } }}163例4.13說明在判斷解是否符合題目要求時,代碼中使用了15*a+9*b+c==300,而不是原先的第二個方程,這樣做是為了防止出現(xiàn)整數(shù)除問題。本題可進(jìn)一步優(yōu)化:當(dāng)a、b確定時,實質(zhì)上c也就確定了。因此不必再從0嘗試至100。為此有改進(jìn)代碼。164例4.13的優(yōu)化inta,b,c;for(a=0;a<=20;a++){ for(b=0;b<=33;b++) { c=100-a-b; if(15*a+9*b+c==300) { printf("%d,%d,%d\n",a,b,c); } }}165百錢百雞說明改進(jìn)后,嘗試的范圍由[0,0,0]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論