《CC++語(yǔ)言程序設(shè)計(jì)案例教程》課件-第3章程序設(shè)計(jì)基礎(chǔ)_第1頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)案例教程》課件-第3章程序設(shè)計(jì)基礎(chǔ)_第2頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)案例教程》課件-第3章程序設(shè)計(jì)基礎(chǔ)_第3頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)案例教程》課件-第3章程序設(shè)計(jì)基礎(chǔ)_第4頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)案例教程》課件-第3章程序設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩129頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1第3章程序設(shè)計(jì)基礎(chǔ)C/C++語(yǔ)言程序設(shè)計(jì)案例教程2024/12/232本章將介紹C語(yǔ)言的主要語(yǔ)句和程序設(shè)計(jì)的三種基本結(jié)構(gòu)——順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。把C語(yǔ)言的基本數(shù)據(jù)類(lèi)型、運(yùn)算符、順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)等知識(shí)貫穿到案例中,以幫助讀者建立程序設(shè)計(jì)的基本概念和思想2024/12/233案例一計(jì)算圓的周長(zhǎng)和面積1.問(wèn)題描述已知圓的半徑,求圓的周長(zhǎng)和面積。2.問(wèn)題分析圖3.1計(jì)算圓的面積和周長(zhǎng)的流程圖程序?=?數(shù)據(jù)結(jié)構(gòu)?+?算法,所以,要編寫(xiě)程序,通常要進(jìn)行算法分析和數(shù)據(jù)分析,依據(jù)算法分析和數(shù)據(jù)分析畫(huà)出傳統(tǒng)流程圖或者N-S流程圖,最后根據(jù)流程圖編寫(xiě)程序。(1)算法分析:所謂“算法”,指為解決一個(gè)問(wèn)題而采取的方法和步驟,或者說(shuō)是解題步驟的精確描述。對(duì)同一個(gè)問(wèn)題,可以有不同的解題方法與步驟。在本題中l(wèi)?=?2πr,s?=?πr2,屬于三種控制結(jié)構(gòu)中的順序結(jié)構(gòu)。(2)數(shù)據(jù)分析:主要分析有哪些輸入數(shù)據(jù),輸出數(shù)據(jù),中間數(shù)據(jù),分別為什么類(lèi)型比較合適。例如本題中r為輸入數(shù)據(jù),l、s為輸出數(shù)據(jù),都為float類(lèi)型。(3)畫(huà)出流程圖,如圖3.1所示。2024/12/234圖3.1計(jì)算圓的面積和周長(zhǎng)的流程圖2024/12/2353.?C語(yǔ)言代碼#include<stdio.h>#definePI3.1415926voidmain(){floatr,l,s; /*數(shù)據(jù)定義部分,簡(jiǎn)單語(yǔ)句*/r=2.0; /*給變量r賦值為2.0*/l=2*PI*r; /*計(jì)算周長(zhǎng)l*/s=PI*r*r; /*計(jì)算面積s*/printf("l=%f,s=%f\n",l,s); /*輸出周長(zhǎng)l和面積s,以上4條全部為執(zhí)行語(yǔ)句*/}4.程序運(yùn)行結(jié)果l=12.566370,s=12.5663702024/12/2363.1算?法?與?流?程

3.1.1算法的特性算法(algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問(wèn)題的清晰指令。算法具備以下特性:(1)有窮性:指算法在執(zhí)行有限步驟后,自動(dòng)結(jié)束而不會(huì)出現(xiàn)死循環(huán),并且每個(gè)步驟在可接受的時(shí)間內(nèi)完成。(2)確定性:算法中的每一個(gè)步驟都應(yīng)當(dāng)是確定的,而不是含糊的、模棱兩可的。也就是說(shuō)不應(yīng)該產(chǎn)生歧義。(3)有0個(gè)或多個(gè)輸入:所謂輸入是指算法執(zhí)行時(shí)從外界獲取必要信息(外界是相對(duì)算法本身的,輸入可以是人工鍵盤(pán)輸入的數(shù)據(jù),也可以是程序其他部分傳遞給算法的數(shù)據(jù))。(4)有1個(gè)或多個(gè)輸出:算法的輸出就是指該算法得到的結(jié)果。算法必須有結(jié)果,沒(méi)有結(jié)果的算法沒(méi)有意義(結(jié)果可以是顯示在屏幕上或打印的,也可以是將結(jié)果數(shù)據(jù)傳遞給程序的其他部分)。(5)可行性:算法的每一步都必須是可行的,即都可通過(guò)執(zhí)行有限次數(shù)完成。2024/12/2373.1.2算法的表示形式

常用的算法表示方法有自然語(yǔ)言、傳統(tǒng)流程圖、結(jié)構(gòu)化流程圖(N-S流程圖)、偽代碼、計(jì)算機(jī)語(yǔ)言等。本書(shū)將重點(diǎn)講述傳統(tǒng)流程圖和N-S流程圖,在后面的程序算法描述中采用傳統(tǒng)流程圖,如果讀者感興趣的話,可以將它們轉(zhuǎn)化成為N-S流程圖。傳統(tǒng)流程圖是用一些約定的幾何圖形來(lái)描述算法。用某種圖框表示某種操作,用箭頭表示算法流程。下面的圖例就是美國(guó)標(biāo)準(zhǔn)化協(xié)會(huì)ANSI規(guī)定了一些常用的流程圖符號(hào),如圖3.2所示,它已為世界各國(guó)程序工作者普遍采用的標(biāo)準(zhǔn)。2024/12/238圖3.2常用的流程圖符號(hào)2024/12/239下面分別介紹流程圖各圖符的作用和含義。起止框:表示算法的開(kāi)始和結(jié)束。一般內(nèi)部只寫(xiě)“開(kāi)始”或“結(jié)束”。輸入輸出框:表示算法請(qǐng)求輸入需要的數(shù)據(jù)或算法將某些結(jié)果輸出。一般內(nèi)部常常填寫(xiě)“輸入…”“打印/顯示…”等內(nèi)容。菱形框(判斷選擇框):作用主要是對(duì)一個(gè)給定條件進(jìn)行判斷,根據(jù)給定的條件是否成立來(lái)決定如何執(zhí)行其后的操作。它有一個(gè)入口,兩個(gè)出口。處理框:表示算法的某個(gè)處理步驟,一般內(nèi)部常常填寫(xiě)賦值操作或計(jì)算表達(dá)式。連接點(diǎn):用于將畫(huà)在不同地方的流程線連接起來(lái)。同一個(gè)編號(hào)的點(diǎn)是相互連接在一起的,實(shí)際上同一編號(hào)的點(diǎn)是同一個(gè)點(diǎn),只是畫(huà)不下時(shí)才分開(kāi)來(lái)畫(huà)。使用連接點(diǎn),還可以避免流程線的交叉或過(guò)長(zhǎng),使流程圖更加清晰。注釋框:注釋框不是流程圖中必須的部分,不反映流程和操作,它只是對(duì)流程圖中某些框的操作做必要的補(bǔ)充說(shuō)明,以幫助閱讀流程圖的人更好地理解流程圖的作用。2024/12/2310N-S流程圖比文字描述直觀、形象、便于理解;比傳統(tǒng)流程圖緊湊易畫(huà),尤其是它廢除了流程線,整個(gè)算法是由各個(gè)基本結(jié)構(gòu)按順序組成的。N-S流程圖的上下順序就是執(zhí)行時(shí)的順序,寫(xiě)算法和看算法都是從上到下,十分方便。用N-S流程圖表示的算法都是結(jié)構(gòu)化算法,它由幾種基本結(jié)構(gòu)順序組成,基本結(jié)構(gòu)之間不存在跳轉(zhuǎn),流程的轉(zhuǎn)移只存在于一個(gè)基本結(jié)構(gòu)范圍之內(nèi)。2024/12/23113.1.3C語(yǔ)言語(yǔ)句概述

C語(yǔ)言的語(yǔ)句分類(lèi)如圖3.3所示。圖3.3C語(yǔ)言數(shù)據(jù)操作語(yǔ)句2024/12/2312案例二格式輸入輸出函數(shù)1.問(wèn)題描述定義不同類(lèi)型的數(shù)據(jù),在運(yùn)行界面按指定的數(shù)據(jù)格式輸入數(shù)據(jù),完成數(shù)據(jù)賦值。2.問(wèn)題分析程序大部分都是由輸入、處理、輸出組成的,輸入是大部分程序不可或缺的一部分,在編程時(shí)將數(shù)據(jù)的值以正確的形式輸入,賦予變量,是編程的一個(gè)基本任務(wù),格式化輸入函數(shù)主要是scanf(),它要求在程序運(yùn)行界面以指定的格式進(jìn)行輸入。2024/12/23133.C語(yǔ)言代碼#include"stdio.h"/*預(yù)處理命令*/voidmain(){inta,b,c;longm;floatx;doubley;printf("inputa,b,c,m:");scanf("%d%o%x%ld",&a,&b,&c,&m);/*將變量a,b,c,m的值分別以十進(jìn)制整型、八進(jìn)制、十六進(jìn)制和長(zhǎng)整型的形式輸入,中間用空白符隔開(kāi),空白符常用空格,本章將用□表示一個(gè)空格,其他章節(jié)則省略*/printf("a=%d,b=%d,c=%d,m=%ld\n",a,b,c,m); /*輸出a,b,c,m的值*/printf("inputx,y:");scanf("%f%lf",&x,&y);/*將變量x,y的值以單精度形式和雙精度形式輸入,中間用空白符隔開(kāi)*/printf("x=%f,y=%lf\n",x,y); /*輸出x,y的值*/}2024/12/23144.程序運(yùn)行結(jié)果inputa,b,c,m:10□012□0x1a□100a=10,b=10,c=26,m=100inputx,y:6.8□1.2345x=6.800000,y=1.2345002024/12/23153.2數(shù)據(jù)的輸入與輸出3.2.1printf()函數(shù)1.?printf()函數(shù)printf()函數(shù)的一般格式為:printf("格式控制字符串",輸出項(xiàng)表);函數(shù)功能:將輸出項(xiàng)表中的各個(gè)對(duì)象的值按格式控制字符串中對(duì)應(yīng)的格式顯示在標(biāo)準(zhǔn)輸出設(shè)備(顯示器)上。例如:printf("sumis%d\n",sum);2024/12/2316說(shuō)明:(1)調(diào)用printf()函數(shù)時(shí)必須至少給出一個(gè)實(shí)際參數(shù),即格式控制字符串。格式控制字符串是用雙引號(hào)括起來(lái)的字符串,可以包含兩類(lèi)字符:①普通字符,是作為輸出提示的文字信息,將會(huì)進(jìn)行原樣輸出。例如:printf("thisisanapple!");輸出的結(jié)果為:thisisanapple!②格式說(shuō)明,由“%”和用來(lái)控制對(duì)應(yīng)表達(dá)式的輸出格式字符組成,如%d,%c等。它的作用是將內(nèi)存中需要輸出的數(shù)據(jù)由二進(jìn)制形式轉(zhuǎn)換為指定的格式輸出。(2)輸出項(xiàng)表是需要輸出的數(shù)據(jù)對(duì)象。每個(gè)輸出的數(shù)據(jù)是一個(gè)值為基本類(lèi)型或指針類(lèi)型的表達(dá)式,稱(chēng)為實(shí)參表達(dá)式。輸出項(xiàng)表中的各輸出項(xiàng)要用逗號(hào)隔開(kāi)。輸出數(shù)據(jù)項(xiàng)的數(shù)目任意,但是格式說(shuō)明的個(gè)數(shù)要與輸出項(xiàng)的個(gè)數(shù)相同,使用的格式字符也要與它們一一對(duì)應(yīng)且類(lèi)型匹配。2024/12/2317例如,對(duì)于printf("%d,%s",n,s);語(yǔ)句,其中?"%d,%s"?是格式控制字符串,n,s是輸出項(xiàng)表。格式字符d與輸出項(xiàng)n對(duì)應(yīng),格式字符s與輸出項(xiàng)s對(duì)應(yīng)。2.格式字符每個(gè)格式說(shuō)明都必須用“%”開(kāi)頭,以一個(gè)格式字符作為結(jié)束,在此之間可以根據(jù)需要插入“寬度說(shuō)明”、左對(duì)齊符號(hào)“-”、前導(dǎo)零符號(hào)“0”等。允許使用的格式字符及其說(shuō)明如表3.l所示。2024/12/2318表3.1printf()函數(shù)使用的格式字符及其說(shuō)明格式字符說(shuō)明d或i輸出帶符號(hào)的十進(jìn)制整數(shù)(正數(shù)不輸出符號(hào))o以八進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不帶前導(dǎo)0)X或x以十六進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不帶前導(dǎo)0x或0X)。對(duì)于0x用小寫(xiě)形式abcdef輸出;對(duì)于0X,用大寫(xiě)形式ABCDEF輸出u按無(wú)符號(hào)的十進(jìn)制形式輸出整數(shù)c輸出一個(gè)字符s輸出字符串中的字符,直到遇到'\0',或者輸出由精度指定的字符數(shù)f以[-]mmm.dddddd帶小數(shù)點(diǎn)的形式輸出單精度和雙精度數(shù),d的個(gè)數(shù)由精度指定。隱含的精度為6,若指定的精度為0,小數(shù)部分(包括小數(shù)點(diǎn))都不輸出E或e以[-]m.ddddddE±xxx或[-]m.dddddde±xxx的指數(shù)形式輸出單精度和雙精度數(shù)。d的個(gè)數(shù)由精度指定,隱含的精度為6,若指定的精度為0,小數(shù)部分(包括小數(shù)點(diǎn))都不輸出G或g由系統(tǒng)決定采用%f格式還是采用%e格式,以使輸出寬度最小%輸出一個(gè)%2024/12/2319說(shuō)明:(1)?%d格式符:輸出帶符號(hào)的十進(jìn)制整數(shù)。①?%d是按實(shí)際長(zhǎng)度進(jìn)行輸出。如:printf("x=%d,y=%d",83,35);結(jié)果為:x=83,y=35②%md是按照m指定的寬度進(jìn)行輸出,且數(shù)據(jù)右靠齊,不夠位左端補(bǔ)空格。如果實(shí)際寬度大于m,則按數(shù)據(jù)的實(shí)際寬度進(jìn)行輸出。如:x=1234;y=123456;printf("x=%5d,y=%5d",x,y);結(jié)果為:x=□1234,y=123456注意:由于格式字符的控制在輸出時(shí)會(huì)出現(xiàn)空格。2024/12/2320③%-md按照m指定的寬度進(jìn)行輸出,只是如果數(shù)據(jù)的位數(shù)小于m,則數(shù)據(jù)在寬度內(nèi)左靠齊,右端補(bǔ)空格。如:x=1234;y=123456;printf("x=%-5d,y=%-5d",x,y);結(jié)果為:x=1234□,y=123456④%ld輸出長(zhǎng)整型數(shù)據(jù)。如:x=76543;printf("x=%ld,x=%d",x,x);結(jié)果為:x=76543,x=76543⑤%mld是按照m指定的寬度輸出長(zhǎng)整型數(shù)據(jù),且數(shù)據(jù)右靠齊。如果實(shí)際寬度大于m,則按數(shù)據(jù)的實(shí)際寬度進(jìn)行輸出。如:x=76543;printf("x=%7ld,x=%4ld",x,x);結(jié)果為:x=□□76543,x=765432024/12/2321(2)?%o格式符:以八進(jìn)制數(shù)形式輸出(無(wú)符號(hào))整數(shù)。如:inta=-1;printf("%d,%o",a,a);結(jié)果為:-1,37777777777又如:printf("%lo,%8o",0xFFFFF,-1);結(jié)果為:3777777,37777777777printf("%-12o",0xFFFFF);結(jié)果為:3777777□□□□□2024/12/2322(3)?%x格式符:以十六進(jìn)制形式輸出整數(shù)。輸出的數(shù)據(jù)不帶符號(hào)。如:x=-1;printf("x=%x,x=%d",x,x);結(jié)果為:x=ffffffff,x=-1同樣,%x也可以使用l、m、-作為說(shuō)明符。如:longx=0x9FFFF;printf("%8x,%lx,%8lx,%-8lx",x,x,x,x);結(jié)果為:9ffff,9ffff,□□□9ffff,9ffff□□□2024/12/2323(4)?%u格式符:用來(lái)以十進(jìn)制形式輸出無(wú)符號(hào)數(shù)據(jù)。如:inti=-2;unsignedintj=65535;printf("i=%d,%o,%X,%u\n",i,i,i,i);printf("j=%d,%o,%X,%u\n",j,j,j,j);結(jié)果為:i=-2,37777777776,FFFFFFFE,4294967294j=65535,177777,FFFF,65535同樣,%u也可以使用l、m、-作為說(shuō)明符。2024/12/2324(5)?%c格式符:用來(lái)輸出一個(gè)字符。在0~255范圍的一個(gè)整數(shù),可以用字符形式輸出,結(jié)果為該整數(shù)作為ASCII碼所對(duì)應(yīng)的字符;反之,一個(gè)字符也可以用整數(shù)形式輸出。如:printf("x=%c,y=%c",'A',66);結(jié)果為:x=A,y=B同樣,%c也可以使用m作為說(shuō)明符。如:printf("x=%5c",66);結(jié)果為:x=□□□□B2024/12/2325(6)?%s格式符:用來(lái)輸出一個(gè)字符串。①?%s是按實(shí)際字符串長(zhǎng)度進(jìn)行輸出。如:printf("%s","china");結(jié)果為:china②?%ms是按照m指定的寬度進(jìn)行輸出,且字符數(shù)據(jù)右靠齊。如果實(shí)際長(zhǎng)度大于m,則按字符串的實(shí)際長(zhǎng)度進(jìn)行輸出。如:printf("%8s","china");結(jié)果為:□□□china2024/12/2326③?%-ms按照m指定的寬度進(jìn)行輸出,只是如果字符串的實(shí)際長(zhǎng)度小于m,則字符數(shù)據(jù)左靠齊,右端補(bǔ)空格。如:printf("%-8s%s","china","is□good");結(jié)果為:china□□□is□good④?%m.ns是按照m指定的寬度進(jìn)行輸出,但是只輸出字符串從左端開(kāi)始的n個(gè)字符。如果n小于m,則字符數(shù)據(jù)右靠齊,左端補(bǔ)空格;如果n大于m,則突破m的限制,保證n個(gè)字符正常輸出。如:printf("%7.2s,%.4s","china","china");結(jié)果為:□□□□□ch,chin⑤%-m.ns如果n小于m,則字符數(shù)據(jù)左靠齊,右端補(bǔ)空格。如:printf("%-5.3s","china");結(jié)果為:chi□□2024/12/2327(7)?%f格式符:用來(lái)輸出實(shí)數(shù),以小數(shù)形式輸出。①?%f是整數(shù)部分全部輸出,小數(shù)部分保留6位,小數(shù)位不夠6位后面補(bǔ)足0,多了四舍五入,需注意有效位數(shù)?、?m.nf指定輸出的數(shù)據(jù)共占m位,小數(shù)部分為n位。此時(shí),小數(shù)點(diǎn)也需占用1位。如果實(shí)際寬度小于m,則數(shù)據(jù)右靠齊,左端補(bǔ)空格。如果實(shí)際寬度大于m,則按數(shù)據(jù)的實(shí)際寬度進(jìn)行輸出。③%-m.nf如果數(shù)據(jù)的實(shí)際寬度小于m,則數(shù)據(jù)左靠齊,右端補(bǔ)空格。如:floatf=123.456;printf("%f,%10f,%10.2f,%.2f,%-10.2f\n",f,f,f,f,f);結(jié)果為:123.456001,123.456001,□□□□123.46,123.46,123.46□□□□2024/12/2328(8)?e格式符:以指數(shù)形式輸出實(shí)數(shù)。①?%e是固定小數(shù)部分占6位,整數(shù)占1位,小數(shù)點(diǎn)占1位,"e"占1位,指數(shù)占3位,指數(shù)符號(hào)占1位。整體共占13位。即數(shù)值按規(guī)范化指數(shù)形式輸出,小數(shù)點(diǎn)前必須有且只有1位非零的有效數(shù)字。如:printf("%e",123.456);結(jié)果為:1.234560e+002②?%m.ne指定輸出的數(shù)據(jù)共占m位,小數(shù)為n位。如果實(shí)際寬度小于m,則數(shù)據(jù)右靠齊,左端補(bǔ)空格。如果實(shí)際寬度大于m,則按數(shù)據(jù)的實(shí)際寬度進(jìn)行輸出。③?%-m.ne如果數(shù)據(jù)的實(shí)際寬度小于m,則數(shù)據(jù)左靠齊,右端補(bǔ)空格。如:floatf=123.456;printf("%e,%10e,%10.2e,%.2e,%-10.2e",f,f,f,f,f);結(jié)果為:1.234560e+002,1.234560e+002,□1.23e+002,1.23e+002,1.23e+002□2024/12/2329(9)?g格式符:自動(dòng)選擇實(shí)數(shù)輸出列數(shù)最小的f或e格式,且不輸出無(wú)意義的零。如:f=123.456;printf("%f,%e,%g",f,f,f);結(jié)果為:123.456001,1.234560e+002,123.456(10)?%%格式符:作用是輸出一個(gè)%。如:printf("這個(gè)月的出勤率是96%%");結(jié)果為:這個(gè)月的出勤率是96%在使用printf()函數(shù)時(shí)還需注意:·除了X,E,G外,其他格式字符必須用小寫(xiě)字母?!じ袷娇刂谱址校砂D(zhuǎn)義字符?!じ袷秸f(shuō)明必須以“%”開(kāi)頭?!び敵鲎址?”,則應(yīng)在“格式控制字符串”中用連續(xù)兩個(gè)%表示?!げ煌南到y(tǒng)在實(shí)現(xiàn)格式輸出時(shí),輸出結(jié)果可能會(huì)有一些小的差別。2024/12/2330各種附加格式說(shuō)明符含義見(jiàn)表3.2。表3.2附加格式說(shuō)明符(修飾符)修飾符功能m輸出數(shù)據(jù)最小域?qū)?,?shù)據(jù)長(zhǎng)度?<?m,左補(bǔ)空格;否則按實(shí)際寬度輸出.n對(duì)實(shí)數(shù),指定小數(shù)點(diǎn)后位數(shù)(位數(shù)多了四舍五入,少了后面補(bǔ)零)對(duì)字符串,指定實(shí)際輸出位數(shù)-輸出數(shù)據(jù)在域內(nèi)左對(duì)齊(缺省右對(duì)齊)+指定在有符號(hào)數(shù)的正數(shù)前顯示正號(hào)(+)0輸出數(shù)值時(shí)指定左面不使用的空位置自動(dòng)填0#在八進(jìn)制和十六進(jìn)制數(shù)前顯示前導(dǎo)0,0xl在d,o,x,u前,指定輸出精度為long型在e,f,g前,指定輸出精度為double型2024/12/2331例3.1字符型數(shù)據(jù)的輸出。#include"stdio.h"voidmain(){intn=97; /*定義基本整型變量n,并給其賦值*/charch='B'; /*定義字符型變量ch,并給其賦值*/printf("n:%d%c\n",n,n); /*n:原樣輸出,第一個(gè)%d表示將n以十進(jìn)制整型的形式 輸出,第二個(gè)%c表示將n以字符形式輸出*/printf("ch:%d%c\n",ch,ch); /*第一個(gè)%d表示將ch以十進(jìn)制整型形式輸出*/printf("%s\n","student"); /*將字符串student以字符串形式輸出*/printf("%10s\n","student"); /*將字符串student以字符串形式輸出,域?qū)挒?0*/printf("%-10s\n","student"); /*將字符串student以字符串形式左對(duì)齊輸出,域?qū)挒?0*/printf("%10.3s\n","student");/*10表示域?qū)挘?3表示從字符串student中從左至右截取 三個(gè)字符輸出*/printf("%.3s\n","student"); /*.3表示從字符串student中從左至右截取三個(gè)字符輸出*/}2024/12/2332程序運(yùn)行結(jié)果如下:n:97ach:66Bstudentstudentstudentstustu2024/12/23333.2.2scanf()函數(shù)1.?scanf()函數(shù)scanf()函數(shù)的一般格式為:scanf("格式控制字符串",輸入地址列表);其中,格式控制字符串和printf中的一樣,輸入地址列表中的各輸入項(xiàng)用逗號(hào)隔開(kāi),各輸入項(xiàng)只能是合法的地址表達(dá)式,即可以是變量的地址或字符串的首地址等。例如,對(duì)于scanf("%d%f",&n,&f);這個(gè)語(yǔ)句,"%d%f"是格式控制字符串,&n,&f是輸入項(xiàng)表,n,f是兩個(gè)變量,這些變量前的符號(hào)“&”是C語(yǔ)言中的求地址運(yùn)算符,&n就是取變量n的地址,&f則是取變量f的地址。也就是說(shuō),輸入項(xiàng)必須是某個(gè)存儲(chǔ)單元的地址。同時(shí)要注意輸入時(shí)在兩個(gè)數(shù)據(jù)之間要用一個(gè)或多個(gè)空格分隔,也可以用回車(chē)鍵(用↙表示)、跳格鍵Tab。輸入時(shí)可以采用:8□9.2↙或8□□□9.2↙或8(按Tab鍵)9.2↙或8↙9.2↙2024/12/23342.格式說(shuō)明每個(gè)格式說(shuō)明都必須用“%”開(kāi)頭,以一個(gè)“格式字符”作為結(jié)束。允許用于輸入的格式字符和它們的功能和printf()函數(shù)格式一致。說(shuō)明:(1)?%o,%x用于輸入八進(jìn)制、十六進(jìn)制的數(shù)。例如:scanf("%o%x",&a,&b);

printf("%d,%d",a,b);若輸入為:12□12↙或012□0x12,則得到結(jié)果為:10,18。(2)在格式字符前可以用一個(gè)整數(shù)指定輸入數(shù)據(jù)所占的寬度,由系統(tǒng)自動(dòng)截取所需數(shù)據(jù)。例如:scanf("%3d%3d",&x,&y);若輸入為:123456↙,則得到的結(jié)果為:x=123,y=456。系統(tǒng)自動(dòng)截取前3位賦給變量x,繼續(xù)截取3位賦給變量y。2024/12/2335(3)可使用“l(fā)”格式控制長(zhǎng)型數(shù)據(jù)的輸入,如長(zhǎng)整型,雙精度類(lèi)型:scanf("%ld%lo%lx",&x,&y,&z);scanf("%lf%le",&a,&b);而輸入短型數(shù)據(jù)應(yīng)用“h”,例如:scanf("%hd%ho%hx",&x,&y,&z);(4)“*”表示空過(guò)一個(gè)數(shù)據(jù)。例如:scanf("%d%*d%d",&x,&y);若輸入為:3□4□5↙,則得到的結(jié)果為:x=3,y=5。(5)對(duì)于unsinged型的可以用%u,%d,%o,%x輸入皆可。(6)不可以規(guī)定輸入數(shù)據(jù)的精度,即不可以對(duì)實(shí)數(shù)指定小數(shù)位的寬度。例如:scanf("%7.2f",&x);若輸入為:1234567↙,從而想得到x=12345.67是完全錯(cuò)誤的!2024/12/23363.使用scanf()時(shí)應(yīng)注意的問(wèn)題(1)輸入項(xiàng)表只能是地址,表示將輸入的數(shù)據(jù)送到相應(yīng)的地址單元中;所以一定要寫(xiě)“&”,而不能直接寫(xiě)變量名。(2)當(dāng)調(diào)用scanf()函數(shù)從鍵盤(pán)輸入數(shù)據(jù)時(shí),最后一定要按下回車(chē)鍵(Enter鍵),scanf()函數(shù)才能接受從鍵盤(pán)輸入的數(shù)據(jù)。當(dāng)從鍵盤(pán)輸入數(shù)據(jù)時(shí),輸入的數(shù)據(jù)之間用間隔符(空格、跳格鍵或回車(chē)鍵)隔開(kāi),間隔符個(gè)數(shù)不限。(3)在“格式控制字符串”中,格式說(shuō)明的類(lèi)型與輸入項(xiàng)的類(lèi)型應(yīng)一一對(duì)應(yīng)匹配。(4)在“格式控制字符串”中,格式說(shuō)明的個(gè)數(shù)應(yīng)該與輸入項(xiàng)的個(gè)數(shù)相同。若格式說(shuō)明的個(gè)數(shù)少于輸入項(xiàng)的個(gè)數(shù)時(shí),scanf()函數(shù)結(jié)束輸入,多余的數(shù)據(jù)項(xiàng)并沒(méi)從終端接受新的數(shù)據(jù);若格式說(shuō)明的個(gè)數(shù)多于輸入項(xiàng)的個(gè)數(shù)時(shí),scanf()函數(shù)同樣也結(jié)束輸入。2024/12/2337(5)如果在“格式控制字符串”中插入了其他普通字符,這些字符不能輸出到屏幕上。但在輸入時(shí)要求按一一對(duì)應(yīng)的位置原樣輸入這些字符。例如:scanf("%d,%d",&i,&j);則實(shí)現(xiàn)上面賦值的輸入數(shù)據(jù)格式如下:1,2↙1和2之間的是逗號(hào),而不能是其他字符。例如:scanf("inputthenumber%d",&x);輸入形式為inputthenumber3才能使x得到3這個(gè)值。例如:scanf("x=%d,y=%d",&x,&y);輸入形式為x=3,y=4↙如果想在輸入之前進(jìn)行提示,先用一條printf()輸出提示即可。例如:printf("Inputthenumber:\n");scanf("%d",&x);2024/12/2338(6)在用“%c”格式輸入字符時(shí)不能用分隔符將各字符分開(kāi)。例如:scanf("%c%c%c",&c1,&c2,&c3);若輸入a□b□c↙,則得到:c1='a',c2='□',c3='b'。因?yàn)椤?c”只要求輸入一個(gè)單個(gè)的字符,后面不需要用分隔符作為兩個(gè)字符的間隔。可見(jiàn)空格字符、轉(zhuǎn)義字符均為有效字符。(7)某一數(shù)據(jù)輸入時(shí),遇到下列輸入則認(rèn)為當(dāng)前輸入結(jié)束。①遇到空格、回車(chē)鍵、Tab鍵時(shí)輸入結(jié)束。②到達(dá)指定寬度時(shí)結(jié)束,如%3d,則只取3列。③遇到非法輸入時(shí),如下面的例子:scanf("%d%c%f",&x,&y,&z);若輸入為:1234k543o.22↙,則得到:x=1234,y='k',z=543。遇到o認(rèn)為數(shù)據(jù)輸入到此結(jié)束。2024/12/23393.2.3字符輸入輸出函數(shù)

1.

putchar()函數(shù)此函數(shù)為字符輸出函數(shù),其作用是輸出給定的一個(gè)字符常量或一個(gè)字符變量,與printf()函數(shù)中的%c相當(dāng)。putchar()函數(shù)括號(hào)內(nèi)必須有一個(gè)輸出項(xiàng),輸出項(xiàng)可以是字符型常量或變量、整型常量或變量、整型或字符型表達(dá)式,但輸出結(jié)果只能是單個(gè)字符而不能是字符串。例如:putchar('A');輸出字母A。putchar(65);輸出整數(shù)65作為ASCII碼所對(duì)應(yīng)的字符,結(jié)果也為字母A。putchar(x);這里x可以是整型或字符型變量。例3.2字符輸出函數(shù)putchar()舉例。#include<stdio.h> /*putchar()函數(shù)所需的頭文件*/

voidmain(){chara,b,c;a='C';b='A';c='T';putchar(a); /*將變量a的值以字符形式輸出*/putchar(b); /*將變量b的值以字符形式輸出*/putchar(c); /*將變量c的值以字符形式輸出*/}程序運(yùn)行結(jié)果如下:CAT2024/12/23402.?getchar()函數(shù)此函數(shù)為字符輸入函數(shù),其作用是運(yùn)行時(shí)在運(yùn)行界面輸入一個(gè)字符,該函數(shù)返回輸入字符的ASCII碼值。該函數(shù)無(wú)參數(shù),只能接受一個(gè)字符。當(dāng)調(diào)用getchar()函數(shù)時(shí),系統(tǒng)會(huì)等待外部的輸入。用getchar()函數(shù)得到的字符可以賦給一個(gè)字符型變量或者整型變量,也可以不賦給任何變量,只是作為表達(dá)式的一部分。2024/12/2341例3.3字符輸入函數(shù)getchar()舉例。#include"stdio.h" /*getchar()函數(shù)所需的類(lèi)文件*/voidmain(){charch;ch=getchar(); /*利用getchar()函數(shù)給ch賦值,getchar()函數(shù)為無(wú)參函數(shù)*/putchar(ch); /*利用putchar()函數(shù)輸出變量ch*/printf("\n");printf("%c%d\n",ch,ch);/*將ch的值分別以字符形式和十進(jìn)制整型形式輸出*/printf("%c%d\n\n",ch-32,ch-32);/*將ch-32的值分別以字符形式和十進(jìn)制整型形式輸出*/}如果輸入的數(shù)據(jù)是a,程序運(yùn)行結(jié)果如下:aa97A652024/12/2342案例三交換兩個(gè)整型變量的值

1.問(wèn)題描述從鍵盤(pán)輸入兩個(gè)整型變量的值,交換它們的值并輸出。圖3.4交換兩個(gè)整型數(shù)的流程圖2.問(wèn)題分析(1)算法分析:在計(jì)算機(jī)中交換兩個(gè)變量a和b,不能只寫(xiě)a=b;b=a;正確的交換方法(借助中間變量):c=a;a=b;b=c。(2)數(shù)據(jù)分析:輸入數(shù)據(jù):a,b,int型;輸出數(shù)據(jù):a,b,int型;中間數(shù)據(jù):c,int型。(3)該算法的流程圖如圖3.4所示。2024/12/2343圖3.4交換兩個(gè)整型數(shù)的流程圖2024/12/23443.?C語(yǔ)言代碼#include<stdio.h>voidmain(){inta,b,c;printf("\ninputa,b:");scanf("%d%d",&a,&b); /*以十進(jìn)制整型形式輸入a和b的值*/printf("\nbeforeexchange:a=%db=%d\n",a,b); /*輸出交換前a和b的值*/c=a;a=b;b=c; /*交換a和b的值*/printf("afterexchange:a=%db=%d\n",a,b); /*輸出交換后a和b的值*/}2024/12/23454.程序運(yùn)行結(jié)果inputa,b:35beforeexchange:a=3b=5afterexchange:a=5b=32024/12/23463.3順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)是程序設(shè)計(jì)語(yǔ)言最基本的結(jié)構(gòu),其包含的語(yǔ)句是按照書(shū)寫(xiě)的順序執(zhí)行的,其特點(diǎn)就是其中的語(yǔ)句或結(jié)構(gòu)被連續(xù)按順序執(zhí)行。順序結(jié)構(gòu)的程序流程如圖3.5所示,程序按書(shū)寫(xiě)順序執(zhí)行。先執(zhí)行A,再執(zhí)行B。其中A、B可是一條或多條語(yǔ)句,甚至是一個(gè)復(fù)雜的結(jié)構(gòu)。2024/12/2347圖3.5順序結(jié)構(gòu)執(zhí)行流程

2024/12/2348例3.4編寫(xiě)程序計(jì)算圓周長(zhǎng)、圓面積、圓球表面積、圓球體積、圓柱體積。(1)算法分析。l=2*PI*r;s=PI*r*r;sq=4*PI*r*r;vq=4.0/3.0*PI*r*r*r;vz=PI*r*r*h;(2)數(shù)據(jù)分析。輸入數(shù)據(jù):半徑r和圓柱體的高h(yuǎn),float型;輸出數(shù)據(jù):圓周長(zhǎng)l、圓面積s、圓球表面積sq、圓球體積vq、圓柱體積vz,float型。(3)該算法的流程圖如圖3.6所示。2024/12/2349圖3.6計(jì)算球體表面積、體積等的流程圖2024/12/2350(4)?C語(yǔ)言代碼。#include"stdio.h"#include"math.h"#definePI3.14voidmain(){doubler,h,l,s,sq,vq,vz;printf("請(qǐng)輸入圓半徑r,圓柱高h(yuǎn)的值\n");scanf("%lf%lf",&r,&h);/*r和h為雙精度,輸入時(shí)用%lf*/l=2*PI*r;/*計(jì)算周長(zhǎng)l*/s=PI*r*r;/*計(jì)算面積s*/sq=4*PI*r*r;/*計(jì)算球體表面積sq*/vq=4.0/3.0*PI*r*r*r;/*計(jì)算球體體積*/vz=PI*r*r*h;/*計(jì)算圓柱體體積*/printf("圓周長(zhǎng)為:l=%6.2f\n",l);printf("圓面積為:s=%6.2f\n",s);printf("圓球表面積為:sq=%6.2f\n",sq);printf("圓球體積為:sv=%6.2f\n",vq);printf("圓柱體積為:sz=%6.2f\n",vz);}2024/12/2351(5)程序運(yùn)行結(jié)果。請(qǐng)輸入圓半徑r,圓柱高h(yuǎn)的值2.13圓周長(zhǎng)為:l=13.19圓面積為:s=13.85圓球表面積為:sq=55.39圓球體積為:sv=38.77圓柱體積為:sz=41.542024/12/2352例3.5從鍵盤(pán)上輸入一個(gè)3位數(shù),求該數(shù)各位上的數(shù)字和。(1)算法分析。設(shè)該數(shù)為n,百位上的數(shù)字為a,十位上的字為b,個(gè)位上的數(shù)字為c,則a=n/100,b=n/10%10,c=n%10。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):n,int型;輸出數(shù)據(jù):d,用于存放個(gè)位、十位、百位上的數(shù)的和,int型;中間數(shù)據(jù):a,b,c,int型。(3)?C語(yǔ)言代碼。#include"stdio.h"voidmain(){intn,a,b,c,d;printf("輸入三位數(shù):");scanf("%d",&n);a=n/100; /*百位數(shù)*/b=n/10%10; /*十位數(shù)*/c=n%10; /*個(gè)位數(shù)*/d=a+b+c; /*百位、十位、個(gè)位上的數(shù)字和*/printf("百位、十位、個(gè)位上的數(shù)字和=%d",d);}2024/12/2353(4)程序運(yùn)行結(jié)果。輸入三位數(shù):256百位、十位、個(gè)位上的數(shù)字和=13圖3.7計(jì)算三角形面積的流程圖思考:如果是四位數(shù)或者五位數(shù),又應(yīng)該如何求解?2024/12/2354例3.6輸入三角形的三邊長(zhǎng),求三角形的面積。(1)算法分析。已知三角形的三邊長(zhǎng)a,b,c,則由海倫公式計(jì)算三角形的面積為其中,s=(a+b+c)/2。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):三邊邊長(zhǎng)a,b,c,float型;輸出數(shù)據(jù)為面積area,float型;中間數(shù)據(jù)為半周長(zhǎng)s,float型。(3)此題為順序結(jié)構(gòu)程序設(shè)計(jì),按照輸入數(shù)據(jù)、計(jì)算、輸出的思路畫(huà)出該算法的流程圖如圖3.7所示。2024/12/2355圖3.7計(jì)算三角形面積的流程圖2024/12/2356(4)?C語(yǔ)言代碼。#include<stdio.h>#include<math.h>voidmain(){floata,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c); /*輸入三邊長(zhǎng)*/s=(a+b+c)/2; /*計(jì)算半周長(zhǎng)s*/area=sqrt(s*(s-a)*(s-b)*(s-c)); /*計(jì)算面積area*/printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);printf("area=%7.2f\n",area);}2024/12/2357(5)程序運(yùn)行結(jié)果。3.0,4.0,5.0a=3.00,b=4.00,c=5.00,s=6.00area=6.00由以上例題可知:順序結(jié)構(gòu)程序設(shè)計(jì)的一般步驟包括:(1)定義所需要的輸入、輸出和中間變量;(2)讓輸入變量得到值(可以通過(guò)賦值、輸入函數(shù)和初始化等方法完成);(3)依據(jù)算法計(jì)算所需結(jié)果;(4)按合適的格式輸出結(jié)果。2024/12/2358案例四計(jì)算y=|x|1.問(wèn)題描述從鍵盤(pán)上輸入x的值,計(jì)算其絕對(duì)值。2.問(wèn)題分析(1)算法分析。①

y=x;②

如果y?<?0,則執(zhí)行y?=?-x,可以用單分支if語(yǔ)句。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):x,float型;輸出數(shù)據(jù):y,float型。(3)此題為選擇結(jié)構(gòu)程序設(shè)計(jì),按照輸入數(shù)據(jù),計(jì)算、輸出的思路畫(huà)出該算法的流程圖如圖3.8所示。2024/12/2359圖3.8求絕對(duì)值的流程圖2024/12/23603.?C語(yǔ)言代碼#include"stdio.h"voidmain(){floatx,y;printf("pleaseinputx:");

scanf("%f",&x);y=x;if(y<0)y=-x;printf("y=%f\n",y);}4.程序運(yùn)行結(jié)果pleaseinputx:-10.3y=10.3000002024/12/23613.4選擇結(jié)構(gòu)的程序設(shè)計(jì)選擇結(jié)構(gòu)也稱(chēng)為條件結(jié)構(gòu)或分支結(jié)構(gòu),通常是在兩個(gè)或兩個(gè)以上不同的操作中選擇其中的一個(gè)進(jìn)行操作。例如在例3.6中,如果輸入的a,b,c不能構(gòu)成三角形,則無(wú)法計(jì)算,所以需要在計(jì)算前判斷a,b,c能否構(gòu)成三角形,這就需要用選擇結(jié)構(gòu)來(lái)完成。在C語(yǔ)言中有兩種選擇控制語(yǔ)句:if語(yǔ)句和switch語(yǔ)句。2024/12/23623.4.1if語(yǔ)句及其三種基本形式

1.單分支選擇語(yǔ)句單分支選擇語(yǔ)句的形式為if(表達(dá)式)

語(yǔ)句執(zhí)行單分支選擇語(yǔ)句時(shí),首先判斷表達(dá)式的值,若為真(非0),則執(zhí)行下面的語(yǔ)句;若為假(0),則跳過(guò)該語(yǔ)句。流程圖如圖3.9所示。圖3.9單分支選擇結(jié)構(gòu)執(zhí)行流程圖2024/12/23632.雙分支選擇語(yǔ)句圖3.10雙分支選擇結(jié)構(gòu)執(zhí)行流程圖雙分支選擇語(yǔ)句的形式為if(表達(dá)式)

語(yǔ)句組1else語(yǔ)句組2執(zhí)行雙分支選擇語(yǔ)句時(shí),首先判斷表達(dá)式的值,若為真(非0),則執(zhí)行語(yǔ)句組1;否則執(zhí)行語(yǔ)句組2。流程圖如圖3.10所示。圖3.10雙分支選擇結(jié)構(gòu)執(zhí)行流程圖2024/12/2364例3.7在案例四中,用雙分支選擇語(yǔ)句求x的絕對(duì)值,流程圖如圖3.11所示。C語(yǔ)言代碼如下:#include"stdio.h"voidmain(){floatx,y;printf("pleaseintputx:");scanf("%f",&x);

if(x>0)y=x;elsey=-x;printf("y=%f\n",y);}圖3.11用雙分支選擇語(yǔ)句實(shí)現(xiàn)x的絕對(duì)值的算法流程圖

2024/12/23653.多分支選擇語(yǔ)句

多分支選擇語(yǔ)句的形式為if(表達(dá)式1)語(yǔ)句1elseif(表達(dá)式2)語(yǔ)句2elseif(表達(dá)式3)語(yǔ)句3…elseif(表達(dá)式m)語(yǔ)句melse語(yǔ)句n流程圖如圖3.12所示圖3.12多分支選擇語(yǔ)句執(zhí)行流程圖2024/12/2366執(zhí)行多分支選擇語(yǔ)句時(shí),先判斷表達(dá)式1的值,若為真(非0),則執(zhí)行語(yǔ)句1,然后跳到整個(gè)if語(yǔ)句之外繼續(xù)執(zhí)行下一條語(yǔ)句;若為假(0),則執(zhí)行下一個(gè)表達(dá)式2的判斷,若表達(dá)式2的值為真(非0),則執(zhí)行語(yǔ)句2,然后同樣跳到整個(gè)if語(yǔ)句之外執(zhí)行if語(yǔ)句之后的下一條語(yǔ)句;否則一直這樣繼續(xù)判斷,當(dāng)出現(xiàn)某個(gè)表達(dá)式的值為真時(shí),則執(zhí)行其后對(duì)應(yīng)的語(yǔ)句,然后跳到整個(gè)if語(yǔ)句之外繼續(xù)執(zhí)行程序;若所有的表達(dá)式均為假,則執(zhí)行語(yǔ)句n,然后繼續(xù)執(zhí)行后續(xù)程序。2024/12/2367例3.8從鍵盤(pán)上輸入x的值,計(jì)算y的值。2024/12/2368(1)算法分析。此題有四種情況,可以采用多分支if語(yǔ)句。在設(shè)計(jì)時(shí),如果有n個(gè)分支,一般將前(n-1)個(gè)分支用if或者elseif引出,而將最后一個(gè)分支用else來(lái)處理。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):x,float型;輸出數(shù)據(jù):y,float型。(3)?C語(yǔ)言代碼。#include"stdio.h"voidmain(){floatx,y;printf("pleaseintputx:");scanf("%f",&x);if(x>3)y=x+20;elseif(x>0)y=x+3;elseif(x>-3)y=x-20;

elsey=x-3;printf("y=%f\n",y);}(4)程序運(yùn)行結(jié)果。pleaseintputx:2y=5.0000002024/12/23693.4.2if語(yǔ)句的嵌套結(jié)構(gòu)

在上述三種if語(yǔ)句的結(jié)構(gòu)中,當(dāng)if(表達(dá)式)或else后面的語(yǔ)句本身又是一個(gè)if語(yǔ)句結(jié)構(gòu)時(shí),就形成了if語(yǔ)句的嵌套結(jié)構(gòu)。例如if語(yǔ)句的兩層嵌套結(jié)構(gòu)為if(表達(dá)式1)if(表達(dá)式1-1)

語(yǔ)句1_1else

語(yǔ)句1_2elseif(表達(dá)式2_1)

語(yǔ)句2_1else

語(yǔ)句2_22024/12/2370一般而言,如果嵌套的if語(yǔ)句都帶else子句,那么if的個(gè)數(shù)與else的個(gè)數(shù)總相等,加之良好的書(shū)寫(xiě)習(xí)慣,則嵌套中出現(xiàn)混亂與錯(cuò)誤的機(jī)會(huì)就會(huì)少一些。但在實(shí)際程序設(shè)計(jì)中常需要使用帶else子句和不帶else子句的if語(yǔ)句的混合嵌套,在這種情況下,嵌套中就會(huì)出現(xiàn)if與else個(gè)數(shù)不等的情況,很易于出現(xiàn)混亂的現(xiàn)象。else和if配對(duì)的原則是:缺省?{}?的情況下,else總是和上方未配過(guò)對(duì)的最近的if配對(duì),同時(shí)配對(duì)的else和if之間連線不能出現(xiàn)交叉。例如:if(表達(dá)式1)if(表達(dá)式2)語(yǔ)句1else語(yǔ)句22024/12/2371從形式上看,編程者似乎希望程序中的else子句屬于第一個(gè)if語(yǔ)句,但編譯程序并不這樣認(rèn)為,仍然把它與第二個(gè)if相聯(lián)系。對(duì)于這類(lèi)情況,C語(yǔ)言明確規(guī)定:if嵌套結(jié)構(gòu)中的else總是屬于在它上面的、最近的、又無(wú)else子句的那個(gè)if語(yǔ)句。盡管有這類(lèi)規(guī)定,建議還是應(yīng)盡量避免使用這類(lèi)嵌套為好。如果必須這樣做,應(yīng)使用復(fù)合語(yǔ)句的形式明顯指出else的配對(duì)關(guān)系。如可以這樣來(lái)處理:if(表達(dá)式1){if(表達(dá)式2) 語(yǔ)句1}else語(yǔ)句22024/12/2372例3.9比較兩個(gè)整數(shù)的關(guān)系,討論它們是大于,小于還是等于關(guān)系。(1)算法分析。此題有三種情況,可以采用多分支if語(yǔ)句或者if語(yǔ)句的嵌套,這里采用if語(yǔ)句的嵌套,可以這樣設(shè)計(jì):總體是一個(gè)雙分支,一個(gè)分支處理不等于的情況,另一個(gè)分支處理等于的情況,然后在不等于這個(gè)分支下嵌套一個(gè)雙分支,判斷是大于還是小于關(guān)系。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):x,y,int型;輸出數(shù)據(jù):字符串,不需要定義。(3)算法流程圖如圖3.13所示。圖3.13比較兩個(gè)整數(shù)關(guān)系的流程圖

2024/12/2373(4)?C語(yǔ)言代碼。#include<stdio.h>voidmain(){

intx,y;

printf("Enterintegerxandy:");scanf("%d%d",&x,&y);if(x!=y)if(x>y)printf("x>y\n");/*注意else和它匹配的if對(duì)齊*/elseprintf("x<y\n");elseprintf("x=y\n");}(5)程序運(yùn)行結(jié)果。Enterintegerxandy:350x<y2024/12/2374例3.10例3.8的分段函數(shù)用嵌套的if語(yǔ)句實(shí)現(xiàn),程序如下:#include"stdio.h"voidmain(){floatx,y;printf("pleaseintputx:");scanf("%f",&x);if(x>0)

if(x>3)y=x+20;

elsey=x+3;

elseif(x>-3)y=x-20;else

y=x-3;printf("y=%f\n",y);}2024/12/23753.4.3switch語(yǔ)句(開(kāi)關(guān)語(yǔ)句)switch語(yǔ)句是C語(yǔ)言中提供的一種有效的、結(jié)構(gòu)清晰的多分支選擇語(yǔ)句,也稱(chēng)為開(kāi)關(guān)語(yǔ)句。它根據(jù)給出的表達(dá)式的值,將程序控制轉(zhuǎn)移到某個(gè)語(yǔ)句處執(zhí)行。使用它可以克服嵌套的if語(yǔ)句易于造成混亂及過(guò)于復(fù)雜等問(wèn)題。C程序設(shè)計(jì)中常用它來(lái)實(shí)現(xiàn)分類(lèi)、菜單設(shè)計(jì)等處理。switch語(yǔ)句的一般形式為switch(表達(dá)式){case常量表達(dá)式1:語(yǔ)句組1;case常量表達(dá)式2:語(yǔ)句組2;…case常量表達(dá)式n:語(yǔ)句組n;default:語(yǔ)句組n+1;}2024/12/2376執(zhí)行switch語(yǔ)句時(shí),首先計(jì)算表達(dá)式的值,然后逐個(gè)與case后的常量表達(dá)式值相比較,當(dāng)表達(dá)式的值與case后面某個(gè)常量表達(dá)式的值相等時(shí),即執(zhí)行其后的語(yǔ)句,繼續(xù)執(zhí)行后面所有case后的語(yǔ)句,直到遇到break語(yǔ)句或遇到switch結(jié)構(gòu)右側(cè)的花括弧結(jié)束。如果表達(dá)式的值與所有case后的常量表達(dá)式值均不相同時(shí),則執(zhí)行default后的語(yǔ)句。例如,要求輸入一個(gè)數(shù)字(1~7),輸出其對(duì)應(yīng)星期幾的英文單詞。switch(a){case1:printf("Monday\n");case2:printf("Tuesday\n");case3:printf("Wednesday\n");case4:printf("Thursday\n");case5:printf("Friday\n");case6:printf("Saturday\n");case7:printf("Sunday\n");default:printf("error\n");}2024/12/2377當(dāng)輸入5之后,執(zhí)行了case5以及以后的所有語(yǔ)句,輸出了Friday及以后的所有單詞。因?yàn)樵趕witch語(yǔ)句中,“case常量表達(dá)式”只相當(dāng)于一個(gè)語(yǔ)句標(biāo)號(hào),表達(dá)式的值和某標(biāo)號(hào)相等則從該標(biāo)號(hào)開(kāi)始執(zhí)行,不能在執(zhí)行完該標(biāo)號(hào)的語(yǔ)句后自動(dòng)跳出整個(gè)switch語(yǔ)句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語(yǔ)句的情況。這是與前面的if語(yǔ)句不同的,應(yīng)該引起注意。為了避免上述情況,C語(yǔ)言還提供了一種break語(yǔ)句,用于跳出switch語(yǔ)句。我們將程序修改如下,在每一case語(yǔ)句之后增加break語(yǔ)句,使每一次執(zhí)行之后均可跳出switch語(yǔ)句,從而避免輸出不應(yīng)有的結(jié)果。2024/12/2378switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursday\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;case7:printf("Sunday\n");break;default:printf("error\n");}最后一個(gè)分支(default)可以不加break語(yǔ)句。2024/12/2379例3.11將百分制成績(jī)轉(zhuǎn)換成五分制成績(jī),轉(zhuǎn)換原則如下:2024/12/2380(1)算法分析。此題有五種情況,可以采用多分支if語(yǔ)句或switch語(yǔ)句,解決這個(gè)問(wèn)題的關(guān)鍵有兩個(gè),第一,如何將像93.6,95.8,96等這些數(shù)值都對(duì)應(yīng)到輸出A這種分支下,將一個(gè)兩位數(shù)s轉(zhuǎn)換成一位數(shù),通常采用(int)(s/10)這種方法。第二,這五個(gè)分支如果用switch語(yǔ)句,通常可以將前四個(gè)分支用case來(lái)處理,而將最后一個(gè)分支用default來(lái)處理。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):s,表示百分制成績(jī),float型;輸出數(shù)據(jù)為:g,表示五分制成績(jī),char型。2024/12/2381(3)?C語(yǔ)言代碼。#include<stdio.h>voidmain(){floats;charg;printf("請(qǐng)輸入一個(gè)0至100之間的百分制成績(jī):");scanf("%f",&s);switch((int)(s/10)){case10:case9:g='A';break;case8:g='B';break;case7:g='C';break;case6:g='D';break;default:g='E';}printf("百分制成績(jī)?yōu)椋?f,五分制成績(jī)?yōu)椋?c\n",s,g);}(4)程序運(yùn)行結(jié)果。請(qǐng)輸入一個(gè)0至100之間的百分制成績(jī):85.5百分制成績(jī)?yōu)椋?5.500000,五分制成績(jī)?yōu)椋築2024/12/2382說(shuō)明:(1)?switch后面“表達(dá)式”的類(lèi)型和常量表達(dá)式的類(lèi)型是整型、字符型。(2)每一個(gè)case的常量表達(dá)式的值必須互不相同。(3)在case后允許有多條執(zhí)行語(yǔ)句,可以不用{}括起來(lái)。(4)各case和default子句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果。default子句可以省略不用。(5)多個(gè)case可共用一組執(zhí)行語(yǔ)句。如例3.11中,case10和case9后的語(yǔ)句一樣,只需要在case9后面寫(xiě)上語(yǔ)句組就行。2024/12/23833.4.4選擇結(jié)構(gòu)程序舉例例3.12從鍵盤(pán)上輸入三個(gè)數(shù),計(jì)算以這三個(gè)數(shù)為邊長(zhǎng),圍成的三角形的面積。(1)算法分析。在順序結(jié)構(gòu)程序設(shè)計(jì)中,我們?cè)O(shè)計(jì)過(guò)求三角形面積的程序,沒(méi)有考慮輸入的數(shù)據(jù)是否可以組成三角形。本例要考慮三角形的三邊關(guān)系,若a+b>c&&a+c?>?b&&b+c>a,則可以構(gòu)成三角形,所以此題有兩個(gè)分支,若能夠構(gòu)成三角形,則計(jì)算其面積,否則輸出數(shù)據(jù)錯(cuò)誤,可以用雙分支if語(yǔ)句解決。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):三邊長(zhǎng)a,b,c,float型;輸出數(shù)據(jù):面積area,float型;中間數(shù)據(jù):半周長(zhǎng)s,float型。2024/12/2384(3)?C語(yǔ)言代碼。#include<stdio.h>#include<math.h>voidmain(){floata,b,c,s,area;printf("請(qǐng)輸入三個(gè)大于0的三角形邊長(zhǎng)");scanf("%f,%f,%f",&a,&b,&c); /*輸入三邊長(zhǎng)*/if(a+b>c&&a+c>b&&b+c>a) /*判斷能否構(gòu)成三角形*/{s=(a+b+c)/2; /*計(jì)算半周長(zhǎng)s*/area=sqrt(s*(s-a)*(s-b)*(s-c)); /*計(jì)算面積area*/

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

printf("area=%7.2f\n",area);}elseprintf("輸入數(shù)據(jù)錯(cuò)誤");}(4)程序運(yùn)行結(jié)果。請(qǐng)輸入三個(gè)大于0的三角形邊長(zhǎng)3.0,4.0,5.0a=3.00,b=4.00,c=5.00area=6.002024/12/2385例3.13從鍵盤(pán)上輸入一個(gè)年份,編寫(xiě)程序判斷該年是否是閏年。(1)算法分析。判斷一個(gè)用整數(shù)表示的年份是不是閏年的規(guī)則是該數(shù)滿(mǎn)足以下兩個(gè)條件之一則為閏年:①能被400整除;②能被4整除,但不能被100整除。根據(jù)上述規(guī)則,我們可用year表示年份,flag為標(biāo)志變量。是閏年,設(shè)置flag=1,否則設(shè)置flag=0,最后根據(jù)flag的值進(jìn)行輸出。在是與否的問(wèn)題中經(jīng)常設(shè)計(jì)標(biāo)志變量。是閏年需滿(mǎn)足的條件是表達(dá)式(year%400==0)||(year%4==0&&year%100!=0)的值為真,所以此題可以用雙分支if語(yǔ)句解決。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):year,int型;輸出數(shù)據(jù):year,int型;中間數(shù)據(jù):flag,int型。2024/12/2386(3)?C語(yǔ)言代碼。#include"stdio.h"voidmain(){intyear,flag;printf("Pleaeinputayear:");scanf("%d",&year);if((year%400==0)||(year%4==0&&year%100!=0))flag=1;elseflag=0;if(flag==1)printf("%d年是閏年\n",year);elseprintf("%d年不是閏年\n",year);}(4)程序運(yùn)行結(jié)果。Pleaeinputayear:20002000年是閏年2024/12/2387例3.14從鍵盤(pán)上輸入a,b,c三個(gè)數(shù),求關(guān)于x的方程ax2+bx+c=0的根。(1)算法分析。如果a等于0,是一元一次方程,否則是一元二次方程,所以總體是雙分支,當(dāng)是一元二次方程時(shí),有三種情況,可以用if語(yǔ)句的嵌套完成。判別式d=b2-4ac。當(dāng)d?=?0時(shí),方程有兩個(gè)相等的實(shí)根:x1=x2=-b/(2*a)。當(dāng)d?>?0時(shí),方程有兩個(gè)不相等的實(shí)根:x1=(-b+sqrt(d))/(2*a),x2=(-b-sqrt(d))/(2*a)。當(dāng)d?<?0時(shí),方程有兩個(gè)虛根:x1=jp+ipi,x2=jp-ipi,實(shí)部jp=-b/(2*a),虛部ip?=?sqrt(-d)/(2*a)。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):a,b,c,,float型;輸出數(shù)據(jù):x1,x2,jp,ip,float型;中間數(shù)據(jù):d,float型。2024/12/2388(3)?C語(yǔ)言代碼。#include"math.h"#include"stdio.h"voidmain(){floata,b,c,d,x1,x2,jp,ip;scanf("%f%f%f",&a,&b,&c);printf("theequation");if(fabs(a)<1e-6)printf("isnotquadratic");else{d=b*b-4*a*c;if(fabs(d)<=1e-6) /*相等的實(shí)根*/{?printf("hastwoequalroots:\n");printf("x1=x2=%8.4f\n",-b/(2*a));}elseif(d>1e-6) /*不相等的實(shí)根*/{x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("hastworealroots:\n");

printf("x1=%8.4f,x2=%8.4f\n",x1,x2);}else /*虛根*/{jp=-b/(2*a);ip=sqrt(-d)/(2*a);printf("hastwocomplexroots:\n");printf("x1=%8.4f+%8.4fi\n",jp,ip);printf("x2=%8.4f-%8.4fi\n",jp,ip);}}}2024/12/2389(4)程序運(yùn)行結(jié)果。132theequationhastworealroots:x1=-1.0000,x2=-2.00002024/12/2390案例五

計(jì)算1~100的累計(jì)和1.問(wèn)題描述編程實(shí)現(xiàn)計(jì)算1~100的累計(jì)和。圖3.14用while實(shí)現(xiàn)1~100的累加求和流程圖2.問(wèn)題分析(1)算法分析。設(shè)保存和的變量為sum,每次加上去的數(shù)是i,計(jì)算機(jī)是這樣完成的sum?=?sum?+?1,sum?=?sum?+?2,sum?=?sum?+?3,…,sum?=?sum?+?99,sum?=?sum?+?100,當(dāng)要加上去的數(shù)i是101時(shí),算法結(jié)束,我們可以看到這些算式有一個(gè)共同的特點(diǎn),可以總結(jié)為sum=sum+i,只不過(guò)每次加上去的i的值不同罷了,i每次自增1,所以可以總結(jié)出循環(huán)變量為i,循環(huán)體為sum?=?sum+i,i?=?i+1;循環(huán)條件為sum?<=?100。(2)數(shù)據(jù)分析。輸入數(shù)據(jù):無(wú);輸出數(shù)據(jù):和sum,int型;中間數(shù)據(jù):i,int型。(3)算法流程圖如圖3.14所示。2024/12/2391圖3.14用while實(shí)現(xiàn)1~100的累加求和流程圖2024/12/23923.C語(yǔ)言代碼#include"stdio.h"voidmain(){inti=1,sum=0;/*初始化循環(huán)控制變量i和累加器sum*/while(i<=100) /*循環(huán)條件*/{sum+=i; /*實(shí)現(xiàn)累加*/i++; /*循環(huán)控制變量i增1*/}printf("sum=%d\n",sum);

}4.程序運(yùn)行結(jié)果sum=5050思考1:如果要計(jì)算1~100之間的所有奇數(shù)之和,應(yīng)該怎樣修改程序?分析:奇數(shù)之和,每次循環(huán)變量加2,所以只需要將上面程序中的i++修改為:i=i+2。思考2:如果要計(jì)算1~100之間的所有偶數(shù)之和,應(yīng)該怎樣修改程序?分析:從2開(kāi)始累加,將上面的程序中的循環(huán)變量i的初值i=1改為i=2,將i++改為i=i+2。思考3:如何求n!?2024/12/23933.5循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)在現(xiàn)實(shí)問(wèn)題求解中我們往往會(huì)按照已定的條件反復(fù)執(zhí)行一定的操作,這種操作我們稱(chēng)為循環(huán)。例如,要輸入全校學(xué)生的成績(jī);求前100名學(xué)生的數(shù)學(xué)平均成績(jī);迭代求根等。幾乎所有實(shí)用的程序都包含循環(huán)。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序三種基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。循環(huán)程序結(jié)構(gòu)就是重復(fù)執(zhí)行某一段程序,直到某

溫馨提示

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

評(píng)論

0/150

提交評(píng)論