C語言程序設(shè)計:第2章 簡單判定性問題求解_第1頁
C語言程序設(shè)計:第2章 簡單判定性問題求解_第2頁
C語言程序設(shè)計:第2章 簡單判定性問題求解_第3頁
C語言程序設(shè)計:第2章 簡單判定性問題求解_第4頁
C語言程序設(shè)計:第2章 簡單判定性問題求解_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

所謂判定性問題(decisionproblem)就是提出一個問題,只需要給出「Yes」或「No」答案的問題

第二章

簡單判定性問題求解2.1判定性問題及判定條件的描述關(guān)系運算符關(guān)系運算符含義操作數(shù)個數(shù)結(jié)合性>大于雙目左結(jié)合>=大于或等于雙目左結(jié)合<小于雙目左結(jié)合<=小于或等于雙目左結(jié)合==等于雙目左結(jié)合!=不等于

雙目左結(jié)合賦值運算符

關(guān)系運算符

算術(shù)運算符優(yōu)先級由低到高<、<=、>、>=的優(yōu)先級相同==、!=的優(yōu)先級相同<、<=、>、>=高于==、!=

2.1判定性問題及判定條件的描述關(guān)系表達(dá)式表達(dá)式

關(guān)系運算符

表達(dá)式a+b>c-d x>3/2 'a'+(b>c) a!=(c==d)關(guān)系表達(dá)式的值是“真”和“假”,分別用“1”和“0”表示

5>0的值為“真”,即為1(a=3)>(b=5)

由于3>5不成立,故其值為假,即為02.1判定性問題及判定條件的描述邏輯運算符邏輯運算符含義操作數(shù)個數(shù)結(jié)合性&&

與運算

雙目左結(jié)合||或運算

雙目左結(jié)合!非運算

單目右結(jié)合賦值運算符

邏輯或

邏輯與

關(guān)系運算符

算術(shù)運算符

邏輯非

優(yōu)先級由低到高a>b&&c>d等價于(a>b)&&(c>d)2.1判定性問題及判定條件的描述邏輯表達(dá)式表達(dá)式

邏輯運算符

表達(dá)式邏輯運算的值為“真”和“假”,分別用“1”和“0”表示

A的取值B的取值A(chǔ)&&BA||B!A非0非0110非000100非0011000012.1判定性問題及判定條件的描述

思考:當(dāng)i=10、j=3、k=0時,i==1&&(j==3||(k=k+1))的運算次序是怎樣的?表達(dá)式最終的值是多少呢?k值是多少?

在處理邏輯表達(dá)式時應(yīng)注意以下兩點:

(1)C語言編譯系統(tǒng)在給出邏輯運算結(jié)果時,以0代表“假”,以1代表“真”。但在判斷一個邏輯量“真假”時,以非0表示“真”,以0表示“假”。例如:當(dāng)a=5.4,b=5,c=’a’時,!a,!b,!c的值均為“假”,即為0。a&&c的值為1,因為a和b均為非0。

(2)在進(jìn)行邏輯運算時,邏輯表達(dá)式運算到其值完全確定時為止(短路運算)。例如:思考題中計算i==1&&(j==3||k=k+1)時,由于i==1不成立,決定了整個表達(dá)式的值為0,因此(j==3||k=k+1)就不在計算了,k的值還是0。

2.1判定性問題及判定條件的描述位運算

所謂位運算是指進(jìn)行二進(jìn)制位的運算。在系統(tǒng)軟件中,常要處理二進(jìn)制位的問題。C語言提供了按位運算的功能,這使得它與其它高級語言相比,具有很強(qiáng)的優(yōu)越性。C語言提供了6種位運算符。類

型運算符含義位邏輯運算符&按位與|按位或^按位異或~取反移位運算

符<<左移>>右移說明:①運算操作數(shù)只能是整型或字符型的數(shù)據(jù),不能為實型或結(jié)構(gòu)體等類型的數(shù)據(jù)。②六個位運算符的優(yōu)先級由高到低依次為:取反、左移和右移、按位與、按位異或、按位或。③兩個不同長度的數(shù)據(jù)進(jìn)行位運算時,系統(tǒng)會將二者按右端對齊。下面對各種位運算符介紹如下:2.1判定性問題及判定條件的描述位運算1.“按位與”運算符(&)(1)規(guī)則:參與運算的兩數(shù)(以補(bǔ)碼方式出現(xiàn))各對應(yīng)的二進(jìn)位相與(即邏輯乘),只有對應(yīng)的兩個二進(jìn)位均為1時,結(jié)果位才為1,否則為0,它是雙目運算符。即:0&0=0;0&1=0;1&0=0;1&1=1。例如:9&5可寫算式如下:9的二進(jìn)制補(bǔ)碼:000010015的二進(jìn)制補(bǔ)碼:00000101&___________________

00000001(1的二進(jìn)制補(bǔ)碼)可見9&5=1。1.“按位與”運算符(&)(2)特殊用途:①清零按位與運算通常用來對某些位清0。由按位與的規(guī)則可知:為了使某數(shù)的指定位清零,可將該數(shù)按位與一特定數(shù)。該數(shù)中為1的位,特定數(shù)中相應(yīng)位應(yīng)為0;該數(shù)中為0的位,特定數(shù)中相應(yīng)位可以為0也可以為1。由此可見,能對某一個數(shù)的指定位清零的數(shù)并不唯一。②取一個數(shù)中某些位可將該數(shù)與一個特定數(shù)進(jìn)行&運算,對于要取的那些位,特定數(shù)中相應(yīng)的位設(shè)為1。③取出數(shù)中某一位要相將一個數(shù)的某一位保留下來,可將該數(shù)與一個特定數(shù)進(jìn)行&運算,特定數(shù)的相對應(yīng)的那位應(yīng)為1。對原數(shù)00110110中為1的位清零。原數(shù)補(bǔ)碼:00110110清零的數(shù):11000000(或01000000、00000000等)&___________________00000000程序可寫為:#include"stdio.h"main(){inta=0x36,b=0xc0,c;c=a&b;printf("a=%x\nb=%x\nc=%x\n",a,b,c);}運行情況為:a=36b=c0c=0把a(bǔ)的高八位清0,保留低八位。可作a&255運算(255的二進(jìn)制數(shù)為0000000011111111)。#include"stdio.h"main(){inta,b=255,c;scanf("%d",&a);/*從鍵盤敲入a,隨后具體講解scanf*/c=a&b;printf("a=%x\nb=%x\nc=%x\n",a,b,c);}運行情況為:輸入:920<CR>a=398b=ffc=98編寫程序?qū)(=9)的最低位取出。#include"stdio.h"main(){inta=9,b=1,c;c=a&b;printf("a=%x\nb=%x\nc=%x\n",a,b,c);}運行情況為:a=9b=1c=12.“按位或”運算符(|)(1)規(guī)則參與運算的兩數(shù)(以補(bǔ)碼出現(xiàn))各對應(yīng)的二進(jìn)位相或(即邏輯加)。只要對應(yīng)的兩個二進(jìn)位有一個為1時,結(jié)果位就為1,它是雙目運算符。即:0|0=0;0|1=1;1|0=1;1|1=1。例如:9|5可寫算式如下:00001001 00000101 |_________________ 00001101(十進(jìn)制為13)可見9|5=13。(2)特殊用途將一個數(shù)據(jù)的某些指定的位置為1。將一個數(shù)的低5位,置為1。只需將該數(shù)與“00011111”進(jìn)行|運算。如:########(#可代表0或1)00011111|_______________###11111#include"stdio.h"main(){int

a,b=31,c;/*思考:為什么置b=31?*/

scanf("%d",&a);c=a|b;

printf("a=%x\nb=%x\nc=%x\n",a,b,c);}運行情況為:輸入:5<CR>a=5b=1fc=1f3.“按位異或”運算符(^)(1)規(guī)則參與運算的兩數(shù)(以補(bǔ)碼出現(xiàn))各對應(yīng)的二進(jìn)位相異或,當(dāng)兩對應(yīng)的二進(jìn)位相異時,結(jié)果為1,它是雙目運算符。即:0^0=0;0^1=1;1^0=1;1^1=0。例如:9^5可寫成算式如下:0000100100000101^____________________00001100(十進(jìn)制為12)可見9^5=12。3.“按位異或”運算符(^)(2)特殊用途①使特定位翻轉(zhuǎn)

要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行“按位異或”運算的數(shù)的相應(yīng)位置為1。②使特定位保留原值要使哪幾位保留原值就將與其進(jìn)行“按位異或”運算的數(shù)的相應(yīng)位置為0。③交換兩個值,不用臨時變量將01110001的低4位翻轉(zhuǎn),高4位保留原值。0111000100001111^______________01111110(十進(jìn)制126)程序可寫為:#include"stdio.h"main(){inta=0x71,b=0xf,c;c=a^b;printf("a=%x\nb=%x\nc=%x\n",a,b,c);}運行情況為:a=71b=fc=7e

設(shè)有整型數(shù)a=5,b=7。編寫程序利用位運算,將a和b的值互換。

程序中,通過順序使用a=a^b;b=b^a;a=a^b;三個賦值語句將兩變量a、b的值互換。具體計算過程如下:第一步:a0000000000000101b0000000000000111a=a^b0000000000000010第二步:a0000000000000010b0000000000000111b=b^a0000000000000101(b的值為5)第三步:a0000000000000010b0000000000000101a=a^b0000000000000111(

a的值為7)#include"stdio.h"main(){inta=5,b=7;printf("a=%d,b=%d\n",a,b);a=a^b;b=b^a;a=a^b;printf("a=%d,b=%d\n",a,b);}運行情況為:a=5,b=7a=7,b=5

設(shè)有整型數(shù)a=5,b=7。編寫程序利用位運算,將a和b的值互換。

4.“求反”運算符(~)(1)規(guī)則對參與運算的數(shù)的各二進(jìn)位按位求反,它是單目運算符,具有右結(jié)合性。即:~0=1;~1=0。例如:~9的運算為0000000000001001~__________________1111111111110110(2)用途適當(dāng)?shù)氖褂每稍黾映绦虻囊浦残?。如要將整?shù)a的最低位置為0,我們通常采用語句a=a&~1;來完成,因為這樣對a是16位數(shù)還是32位數(shù)均不受影響。5.“左移”運算符(<<)(1)規(guī)則把“<<”左邊的運算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動的位數(shù),高位丟棄,低位補(bǔ)0,是雙目運算符。例如:a<<4指把a(bǔ)的各二進(jìn)位向左移動4位。如a=00000011(十進(jìn)制3),左移4位后為00110000(十進(jìn)制48)。(2)特殊用途左移1位相當(dāng)于該數(shù)乘以2;左移n位相當(dāng)于該數(shù)乘以2n

。但此結(jié)論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。左移比乘法運算快得多,有的C編譯系統(tǒng)自動將乘2運算用左移一位來實現(xiàn)。6.“右移”運算符(>>)(1)規(guī)則把“>>”左邊的運算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動的位數(shù)。(2)特殊用途右移1位相當(dāng)于該數(shù)除以2;右移n位相當(dāng)于該數(shù)除以2n。6.“右移”運算符(>>)(3)說明對于有符號數(shù),在右移時,符號位將隨同移動。當(dāng)為正數(shù)時,最高位補(bǔ)0;而為負(fù)數(shù)時,符號位為1,最高位是補(bǔ)0還是補(bǔ)1取決于計算機(jī)系統(tǒng)的規(guī)定。移入0的稱為“邏輯右移”;移入1的稱為“算術(shù)右移”。我們可以通過編寫程序來驗正所使用的系統(tǒng)是采用“邏輯右移”還是“算術(shù)右移”。很多系統(tǒng)規(guī)定為補(bǔ)1,即“算術(shù)右移”。

如:a:1001011111101101a>>1:0100101111110110(邏輯右移)a>>1:1100101111110110(算術(shù)右移)2.2if-else判定性結(jié)構(gòu)If判斷結(jié)構(gòu)if(條件表達(dá)式)語句塊1;例2-2輸入兩個整數(shù),輸出其中的大數(shù)。

設(shè)定變量nNum1,nNum2,nMax開始結(jié)束輸入數(shù)據(jù)輸出nMaxnMax<nNum2nMax=nNum2真假nMax=nNum1例2-2輸入兩個整數(shù),輸出其中的大數(shù)。

#include<stdio.h>#include<stdlib.h>voidmain(void){

int

nNum1,nNum2;/*定義兩個整型變量,用于存放兩個操作數(shù)*/

intnMax;/*定義中間變量,用于存放中間結(jié)果*/

printf("\ninputtwonumbers:");

scanf("%d%d",&nNum1,&nNum2);/*輸入兩個操作數(shù)和運算符*/

nMax=nNum1;/*將第一操作數(shù)賦值給中間變量max*/

if(nMax<

nNum2) nMax=nNum2;/*比較大小,將大數(shù)存入max中*/

printf("Max=%d\n",nMax);/*輸出兩個整數(shù)中的大數(shù)*/}格式輸入函數(shù)格式輸入函數(shù)scanf(格式控制字符串,地址表列);功能:按指定格式從鍵盤讀入數(shù)據(jù),存入地址表指定的存儲單元中,并按回車鍵結(jié)束scanf("%d,%f”,&a,&b);非格式字符格式說明地址表列d以帶符號十進(jìn)制形式輸入整型數(shù)據(jù)o以八進(jìn)制無符號形式輸入(無前導(dǎo)0)x以十六進(jìn)制無符號形式輸入(無前導(dǎo)0x)c以字符形式輸入單個字符s輸入字符串,以非空字符開始,遇第一個

空白字符結(jié)束f以小數(shù)形式輸入浮點數(shù)e以標(biāo)準(zhǔn)指數(shù)形式輸入scanf格式字符l

加在d、o、x、u前:輸入長整型

加在f、e

前:輸入雙精度型L加在f、e前:輸入longdouble型h加在d、o、x前:輸入短整型m表示數(shù)據(jù)占用的寬度*本輸入項在讀入后不賦給相應(yīng)的變量scanf附加格式說明符格式輸入函數(shù)常見錯誤(牢記)scanf("%d,%f\n”,&a,&b);scanf("%d,%f”,a,b);scanf("%7.2f",&a);輸入數(shù)據(jù)時,遇以下情況時該數(shù)據(jù)認(rèn)為結(jié)束遇寬度:%3d遇非法輸入遇空格、回車、TAB鍵格式輸入函數(shù)#include<stdio.h>main(){

inta,b; printf("Pleaseinputaandb:"); scanf("%2d%*2d%2d",&a,&b); printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}Pleaseinputaandb:a=12,b=56,a+b=68123456↙例遇寬度格式說明符%*2d中的*為忽略輸入修飾符,表示對應(yīng)的輸入項在讀入后不賦給相應(yīng)的變量#include<stdio.h>main(){

inta,b; printf("Pleaseinputaandb:"); scanf("%2d,%2d",&a,&b); printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}Pleaseinputaandb:a=12,b=5,a+b=1712,5a↙例遇非法輸入字符#include<stdio.h>main(){

inta,b; printf("Pleaseinputaandb:"); scanf("%2d%*2d%2d",&a,&b); printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}Pleaseinputaandb:a=12,b=5,a+b=1712345a↙例遇寬度和非法輸入字符#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}問題1:當(dāng)要求程序輸出結(jié)果為a=12,b=34時,用戶應(yīng)該如何輸入數(shù)據(jù)?

1234↙輸入數(shù)據(jù)的格式控制遇空格#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}問題2:當(dāng)限定用戶輸入數(shù)據(jù)以逗號為分隔符,即輸入數(shù)據(jù)格式為:12,34↙時,應(yīng)修改程序中的哪條語句?怎樣修改?

scanf("%d,%d",&a,&b);

輸入數(shù)據(jù)的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}問題3:語句scanf("%d%d",&a,&b);修改為scanf("a=%d,b=%d",&a,&b);時,用戶應(yīng)該如何輸入數(shù)據(jù)?a=12,b=34↙輸入數(shù)據(jù)的格式控制scanf("a=%d,b=%d",&a,&b);#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}

問題4:限定用戶輸入數(shù)據(jù)為以下格式為

1234↙

同時要求程序輸出結(jié)果為a=12,b=34scanf("%2d%2d",&a,&b);輸入數(shù)據(jù)的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}

問題5:限定用戶輸入數(shù)據(jù)為以下格式為12↙34↙

同時要求程序輸出結(jié)果為a="12",b="34"scanf("%d%d",&a,&b);printf("a=\"%d\",b=\"%d\"\n",a,b);輸入數(shù)據(jù)的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}問題6:設(shè)計程序使得用戶可以用任意字符(回車、空格、制表符、逗號、其它)作為分隔符進(jìn)行數(shù)據(jù)的輸入scanf("%d%*c%d",&a,&b);

輸入數(shù)據(jù)的格式控制說明:用“%c”格式符時,空格和轉(zhuǎn)義字符作為有效字符輸入Problem:輸入函數(shù)留下的“垃圾”例intx;charch;scanf("%d",&x);ch=getchar();printf("x=%d,ch=%d\n",x,ch);執(zhí)行:123輸出:x=123,ch=10例intx;charch;scanf("%d",&x);scanf("%c",&ch);printf("x=%d,ch=%d\n",x,ch);執(zhí)行:123輸出:x=123,ch=10解決方法:(1)用getchar()清除(2)用格式串中空格或“%*c”或%1s來“吃掉”例intx;charch;scanf("%d",&x);scanf("%c",&ch);或scanf("%*c%c",&ch);或scanf("%1s",&ch);

#include<stdio.h>main(){

intdata1,data2,sum;

charop;

printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2第1次測試12+3↙123129=3141C格式符存在的問題及其解決#include<stdio.h>main(){

intdata1,data2,sum;

charop;

printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2

第2次測試123↙123=15C格式符存在的問題及其解決#include<stdio.h>main(){

intdata1,data2,sum;

charop;

printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2

第3次測試12+3↙12+3=15C格式符存在的問題及其解決2007年4月份(選擇題)

(16)設(shè)變量均已正確定義,若要通過scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);語句為變量a1和a2賦數(shù)值10和20,為變量c1和c2賦字符X和Y。以下所示的輸入形式中正確的是(注:□代表空格字符)()

A)10□X□20□Y〈回車〉

B)10□X20□Y〈回車〉

C)10□X〈回車〉D)10X〈回車〉20□Y〈回車〉20Y〈回車〉答案:D2006年4月(選擇題)(29)有以下程序#include<stdio.h>main(){charc1,c2,c3,c4,c5,c6;scanf(“%c%c%c%c”,&c1,&c2,&c3,&c4);c5=getchar();

c6=getchar();putchar(c1);putchar(c2);printf("%c%c\n",c5,c6);}

程序運行后,若從鍵盤輸入(從第1列開始)123<回車>45678<回車>則輸出結(jié)果是(

A)1267B)1256C)1278D)1245

答案:D指針類型格式:scanf(“格式控制串”,地址表)地址表:變量的地址,常用取地址運算符或指針。指針是一種數(shù)據(jù)類型,被稱為指針類型。它與加“&”的變量意義相同,即表示地址。

新知識點地址和指針的概念1.內(nèi)存地址──內(nèi)存中存儲單元的編號2.變量地址──系統(tǒng)分配給變量的內(nèi)存單元的起始地址(1)計算機(jī)硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元(每個存儲單元容量為1字節(jié))。為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個唯一的地址。(2)在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。

注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。C編譯程序編譯到該變量定義語句時,將變量nNum1登錄到“符號表”中。符號表的關(guān)鍵屬性有兩個:一是“標(biāo)識符名(id)”

,二是該標(biāo)識符在內(nèi)存空間中的“地址(addr)”

。為描述方便,假設(shè)系統(tǒng)分配給變量nNum1的4字節(jié)存儲單元為0012FF7C,0012FF7D,0012FF7E和0012FF7F,則起始地址0012FF7C就是變量nNum1在內(nèi)存中的地址。scanf("%d",&nNum1);3.變量值的存取──通過變量在內(nèi)存中的地址進(jìn)行(1)直接訪問──直接利用變量的地址進(jìn)行存取地址和指針的概念scanf("%d",&nNum1);的執(zhí)行過程是這樣的:用變量名nNum1作為索引值,檢索符號表,找到變量nNum1的起始地址0012FF7C;然后將鍵盤輸入的值(假設(shè)為3)送到0012FF7C起始點四個字節(jié)的內(nèi)存單元中。

(2)間接訪問──通過另一變量訪問該變量的值

C語言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來存放其它變量的地址。

例如,假設(shè)定義了這樣一個指針變量pNum1,可通過賦值語句“pNum1=&nNum1;”讓pNum1指向nNum1的首地址。此時,指針變量pNum1的值就是變量nNum1在內(nèi)存中的起始地址0012FF7C。pNum1的定義形式為:3.變量值的存取──通過變量在內(nèi)存中的地址進(jìn)行地址和指針的概念int*pNum1;指針變量定義的一般形式:變量類型*變量名;指針變量賦值的一般形式:指針變量名=&普通變量名;printf(“%d”,*pNum1);printf(“%d”,nNum1);*和&的含義在定義變量時,*的作用是指示此變量為指針類型。在做雙目運算符(有兩個操作數(shù))時,&是按位邏輯與。在使用時,*為取值符號,&為取址符號。如,inta=1,b=2,*p1,*p2;p1=&a;p2=&b;

是正確的?!?”和“*”的優(yōu)先級別相同,按自右而左的方向結(jié)合。如,inta=1,b=2,*p1,*p2;

p1=&a;p2=&b;p2=&*p1;/*相當(dāng)于p2=p1或p2=&a*/

2006年4月(選擇題)(24)若有說明語句:double*p,a;則能通過scanf語句正確給輸入項讀入數(shù)據(jù)的程序段是A)*p=&a;

scanf(“%1f”,p);B)*p=&a;

scanf(“%f”,p);C)p=&a;

scanf(“%1f”,*p);D)p=&a;

scanf("%1f",p);

答案:D2007年9月(選擇題)答案:C2.2if-else判定性結(jié)構(gòu)If判斷結(jié)構(gòu)if(表達(dá)式)

語句塊1;else

語句塊2;例2-3輸入兩個實數(shù),請用if-else語句結(jié)構(gòu)輸出其中的大數(shù)。

例2-3輸入兩個實數(shù),請用if-else語句結(jié)構(gòu)輸出其中的大數(shù)。

#include<stdio.h>#include<stdlib.h>voidmain(void){

double

dNum1,dNum2;/*定義兩個雙精度浮點型變量,用于存放兩個操作數(shù)*//*定義兩個雙精度浮點型指針,用于指向存放浮點數(shù)的內(nèi)存單元*/

double*pNum1,*pNum2;

pNum1=&dNum1;/*用&將fNum1地址取出來賦給指針變量pNum1*/

pNum2=&dNum2;/*用&將fNum2地址取出來賦給指針變量pNum2*/

printf("\ninputtwonumbers:");

scanf("%lf%lf",pNum1,pNum2);/*輸入兩個操作數(shù)以指針?biāo)赶虻牡刂?/

printf("acceptedtwonumbers:dNum1=%lf;dNum2=%lf",*pNum1,*pNum2);

if(dNum1>dNum2)/*將兩個操作數(shù)比較大小,輸出大數(shù)*/

printf("\nMax=%5.2lf\n",dNum1);

else

printf("\nMax=%5.2lf\n",dNum2);}2.2if-else判定性結(jié)構(gòu)If判斷結(jié)構(gòu)if(表達(dá)式1)語句塊1;elseif(表達(dá)式2)語句塊2;elseif(表達(dá)式3)語句塊3;······elseif(表達(dá)式n)語句塊n;else語句塊n+1;······例2-4輸入學(xué)生考試分?jǐn)?shù),按A、B、C、D、E給出成績的等級。90分以上(包括90分)為A等,60分以下(不包括60分)為E等,中間每10分為一個等級,畫出流程圖。

例2-4輸入學(xué)生考試分?jǐn)?shù),按A、B、C、D、E給出成績的等級。90分以上(包括90分)為A等,60分以下(不包括60分)為E等,中間每10分為一個等級,畫出流程圖。

#include<stdio.h>#include<stdlib.h>void

main(void){

char

cLevel=0x20;

float

fScore;

printf("請輸入成績:");

scanf("%f",&fScore); /*輸入考試分?jǐn)?shù)*/

if(fScore>100.0||fScore<0.0) {

printf("\n輸入成績錯誤!");

return; }elseif(fScore>89.99) /*分?jǐn)?shù)fScore>=90*/

cLevel='A';

elseif(fScore>79.99) /*分?jǐn)?shù)90>fScore>=80*/

cLevel='B';

elseif(fScore>69.99) /*分?jǐn)?shù)80>fScore>=70*/

cLevel='C';

elseif(fScore>59.99) /*分?jǐn)?shù)70>fScore>=60*/

cLevel='D';

else

/*分?jǐn)?shù)fScore<60*/

cLevel='E';

printf("該成績的等級為:%c\n",cLevel);}找別扭inta=1;

if(a==0)

printf("OK");inta=0;

if(a==0)

printf("OK");inta=1;

if(a=0)

printf("OK");inta=0;

if(a=0)

printf("OK");一定要分清==和=,下面用法能起點小作用inta=0;

if(0==a)

printf("OK");inta=0;

if(0=a)

printf("OK");編譯出錯2.2if-else判定性結(jié)構(gòu)If語句的嵌套if(表達(dá)式)if(表達(dá)式)語句;if(表達(dá)式)if(表達(dá)式)語句;elseif(表達(dá)式)語句;

if(……)if(……)if(……)else…...else…...else…...C語言規(guī)定,else總是與它前面最近的if配對

例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b)

{if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);實現(xiàn)if~else正確配對方法:加{}實現(xiàn)if~else正確配對方法2005年4月(填空題)(8)以下程序運行后的輸出結(jié)果是【8】。main(){inta=3,b=4,c=5,t=99;if(b<a&&a<c)t=a;a=c;c=t;if(a<c&&b<c)t=b,b=a,a=t;printf("%d%d%d\n",a,b,c);}2.2if-else判定性結(jié)構(gòu)條件運算符

條件表達(dá)式把a(bǔ)和b中的最大值放入z中if(a>b)

z=a;else

z=b;

z=(a>b)?a:b;

此種表達(dá)式切忌用得過于繁雜2.3switch判定性結(jié)構(gòu)switch(表達(dá)式){case常量表達(dá)式1:語句塊1;[break;]

case常量表達(dá)式2:語句塊2;[break;]

case常量表達(dá)式n:語句塊n;[break;]

[default:語句塊n+1;]}2.3switch判定性結(jié)構(gòu)

/*purpose:輸入一個整數(shù),轉(zhuǎn)換成星期輸出*/#include<stdio.h>#include<stdlib.h>voidmain(void){

inta;

printf("inputintegernumber:");

scanf("%d",&a);

switch(a)/*判定表達(dá)式*/{

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");}}?default可以沒有不要忘記breakswitch和else-if的比較

1else-if比switch的條件控制更強(qiáng)大一些else-if可以依照各種邏輯運算的結(jié)果進(jìn)行流程控制switch只能進(jìn)行==判斷,并且只能是整數(shù)判斷2switch比else-if更清晰

兩者都要盡量避免用得過多、過長,尤其不要嵌套得太多,它們大大增加程序的分支,使邏輯關(guān)系顯得混亂,不易維護(hù),易出錯兩個同種數(shù)據(jù)類型的運算結(jié)果,還是該類型兩個不同種數(shù)據(jù)類型的運算結(jié)果,是兩種類型中取值范圍更大的那種long

double>double>float>long>int>short>char只要兩者中有一個是unsigned,就都轉(zhuǎn)為unsigned再計算把數(shù)據(jù)賦值給另外一種類型變量也會發(fā)生自動類型轉(zhuǎn)換從小到大,順利轉(zhuǎn)換從大到小,發(fā)出警告(好的編譯器會給出)注意:新知識點2.4應(yīng)用實例例2-5計算器程序。問題描述:任意輸入兩個數(shù),根據(jù)用戶選擇的功能菜單,求出它們的和、差、積、除的結(jié)果。

假nFun=2加法運算真設(shè)定變量開始結(jié)束nFun=3減法運算真nFun=4乘法運算真除法運算輸出結(jié)果輸入功能選項nFun<1或>4輸入錯誤操作數(shù)2=0輸入錯誤真打印功能菜單輸入兩操作數(shù)假假假假假#include<stdio.h>#include<stdlib.h>voidmain(void){

double

dLOper,dROper,dResult; /*定義兩個double變量,用于存放左右操作數(shù)*/

int

nFun; /*定義一個字符變量,用于存放運算符*/

printf("--------------------------\n"); /*構(gòu)造功能菜單*/

printf("加法運算--------1\n");

printf("減法運算--------2\n");

printf("除法運算--------3\n");

printf("乘法運算--------4\n");

printf("--------------------------\n");

printf("請輸入功能選擇:"); /*

溫馨提示

  • 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

提交評論