課件C語言高級(jí)語言程序設(shè)計(jì)一C程序設(shè)計(jì)基_第1頁
課件C語言高級(jí)語言程序設(shè)計(jì)一C程序設(shè)計(jì)基_第2頁
課件C語言高級(jí)語言程序設(shè)計(jì)一C程序設(shè)計(jì)基_第3頁
課件C語言高級(jí)語言程序設(shè)計(jì)一C程序設(shè)計(jì)基_第4頁
課件C語言高級(jí)語言程序設(shè)計(jì)一C程序設(shè)計(jì)基_第5頁
已閱讀5頁,還剩153頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

高級(jí)語言程序設(shè)計(jì)(一)

(CProgramming)第二講:C程序設(shè)計(jì)基礎(chǔ)(二)高級(jí)語言程序設(shè)計(jì)(一)

(CProgramming)第二講本章目標(biāo)掌握函數(shù)的定義及調(diào)用方式掌握函數(shù)參數(shù)傳遞方式掌握switch多路選擇掌握一維數(shù)組的定義和使用;掌握簡(jiǎn)單的文件輸入/輸出本章目標(biāo)掌握函數(shù)的定義及調(diào)用方式模塊化程序設(shè)計(jì)將復(fù)雜問題分解為簡(jiǎn)單問題的程序設(shè)計(jì)方法稱為結(jié)構(gòu)化程序設(shè)計(jì),其特點(diǎn)為:自頂向下(top-downdesign);逐步細(xì)化(stepwiserefinement);模塊化(modularprogramming);模塊化的好處:功能分解的需要;代碼重用;模塊化程序設(shè)計(jì)將復(fù)雜問題分解為簡(jiǎn)單問題的程序設(shè)計(jì)方法稱為結(jié)構(gòu)#include<stdio.h>main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=3.1415929*radius*radius; perimeter=2*radius*3.1415926; printf(“%6.2f%6.2f”,area,perimeter);}C程序設(shè)計(jì)基礎(chǔ)4常量定義所有常量可以用#define來定義,即可以給一個(gè)常量命名。如:#definePI3.1415926使用常量定義的好處:可提高程序的可讀性程序的可移植性更好,可維護(hù)性更好#include<stdio.h>#definePI3.1415926main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=PI*radius*radius; perimeter=2*radius*PI; printf(“Perimeter=%6.2f”,,perimeter);}實(shí)驗(yàn)#include<stdio.h>C程序設(shè)計(jì)基礎(chǔ)4常量定義C程序設(shè)計(jì)基礎(chǔ)5常量定義(續(xù))在ANSIC中,類型修飾符:const----其變量值在程序執(zhí)行中不可以通過賦值等方法對(duì)它進(jìn)行修改(是定義常量的另一種方法,用#define定義的常量無類型,而用const定義的常量有類型)。如:constfloatPI=3.14159;#include<stdio.h>constfloatPI=3.14159;main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=PI*radius*radius; perimeter=2*radius*PI; printf(“Perimeter=%6.2f”,perimeter);}C程序設(shè)計(jì)基礎(chǔ)5常量定義(續(xù))在ANSIC中,類型修飾符:#include<stdio.h>main(){ inta,b,sum; scanf(“%d+%d”,&a,&b); sum=a+b; printf(“Sum=%d\n”,sum);}tmainmainmainscanfprintf標(biāo)準(zhǔn)輸入/輸出庫函數(shù)#include<stdio.h>tmainmainma標(biāo)準(zhǔn)(庫)函數(shù)標(biāo)準(zhǔn)I/O庫函數(shù)#include<stdio.h>(scanf,printf,getchar,putchar…)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)#include

<math.h>(sin,cos,sqrt…)…標(biāo)準(zhǔn)(庫)函數(shù)標(biāo)準(zhǔn)I/O庫函數(shù)問題2.1問題:已知一組三角形的三邊(如(2.0,2.0,2.0)、(3.0,4.0,5.0)、(2.5,3.1,3.8)),計(jì)算其面積。計(jì)算三角形面積的公式為:#include<stdio.h>#include<math.h>main(){ doubles; s=(2.0+2.0+2.0)/2; printf(“%f\n”,sqrt(s*(s-2.0)*(s-2.0)*(s-2.0))); s=(3.0+4.0+5.0)/2; printf(“%f\n”,sqrt(s*(s-3.0)*(s-4.0)*(s-5.0))); s=(2.5+3.1+3.8)/2; printf(“%f\n”,sqrt(s*(s-2.5)*(s-3.1)*(s-3.8)));}對(duì)于這樣的有規(guī)律的重復(fù)計(jì)算,可以用更好的方法:函數(shù)來解決doublesqrt(doublex)為標(biāo)準(zhǔn)數(shù)學(xué)庫中函數(shù),使用前應(yīng)加上#include<math.h>問題2.1問題:已知一組三角形的三邊(如(2.0,2.0定義求三角形面積函數(shù)tri_area()doublea,doubleb,doublecdouble{

}

函數(shù)名需要傳遞給函數(shù)的數(shù)據(jù)(參數(shù)):數(shù)據(jù)類型、數(shù)據(jù)名稱函數(shù)計(jì)算結(jié)果(返回)類型

double函數(shù)是如何對(duì)數(shù)據(jù)進(jìn)行計(jì)算(函數(shù)體)doublea,doubleb,doublectri_area定義求三角形面積函數(shù)tri_area(tri_area函數(shù)定義

doubletri_area(doublea,doubleb,doublec){doubles,area;

s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));returnarea;}函數(shù)定義頭部,其中double為函數(shù)類型tri_area為函數(shù)名a,b,c為函數(shù)參數(shù)函數(shù)體局部變量函數(shù)返回(return)語句,返回計(jì)算結(jié)果tri_area函數(shù)定義

doubletri_area(d函數(shù)定義在ANSIC標(biāo)準(zhǔn)中,函數(shù)定義形式為:類型函數(shù)名(參數(shù)說明){[局部變量定義或說明]

語句}0個(gè)、一個(gè)或多個(gè)參數(shù),多個(gè)參數(shù)以逗號(hào),分隔稱為形參,格式:數(shù)據(jù)類型參數(shù)名函數(shù)定義在ANSIC標(biāo)準(zhǔn)中,函數(shù)定義形式為:0個(gè)、一個(gè)或多函數(shù)定義(續(xù))函數(shù)名一般是標(biāo)識(shí)符,一個(gè)程序只有一個(gè)main函數(shù),其它函數(shù)名可隨意取,當(dāng)然最好是有助于記憶的名字。局部變量定義或說明可有可無,在ANSIC標(biāo)準(zhǔn)中,局部變量定義或說明應(yīng)放在函數(shù)體的最前面。在ANSIC標(biāo)準(zhǔn)中,函數(shù)(返回值)類型不允許省略,即使是返回整型值(int),當(dāng)函數(shù)無返回值時(shí),應(yīng)其類型說明為void類型。若需要返回值:return表達(dá)式;若不需要返回值:return;或者沒有return語句函數(shù)定義(續(xù))函數(shù)名一般是標(biāo)識(shí)符,一個(gè)程序只有一個(gè)main函函數(shù)定義(續(xù))*在C語言中,函數(shù)不能嵌套定義。如,下面定義在C語言中是不充許的:f(){g(){…}…}函數(shù)定義(續(xù))*在C語言中,函數(shù)不能嵌套定義。問題2.1:代碼實(shí)現(xiàn)#include<stdio.h>#include<math.h>doubletri_area(doublea,doubleb,doublec){doubles,area;

s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));return(area);}intmain(){doublearea;area=tri_area(2.0,2.0,2.0);printf(“%f\n”,area); area=tri_area(3.0,4.0,5.0);printf(“%f\n”,area); area=tri_area(2.5,3.1,3.8);printf(“%f\n”,area);return0;}函數(shù)調(diào)用實(shí)驗(yàn)或者:intmain(){printf(“%f\n”,tri_area(2.0,2.0,2.0));printf(“%f\n”,tri_area(3.0,4.0,5.0));printf(“%f\n”,tri_area(2.5,3.1,3.8));return0;}問題2.1:代碼實(shí)現(xiàn)#include<stdio.h>函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用形式:函數(shù)名([實(shí)參表])其中實(shí)參個(gè)數(shù)、類型、排列次序應(yīng)和形參定義時(shí)一致。函數(shù)通過return語句將值返回給調(diào)用函數(shù)。它有兩種使用形式:1)returnexpr;2)return;注意:使用return語句只能返回一個(gè)值。函數(shù)調(diào)用可以作為單獨(dú)語句,也可以出現(xiàn)在表達(dá)式中函數(shù)調(diào)用函數(shù)調(diào)用形式:函數(shù)名([實(shí)參表])函數(shù)調(diào)用可以作函數(shù)定義與調(diào)用(續(xù))*注意:當(dāng)一個(gè)函數(shù)帶有返回值時(shí),應(yīng)保證函數(shù)每個(gè)可能執(zhí)行路徑上應(yīng)有返回值。如下面將大寫字母轉(zhuǎn)換為小寫字母函數(shù):chartoLower(charc){if(c>=‘A’&&c<=‘Z’)/*error!*/returnc+‘a(chǎn)’–‘A’;}正確寫法:chartoLower(charc){if(c>=‘A’&&c<=‘Z’)returnc+‘a(chǎn)’–‘A’;returnc;}函數(shù)定義與調(diào)用(續(xù))*注意:當(dāng)一個(gè)函數(shù)帶有返回值時(shí),應(yīng)保證函問題2.1:代碼實(shí)現(xiàn)#include<stdio.h>#include<math.h>intmain(){

printf(“%f\n”,tri_area(2.0,2.0,2.0)); printf(“%f\n”,tri_area(3.0,4.0,5.0)); printf(“%f\n”,tri_area(2.5,3.1,3.8)); return0;}doubletri_area(doublea,doubleb,doublec){doubles,area;s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));return(area);}doubletri_area(doublea,doubleb,doublec);函數(shù)原型實(shí)驗(yàn)問題2.1:代碼實(shí)現(xiàn)#include<stdio.h>do函數(shù)原型說明(prototype):在ANSIC標(biāo)準(zhǔn)中,所有函數(shù)調(diào)用之前必須要有函數(shù)定義或原型說明,函數(shù)原型用以說明函數(shù)的返回值類型、函數(shù)參數(shù)類型、個(gè)數(shù)及次序。函數(shù)原型說明有兩種形式:直接使用函數(shù)的頭部(函數(shù)頭部后加分號(hào))。如,doubletri_area(doublea,doubleb,doublec);在原型說明中僅給出類型、個(gè)數(shù)及次序,無形參變量名。如,doubletri_area(double,double,double);

注意:函數(shù)原型說明的類型、參數(shù)類型、個(gè)數(shù)及次序必須與函數(shù)定義時(shí)一致,否則會(huì)產(chǎn)生錯(cuò)誤。函數(shù)原型說明(prototype):在ANSIC標(biāo)準(zhǔn)中,所函數(shù)參數(shù)voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}int

main(){inta=2,b=3;swap(a,b);return0;}請(qǐng)問a和b是否交換?不能!調(diào)用swap后調(diào)用swap(a,b)如何通過函數(shù)調(diào)用改變參數(shù)的值將在后續(xù)章節(jié)中介紹??截悾簜髦嫡{(diào)用23ab23xy32xy實(shí)驗(yàn)函數(shù)參數(shù)voidswap(intx,inty)請(qǐng)函數(shù)參數(shù)(續(xù))注意:C函數(shù)的參數(shù)傳遞全部采用傳值。傳值調(diào)用實(shí)際上重新拷貝了一個(gè)副本給形參。傳值的好處是傳值調(diào)用不會(huì)改變調(diào)用函數(shù)實(shí)參變量的內(nèi)容,因此,可避免不必要的副作用。函數(shù)參數(shù)(續(xù))注意:C函數(shù)的參數(shù)傳遞全部采用傳值。傳值調(diào)用實(shí)問題2.2:求素?cái)?shù)讀入一個(gè)整數(shù),求該整數(shù)范圍內(nèi)的所有素?cái)?shù)。解題步驟:讀入一個(gè)整數(shù)到n;for(m=2;m<=n;i++)if(m是素?cái)?shù))輸出m;可定義一個(gè)函數(shù)intisprime(intn)來判斷一個(gè)整數(shù)是否為素?cái)?shù),若是返回1,否則返回0。問題2.2:求素?cái)?shù)讀入一個(gè)整數(shù),求該整數(shù)范圍內(nèi)的所有素?cái)?shù)??蓡栴}2.2:代碼實(shí)現(xiàn)intisprime(intn){intm;if(n<=1)return0;for(m=2;m*m<=n;m++)if(n%m==0)/*存在因子,不是素?cái)?shù)*/

return0;return1;}主函數(shù)#include<stdio.h>intisprime(intn);intmain(){intn,m;scanf(“%d”,&n);for(m=2;m<=n;m++)if(isprime(m))printf(“%d“,m);return0;}實(shí)驗(yàn)問題2.2:代碼實(shí)現(xiàn)intisprime(intn)主函局部變量局部變量(localvariable),又稱自動(dòng)變量:在函數(shù)(或塊結(jié)構(gòu))中定義的變量。使用范圍:只在定義它的函數(shù)或塊結(jié)構(gòu)內(nèi)有效。定義時(shí)可加auto關(guān)鍵字,也可省略:autointindex; 等同于: intindex;編譯程序不對(duì)局部(自動(dòng))變量給予隱含的初值,故其初值不確定。因此,每次使用前,必須明確地置初值。局部(自動(dòng))變量隨函數(shù)的調(diào)用而存在,函數(shù)返回后將消失,由一次調(diào)用到下一次調(diào)用之間不保持值,每次調(diào)用函數(shù)時(shí)都重新初始化。形參是自動(dòng)變量,使用范圍僅限于相應(yīng)函數(shù)內(nèi)。局部變量局部變量(localvariable),又稱自動(dòng)變計(jì)算x的冪:#include<stdio.h>doublepower(doublex,intn);intmain(){intn,m,i;doublef;scanf(“%d”,&m);for(i=0;i<m;i++){scanf(“%lf%d”,&f,&n);printf(“%f\n”,power(f,n));}return0;}

doublepower(doublex,intn){ doublef; f=1; while(n>0) { f=f*x;

n--; } return(f);}doublef;doublef;f=1;實(shí)驗(yàn)計(jì)算x的冪:doublepower(doublex,i如何劃分函數(shù)程序中可能有重復(fù)出現(xiàn)的相同或相似的計(jì)算片段,可以考慮從中抽取出共同的東西,定義為函數(shù)。這樣可以縮短程序代碼,提高程序的可讀性和易修改性。程序中具有邏輯獨(dú)立的片段定義為函數(shù)。這樣做主要用于分解程序的復(fù)雜性。如何劃分函數(shù)程序中可能有重復(fù)出現(xiàn)的相同或相似的計(jì)算片段,可以#include<stdio.h>doublepower(doublex,intn){inti;doublep;p=1;for(i=1;i<=n;++i)p=p*x;return(p);}intmain(){floatx;scanf(“%f”,&x);printf(“Xpower2=%f\n”,power(x,2));printf(“Xpower3=%f\n”,power(x,3));printf(“Xpower4=%f\n”,power(x,4));return0;}

#include<stdio.h>voidprintPower(doublex,intn){inti;doublep;

p=1;for(i=1;i<=n;++i)p=p*x;printf(“Xpower%d=%f\n”,n,p);}intmain(){floatx;scanf(“%f”,&x);

printPower(x,2);printPower(x,3);printPower(x,4);return0;}

實(shí)驗(yàn)#include<stdio.h>#include<st27問題2.3:簡(jiǎn)易計(jì)算器【問題描述】

編程實(shí)現(xiàn)簡(jiǎn)單的交互式計(jì)算器,能進(jìn)行整數(shù)的+-*/運(yùn)算。【輸入形式】從鍵盤讀入如下形式的輸入行,數(shù)據(jù)與運(yùn)算符之間可以用一個(gè)空格分隔:

120350+ 52/【輸出形式】若是/運(yùn)算,

小數(shù)點(diǎn)后保留兩位有效數(shù)字4702.50 27問題2.3:簡(jiǎn)易計(jì)算器【問題描述】28問題2.3:?jiǎn)栴}分析如何讀入數(shù)據(jù)及運(yùn)算符? intdata1,data2; charop; scanf(“%d%d%c”,&data1,&data2,&op);28問題2.3:?jiǎn)栴}分析如何讀入數(shù)據(jù)及運(yùn)算符?29問題2.3:算法設(shè)計(jì)intdata1,data2,result1;floatresult2;charop;從標(biāo)準(zhǔn)輸入中讀入整數(shù)data1,整數(shù)data2及運(yùn)算符op判斷op:若為‘+’,則result1=data1+data2;若為‘-’,則result1=data1-data2;若為‘*’,則result1=data1*data2;若為‘/’,則result2=data1/data2;若op為‘+’,‘-’或’*’,輸出結(jié)果result1;若op為‘/’,輸出結(jié)果result2;op值加運(yùn)算‘+’減運(yùn)算乘運(yùn)算除運(yùn)算‘-’‘*’‘/’多路選擇注意:由于data1和data2為整數(shù),結(jié)果仍為整數(shù)。要用強(qiáng)制類型轉(zhuǎn)換才能得到小數(shù)位。result2=(float)data1/data2;多路選擇,可使用if-elseif語句實(shí)現(xiàn)。在此,更適合switch語句。29問題2.3:算法設(shè)計(jì)intdata1,data2,r第三講:程序設(shè)計(jì)方法-問題分析30多路選擇:switch語句基本形式:switch(表達(dá)式){case常量表達(dá)式1:語句1或空;case常量表達(dá)式2:語句2或空;…case常量表達(dá)式n:語句n或空;default:語句n+1或空;}語義動(dòng)作為:先計(jì)算表達(dá)式的值;該值與每一個(gè)case后的常量進(jìn)行比較;若匹配,則控制就轉(zhuǎn)向該常量后的語句;若不匹配,若有default,則轉(zhuǎn)向default后的語句,否則什么也不做;S1S2SnSn+1EC1C2…Cndefault因此,switch語句特別適合于依據(jù)一組常量值來進(jìn)行判斷的多路選擇。第三講:程序設(shè)計(jì)方法-問題分析30多路選擇:switch語句第三講:程序設(shè)計(jì)方法-問題分析31多路選擇:switch語句(續(xù))注意:常量表達(dá)式必須是整型(if_elseif可能根據(jù)任意條件來進(jìn)行多路選擇);在同一個(gè)switch中不應(yīng)出現(xiàn)兩個(gè)具有同樣的常量;default語句如果有,只允許出現(xiàn)一次,default可出現(xiàn)在switch中的任何位置,通常放在最后;case和default本身不改變控制流(這與pascal中的case語句不同),中斷離開switch要用break;case后的語句可以是單個(gè)語句,也可以是復(fù)合語句(但不帶開頭和結(jié)尾的花括號(hào))第三講:程序設(shè)計(jì)方法-問題分析31多路選擇:switch語句32#include<stdio.h>intmain(){ intdata1,data2,result1; floatresult2; charop; scanf(“%d%d%c”,&data1,&data2,&op); switch(op){ case'+':result1=data1+data2; case'-':result1=data1-data2; case'*':result1=data1*data2; case'/':result2=(float)data1/data2; default: printf("Inputerror!\n"); } if(op==‘+’||op==‘-’||op==‘*’) printf("%d“,result1); elseif(op==‘/’) printf(“%.2f\n“,result2); return0;}測(cè)試數(shù)據(jù):120350+1212-352*32/break;break;break;break;break;32測(cè)試數(shù)據(jù):break;break;break;break33問題2.3:常見問題在switch中遺漏break#include<stdio.h>intmain(){ intdata1,data2,result1;floatresult2; charop; scanf(“%d%c%d”,&data1,&op,&data2); switch(op){ case'+':result1=data1+data2;break; case'-':result1=data1-data2;break; case'*':result1=data1*data2;break; case'/':result2=(float)data1/data2;break; default: printf("Inputerror!\n");break; } if(op==‘+’||op==‘-’||op==‘*’) printf("%d%c%d=%d\n“,data1,op,data2,result1); elseif(op==‘/’) printf("%d%c%d=%.2f\n“,data1,op,data2,result2); return0;}測(cè)試數(shù)據(jù)為:120+350結(jié)果為:120+350=-230Why?33問題2.3:常見問題在switch中遺漏break測(cè)試數(shù)問題2.4問題:“在一行上輸入10個(gè)整數(shù),在下一行上反序輸出”。輸入樣例:233245556778910467323輸出樣例:233467109786754552332問題2.4問題:“在一行上輸入10個(gè)整數(shù),在下一行上反序輸問題2.4:?jiǎn)栴}分析首先遇到的問題是如何保存輸入的數(shù)據(jù)?以目前所學(xué)的知識(shí),我們可以設(shè)置10個(gè)變量來存儲(chǔ)輸入如:intdata1,data2,…,data10;這樣做的缺點(diǎn):程序處理數(shù)據(jù)非常煩瑣,如我們必須依次讀入每個(gè)數(shù)據(jù)(不能用循環(huán));程序不具擴(kuò)展性,如果我們要處理100個(gè)、1000個(gè)甚至更多的數(shù)據(jù),怎么辦?如何存儲(chǔ)類型相同并且緊密相關(guān)的一組數(shù)據(jù)?使用數(shù)組問題2.4:?jiǎn)栴}分析首先遇到的問題是如何保存輸入的數(shù)據(jù)?使用數(shù)組的定義與初始化數(shù)組是變量的有序集合,數(shù)組的所有成員(數(shù)組元素)都具有相同的數(shù)據(jù)類型。數(shù)組定義一般采用如下格式:類型數(shù)組名[長(zhǎng)度]; --長(zhǎng)度為常量表達(dá)式

數(shù)組的定義與初始化數(shù)組是變量的有序集合,數(shù)組的所有成員(數(shù)組數(shù)組的定義與初始化(續(xù))例如: inta[50]; a[0]~a[49]…a[0]a[1]數(shù)組元素的下標(biāo)是從0開始,即數(shù)組中第一個(gè)元素的下標(biāo)為0數(shù)組的定義與初始化(續(xù))例如:…a[0]a[1]數(shù)組元數(shù)組的定義與初始化(續(xù))注意:C語言不支持動(dòng)態(tài)數(shù)組,即數(shù)組的長(zhǎng)度必須在編譯時(shí)確定下來,而不是在運(yùn)行中根據(jù)需要臨時(shí)決定。但C語言提供了動(dòng)態(tài)分配存貯函數(shù),利用它可實(shí)現(xiàn)動(dòng)態(tài)申請(qǐng)空間。intlength;scanf(“%d”,&length);doubles[length];長(zhǎng)度必須是常量表達(dá)式實(shí)驗(yàn)數(shù)組的定義與初始化(續(xù))注意:C語言不支持動(dòng)態(tài)數(shù)組,即數(shù)組的數(shù)組的定義與初始化(續(xù))數(shù)組初始化:可以在定義時(shí)初始化一個(gè)數(shù)組。下面是一些數(shù)組初始化實(shí)例:doublesales[5]={12.25,32.50,16.90,23,45.68};doublesales[]={12.25,32.50,16.90,23,45.68};intlist[5]={6,5,12};相當(dāng)于:intlist[5]={6,5,12,0,0}以實(shí)際元素的個(gè)數(shù)決定數(shù)組的大小實(shí)驗(yàn)數(shù)組的定義與初始化(續(xù))數(shù)組初始化:可以在定義時(shí)初始化一個(gè)數(shù)charstring[10]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’}charstring[10]=“hello”;charstring[]=“hello”;注意:用字符串常量初始化一個(gè)字符數(shù)組時(shí),其長(zhǎng)度應(yīng)至少比字符個(gè)數(shù)多1。數(shù)組的定義與初始化(續(xù))hlel\0o0124359實(shí)驗(yàn)數(shù)組的定義與初始化(續(xù))hlel\0o0124359實(shí)驗(yàn)數(shù)組元素的訪問初始化數(shù)組intarray[10],i;for(i=0;i<10;i++)

array[i]=1;讀入數(shù)組元素intarray[10],i;for(i=0;i<10;i++)scanf(“%d”,&array[i]);注意:不要將循環(huán)條件寫為i<=10。這是初學(xué)者常犯的錯(cuò)誤。如果一個(gè)數(shù)組的長(zhǎng)度為N,則遍歷數(shù)組的循環(huán)常寫為:for(i=0;i<N;i++)或for(i=0;i<=N-1;i++)編譯器不提供數(shù)組下標(biāo)越界檢查,下標(biāo)越界時(shí)可以通過編譯,但運(yùn)行時(shí)會(huì)出錯(cuò)格式:數(shù)組名[下標(biāo)]實(shí)驗(yàn)數(shù)組元素的訪問初始化數(shù)組注意:不要將循環(huán)條件寫為i<=10。數(shù)組元素的訪問(續(xù))求數(shù)組中最大元素maxIndex=0;/*maxIndex記錄最大元素的下標(biāo)*/for(i=0;i<N;i++)if(array[maxIndex]<array[i])maxIndex=i;maxElement=array[maxIndex];實(shí)驗(yàn)或者:maxElement=array[0];for(i=1;i<N;i++)if(maxElement<array[i])maxElement=array[i];數(shù)組元素的訪問(續(xù))求數(shù)組中最大元素實(shí)驗(yàn)或者:數(shù)組處理的限制在C中不允許對(duì)數(shù)組進(jìn)行整體操作。下面用法是錯(cuò)誤的:intx[10],y[10];scanf(“%d”,x);y=x;if(x==y)…y={1,2,3,4,5};比較數(shù)組正確做法是:for(i=0;i<10;i++)if(x[i]!=y[i])…正確做法是:for(i=0;i<10;i++)scanf(“%d”,&x[i]);正確做法是:for(i=0;i<10;i++)y[i]=x[i];復(fù)制數(shù)組只能在定義數(shù)組時(shí)整體初始化,不能整體賦值。實(shí)驗(yàn)數(shù)組處理的限制在C中不允許對(duì)數(shù)組進(jìn)行整體操作。下面用法是錯(cuò)誤問題2.4問題:“在一行上輸入10個(gè)整數(shù),在下一行上反序輸出”。輸入樣例:233245556778910467323輸出樣例:233467109786754552332問題2.4問題:“在一行上輸入10個(gè)整數(shù),在下一行上反序輸問題2.4:解題步驟1、定義保存數(shù)據(jù)的數(shù)組data[10]和下標(biāo)變量index;2、index設(shè)為數(shù)組第一個(gè)元素的下標(biāo);3、Whileindex小于10 3.1、讀入數(shù)據(jù)并保存到下標(biāo)為index的數(shù)組元素中;

3.2、index增1;4、index設(shè)為最后一個(gè)元素的下標(biāo);5、Whileindex大于等于0 5.1、打印下標(biāo)為index的數(shù)組元素;

5.2、index減1;問題2.4:解題步驟1、定義保存數(shù)據(jù)的數(shù)組data[10]和問題2.4程序?qū)崿F(xiàn):#include<stdio.h>intmain(){ intdata[10]; intindex; for(index=0;index<10;index++) scanf("%d",&data[index]); printf("\n"); for(index=9;index>=0;index--) printf("%d",data[index]); return0;}實(shí)驗(yàn)問題2.4程序?qū)崿F(xiàn):#include<stdio.h>實(shí)問題2.5問題:統(tǒng)計(jì)輸入中每個(gè)數(shù)字字符的出現(xiàn)次數(shù)分析:方法一:顯然可以使用10個(gè)int型變量來分別存儲(chǔ)每個(gè)數(shù)字字符的出現(xiàn)次數(shù)。然后在程序中,使用if_elseif來分別統(tǒng)計(jì)每個(gè)數(shù)字字符的出現(xiàn)次數(shù)。(該方法太笨拙)問題2.5問題:統(tǒng)計(jì)輸入中每個(gè)數(shù)字字符的出現(xiàn)次數(shù)問題2.5:分析(續(xù))方法二可以使用數(shù)組來存儲(chǔ)每個(gè)數(shù)字字符的出現(xiàn)次數(shù)。如:intdigit[10];如何將輸入的數(shù)字字符與相應(yīng)數(shù)組下標(biāo)對(duì)應(yīng)?表達(dá)式:

c–‘0’可將數(shù)字字符c轉(zhuǎn)換為相應(yīng)整數(shù)。因此,下面語句可統(tǒng)計(jì)每個(gè)數(shù)字字符的出現(xiàn)次數(shù):

digit[c-‘0’]++;

問題2.5:分析(續(xù))方法二問題2.5:代碼實(shí)現(xiàn)#include<stdio.h>intmain(){inti,c,digit[10]={0,0,0,0,0,0,0,0,0,0};while((c=getchar())!=EOF)if(c>=‘0’&&c<=‘9’)digit[c-‘0’]++;for(i=0;i<10;i++)printf(“Numberof%d:%d\n”,i,digit[i]);return0;}如何將打印整數(shù)數(shù)組封裝成一個(gè)函數(shù)?實(shí)驗(yàn)問題2.5:代碼實(shí)現(xiàn)#include<stdio.h>如例:打印整數(shù)數(shù)組函數(shù)voidprint(inta[10]){ inti; for(i=0;i<10;i++) printf(“%d\n”,a[i]);}voidprint(inta[],intlength){ inti; for(i=0;i<length;i++) printf(“%d\n”,a[i]);}數(shù)組長(zhǎng)度一般作為單獨(dú)參數(shù)傳遞給函數(shù)注意:1、數(shù)組長(zhǎng)度一般不寫在一維數(shù)組形參內(nèi),因?yàn)榫幾g器不作檢查。2、該函數(shù)不能打印任意長(zhǎng)度的整數(shù)數(shù)組。例:打印整數(shù)數(shù)組函數(shù)voidprint(inta[10]intmain(){inti,c,digit[10]={0,0,0,0,0,0,0,0,0,0};while((c=getchar())!=EOF)if(c>=‘0’&&c<=‘9’)digit[c-‘0’]++;

print(digit,10);

return0;}數(shù)組作為實(shí)參,只寫數(shù)組名,千萬不要寫成digit[10]#include<stdio.h>voidprint(inta[],intlength){ inti; for(i=0;i<length;i++) printf(“%d\n”,a[i]);}能否將統(tǒng)計(jì)功能也封裝成函數(shù)呢?實(shí)驗(yàn)intmain()數(shù)組作為實(shí)參,只寫數(shù)組名,千萬不要寫成dvoidcount(inta[]){ intc; while((c=getchar())!=EOF) if(c>=‘0’&&c<=‘9’) a[c-‘0’]++;}intmain(){ intdigit[10]={0};

count(digit);

print(digit,10);

return0;}例:統(tǒng)計(jì)數(shù)字出現(xiàn)次數(shù)函數(shù)數(shù)組中的值能傳遞回來嗎?01……9digita實(shí)驗(yàn)voidcount(inta[])例:統(tǒng)計(jì)數(shù)字出數(shù)組作為函數(shù)參數(shù)數(shù)組可以作為參數(shù)傳遞給函數(shù)。實(shí)際上傳遞的是數(shù)組的首地址(即數(shù)組第一個(gè)元素的地址,將在指針部分說明),我們可以這樣理解數(shù)組作為參數(shù)傳遞:形參數(shù)組與實(shí)參數(shù)組是一對(duì)共享同一數(shù)據(jù)區(qū)的數(shù)組,即它們是同一個(gè)數(shù)組,而不是對(duì)實(shí)參數(shù)組的拷貝。數(shù)組作為參數(shù)時(shí),函數(shù)的定義形式:voidfun(intarray[],intsize){…}數(shù)組作為參數(shù)時(shí),函數(shù)的調(diào)用形式:main(){inta[10];….fun(a,10);….}注意:定義數(shù)組形參時(shí),數(shù)組長(zhǎng)度可省略,同時(shí),還應(yīng)在形參中指定數(shù)組元素個(gè)數(shù)。注意:函數(shù)調(diào)用時(shí),用數(shù)組名作實(shí)參。數(shù)組作為函數(shù)參數(shù)數(shù)組可以作為參數(shù)傳遞給函數(shù)。實(shí)際上傳遞的是數(shù)字符數(shù)組數(shù)組元素的類型是char。charmes[]=“CLanguage”;charline[100]=“Programming”;字符數(shù)組有如下特點(diǎn):數(shù)組元素跟一般變量一樣可賦值、比較、計(jì)算等。數(shù)組下標(biāo)也是從0~N-1(N為數(shù)組長(zhǎng)度)。字符數(shù)組長(zhǎng)度可以顯式給出,也可以隱式得到。由雙引號(hào)括起來的的字符串常量具有靜態(tài)字符串?dāng)?shù)組類型。對(duì)數(shù)組初始化時(shí),編譯程序以\0作為結(jié)束符添加到字符串最后。因此,數(shù)組長(zhǎng)度要比字符串長(zhǎng)度多1。字符數(shù)組數(shù)組元素的類型是char。問題2.6:將數(shù)字字符串轉(zhuǎn)換成整數(shù)n=0whiles[i]為數(shù)字字符

n=10*n+s[i]–‘0’;“123”‘1’-‘0’=11*10+‘2’-‘0’=1212*10+‘3’-‘0’=123方法分析問題2.6:將數(shù)字字符串轉(zhuǎn)換成整數(shù)n=0“123”‘1’問題2.6:代碼實(shí)現(xiàn)intatoi(chars[]){inti,n,sign;for(i=0;s[i]==‘‘||s[i]==‘\n’||s[i]==‘\t’;i++); /*skipwhitespace*/sign=1;if(s[i]==‘+’||s[i]==‘-‘)sign=(s[i++]==‘+’)?1:-1;for(n=0;s[i]>=‘0’&&s[i]<=‘9’;i++)n=10*n+s[i]–‘0’;return(sign*n);}字符數(shù)組??照Z句條件運(yùn)算符:

<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>先計(jì)算表達(dá)式1,若其值為非零,則整個(gè)表達(dá)式結(jié)果為表達(dá)式2的值,否則就為表達(dá)式3的值。#include<stdio.h>intatoi(chars[]);main(){chars[20];scanf(“%s”,s);printf(“%d\n”,atoi(s));}實(shí)驗(yàn)問題2.6:代碼實(shí)現(xiàn)intatoi(chars[])字問題2.7:將字符串顛倒“…………”方法分析交換問題2.7:將字符串顛倒“…………”方法分析交換問題2.7:代碼實(shí)現(xiàn)voidreverse(chars[]){intc,i,j;for(i=0,j=str_len(s)-1;i<j;i++,j--){c=s[i];s[i]=s[j];s[j]=c;}}

intstr_len(chars[]){inti=0;while(s[i]!=‘\0’)++i;return(i);}#include<stdio.h>intreverse(chars[]);intstr_len(chars[]);main(){chars[20];scanf(“%s”,s);

reverse(s);printf(“%s\n”,s);}當(dāng)有多個(gè)循環(huán)變量時(shí),要用逗號(hào)隔開。逗號(hào)表達(dá)式:如e1,e2順序求e1和e2,以e2值作為整個(gè)表達(dá)式結(jié)果的值。如,a=(t=3,t+2);結(jié)果為5字符數(shù)組作為函數(shù)參數(shù)傳遞時(shí),不需要同時(shí)傳遞數(shù)組長(zhǎng)度。因?yàn)樽址麛?shù)組中字符串是以’\0’結(jié)束的。實(shí)驗(yàn)問題2.7:代碼實(shí)現(xiàn)voidreverse(chars問題2.8:將文件in.txt拷貝至新文件out.txt中。問題分析:

如何讀取、保存文件內(nèi)容?將標(biāo)準(zhǔn)輸入拷貝到標(biāo)準(zhǔn)輸出非常簡(jiǎn)單:#include<stdio.h>intmain(){intc;while((c=getchar())!=EOF)putchar(c);return0;}問題2.8:將文件in.txt拷貝至新文件out.txt中。文件文件操作文件操作基本過程打開文件讀寫文件關(guān)閉文件首先在程序文件的頭部應(yīng)有如下語句:#include<stdio.h>stream(流,讀寫通道)程序結(jié)束前應(yīng)該關(guān)閉文件!程序文件文件文件操作文件操作基本過程打開文件讀寫文件關(guān)閉文件首先在程文件打開文件FILE*fp;fp=fopen(文件名,文件使用方式);FILE是<stdio.h>文件中定義的結(jié)構(gòu)數(shù)據(jù)類型,包含文件有關(guān)信息:讀或?qū)懝ぷ鞣绞剑划?dāng)前讀/寫位置等等。一般用戶不必關(guān)心。若成功打開指定文件,則fopen返回指向該文件的FILE類型指針;若打開文件失敗,則返回NULL。文件指針:與打開的文件綁定在一起,以后將使用該指針實(shí)現(xiàn)對(duì)文件的所有操作文件打開文件FILE*fp;FILE是<stdio.h文件打開文件(續(xù))fp=fopen(文件名,文件使用方式);文件名:

字符串,可以只寫文件名,也可以包含路徑。只寫文件名時(shí),表示文件在當(dāng)前目錄下,當(dāng)前目錄是指:從VC運(yùn)行時(shí),工程文件和源程序所在目錄。雙擊*.exe程序運(yùn)行時(shí),該*.exe程序所在目錄。包含路徑實(shí)例:“c:\temp\text.txt”“c:\\temp\\text.txt”文件打開文件(續(xù))fp=fopen(文件名,文件使用方文件打開文件(續(xù))fp=fopen(文件名,文件使用方式);

使用方式也是字符串,表示打開文件的方式,字符流方式包括:“r”: 表示讀;“w”: 表示寫;“a”: 表示添加;“r+”: 表示讀寫已有文件;“w+”: 表示讀寫新文件;“a+”: 表示讀及添加;文件打開文件(續(xù))fp=fopen(文件名,文件使用方式文件打開文件(續(xù))用“w”或“a”方式調(diào)用fopen打開一個(gè)不存在的文件,系統(tǒng)會(huì)首先自動(dòng)創(chuàng)建該文件。然后再把它打開。用“w”方式打一個(gè)已存在的文件,則該文件原有內(nèi)容全部消失。用“a”方式打開一個(gè)已存在的文件,則原文件內(nèi)容保留不變,新添加的內(nèi)容將加到它的后面去。用“r”方式打開一個(gè)已存在的文件是正常的使用文件,若用“r”方式而打開一個(gè)尚未存在的文件,則會(huì)出錯(cuò),此時(shí)返回NULL。因此,一個(gè)好的程序設(shè)計(jì)風(fēng)格,應(yīng)判斷打開文件的返回值,并進(jìn)行處理。一個(gè)打開文件的典型用法:…if((fp=fopen(filename,“r”))==NULL){printf(“Can’topenfile%s!\n”,filename);return-1;}…文件打開文件(續(xù))用“w”或“a”方式調(diào)用fopen打開一個(gè)文件“r+”是對(duì)一個(gè)已存在的文件進(jìn)行讀和寫操作?!皐+”同樣對(duì)一個(gè)已存在的文件打開時(shí),原數(shù)據(jù)消失,因此,修改一個(gè)已有文件的內(nèi)容時(shí),必須以“r+”方式打開。“a+”寫入的數(shù)據(jù)均在文件最后,而數(shù)據(jù)卻可由文件任何位置上讀取。

打開文件(續(xù))注意:文件必須打開后,才可進(jìn)行讀寫。文件“r+”是對(duì)一個(gè)已存在的文件進(jìn)行讀和寫操作。打開文件(續(xù)文件打開文件(續(xù))例如:以只讀方式打開一個(gè)文件“hello.c”。fp=fopen(“hello.c”,“r”);例如:以寫方式打開一個(gè)文件“output.dat”,該將文件位于C:盤根目錄下。fp=fopen(“c:\\output.dat”,“w”);文件打開文件(續(xù))例如:以只讀方式打開一個(gè)文件“hello.文件讀寫文件字符輸入函數(shù):

intfgetc(FILE*fp);

從fp所指向的文件中讀取一個(gè)字符并返回。若文件結(jié)束或調(diào)用失敗,返回EOF字符輸出函數(shù):

intfputc(intch,FILE*fp);

將字符ch寫入fp所指向的文件。若成功,則返回寫入的字符;若失敗,返回EOF文件讀寫文件字符輸入函數(shù):文件關(guān)閉文件關(guān)閉文件函數(shù):

intfclose(FILE*fp);關(guān)閉fp文件指針?biāo)赶虻奈募?,并釋放fp文件指針。若成功關(guān)閉,返回0,否則返回EOF注意:fp必須是fopen返回的指針,并且調(diào)用關(guān)閉函數(shù)后,fp被釋放掉,不能再利用fp進(jìn)行讀寫文件操作。若文件不再使用,應(yīng)及時(shí)關(guān)閉文件。在程序結(jié)束前,應(yīng)該關(guān)閉所有打開的文件(否則有可能丟失數(shù)據(jù))。文件關(guān)閉文件關(guān)閉文件函數(shù):注意:?jiǎn)栴}2.8:將文件in.txt拷貝至新文件out.txt中。算法分析:打開文件in.txt。打開文件out.txt。從文件in.txt讀取一個(gè)字符保存到ch中。是否到達(dá)文件尾部?4.1 將ch保存到out.txt中。4.2再從in.txt讀取一個(gè)字符保存到ch中。關(guān)閉文件。問題2.8:將文件in.txt拷貝至新文件out.txt中。文件#include<stdio.h>intmain(){ charch; FILE*in,*out; if((in=fopen("in.txt","r"))==NULL) { printf("Can'topenin.txt!"); return-1; } if((out=fopen("out.txt","w"))==NULL) { printf("Can'topenout.txt!"); return-1; } while((ch=fgetc(in))!=EOF) fputc(ch,out); fclose(in); fclose(out); return0;}文件#include<stdio.h>問題2.8:測(cè)試首先在該程序工程文件(即.dsp文件)目錄下準(zhǔn)備一個(gè)包含一定內(nèi)容的input.txt文件。程序正確運(yùn)行后,將在同一目錄下生成一個(gè)output.txt文件。檢查文件input.txt和output.txt內(nèi)容是否完全一樣。實(shí)驗(yàn)問題2.8:測(cè)試首先在該程序工程文件(即.dsp文件)目錄下常見問題程序風(fēng)格如何從循環(huán)嵌套中跳出continue與while、for循環(huán)數(shù)組元素未賦值就使用(通過調(diào)試解決)模塊化程序設(shè)計(jì)常見問題程序風(fēng)格模塊化程序設(shè)計(jì)程序風(fēng)格比較:#include<stdio.h>main(){inta[1000],b[1000];inti,j,m;for(i=0;i<1000;i++){scanf("%d",&a[i]);if(a[i]==-1)break;}for(j=0;j<1000;j++){scanf("%d",&b[j]);if(b[j]==-1)break;}for(i=0;i<1000;i++){for(j=0;j<1000;j++){m=0;if(a[i]==b[j]){m=1;break;}}if(m==0)printf("%d",a[i]);}}

#include<stdio.h>main(){inta[1000],b[1000];inti,j,m;for(i=0;i<1000;i++){scanf("%d",&a[i]);if(a[i]==-1)break;}for(j=0;j<1000;j++){scanf("%d",&b[j]);if(b[j]==-1)break;}for(i=0;i<1000;i++){for(j=0;j<1000;j++){m=0;if(a[i]==b[j]){m=1;break;}}if(m==0)printf("%d",a[i]);}}程序風(fēng)格比較:#include<stdio.h>#inclu程序設(shè)計(jì)實(shí)踐:程序設(shè)計(jì)風(fēng)格(StyleorConvention)(一)為什么要強(qiáng)調(diào)程序設(shè)計(jì)風(fēng)格:可以改善軟件的可讀性,幫助程序員理解代碼。程序設(shè)計(jì)實(shí)踐:程序設(shè)計(jì)風(fēng)格(StyleorConvent模塊化程序設(shè)計(jì)如何從嵌套循環(huán)中跳出輸入兩組正整數(shù)a、b,都以-1作為結(jié)束標(biāo)志,從數(shù)組a中找到第一個(gè)與數(shù)組b相同的元素并輸出,若找不到則輸出Noanswer。輸入:34569102-1967567506-1輸出:56解題步驟:1、輸入兩組數(shù)分別存儲(chǔ)在數(shù)組a、b中;2、對(duì)于數(shù)組a中的每一個(gè)元素a[i],分別與數(shù)組b中的每一個(gè)元素b[j]進(jìn)行比較

,若a[i]==b[j],則輸出a[i]3、若都找不到,輸出Noanswer。模塊化程序設(shè)計(jì)如何從嵌套循環(huán)中跳出輸入兩組正整數(shù)a、b,都以#include<stdio.h>main(){inta[100],b[100];inti,j;intfound=0;for(i=0;i<100;i++){scanf("%d",&a[i]);if(a[i]==-1)break;}for(j=0;j<100;j++){scanf("%d",&b[j]);if(b[j]==-1)break;}

for(i=0;a[i]!=-1;i++){for(j=0;j<b[j]!=-1;j++){ if(a[i]==b[j]){

found=1;printf(“%d”,a[i]);break;}}

if(found)break;}if(!found)printf(“Noanswer”);}如何從嵌套循環(huán)中跳出變量found表示是否找到相同元素通過再次判斷跳出兩重循環(huán)#include<stdio.h>for(i=0;a#include<stdio.h>

main()

{

inta,b;

for(a=1,b=1;a<=100;a++)

{

if(b>=20)

break;

if(b%3==1)

{

b+=3;

continue;

}

b-=5;

}

printf("%d,%d\n",a,b);

}

continue與while、for循環(huán)#include<stdio.h>

main()

{

inta,b;

a=1,b=1;

while(a<=100)

{

if(b>=20)

break;

if(b%3==1)

{

b+=3;

a++;continue;

}

b-=5;

a++;

}

printf("%d,%d\n",a,b);

}

#include<stdio.h>

main()

{

如何調(diào)試函數(shù)?如何查看字符數(shù)據(jù)?如何查看數(shù)組中的數(shù)據(jù)?(問題2.5顛倒字符串程序?yàn)槔┤绾螠y(cè)試文件操作?(2.6拷貝文件為例)數(shù)組元素未賦值就使用(通過調(diào)試解決)程序設(shè)計(jì)實(shí)踐:調(diào)試程序(2)如何調(diào)試函數(shù)?程序設(shè)計(jì)實(shí)踐:調(diào)試程序(2)數(shù)組調(diào)試示例:#include<stdio.h>voidmain(){inta[1000],b[1000];inti,j,m;for(i=0;i<1000;i++){scanf("%d",&a[i]);if(a[i]==-1)break;}for(j=0;j<1000;j++){scanf("%d",&b[j]);if(b[j]==-1)break;}

for(i=0;i<1000;i++){for(j=0;j<1000;j++){m=0;if(a[i]==b[j]){m=1;break;}}if(m==0)printf("%d",a[i]);}}數(shù)組調(diào)試示例:#include<stdio.h>fo高級(jí)語言程序設(shè)計(jì)(一)

(CProgramming)第二講:C程序設(shè)計(jì)基礎(chǔ)(二)高級(jí)語言程序設(shè)計(jì)(一)

(CProgramming)第二講本章目標(biāo)掌握函數(shù)的定義及調(diào)用方式掌握函數(shù)參數(shù)傳遞方式掌握switch多路選擇掌握一維數(shù)組的定義和使用;掌握簡(jiǎn)單的文件輸入/輸出本章目標(biāo)掌握函數(shù)的定義及調(diào)用方式模塊化程序設(shè)計(jì)將復(fù)雜問題分解為簡(jiǎn)單問題的程序設(shè)計(jì)方法稱為結(jié)構(gòu)化程序設(shè)計(jì),其特點(diǎn)為:自頂向下(top-downdesign);逐步細(xì)化(stepwiserefinement);模塊化(modularprogramming);模塊化的好處:功能分解的需要;代碼重用;模塊化程序設(shè)計(jì)將復(fù)雜問題分解為簡(jiǎn)單問題的程序設(shè)計(jì)方法稱為結(jié)構(gòu)#include<stdio.h>main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=3.1415929*radius*radius; perimeter=2*radius*3.1415926; printf(“%6.2f%6.2f”,area,perimeter);}C程序設(shè)計(jì)基礎(chǔ)83常量定義所有常量可以用#define來定義,即可以給一個(gè)常量命名。如:#definePI3.1415926使用常量定義的好處:可提高程序的可讀性程序的可移植性更好,可維護(hù)性更好#include<stdio.h>#definePI3.1415926main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=PI*radius*radius; perimeter=2*radius*PI; printf(“Perimeter=%6.2f”,,perimeter);}實(shí)驗(yàn)#include<stdio.h>C程序設(shè)計(jì)基礎(chǔ)4常量定義C程序設(shè)計(jì)基礎(chǔ)84常量定義(續(xù))在ANSIC中,類型修飾符:const----其變量值在程序執(zhí)行中不可以通過賦值等方法對(duì)它進(jìn)行修改(是定義常量的另一種方法,用#define定義的常量無類型,而用const定義的常量有類型)。如:constfloatPI=3.14159;#include<stdio.h>constfloatPI=3.14159;main(){ doubleradius,area,perimeter; scanf(“%lf”,&radius); area=PI*radius*radius; perimeter=2*radius*PI; printf(“Perimeter=%6.2f”,perimeter);}C程序設(shè)計(jì)基礎(chǔ)5常量定義(續(xù))在ANSIC中,類型修飾符:#include<stdio.h>main(){ inta,b,sum; scanf(“%d+%d”,&a,&b); sum=a+b; printf(“Sum=%d\n”,sum);}tmainmainmainscanfprintf標(biāo)準(zhǔn)輸入/輸出庫函數(shù)#include<stdio.h>tmainmainma標(biāo)準(zhǔn)(庫)函數(shù)標(biāo)準(zhǔn)I/O庫函數(shù)#include<stdio.h>(scanf,printf,getchar,putchar…)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)#include

<math.h>(sin,cos,sqrt…)…標(biāo)準(zhǔn)(庫)函數(shù)標(biāo)準(zhǔn)I/O庫函數(shù)問題2.1問題:已知一組三角形的三邊(如(2.0,2.0,2.0)、(3.0,4.0,5.0)、(2.5,3.1,3.8)),計(jì)算其面積。計(jì)算三角形面積的公式為:#include<stdio.h>#include<math.h>main(){ doubles; s=(2.0+2.0+2.0)/2; printf(“%f\n”,sqrt(s*(s-2.0)*(s-2.0)*(s-2.0))); s=(3.0+4.0+5.0)/2; printf(“%f\n”,sqrt(s*(s-3.0)*(s-4.0)*(s-5.0))); s=(2.5+3.1+3.8)/2; printf(“%f\n”,sqrt(s*(s-2.5)*(s-3.1)*(s-3.8)));}對(duì)于這樣的有規(guī)律的重復(fù)計(jì)算,可以用更好的方法:函數(shù)來解決doublesqrt(doublex)為標(biāo)準(zhǔn)數(shù)學(xué)庫中函數(shù),使用前應(yīng)加上#include<math.h>問題2.1問題:已知一組三角形的三邊(如(2.0,2.0定義求三角形面積函數(shù)tri_area()doublea,doubleb,doublecdouble{

}

函數(shù)名需要傳遞給函數(shù)的數(shù)據(jù)(參數(shù)):數(shù)據(jù)類型、數(shù)據(jù)名稱函數(shù)計(jì)算結(jié)果(返回)類型

double函數(shù)是如何對(duì)數(shù)據(jù)進(jìn)行計(jì)算(函數(shù)體)doublea,doubleb,doublectri_area定義求三角形面積函數(shù)tri_area(tri_area函數(shù)定義

doubletri_area(doublea,doubleb,doublec){doubles,area;

s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));returnarea;}函數(shù)定義頭部,其中double為函數(shù)類型tri_area為函數(shù)名a,b,c為函數(shù)參數(shù)函數(shù)體局部變量函數(shù)返回(return)語句,返回計(jì)算結(jié)果tri_area函數(shù)定義

doubletri_area(d函數(shù)定義在ANSIC標(biāo)準(zhǔn)中,函數(shù)定義形式為:類型函數(shù)名(參數(shù)說明){[局部變量定義或說明]

語句}0個(gè)、一個(gè)或多個(gè)參數(shù),多個(gè)參數(shù)以逗號(hào),分隔稱為形參,格式:數(shù)據(jù)類型參數(shù)名函數(shù)定義在ANSIC標(biāo)準(zhǔn)中,函數(shù)定義形式為:0個(gè)、一個(gè)或多函數(shù)定義(續(xù))函數(shù)名一般是標(biāo)識(shí)符,一個(gè)程序只有一個(gè)main函數(shù),其它函數(shù)名可隨意取,當(dāng)然最好是有助于記憶的名字。局部變量定義或說明可有可無,在ANSIC標(biāo)準(zhǔn)中,局部變量定義或說明應(yīng)放在函數(shù)體的最前面。在ANSIC標(biāo)準(zhǔn)中,函數(shù)(返回值)類型不允許省略,即使是返回整型值(int),當(dāng)函數(shù)無返回值時(shí),應(yīng)其類型說明為void類型。若需要返回值:return表達(dá)式;若不需要返回值:return;或者沒有return語句函數(shù)定義(續(xù))函數(shù)名一般是標(biāo)識(shí)符,一個(gè)程序只有一個(gè)main函函數(shù)定義(續(xù))*在C語言中,函數(shù)不能嵌套定義。如,下面定義在C語言中是不充許的:f(){g(){…}…}函數(shù)定義(續(xù))*在C語言中,函數(shù)不能嵌套定義。問題2.1:代碼實(shí)現(xiàn)#include<stdio.h>#include<math.h>doubletri_area(doublea,doubleb,doublec){doubles,area;

s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));return(area);}intmain(){doublearea;area=tri_area(2.0,2.0,2.0);printf(“%f\n”,area); area=tri_area(3.0,4.0,5.0);printf(“%f\n”,area); area=tri_area(2.5,3.1,3.8);printf(“%f\n”,area);return0;}

溫馨提示

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

評(píng)論

0/150

提交評(píng)論