




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程式設計
第1章C語言概述
C語言出現的歷史背景通用的程式設計語言可開發系統軟體和應用軟體既具有高級語言的功能,又具有低級語言的許多功能什麼是C語言?組合語言的速記形式低級語言的高級形式高級語言的低級形式C語言的發展ALGOL60(1960)國際委員會精緻遠離硬體CPL複合程式(1963)英國劍橋大學規模較大,難以實現
BCPL(1967)英國劍橋大學濃縮CPLB(1970)美國貝爾實驗室太簡單,接近硬體C(1972~1973)美國貝爾實驗室最初為UNIX隨著UNIX的日益廣泛使用,C語言也迅速得到了發展。C標準標準C
1978年發表ANSIC
1983年發表87ANSIC
1987年發表C語言的特點語言簡潔、緊湊,使用方便、靈活運算符豐富數據結構豐富具有結構化的控制語句語法限制不太嚴格可直接訪問物理地址生成目標代碼品質高可移植性好簡單的程式介紹例1.1#include"stdio.h"main(){printf("Thisisacprogram.\n");}運行結果:Thisisacprogram.例1.2#include"stdio.h"main()/*求兩數之和*/{inta,b,sum;/*定義變數*/a=123,b=456;sum=a+b;printf("\nsumis%d\n",sum);}運行結果:sumis579例1.3main(
)/*主函數*/{inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("\nmax=%d\n",c);}intmax(intx,inty)/*定義max函數*/{intz;if(x>y)z=x;運行結果:
elsez=y;入:8,5
returnz;出:max=8}一個程式包含兩方面的內容1.對數據的描述類型、數據的組織形式
數據結構2.對操作的描述操作步驟
演算法認真考慮和設計:數據結構和演算法什麼是程式?沃思公式:數據結構+演算法=程式具體化:程式=演算法+數據結構+程式設計方法+語言工具和環境演算法解決的問題是
做什麼和怎麼做(電腦)演算法的概念做任何事都有一定的次序和步驟如:召開會議,報考大學,購物等為解決一個問題而採取的方法和步驟就稱為“演算法”解決同一個問題可以有不同的方法和步驟,方法有有劣之分採用簡單的和運算步驟少的方法為優電腦演算法分兩大類別數值運算演算法目的是求數值解,演算法成熟非數值運算演算法種類繁多,要求各異,難以規範
簡單演算法舉例例2.1求1×2×3×4×5原始方法:1×2,2×3,6×4,24×5通用的方法:設兩個變數(被乘數p,乘數i)S1:1=>pS2:2=>iS3:p×i=>pS4:i+1=>iS5:若i≤5,返回s3;否則結束如果題目該為求1×3×5×7×9×11?S1:1=>pS2:3=>iS3:p×i=>pS4:i+2=>iS5:若i≤11,返回s3;否則結束用這種方法表示的演算法具有通用性、靈活性例2.2有50個學生,要求將他們之中成績在80分以上者列印出來.用n表示學生學號,n1代表第一個學生學號,ni代表第i個學生的學號,g代表學生成績
gi代表第i個學生成績.演算法如下:S1:1=>iS2:若gi≥80則列印ni和gi,否則不列印S3:i+1=>iS4:若i≤50返回s2,否則演算法結束例2.3判斷2000-2500年中的每一年是否閏年,將結果輸出閏年的條件:①能被4整除,但不能被100整除的年份都是閏年,如1996,2004年是閏年;②能被100整除,又能被400整除的年份是閏年,如1600,2000年是閏年。不符合這兩個條件的年份不是閏年。演算法如下:設y為被測的年份y不能被4整除①y能被4整除但不能被100整除②閏年非閏年③y能被100整除又能被400整除閏年④其他非閏年
S1:2000=>yS2:若y不能被4整除則轉到S5S3:若y能被4整除,不能被100整除,則輸 出y“是閏年”,轉S6S4:若y能被100整除,又能被400整除,則輸出y“是閏年”,轉S6,(否則順序執行)S5:輸出y“不是閏年”S6:y+1=>yS7:當y≤2500時轉S2,否則演算法結束例2.4求1-1/2+1/3-1/4+…+1/99-1/100演算法:S1:sign=1S2:sum=1S3:deno=2S4:sign=-signS5:term=sign×(1/deno)S6:sum=sum+termS7:deno=deno+1S8:若deno≤100返回S4,否則演算法結束例2.5對一個大於等於3的正整數,判斷它是否為素數.素數:除了1和該數本身之外,不能被其他任何整數整除的數.如:13判斷素數的方法:將一個大於等於3的正整數n作為被除數,將2到n-1各個數輪流作為除數,如果都不能被整除,則n為素數.S1:輸入n的值S2:2=>i
S3:n被i整除,得餘數rS4:若r=0,表示n能被i整除,則n不是素數,否則順序執行到S5S5:i+1=>iS6:若i≤n-1,返回S3;否則n是素數,演算法結束或S6:若i≤n/2或若i≤2.3演算法的特性一個演算法應具有以下特點:有窮性確定性有零個或多個輸入有一個或多個輸出有效性程式設計人員設計演算法,並根據演算法編寫程式怎樣表示一個演算法用自然語言表示演算法用流程圖表示演算法用N-S流程圖表示演算法用三種基本結構(順序,選擇,迴圈)起止輸入/出判斷處理流程線連接點Begin2=>iInputnRemainderofn/i=>rr=0?i+1=>ii>n1/2?Printn“isprime”EndPrintn“isnotprime”NYNY1=>iprintni,gigi>=80YNi+1=>iUntilI>50用偽代碼表示演算法偽代碼是用介於自然語言和電腦語言之的文字和符號來描述演算法例如,“列印x的絕對值”.IFxispositiveTHENprintxELSE print-x也可以用漢字偽代碼:若x為正列印x否則列印-x還可以中英文混用IFx為正
printxELSEprint-x例2.16求5!開始置t的初值為1置i的初值為2
當i≤5,執行下麵操作使t=t×i使i=i+1(迴圈到此結束)
列印t的值結束也可以寫成以下形式:
BEGIN (演算法開始)1=>t2=>iwhilei<=5{t×i=>ti+1=>i}printtEND(演算法結束)
用電腦語言表示演算法設計演算法和實現演算法例2.20求5!用c語言表示.main(
){inti,t;t=1;i=2;while(i<=5){t=t*i;
/*120*/i=i+1;}printf("%d",t);}例2.21求級數1-1/2+1/3-1/4+…+1/99-1/100main(){intsign=1;floatdeno=2.0,sum=1.0,term;while(deno<=100){sign=-sign;term=sign/deno;sum=sum+term;
/*0.688172*/deno=deno+1;}printf("%f",sum);}結構化程式設計方法一個結構化程式就是用高級語言表示的結構化演算法用三種基本結構組成的程式必然是結構化程式結構化程式的特點:(1)自頂向下(2)逐步細化(3)模組化設計(4)結構化編碼課堂練習用傳統流程圖或N-S圖表示求解問題的演算法有兩個瓶子A和B,分別盛放醋和醬油,要求將它們互換有3個數,找出其中最大的一個.判斷一個數n能否同時被3和5整除1.設:0代表醋,1代表醬油,T為空瓶開始0=>AT=>B1=>BA=>TB=>A列印A,B結束2.max=Amax=bTmax>CFmax=C輸出max的值輸入三個整數A,B,CTA<BFTB<CFTA<CF輸出輸出輸出輸出最大最大最大最大值C值B值C值A輸入三個數A,B,CTA>BFC的數據類型C語言中的數據分常量和變數程式中用到的數據都必須指定其類型C語言中的數據結構是以數據類型形式出現C的數據類型如下
整型字元型基本類型單精確度型實型(浮點型)
雙精度型枚舉類型
數據類型數組類型構造類型結構體類型共用體類型
指針類型空類型常量與變數常量與符號常量在程式運行過程中,其值不能改變的量稱為常量±123±0123±0x123±123L±0123L±0x123L0(整型常量)±1.23±1.05E±10(實型常量)‘x’‘1’(字元型常量)“abc”“1”(字串常量)符號常量符號常量是給常量命名,用名稱代表常量例3.1符號常量的使用。#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}運行結果:total=300注:符號常量不同於變數,不能賦值
PRICE=40; 錯!優點:含義清楚,見名知意。規範的程式中不提倡使用很多的常量,如:sum=15*30*43*0.15
常量究竟代表什麼?sum=price*weight*distance*discountzongjia=danjia*zhongliang*juli*zhekou
2.方便改動如:#definePRICE44變數程式運行中其值可以改變的量為變數3變數值存儲單元a變數名名字:字母、數字和下劃線三種字元組成,且第一個字元必須是字母或下劃線。合法變數名:sum,average,_total,class,day,month,student_name,tan,lotus_1_2_3,li_ming不合法的識別字:1_2_3,M.DJohn,$23,3D64,a>b識別字變數先定義後使用優點正確性按類型分配存儲單元檢查變數的運算合法性如:a%b*****整型常量的表示方法十進位整數:±123,0,987(0~9)八進制整數:±0123(0~7)十六進制整數:±0x12ef(0~f)將十六進制數轉換為十進位數:
1*163+2*162+14*161+15*160=>4847*****整型變數整型數據在內存中的存放形式inti;/*定義i為整型變數*/i=10;/*給i賦以整數10*/i:i:數值-10的補數表示:10的原碼:
取反:
加1得-10的補數:
100000000000001010000000000000101011111111111101011111111111110110表示為二進位數整型變數的分類基本整型int短整型short或shortint長整型long或longint無符號型unsigned前三種都可以加修飾符unsigned例:inta;unsignedintb;整型數範圍:-32768~+32767無符號整型數範圍:0~65535a:b:整型變數的定義強制類型定義位置,在函數的開頭部分,也可以在函數中的某個分程式內的開頭部分,還可以在函數外11111111111111110111111111111111main(){inta,b,c,d;unsignedu;a=12;b=-24;u=10;c=a+u;d=b+u;printf("a+u=%d,b+u=%d\n",c,d);}
運行結果:a+u=22,b+u=-14整型數據的溢出32767+1=?迴圈記數例3.3main(){inta,b;a=32767;b=a+1;printf("%d,%d",a,b);}運行結果:32767,-32768*****變數a,b在內存中的形式:a:
215-1
b:-215整型常量的類型int/short:-32768~32767longint:-2147483648~2147483647
也可以:123L,0L3.unsignedint:0~6553501111111111111111000000000000000實型數據實型常量的表示方法實數又稱浮點數有兩種表示形式十進位小數形式指數形式如:123e3或1.23E5->123×103注:e之前必須有數字,且e後的指數必須為整數例:123.456可以表示為:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e5
規範化的指數形式
1.23456e002實型變數實型變數在內存中的存放形式*****一個實型數據一般在內存中占4個位元組實型變數的分類+.314159+1數符小數部分指數符指數實數:3.14159名稱類型比特數有效位數值範圍單精確度float326~710-37~1038雙精度double6415~1610-307~10308長雙精度longdouble
12818~1910-4931~104932
實型變數的定義floatx,y;doublez;longdoubletemp;實型數據的舍入誤差有效位以外的數字將被舍去例3.4實型數據的舍入誤差main(){floata,b;a=123456.789e5;b=a+20;printf("\na=%f\nb=%f\n",a,b);}運行結果:a=12345678848.000000b=12345678848.000000結論:應當避免一個很大的數和一個很小的數直接相加或相減*****實型常量的類型如:1.65f,654.87F,1234.56789實型常量的運算一個實型常量可以賦給一個float型、double型或longdouble型變數實型常量首先按雙精度常量處理然後截取七位賦給float型變數,截取16位賦給double型變數…例:floata;doubleb;a=123456.789;最後兩位小數不精確!
b=123456.789;精確接收字元型數據字元常量‘A’,‘a’,‘1’,‘$’,’\n’C還允許用一種特殊形式的字元常量,以\開頭的字元或一個八進制、十六進制的數表示如:\101,\x41都是65,也就是A1x82+1x80=65,4X161+1x160=65
轉義字元及含義
字元形式含義ASCII代碼\n回車換行10\t跳9位9\b退格8\r回車13\f換頁12\\反斜杠字元“\”92\’單引號字元39\”雙引號字元34\ddd8進制數ASCII碼\xhh16進制數ASCII碼*****例3.5轉義字元的使用main(){printf(“abc\tde\rf\tg\n");printf("h\ti\b\bjk");}列印結果:123456789012
fabcgdehjik螢幕顯示:fgdehjk字元變數字元型變數可以存放一個字元一個字元存放在一個位元組中(0~255)字元變數的定義形式charc1,c2;intc3,c4;字元變數的賦值c1=‘a’;c2=‘1’;c3=‘b’;c4=‘2’;字元數據在內存中的存儲形式及使用方法字元常量放到字元變數中是將該字元的相應ASCII代碼放到存貯單元中
c1c2c3c4
9749985001100001001100010110001000110010
以二進位形式存放ASCII
AmericanNationalStandardCodeforinformationInterchange字元數據以ASCII碼存貯就與整數存貯形式類似C語言使字元型數據和整型數據之間可以通用例3.6向字元變數賦以整數main()97:{charc1,c2;c1=97,c2=98;printf("%c,,%c\n",c1,c2);printf("%d,,%d\n",c1,c2);}運行結果:a,,b97,,9801100001%c%da97輸出格式顯示例3.7大小寫字母的轉換main(){charc1,c2;c1='a';c2='b';c1=c1-32;c2=c2-32;printf("%c%c",c1,c2);}運行結果:AB*****說明:
將字元處理成帶符號的整數(取值範圍為-128~127其中0~127,%d為正。28-1)如果使用ASCII碼在128~255之間的字元%d輸出時為負值,最高位為1例:charc=130;----->10000010=128+2printf(“%d”,c);*****有符號處理:將10000010減1變反01111110得-126無符號處理:unsignedcharc=130;printf(“%d”,c);結果為:130字串常量字串常量是一對雙引號括起來的字元序列‘a’與“a”的區別:printf(“Howdoyoudo.”);“CHINA”6個字元易錯情況:c=“a”;aa\0各類數值型數據間的混合運算整型、實型、字元型、邏輯型數據間可以混合運算如:(a>b)+10+’1’-1.5*’b’不同類型間的轉換規則:高doublefloat
longunsigned低intcharshort*****常用類型從左到右數據長度增加char<int<unsignedint<long<float<double例:設i為整型,f為單精確度型,d為雙精度型,e為長整型
10+’a’+i*f-d/e整1雙2雙4雙3雙5算術運算符和算術運算式C運算符簡介C運算符有以下幾類:算術運算符+,-,*,/,%關係運算符>,<,==,>=,<=,!=邏輯運算符!,&&,||位運算符<<,>>,~,|,^,&賦值運算符=及擴展賦值運算符條件運算符?:7.逗號運算符,8.指針運算符*,&求位元組數運算符sizeof
強制類型轉換運算符(類型)分量運算符.->下標運算符[]其他函數調用運算符()算術運算符和算術運算式例:1/2.=0.51/2=0向零取整:-5/3=-1規定%兩側均為整數%的應用:5%3=26%3=016%3=1問:1%2=?算術運算式和運算符的優先順序與結合性算術運算式:用算術運算符和括弧將運算對象連接起來的、符合C語法規則的式子一個運算對象兩側的運算符的優先順序相同,則按規定的結合方向處理強制類型轉換運算符一般形式:(類型名)(運算式)例:(double)a錯:double(a)(int)(x+y)(int)x+y(float)(5%3)(float)5%3例3.8強制類型轉換main(
){floatx;inti;x=3.6;i=(int)x;
/*有同樣效果:i=x;賦值轉換*/printf("x=%f,i=%d",x,i);}運行結果:x=3.600000,i=3問:x變數的類型?課堂練習寫出程式運行結果:main(){intx,y;doublea;floatb;a=6.34;b=2.1;a=a+b;y=a-b;x=(int)(a)%(int)(b);printf(“x=%d,y=%d”,x,y);}運行結果:x=0,y=6C具有兩種類型轉換:系統自動進行類型轉換強制類型轉換自增自減運算(右結合)作用:使變數的值增1或減1首碼:++i,--i尾碼:i++,i--++i或i++可以解釋為:i=i+1首碼運算符與尾碼運算符的差別例:設i為3觀察j與i的值j=++i;等效:i=i+1;j=i;結果:j為4,i為42.j=i++;等效:j=i;i=i+1;結果:j為3,i為4問:printf(“%d”,++i);輸出?注:1.自增自減運算符只能用於變數;
2.結合方向是至右向左3.-i++相當於-(i++)4.a+++b解釋為(a++)+b5.a---b解釋為(a--)-b6.i=3,(i++)+(i++)+(i++)=?12/9?討論7.printf(“%d,%d”,i,i++)從左3,3從右4,3討論最好寫成:j=i++此後j為3,i為4printf(“%d,%d”,j,j)3,3printf(“%d,%d”,i,j)4,3課堂練習讀程式寫出運行結果main(){intx,y,z;x=1;y=2;z=3;z=++x%y;printf("\n%3d%3d%3d\n",x,y,z);x=x+(z+++++y);printf("%3d%3d%3d\n",x,y,z);y=++x+z;printf("%3d%3d%3d\n",x,y,z);}答案220531671*****賦值運算符和賦值運算式格式:<變數>=運算式;類型轉換實型賦給整型截取整型賦個實型擴展當數值範圍超出時會出現失真例3.9main(){unsigneda;intb=-1;a=b;printf(“%u”,a);}運行結果:65535複合的賦值運算符使程式簡化,提高編譯效率共有10個複合的賦值運算符:+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=使用:a+=3等價於a=a+3x*=y+8等價於x=x*(y+8)例:設a為6a+=a-=a*a等價於a=a+(a=a-(a*a))結果:a=-60設m1=m2=m3=m4=10討論運算後m1,m2,m3,m4的值?m1+=m2-=m3*=m4/=2m1=m1+(m2=m2-(m3=m3*(m4=m4/2)))-30-40505逗號運算符和逗號運算式逗號運算符又稱順序求值運算符其形式為:運算式1,運算式2,運算式3……運算式n3.它的值為運算式n的值4.逗號優先順序最低例:設a為3a=3*5,a*4結果:a=15運算式值為60a=(3*5,a*4)結果:a=12C語言中逗號有兩種用途分隔符號順序求值運算符如:printf(“%d%d”,(a,b,c),e);C語言40C語言概述C語言的語句用來向電腦系統發出操作指令一個C語句經編譯後產生若干條機器指令一個實際的程式應當包含若干語句函數是具有執行特定功能的副程式C程式結構如圖:C語言40C程式根源程式檔2預處理命令全局變數聲明函數1函數n函數首部函數體執行語句局部變數聲明根源程式檔1根源程式檔n…………C語言40C語句可以分為5類:控制語句,有9種if()~else~條件語句for()~迴圈語句while()~迴圈語句do~while()迴圈語句continue結束本次迴圈語句break終止執行switch或迴圈語句switch多分支選擇語句goto轉向語句return從函數返回語句C語言40函數調用語句max(a,b);運算式語句x>y;a=x+y;空語句;複合語句又稱分程式{}例:main(){inta,b,c;…{z=x+y;t=z/100;printf(“%f”,t);}…}C語言40數據輸入輸出的概念及在C語言中的實現輸入輸出是以電腦主機為主體C語言不提供輸入輸出語句3.在使用C語言庫函數時,要用預編譯命令“#include”將有關的“頭檔”包含到用戶根源程式檔中C語言40在調用標準輸入輸出庫函數時,檔開頭應有以下預編譯命令:#include<stdio.h>或#include“stdio.h”printf,scanf除外C語言40字元數據的輸入輸出putchar函數字元輸出函數格式:putchar(c);作用:向終端輸出一個字元其中:c是字元變數、字元常量或整型變數C語言40例4.1輸出單個字元#include<stdio.h>main(
){chara,b,c;a='B';b='O';c='Y';putchar(a);putchar(b);putchar(c);}運行結果:BOY問:如何將輸出BOY該為輸出BOYC語言40#include<stdio.h>main(
){chara,b,c;a='B';b='O';c='Y';putchar(a);putchar(‘\n’);putchar(b);putchar(‘\n’);putchar(c);putchar(‘\n’);}運行結果:BOYC語言40getchar函數字元輸入函數格式:getchar();作用:從鍵盤輸入一個字元(只接收一個字元)例4.2輸入單個字元#include“stdio.h”main(
){charc;c=getchar();
putchar(getchar());putchar(c);}運行時輸入:a輸出變數c的值為:aC語言40格式輸入與輸出printf函數格式輸出函數格式:printf(格式控制,輸出表列)作用:輸出任何類型的多個數據括弧內包括兩部分:C語言401.格式控制①格式說明符,由%和格式字元組成如:%6.2f,%4d②普通字元,即需要原樣輸出的如:printf(“a=%4d,
b=%6.2f\n”,a,b);注:%x.yf
x代表數的占位寬度,y代表小數位數C語言402.輸出表列需要輸出的一些數據,可以是運算式如:printf(“%f,%d,%s\n”,a+b,c,“hello”);格式字元嚴格按照不同類型的數據用不同的格式字元程式中常用的輸出格式如下:①帶符號整型%d②不帶符號整型%u③帶符號長整型%ld④不帶符號長整型%lu⑤實型%m.nf⑥字元型%c⑦字串%s⑧八進制整數%o⑨十六進制整數%x(⑧⑨輸出的數據不帶符號)C語言40*****舉例:位數大於m,按實際位數輸出inta=123,b=12345;printf(“%4d,%4d”,a,b);結果:123,12345舉例:類型須一致longa=123456;printf(“%ld”,a);結果:123456C語言40*****舉例:八進制、十六進制數輸出不帶符號inta=-1;printf(“%d,%o,%x”,a,a,a);結果:-1,177777,ffff例4.3無符號數據的輸出main(
){unsignedinta=65535;intb=-2;printf("a=%d,%o,%x,%u\n",a,a,a,a);printf("b=%d,%o,%x,%u\n",b,b,b,b);}運行結果:a=-1,177777,ffff,65535
b=-2,177776,fffe,65534
C語言40例4.4字元數據的輸出main(){charc='a';inti=97;printf("%c,%d\n",c,c);printf("%c,%d\n",i,i);}運行結果:a,97a,97C語言40例4.5字串的輸出main(
){printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA",
"CHINA","CHINA","CHINA");}運行結果:CHINA,-----CH,CHIN,CHI--
超m=n-左例4.6輸出實數時的有效位數main(
){floatx,y;x=111111.111;y=222222.222;printf("%f",x+y);}運行結果:333333.328125
(7位精確)C語言40例4.7輸出雙精度數時的有效位main(){doublex,y;x=1111111111111.111111111;y=2222222222222.222222222;printf("%f",x+y);}運行結果:3333333333333.333010超過16位無意義,單精確度與雙精度都用%fC語言40例4.8輸出實數時指定小數位main(
){floatf=123.456;printf("%f%10f%10.2f%.2f%-10.2f\n",f,f,f,f,f);}運行結果:123.456001--123.456001------123.46--123.46--123.46----C語言40在用printf函數輸出時注意:類型匹配可包含轉義字元分清格式符與普通字元用兩個%號printf(“%f%%”,1.)輸出一個%輸出1.000000%scanf函數(格式輸入函數)一般格式:scanf(格式控制,地址表列)作用:輸入任何類型的多個數據格式控制同printf函數基本相同地址表列C語言40包括:變數的地址、指針變數、數組名、字串的首址(&變數名)例4.9用scanf函數輸入數據main(
){inta,b,c;scanf("%d%d%d",&a,&b,&c);printf("%d,%d,%d\n",a,b,c);}運行時輸入:345運行時輸出:3,4,5C語言40在用scanf函數輸出時注意:“&”是地址運算符“%d%d%f”格式符間無分隔符號輸入數據時,在兩數之間以一個或多個空格分隔數據,也可以用回車鍵、跳格鍵tab。雙精度型數據用%lf說明(不能用%f)%e、%g、%f作用相同C語言40說明:不用轉義字元格式符中的普通字元,應照原樣輸入如:scanf(“a=%d,b=%f”,a,b);輸入時鍵入:a=5,b=3.3若語句改變:scanf(“a:%d;b:%f”,a,b);則輸入時鍵入:a:5;b:3.3C語言40順序結構程式舉例例4.10輸入三角形的三個邊長,求三角形面積公式:area=s(s-a)(s-b)(s-c)其中:s=(a+b+c)/2#include<math.h>main(){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);}C語言40運行時輸入:3,4,6結果:a=---3.00,--b=---4.00,--c=---6.00,--s=---6.50area=---5.33例4.11從鍵盤輸入一個大寫字母,要求用小寫字母輸出#include<stdio.h>main(){charc1,c2;c1=getchar();printf("%c,%d\n",c1,c1);c2=c1+32;printf("%c,%d\n",c2,c2);}C語言40運行時輸入:A輸出:A,65a,97課堂練習:讀程式寫出運行結果main(){intx=-668,n1,n2,n3;charsign;sign=x>0?'+':'-';x=x>0?x:-x;n1=x/100;x-=n1*100;n2=x/10;x-=n2*10;n3=x;printf("%c%d%d%d",sign,n1,n2,n3);}選擇結構是三種基本結構之一作用是,根據所指定的條件是否滿足,決定從給定的兩組操作選擇其一實現程式分支如:if(x>0)y=1;elsey=-1;關係運算符和關係運算式關係運算符是邏輯運算中比較簡單的一種關係運算就是比較運算如:設a=5
a>3,a==2,a<1+3
真假假關係運算符及其優先次序<<=優先順序相同(高)>>===!=優先順序相同(低)優先次序:算術運算符高關係運算符賦值運算符低例:c>a+b等效於c>(a+b)a>b==c等效於(a>b)==ca==b<c等效於a==(b<c)a=b>c等效於a=(b>c)關係運算式用關係運算符將兩個運算式連接起來的式子,稱關係運算式下麵是合法的關係運算式a>b>c,a+b>b+c,(a=3)>(b=5),(a>b)>(b<c)關係運算式的值是一個邏輯值邏輯判斷的結果:以“0”代表“假”以“1”代表“真”邏輯運算符和邏輯運算式用邏輯運算符將關係運算式或邏輯量連接起來的式子就是邏輯運算式邏輯運算符及其優先次序&&邏輯與||邏輯或!邏輯非(單目)如:(a>b)&&(x>y)a+b||b-c!a<0&&b+!c例如:設a=3,b=2,c=1a>b為“真”d=a>bd的值是1a>b==c為“真”d=a>b==cd的值是1b+c<a為“假”d=b+c<ad的值是0a>b>c為“假”f=a>b>cf的值是0課堂練習設inta=2;charc=‘a’;floatf=3.0求運算式的值a+2!=c-100f/3<=a-ca<=(f<=c)(a>c)>=(f>4)!a==!f(!a&&1)!=(!c||1)(a=2)<=(f=1)(c=‘A’)!=(f=100.5)(1,2)!=(2,1)(1,2,3)==(3,3,3)答案a+2!=c-100f/3<=a-c1、0a<=(f<=c)(a>c)>=(f>4)0、1!a==!f(!a&&1)!=(!c||1)1、1(a=2)<=(f=1)(c=‘A’)!=(f=100.5)0、1(1,2)!=(2,1)(1,2,3)==(3,3,3)1、1邏輯運算規則:a&&b若a、b均為真,則a&&b為真a||b若a、b之一為真,則a||b為真!a若a為假,則!a為真請思考:a、b如何表示真、假?邏輯運算符的優先次序
!&&||
優先順序!算術運算符關係運算符
&&和||
賦值運算符例如:x=(a+b)&&(b<c)||!(d=1)
問:括弧都能去掉嗎?高低邏輯運算式邏輯運算式的值是一個邏輯量“真”或“假”C規定,邏輯運算的結果:以數值1代表“真”以數值0代表“假”邏輯運算時判斷一個量是“真”是“假”:以0代表“假”以非0代表“真”邏輯運算符兩側的運算對象可以是任何類型的數據例:設a=3,b=4,c=5求運算式的值‘c’&&’d’&&!(a=3)&&(b=4)||b-a-1a-3||b+c&&b-ca<=c||a>c機內邏輯運算執行原則a&&b&&ca||b||c討論:設a=1,b=2,c=3,d=4,m=n=1問:m=?n=?(m=a>b)&&n=c>d)邏輯運算式表達複雜條件判別是否閏年year%4==0&&year%100!=0||year%400==0if語句if語句也稱條件語句,用於實現程式分支結構,根據判斷條件是否滿足決定執行給出的兩種操作之一。if語句的三種形式if(運算式)語句例如:if(x>y)printf(“%d”,x);if(x>y&&x<10)printf(“%d”,x);if(x)printf(“%d”,x);等效於if(x!=0)~運算式語句假0真非0運算式語句1語句2假真圖a圖b2.if(運算式)語句1else語句2例如:if(x>y)printf(“%d”,x);elseprintf(“%d”,y);if(運算式1)語句1elseif(運算式2)語句2elseif(運算式3)語句3
……elseif(運算式m)語句melse語句n運算式3運算式4運算式2運算式1語句5語句4語句3語句2語句1假假假假真真真真圖c例如if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;說明運算式分號;{}例5.1輸入兩個實數,按代數值從小到大的次序輸出這兩個實數main(){floata,b,t;scanf("%f,%f",&a,&b);if(a>b){t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}運行時輸入:3.6,-3.2輸出結果:-3.20,3.60例5.2輸入3個數a,b,c,要求按由小到大順序輸出main(){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",a,b,c);}ya>bnabya>cnacyb>cnbc運行時輸入:3,7,1輸出結果:1.00,3.00,7.00if語句語句的嵌套在一個if語句中又包含一個或多個if語句稱if語句的嵌套一般形式如下:if()
if()語句1
else語句2
else
if()語句3else語句4內嵌if內嵌if注意if與else的配對關係else總是與它上面最近的沒有else的if配對if()
if()語句1
else
if()語句2
else語句3if(){if()語句1}(實現內嵌if)else內嵌if內嵌if例5.3有一函數:
-1(x<0)y=
0(x=0)1(x>0)演算法1:演算法2:輸入x輸入x若x<0y=-1若x<0y=-1
若x=0y=0否則若x>0y=1若x=0y=0輸出y若x>0y=1
輸出y判斷哪個是正確的程式一main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);}程式二main(){intx,y;scanf("%d",&x);if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;printf("x=%d,y=%d\n",x,y);}程式三main(){intx,y;scanf("%d",&x);y=-1;if(x!=0)if(x>0)y=1;elsey=0;printf("x=%d,y=%d\n",x,y);}
程式四main(){intx,y;scanf("%d",&x);y=0;if(x>=0)if(x>0)y=1;elsey=-1;printf("x=%d,y=%d\n",x,y);}條件運算符條件運算符要求3個操作對象(右結合)一般格式:運算式1?運算式2:運算式3說明:條件運算符的執行順序如:max=(a>b)?a:b運算式1取運算式2的值取運算式3的值假(0)真(非0)條件運算符的優先順序,高於賦值運算符如:max=a>b?a:b結合方向為“自右至左”如:a=1,b=2,c=3,d=4a<b?a:c>d?c:d右結合:a<b?a:(c>d?c:d)結果:1左結合:(a<b?a:c)>d?c:d結果:4不能完全取代if語句,但可靈活應用if(a>b)printf(“%d”,a);printf(“%d”,a>b?a:b)elseprintf(“%d”,b);運算式1的類型可以與運算式2
或運算式3的類型不同例5.4將大寫字母轉換成小寫字母main(){charch;scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("%c",ch);}運行結果:A
輸出結果:aswitch語句switch語句是多分支選擇語句,又稱開關語句,if語句只有兩個分支可供選擇,而實際問題中常常需要用到多分支的選擇如,成績分類、人口統計分類、工資統計分類、銀行存款分類…當然這些都可以用嵌套的if語句來處理,但分支較多可讀性下降一般形式:switch(運算式){case常量運算式1:語句1
case常量運算式2:語句2
…case常量運算式n:語句ndefault:語句n+1}例如,按照考試成績的等級列印出百分制分數段main(){chargrade;scanf(“%c”,&grade);運行時輸入:Aswitch(grade)結果:85~100{case’A’:printf(“85~100\n”);70~84case’B’:printf(“70~84\n”);60~69case’C’:printf(“60~69\n”);<60case’D’:printf(“<60\n”);errordefault:printf(“error\n”);}}break不可少main(){chargrade;scanf(“%c”,&grade);switch(grade){case’A’:printf(“85~100\n”);break;case’B’:printf(“70~84\n”);break;case’C’:printf(“60~69\n”);break;case’D’:printf(“<60\n”);break;default:printf(“error\n”);}}說明每個常量運算式的值必須互不相同用break語句進行分割case和default出現的次序不影響運行結果程式舉例例5.5判斷某一年是否閏年真y被4整除假真y被100整除假真y被400假l=1l=0真l=1假輸出“閏年”輸出“非閏年”l=0l=1main()
{intyear,leap;
scanf("%d",&year);if(year%4==0){if(year%100==0){if(year%400==0)運行時輸入:2000leap=1;運行結果:2000isaleapyear.elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf("%dis",year);elseprintf("%disnot",year);printf("aleapyear.\n");}課堂練習讀程式寫出運行結果:main(){inta=2,b=-1,c=2;
if(a<b)
/*a>b*/if(b<0)c++;/*b>0*/elsec+=3;printf(“c=%d\n”,c);}運行結果c=5若改if(a>b)結果為:c=3若改if(b>0)結果為:c=5若改if(a>b)if(b>0)結果為:c=2課堂練習讀程式寫出運行結果:main(){intyear;scanf(“%d”,&year);if((year%4!=0)||(year%100==0&&year%400!=0))printf(“123”);elseprintf(“456”);}運行時輸入:2000運行結果456例5.7運輸公司對用戶計算運費.路程s越遠,每公里運費越低標準如下:
s<250km沒有折扣
250≤s<500
2%折扣
500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣總運費的計算公式:f=p×w×s×(1-d)其中:基本運費p,貨物重量w,距離s,折扣d
折扣d(%)2501500100050020002500300002468101416122121046810csmain(){intc,s;floatp,w,d,f;scanf("%f,%f,%d",&p,&w.&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;運行時輸入:100,20,300case1:d=2;break;運行結果:freight=588000.0000case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("freight=%15.4f",f);}main(){intc,s;floatp,w,d,f;scanf("%f,%f,%d",&p,&w.&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;運行時輸入:100,20,300case1:d=2;break;運行結果:freight=588000.000000case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("freight=%15.4f",f);}習題講解給一個不多於5位的正整數,要求:①求出它是幾位數;②分別列印出每一位數字;③按逆序#include"stdio.h"main(){longintnum;intge,shi,bai,qian,wan,place;printf("enteranumber(0~9999:)");scanf("%ld",&num);if(num>9999)place=5;elseif(num>999)place=4;elseif(num>99)place=3;elseif(num>9)place=2;elseplace=1;迴圈結構是重複執行某段程式,直到某個條件滿足為止的一種程式結構。很多問題的解決需要用到迴圈控制。迴圈結構、順序結構、選擇結構是構成複雜程式的基本單元。C提供四種迴圈goto~ifwhiledo~whileforgoto語句以及用goto語句構成迴圈無條件轉向語句一般形式:goto語句標號;兩種用途與if語句構成迴圈從多層迴圈的最內層跳出例6.1求∑n求:1+2+3+4……+100100n=1main(){
inti,sum=0;注意:初值的設置
i=1;loop:if(i<=100) {sum=sum+i; i++; gotoloop;} printf("%d",sum); }運行結果:5050while語句while語句可以實現當型迴圈格式:while(運算式)語句;執行過程:計算運算式值,為真(非0)則執行語句;反復執行上述操作,直到運算式值為假時止思考:變!什麼在改變!循環體語句N-S結構流程圖當運算式為真例6.2求∑nmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}問:sum和i都在變,誰的變化使迴圈結束?100n=1N-S結構流程圖i=1sum=sum+ii=i+1當i≤100例求7!main(){intt=1,i=2;while(i<=7){t=t*i;i++;}printf(“7!=%d\n”,t);}運行結果:5040(1x2x3x4x5x6x7)思考修改程式使運算順序為7x6x5x4x3x2x1main(){intt=7,i=6;while(i>0){t=t*i;i--;}printf(“7!=%d\n”,t);}課堂練習讀程式寫出運行結果main(){longx;intn=0;scanf(“%ld”,&x);運行時輸入:-10203040x=x>0?x:-x;運行結果:while(x!=0){n++;x=x/10;}printf("%d\n",n);}運行結果:8問:循環體內增加printf("%d\n",x);運行結果是:102030410203010203102010210108do-while語句do-while語句可以實現直到型迴圈格式:do語句;
while(運算式);執行過程:先執行語句,後計算運算式值,為0(假)則退出迴圈;否則返回do處,繼續迴圈循環體語句N-S結構流程圖當運算式為真例6.3用do-while語句求∑nmain(){intsum=0,i=1;do {sum=sum+i;i++;}while(i<=100); printf("%d",
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 订合同公证保全协议书
- 租车调车合同协议模板
- 综合岗位聘用合同范本
- 瓷砖库房转让合同范本
- 采购悬浮地板合同范本
- 租赁音响设备合同范本
- 门面租凭合同终止协议
- 软件系统合同协议模板
- 过户手写协议合同模板
- 软件项目意向合同范本
- 年产62万吨甲醇制烯烃(MTO)项目初步设计说明书
- 联通创新人才认证(解决方案)考试题库(附答案)
- 全成本管理探索与实践
- 电烙铁焊接技术培训
- ICU患者的早期活动
- 出纳课件 转账支票pptx
- TSZUAVIA 009.11-2019 多旋翼无人机系统实验室环境试验方法 第11部分:淋雨试验
- ps6000自动化系统用户操作及问题处理培训
- 商务礼仪情景剧剧本范文(通用5篇)
- 2021年东台市城市建设投资发展集团有限公司校园招聘笔试试题及答案解析
- 某县干部周转宿舍工程可行性研究报告
评论
0/150
提交评论