版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5講
結(jié)構(gòu)化程序設(shè)計(jì)(PartII)周水庚2020年10月22日《程序設(shè)計(jì)》-2020年秋提要C程序簡介函數(shù)基礎(chǔ)知識文件的簡單用法簡單程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》-2020年秋提要C程序簡介函數(shù)基礎(chǔ)知識文件的簡單用法簡單程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》-2020年秋C程序簡介一個C程序可由若干個源程序文件組成一個源文件可以由若干個函數(shù)和預(yù)處理命令以及全局變量聲明部分組成一個函數(shù)由變量定義部分和執(zhí)行語句組成每個源程序文件都是可獨(dú)立編譯的,所以C程序可以按源程序文件分別編寫、分別編譯《程序設(shè)計(jì)》-2020年秋《程序設(shè)計(jì)》-2020年秋C語句C語句是C程序的基本組成單元C語句可以分為以下5類空語句表達(dá)式語句復(fù)合語句控制語句函數(shù)調(diào)用語句《程序設(shè)計(jì)》-2020年秋C語句(續(xù))控制語句有9種if()…
else…
(條件語句)switch(多分支選擇語句)for()
(循環(huán)語句)while()
(循環(huán)語句)do…
while()(循環(huán)語句)continue(結(jié)束本次循環(huán)語句)break(中止執(zhí)行switch或循環(huán)語句)goto(轉(zhuǎn)向語句)return(從函數(shù)返回語句)《程序設(shè)計(jì)》-2020年秋C語句(續(xù))函數(shù)調(diào)用語句由一次函數(shù)調(diào)用加一個分號構(gòu)成表達(dá)式語句由一個表達(dá)式加一個分號構(gòu)成,如賦值語句空語句只有一個分號的語句,它什么也不做復(fù)合語句用{}把一些語句括起來構(gòu)成,又稱分程序《程序設(shè)計(jì)》-2020年秋C程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)條件控制結(jié)構(gòu)if…[else…]循環(huán)結(jié)構(gòu)while()do…while()for()《程序設(shè)計(jì)》-2020年秋提要C程序簡介函數(shù)基礎(chǔ)知識正文文件的簡單用法簡單程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》-2020年秋函數(shù)基礎(chǔ)知識結(jié)構(gòu)化程序設(shè)計(jì)中,將復(fù)雜的功能分解成若干簡單的子功能,用函數(shù)編碼實(shí)現(xiàn)子功能,通過調(diào)用函數(shù)實(shí)施子功能要求函數(shù)是一個實(shí)現(xiàn)指定功能、邏輯上獨(dú)立的代碼段對函數(shù)使用者來說,把它看作“黑盒”,只需知道要傳送給函數(shù)的數(shù)據(jù)(輸入),和函數(shù)執(zhí)行后能得到什么結(jié)果(輸出)函數(shù)可以定義局部對象,使函數(shù)在邏輯上作為程序的一個相對獨(dú)立單位,不受主函數(shù)或其它函數(shù)的程序?qū)ο竺挠绊憽冻绦蛟O(shè)計(jì)》-2020年秋函數(shù)基礎(chǔ)知識(續(xù))函數(shù)可帶形參,函數(shù)執(zhí)行時,操作對象、求值方式等可隨不同調(diào)用的需要而改變函數(shù)為程序的層次構(gòu)造和開發(fā)提供支持,使設(shè)計(jì)新程序能在已有函數(shù)基礎(chǔ)上構(gòu)造功能更強(qiáng)的函數(shù)和程序一個C程序以main()函數(shù)作為程序的主函數(shù)。程序運(yùn)行時,從它開始執(zhí)行在C語言中,函數(shù)不能嵌套定義,一個函數(shù)并不從屬于另一個函數(shù)除不能調(diào)用main()函數(shù)外,其它函數(shù)可以相互調(diào)用《程序設(shè)計(jì)》-2020年秋函數(shù)庫把一些公用的、基本的計(jì)算功能所對應(yīng)的函數(shù)集中起來,構(gòu)成一個庫,我們稱之為函數(shù)庫,相應(yīng)的函數(shù)成為庫函數(shù)函數(shù)庫中的函數(shù)具有預(yù)先定義的、標(biāo)準(zhǔn)的輸入、輸入接口C語言中定義了一些基本的標(biāo)準(zhǔn)函數(shù)編程環(huán)境工具廠商(Microsoft、Borland等)往往提供更多的函數(shù)供編程者使用《程序設(shè)計(jì)》-2020年秋函數(shù)庫(續(xù))C語言使用頭文(headerfile,即*.h文件)對函數(shù)庫中的函數(shù)進(jìn)行定義和說明函數(shù)庫中的函數(shù)經(jīng)編譯后,綁定在一起件,構(gòu)成一個庫文件(libraryfile,即*.lib文件)C程序調(diào)用C語言或者編程環(huán)境提供的函數(shù)時,要在程序中包含(include)相應(yīng)的頭文件;在產(chǎn)生執(zhí)行文件時,需要與庫文件中相應(yīng)的目標(biāo)函數(shù)代碼連接為了使用方便,C語言按功能分類,提供了大量函數(shù)庫,每個函數(shù)庫都有自己的頭文件《程序設(shè)計(jì)》-2020年秋庫函數(shù)的使用使用相應(yīng)庫函數(shù)的程序都要在使用之前寫上包含其頭文件的預(yù)處理命令常用的頭文件stdio.h(輸入輸出庫函數(shù))math.h、stdlib.h、float.h(數(shù)學(xué)庫函數(shù))time.h(時間庫函數(shù))ctype.h(字符分類和轉(zhuǎn)換庫函數(shù))string.h(內(nèi)存緩沖區(qū)和字符串處理庫函數(shù))graphics.h(圖形處理庫函數(shù))malloc.h、stdlib.h(內(nèi)存動態(tài)分配庫函數(shù))signal.h、process.h(進(jìn)程控制庫函數(shù))《程序設(shè)計(jì)》-2020年秋實(shí)例實(shí)例1:時間函數(shù)使用實(shí)例2:隨機(jī)函數(shù)使用(1)實(shí)例3:隨機(jī)函數(shù)使用(2)《程序設(shè)計(jì)》-2020年秋#include<stdio.h>#include<time.h>voidmain(){structtm*tmNow;/*定義一個時間結(jié)構(gòu)指針變量*/longsecsNow;/*定義以秒為單位的記錄時間的變量*/char*strNow;/*時間字符串表示的字符指針*/time(&secsNow);/*調(diào)用函數(shù)time(),得到當(dāng)前時間*/strNow=ctime(&secsNow);/*獲得時間的字符串表示*/printf("自1970年1月1日至現(xiàn)在的時間(以秒為單位):%ld\n",secsNow);printf("當(dāng)前時間的另一種表示:%s\n",strNow);tmNow=localtime(&secsNow);/*獲得結(jié)構(gòu)形式的時間*/printf("存于tmNow所指結(jié)構(gòu)中的時間有年中的日、年、月、日、時、分、秒:\n");printf("%d%d-%02d-%02d%02d:%02d:%02d\n",tmNow->tm_yday,tmNow->tm_year+1900,tmNow->tm_mon,tmNow->tm_mday,tmNow->tm_hour,tmNow->tm_min,tmNow->tm_sec);strNow=asctime(tmNow);/*得到字符串表示的時間*/printf("當(dāng)前時間的另一種表示:%s\n",strNow);}《程序設(shè)計(jì)》-2020年秋#include<stdio.h>#include<time.h>#include<stdlib.h>voidmain(){intk;longnow;srand(time(&now)%60);/*用時間初始化隨機(jī)數(shù)發(fā)生函數(shù)的初態(tài),使初態(tài)總不相同*/for(k=0;k<10;k++)/*產(chǎn)生10個隨機(jī)數(shù)輸出*/printf(”%d\n”,rand());/*調(diào)用隨機(jī)函數(shù)*/}《程序設(shè)計(jì)》-2020年秋#include<stdio.h>#include<time.h>#include<stdlib.h>voidmain(){inti;srand(time(NULL));for(i=1;i<=10000;i++){printf(”%10d”,1+rand()%6);if(i%5==0)printf(“\n”);}}《程序設(shè)計(jì)》-2020年秋函數(shù)定義函數(shù)定義的一般形式為
類型標(biāo)識符函數(shù)名(形式參數(shù)說明表){
說明和定義部分語句序列
}《程序設(shè)計(jì)》-2020年秋函數(shù)定義(續(xù))類型標(biāo)識符用于標(biāo)識函數(shù)執(zhí)行結(jié)果返回值的類型當(dāng)函數(shù)執(zhí)行不返回值時,習(xí)慣用void來標(biāo)記當(dāng)函數(shù)返回int型值時,類型標(biāo)識符int可以省略函數(shù)名是一個標(biāo)識符,一個C程序有且只有一個main()函數(shù),其它的函數(shù)名可以隨意命名《程序設(shè)計(jì)》-2020年秋函數(shù)定義(續(xù))函數(shù)名之后括號內(nèi)的形式參數(shù)說明表是按需要而定沒有形參的函數(shù),也就沒有形參說明表,常用void代之,但函數(shù)名之后的一對圓括號不可省略當(dāng)函數(shù)有多個形參時,形參說明之間用逗號分隔,每個形參說明指定形參的類型和形參名《程序設(shè)計(jì)》-2020年秋函數(shù)定義(續(xù))最外層花括號“{”和“}”括住的部分是函數(shù)體在函數(shù)體的前面部分可有函數(shù)需要的程序?qū)ο蟮恼f明和定義函數(shù)體內(nèi)定義的變量是局部變量,只能在函數(shù)體內(nèi)引用它們說明和定義之后是由語句序列組成的執(zhí)行代碼《程序設(shè)計(jì)》-2020年秋例子1求兩個數(shù)中最小值的函數(shù)min()doublemin(doublex,doubley)/*返回double型值,有兩個形參x,y,都為double型的*/{/*函數(shù)返回x和y中的小者的值*/returnx<y?x:y;}
return語句的執(zhí)行將結(jié)束函數(shù)的執(zhí)行
C語言的return語句有兩種形式:
return;用于不返回值的函數(shù)體中
return表達(dá)式;用于有返回值的函數(shù)體中《程序設(shè)計(jì)》-2020年秋例子2求兩個正整數(shù)最大公因子的函數(shù)gcd()兩個正整數(shù)a和b的最大公因子有性質(zhì):gcd(a,b)=gcd(a-b,b),如a>b;gcd(a,b)=gcd(a,b-a),如a<b;gcd(a,b)=a,如a=b?!冻绦蛟O(shè)計(jì)》-2020年秋intgcd(inta,intb){while(a!=b)if(a>b)a-=b;elseb-=a;returna;}第1解法《程序設(shè)計(jì)》-2020年秋步驟:[求余數(shù)]求a除b的余數(shù)r[判結(jié)束]如r等于0,b為最大公約數(shù)[替換]用b置a,r置b,并回到步驟[求余數(shù)]第2解法《程序設(shè)計(jì)》-2020年秋
intgcd(inta,intb){intr;while(1){if((r=a%b)==0)break;a=b;b=r;}returnb;}《程序設(shè)計(jì)》-2020年秋
intgcd(inta,intb){intr=a;do{a=b;b=r;r=a%b;}while(r);returnb;}《程序設(shè)計(jì)》-2020年秋函數(shù)定義(續(xù))C語言也允許在函數(shù)名后的圓括號內(nèi)只給出各形參的名,隨后才指定各形參的類型,但這種寫法在C++中已不允許doublemin(x,y)doublex,y;{returnx<y?x:y;}C語言還允許函數(shù)體為空的函數(shù)dummy()/*或dummy(void)*/{}《程序設(shè)計(jì)》-2020年秋函數(shù)調(diào)用函數(shù)被定義以后,凡要實(shí)現(xiàn)函數(shù)功能的地方,就可簡單地通過函數(shù)調(diào)用來完成函數(shù)調(diào)用的一般形式為函數(shù)名(實(shí)在參數(shù)表)實(shí)在參數(shù),簡稱實(shí)參。函數(shù)調(diào)用時,實(shí)參按它們出現(xiàn)的順序與函數(shù)定義中的形參一一對應(yīng),并要求實(shí)參類型與其對應(yīng)的形參類型相一致《程序設(shè)計(jì)》-2020年秋函數(shù)調(diào)用(續(xù))函數(shù)調(diào)用有兩種方式傳值調(diào)用(callbyvalue)把實(shí)參的值傳給被調(diào)用函數(shù)的參數(shù)(形參)。這時,被調(diào)用函數(shù)對參數(shù)的改變,不影響調(diào)用函數(shù)實(shí)參的原始值傳引用調(diào)用(callbyreference)把實(shí)參的地址傳給被調(diào)用函數(shù)的參數(shù)(形參)地址。這時,被調(diào)用函數(shù)對參數(shù)的改變,將影響到調(diào)用函數(shù)實(shí)參的原始值《程序設(shè)計(jì)》-2020年秋函數(shù)調(diào)用(續(xù))對doublemin(doublex,doubley)的函數(shù)調(diào)用w=min(u,v);函數(shù)調(diào)用min(u,v)就是對函數(shù)min()的調(diào)用,它提供了兩個實(shí)參u和v,分別對應(yīng)形參x和y如果調(diào)用無形參的函數(shù),這時函數(shù)的調(diào)用形式變?yōu)楹瘮?shù)名()其中函數(shù)名之后的一對圓括號是不能省略的
《程序設(shè)計(jì)》-2020年秋函數(shù)調(diào)用(續(xù))按函數(shù)調(diào)用在程序中的作用,有兩種不同類型的應(yīng)用函數(shù)調(diào)用只是利用函數(shù)所完成的功能。此時,將函數(shù)調(diào)用作為一個獨(dú)立的語句。這種應(yīng)用不要求或無視函數(shù)的返回值如程序中經(jīng)常使用的調(diào)用格式輸入函數(shù)scanf()和格式輸出函數(shù)printf()等。函數(shù)調(diào)用是利用函數(shù)的返回值:或用這返回值繼續(xù)進(jìn)行表達(dá)式的計(jì)算,或輸出函數(shù)返回值等《程序設(shè)計(jì)》-2020年秋函數(shù)調(diào)用的執(zhí)行過程為形參分配內(nèi)存空間計(jì)算實(shí)參表達(dá)式的值,并將值賦給對應(yīng)的形參為函數(shù)的局部變量分配內(nèi)存空間執(zhí)行函數(shù)體內(nèi)的語句序列函數(shù)體執(zhí)行完,或執(zhí)行了return語句后,釋放為這次函數(shù)調(diào)用分配的全部內(nèi)存空間將函數(shù)值(如果有)返回到函數(shù)調(diào)用處繼續(xù)執(zhí)行《程序設(shè)計(jì)》-2020年秋#include<stdio.h>doublex,y,d,min(double,double);voidmain(){printf(“Enterx,y.\n”);scanf(“%lf%lf”,&x,&y);d=min(x,y);printf(“MIN(%.3f,%.3f)=%.3f\n”,x,y,d);}doublemin(doublea,doubleb){doubletemp;temp=a>b?b:a;returntemp;}《程序設(shè)計(jì)》-2020年秋對函數(shù)調(diào)用的說明當(dāng)函數(shù)執(zhí)行return語句或執(zhí)行完函數(shù)體的語句序列后,函數(shù)的這次調(diào)用就結(jié)束,隨之將控制返回到函數(shù)調(diào)用處繼續(xù)執(zhí)行函數(shù)的返回值是通過執(zhí)行return語句時,計(jì)算return之后的表達(dá)式值而獲得的。如果函數(shù)不提供返回值,則return語句不包含表達(dá)式。如果函數(shù)有返回值,則應(yīng)有確定的類型,并在函數(shù)定義時指明。若函數(shù)定義時不指明返回值類型,且函數(shù)有返回值,C語言約定該函數(shù)的返回值類型為int型《程序設(shè)計(jì)》-2020年秋對函數(shù)調(diào)用的說明(續(xù))為了明確指明函數(shù)不提供返回值,建議在函數(shù)定義時,在函數(shù)名之前寫上void。并在這樣的函數(shù)體內(nèi),所有的return語句都不帶表達(dá)式當(dāng)函數(shù)執(zhí)行不帶表達(dá)式的return語句返回時,函數(shù)并不是一定不帶回值,而是返回一個不確定的值。這時,不應(yīng)該利用函數(shù)返回值進(jìn)行再計(jì)算,否則會產(chǎn)生錯誤結(jié)果函數(shù)定義中的return語句的表達(dá)式類型應(yīng)與函數(shù)定義中指明的返回值類型相一致。如果return語句中的表達(dá)式類型與函數(shù)定義指明的返回值類型不一致時,對于基本類型情況,則以函數(shù)的返回值類型為準(zhǔn),系統(tǒng)會自動進(jìn)行類型轉(zhuǎn)換《程序設(shè)計(jì)》-2020年秋實(shí)參向形參單向傳遞數(shù)據(jù)在函數(shù)未被調(diào)用時,函數(shù)定義中的形參和函數(shù)體中定義的局部變量并不占用存儲單元在函數(shù)定義中,必須為函數(shù)的形參指定數(shù)據(jù)類型函數(shù)體中所使用的形參的初值是由函數(shù)調(diào)用時對應(yīng)的實(shí)參表達(dá)式給定的C語言規(guī)定,實(shí)參表達(dá)式對形參的數(shù)據(jù)傳遞是“值傳遞”的,即單向傳遞對于有多個實(shí)參的函數(shù)調(diào)用情況,C語言不規(guī)定實(shí)參的求值次序《程序設(shè)計(jì)》-2020年秋提要C程序簡介函數(shù)基礎(chǔ)知識文件的簡單用法簡單程序設(shè)計(jì)實(shí)例《程序設(shè)計(jì)》-2020年秋文件的簡單用法介紹這部分內(nèi)容的目的學(xué)習(xí)編寫從文件輸入數(shù)據(jù)和把結(jié)果輸出到文件的程序了解使用文件程序的結(jié)構(gòu)掌握文件的一般使用方法熟悉一些和文件操作有關(guān)的庫函數(shù)的用法涉及一些較深的概念先暫且接受!《程序設(shè)計(jì)》-2020年秋定義文件變量在程序的開始處定義文件指針變量,和存儲文件名的字符數(shù)組#include<stdio.h>FILE*fp;/*定義文件指針變量fp*/charfname[40];/*存儲文件目錄路徑和文件名的字符數(shù)組*/《程序設(shè)計(jì)》-2020年秋輸入文件名printf(”輸入文件名(包括目錄路徑、擴(kuò)展名)\n”);scanf(”%s%*c”,fname);/*輸入文件名及回車符*/《程序設(shè)計(jì)》-2020年秋打開文件程序從正文文件輸入數(shù)據(jù)程序向正文文件輸出結(jié)果若被打開文件不存在,則建立一個新文件;若被打開文件已存在,則該文件中的數(shù)據(jù)被刪除if((fp=fopen(fname,”r”))==NULL){printf(”%s文件不能打開\n”,fname);return;}fp=fopen(fname,”w”);/*為寫打開文件*/讀打開時,要求被打開文件已存在《程序設(shè)計(jì)》-2020年秋關(guān)閉文件文件使用結(jié)束后,要及時關(guān)閉fclose(fp);/*以后fp又可用于打開文件*/《程序設(shè)計(jì)》-2020年秋文件輸入輸出調(diào)用函數(shù)fgetc()從文件輸出下一個字符ch=fgetc(fp);/*將輸入字符存于變量ch*/調(diào)用函數(shù)fscanf()從文件按指定格式輸出數(shù)據(jù)fscanf(fp,”%d%d”,&k,&j);/*從文件輸出整數(shù)*/調(diào)用函數(shù)fputc()向文件輸入一個字符fputc(ch,fp);/*將變量ch中的字符輸出到文件*/調(diào)用函數(shù)fprintf()向文件按指定格式輸入數(shù)據(jù)fprintf(fp,”%d%d\n”,k,j);/*向文件輸入整數(shù)*/《程序設(shè)計(jì)》-2020年秋從文件逐一輸出字符intc;/*不能為char類型*/FILE*fp;…/*說明有關(guān)變量和設(shè)置初值等*/
if((fp=fopen(文件名,”r”))==NULL){printf(”不能打開文件%s。\n”,文件名);return;}while((c=fgetc(fp))!=EOF){…/*對剛讀入的字符信息c作某種處理*/}fclose(fp);…/*輸出處理結(jié)果*/《程序設(shè)計(jì)》-2020年秋字符逐一輸入形成新文件intc;/*也可以是char類型*/FILE*fp;…/*說明有關(guān)變量和設(shè)置初值等*/fp=fopen(文件名,”w”);while(還有字符){
…/*生成字符(或字節(jié))存于變量c*/fputc(c,fp);/*將生成的字符輸出*/}fclose(fp);…/*輸出程序結(jié)束報告*/《程序設(shè)計(jì)》-2020年秋例子將鍵盤輸入的字符流復(fù)制到指定的文件逐行復(fù)制從鍵盤輸入字符到指定文件,直至輸入空行結(jié)束《程序設(shè)計(jì)》-2020年秋#include<stdio.h>FILE*fp;voidmain(){intch;charfname[40];printf(”輸入文件名!\n”);scanf(”%s%*c”,fname);fp=fopen(fname,"w");/*以寫方式打開正文文件*/while((ch=getchar())!=‘\n’){/*逐行處理,至空行結(jié)束*/dofputc(ch,fp);/*行內(nèi)字符逐一復(fù)制*/while((ch=getchar())!=‘\n’);/*處理當(dāng)前行*/fputc(ch,fp);/*輸出換行符*/}fclose(fp);printf(”程序復(fù)制鍵盤輸入字符結(jié)束。\n”);}《程序設(shè)計(jì)》-2020年秋提要C程序簡介函數(shù)基礎(chǔ)知識正文文件的簡單用法簡單程序設(shè)計(jì)實(shí)例【例1】輸入整數(shù)n,輸出由2*n+1行2*n+1列,以下形式(n=2)的圖案。
*************圖案分成兩部分,上面由n+1行,下面有n行圖案中,同一行上的兩個星號字符之間有一個空格符對于上半部分,設(shè)第一行的星號字符位于屏幕的中間,則后行圖案的起始位置比前行起始位置提前兩個位置對于下半部,第一行的起始位置比上半部最后一行起始位置前進(jìn)兩個字符位置,以后各行也相繼進(jìn)兩個位置《程序設(shè)計(jì)》-2020年秋#include<stdio.h>voidmain(){intn,j,k;printf("Entern!\n");scanf("%d",&n);for(j=0;j<=n;j++){printf("%*c",40-2*j,’’);for(k=1;k<=2*j+1;k++)printf("*");printf("\n");}for(j=n-1;j>=0;j--){printf("%*c",40-2*j,’’);for(k=1;k<=2*j+1;k++)printf("*");printf("\n");}}《程序設(shè)計(jì)》-2020年秋
“%*c”中的*表示輸入寬度由后面的參量值確定【例2】試編制一個程序輸出以下形式的乘法表。
12345678911224336944812165510152025661218243036771421283542498816243240485664991827364554637281《程序設(shè)計(jì)》-2020年秋#include<stdio.h>voidmain(){inti,j;
printf("\n\t123456789\n");for(i=1;i<=9;i++){printf("\t%d",i);for(j=1;j<=i;j++)printf("%4d",i*j);printf("\n");}printf("\n\n\n");}《程序設(shè)計(jì)》-2020年秋【例3】編制一個程序,實(shí)現(xiàn)輸入n(>2)個整數(shù),輸出其中的次最大數(shù)。為求次最大,程序在循環(huán)過程中需保留兩個數(shù),當(dāng)前暫時最大數(shù)max1和當(dāng)前暫時次最大數(shù)max2。程序?qū)⑤斎氲牡谝粋€數(shù)暫時保留,待輸入第二個數(shù)后,確定max1和max2。從第三個輸入數(shù)x開始,根據(jù)x調(diào)整max1和max2。調(diào)整過程需考慮以下幾種可能:x>max1,則以max1作為新的max2,x作為新的max1;max1>x>max2,則以x作為新的max2;x<max2,則不調(diào)整?!冻绦蛟O(shè)計(jì)》-2020年秋#include<stdio.h>voidmain(){intn,i,max1,max2,x,temp;printf("輸入n(>=2)!\n");scanf("%d",&n);if(n<2)return;printf("輸入第%d個整數(shù).",1);scanf("%d",&temp);printf("輸入第%d個整數(shù).",2);scanf("%d",&x);if(temp<x){max1=x;max2=temp;}《程序設(shè)計(jì)》-2020年秋else{max1=temp;max2=x;}for(i=3;i<=n;i++){printf("輸入第%d個整數(shù).",i);scanf("%d",&x);if(x>max1){max2=max1;max1=x;}elseif(x>max2)max2=x;}printf("次最大是%d\n\n",max2);}《程序設(shè)計(jì)》-2020年秋【例4】編制對給定的整數(shù),判該整數(shù)是否是質(zhì)數(shù)的函數(shù),若是質(zhì)數(shù),函數(shù)返回1,否則函數(shù)返回0。
判一個整數(shù)n是否是一個質(zhì)數(shù)有許多方法:如n=2,則n是質(zhì)數(shù);若n是其它偶數(shù),則n不是質(zhì)數(shù);讓整數(shù)變量k自3開始,每次增2,直至k的平方超過n為止,若其中某個k能整除n,則n不是質(zhì)數(shù)。若所有這樣的k都不能整除n,則n是質(zhì)數(shù)?!冻绦蛟O(shè)計(jì)》-2020年秋《程序設(shè)計(jì)》-2020年秋intisPrime(longn){longk;if(n==2L)return1;if(n%2==0)return0;for(k=3L;k*k<=n;k+=2L)if(n%k==0)break;if(k*k>n)return1;return0;}【例5】編制輸入整數(shù),輸出小于等于該整數(shù)的全部質(zhì)數(shù)的程序。程序首先輸出質(zhì)數(shù)2,之后對指定范圍內(nèi)的奇數(shù)采用例4的方法判其是否是質(zhì)數(shù)。#include<stdio.h>voidmain(){longm,n;intj;/*j控制每行輸出10個質(zhì)數(shù)*/printf(”輸入整數(shù)\n”);scanf(”%ld”,&m);printf(”%6d”,2);j=1;for(n=3L;n<=m;n+=2)if(isPrime(n)){if(j++%10==0)printf(”\n”);printf(”%6ld”,n);}printf(”\n”);}《程序設(shè)計(jì)》-2020年秋【例6】輸入x,求級數(shù)s(x)的近似值。約定求和的精度為0.000001。
x3x5x7s(x)=x++++…3*1!5*2!7*3!一般地,設(shè)級數(shù)為
s(x)=t0+t1+t2+┅+tk《程序設(shè)計(jì)》-2020年秋求級數(shù)部分和的算法可描述如下:{s=0;/*級數(shù)的部分和變量s,置初值0*/t=首項(xiàng)值;/*置通項(xiàng)變量t為級數(shù)的首項(xiàng)值*/k=0;/*置項(xiàng)序號變量k為0*/while(fabs(t)>=Epsilon){s+=t;/*累計(jì)當(dāng)前項(xiàng)tk到部分和*/t=f(t,k);/*由當(dāng)前項(xiàng)t和k計(jì)算下一個當(dāng)前項(xiàng)的值*/k++;/*項(xiàng)序號增1*/}}《程序設(shè)計(jì)》-2020年秋對于本題,首項(xiàng)值為x,級數(shù)第k(>=0)項(xiàng)tk的算式為
(-1)k*x(2*k+1)/((2*k+1)*k!)k+1項(xiàng)tk+1與k項(xiàng)tk有關(guān)系
tk+1=-tk*x*x*(2*k+1)/((2*k+3)*(k+1))tk是通項(xiàng)t的當(dāng)前項(xiàng)值,tk+1是通項(xiàng)t的下一個當(dāng)前項(xiàng)值。由當(dāng)前項(xiàng)t和k計(jì)算t的下一個當(dāng)前項(xiàng)值t’,可用以下表達(dá)式實(shí)現(xiàn):
t’=-t*x*x*(2.0*k+1.0)/((2.0*k+3)*(k+1))把以上式子代入上述算法,并令x的值由輸入給定,寫出程序如下:《程序設(shè)計(jì)》-2020年秋#include<stdio.h>#include<math.h>#defineEpsilon0.000001voidmain(){intk;doubles,x,t;printf(“Enterx.\n”);scanf(“%lf”,&x);s=0.0;/*級數(shù)的部分和變量s置初值0*/t=x;/*置通項(xiàng)變量t為級數(shù)的首項(xiàng)值*/k=0;/*置項(xiàng)序號變量k為0*/while(fabs(t)>=Epsilon){s+=t;t=-t*x*x*(2.0*k+1)/((2.0*k+3)*(k+1));k++;/*項(xiàng)序號增1*/}printf(“s(%f)=%f\n”,x,s);}《程序設(shè)計(jì)》-2020年秋【例7】編制從鍵盤輸入整數(shù)序列,并按輸入順序輸出到指定的文件中的程序。程序循環(huán)地從鍵盤輸入整數(shù),將整數(shù)輸出到指定的文件中。當(dāng)程序發(fā)現(xiàn)不能從鍵盤輸入整數(shù)時結(jié)束循環(huán)?!冻绦蛟O(shè)計(jì)》-2020年秋#include<stdio.h>FILE*fp;intmain(){intx,k;charfname[40];printf(”輸入文件名!\n”);scanf(”%s%*c”,fname);if((fp=fopen(fname,"w"))==NULL){printf("不能打開文件%s。\n",fname);return0;}k=1;while(scanf(”%d”,&x)==1){fprintf(fp,”%d\t”,x);if(k++%5==0)fprintf(fp,”\n”);}fclose(fp);printf(”\n輸出了%d個整數(shù).\n”,k-1);return1;}《程序設(shè)計(jì)》-2020年秋/*scanf返回值表示輸入?yún)?shù)的個數(shù)*/【例8】編制從指定的文件中輸出整數(shù),并按輸出順序輸出到顯示屏上。程序從文件循環(huán)地輸入整數(shù),將整數(shù)輸出到顯示屏。當(dāng)程序發(fā)現(xiàn)不能從文件輸入整數(shù)時結(jié)束循環(huán)。《程序設(shè)計(jì)》-2020年秋#include<stdio.h>FILE*fp;intmain(){intx,k;charfname[40];printf(”輸入文件名!\n”);scanf(”%s%*c”,fname);if((fp=fopen(fname,"r"))==NULL){printf("不能打開文件%s。\n",fname);return0;}k=1;while(fscanf(fp,”%d”,&x)==1){printf(”%d\t”,x);if(k++%5==0)printf(”\n”);}fclose(fp);printf(”\n從文件%s輸入了%d個整數(shù).\n”,fname,k-1);return1;}《程序設(shè)計(jì)》-2020年秋《程序設(shè)計(jì)》-2020年秋【例9】求Sn=a+aa+aaa+…+aa…a(n個a之值),其中a是一個十進(jìn)制數(shù)字。#include<stdio.h>main(){longsn;inti,a,t,n;printf(“Inputnanda:”);scanf(“%d%d”,&n,&a);t=a;sn=0;i=1;do{sn+=t;i++;t=t*10+a;}while(i<n);
printf(“Sn=%l\n”,sn);}《程序設(shè)計(jì)》-2020年秋【例10】有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13,…
求出這個數(shù)列的前n項(xiàng)之和分析:假設(shè)這個序列的第k項(xiàng)為tk=ak/bk,有tk+1=(ak+bk)/ak=1+1/tka1=2;b1=1《程序設(shè)計(jì)》-2020年秋#include<stdio.h>main(){inti=1,n,floatt,sprintf(“Inputn:”);scanf(“%d”,&n);s=0.0;t=2.0while(i<=n){s+=t;t=1.0+1.0/t;i++}printf(“Thesumis:%f”,s);}《程序設(shè)計(jì)》-2020年秋【例11】用迭代法求。求平方根的迭代公式為要求前后兩次求出的x的差的絕對值小于10-5。#include<stdio.h>Main(){floata,x1,x2;printf(“Inputa’svalue:”);scanf(“%f”,&a);x2=a;do{x1=x2;x2=0.5*(x1+a/x1);}while(fabs(x2-x1)>=1e-5);printf(“=%f”,x2);}《程序設(shè)計(jì)》-2020年秋【例12】打印出所有的“水仙花數(shù)”,所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一水仙花數(shù),因?yàn)?53=13+53+33#include<stdio.h>main(){inti,first,second,third;for(i=100;i<=999;i++){first=i/100;second=(i/10)%10;third=(i%100)%10;if(i==first*first*first+second*second*second+third*third*third)printf(“%d\n”,i);}}《程序設(shè)計(jì)》-2020年秋【例13】一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。例如,6的因子為1、2、3,而6=1+2+3,因此6是“完數(shù)”。編程序找出1000之內(nèi)的所有完數(shù),并按下面格式輸出其因子:
6’sfactorsare1,2,3《程序設(shè)計(jì)》-2020年秋
#include<stdio.h>main(){inti,j,sum;for(i=1;i<=1000;i++){sum=0;for(j=1;j<i;j++)if(i%j==0)sum+=j;if(i==1)printf(“1’sfactoris1”)elseif(sum==i){printf(“%d’sfactorsare:”);for(j=1;j<i;j++)
if(i%j==0)printf(“%d,”,j);printf(“\n”);}}}猴子吃桃問題【例14】猴子第一天摘下若干個桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個。第二天早上又將第一天剩下的桃子吃掉一半,有多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,發(fā)現(xiàn)只剩下一個桃子了。編寫程序求猴子第一天摘了多少個桃子。關(guān)鍵是:搞清楚第一天桃數(shù)和第二天桃子數(shù)之間的關(guān)系,即第二天桃子數(shù)加1的2倍等于第一天的桃子數(shù)?!冻绦蛟O(shè)計(jì)》-2020年秋#include<stdio.h>intmain(){Intday,x1,x2;/*定義day、x1、x23個變董為基本整型*/day=9;x2=1;while(day>0){
x1=(x2+1)*2;/*第一天的桃子數(shù)是第二天桃子數(shù)加1后
的2倍*/
x2=x1;
day--;/*因?yàn)閺暮笙蚯巴扑蕴鞌?shù)遞減*/}printf("thetotalis%d\n",x1);/*輸出桃子的總數(shù)*/return
0;}《程序設(shè)計(jì)》-2020年秋漁夫打魚曬網(wǎng)問題【例15】如果一個漁夫從2011年1月1日開始每三天打一次漁,兩天曬一次網(wǎng),編程實(shí)現(xiàn)當(dāng)輸入20111月1日以后的任意一天,輸出該漁夫是在打漁還是在
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度××企業(yè)vi設(shè)計(jì)合同
- 2024年度XX影視作品制作合同
- 2024烏魯木齊市國有土地上房屋征收補(bǔ)償合同
- 2024年度智能工廠設(shè)計(jì)與建設(shè)合同
- 公司員工試用期轉(zhuǎn)正個人工作總結(jié)
- 會計(jì)專業(yè)頂實(shí)習(xí)報告錦集五篇
- 中秋節(jié)晚會精彩致辭范文(6篇)
- 2024年二手房買賣合同模板(含裝修情況)
- 2024年度健身服務(wù)承包經(jīng)營合同協(xié)議書
- 2024年度知識產(chǎn)權(quán)許可使用合同:含許可范圍、許可費(fèi)用、使用期限
- 社會體育導(dǎo)論教學(xué)教案
- 廠房物業(yè)管理服務(wù)合同
- 心理健康家長會(課件)-小學(xué)生主題班會通用版
- 新生適應(yīng)性成長小組計(jì)劃書
- 08SS523建筑小區(qū)塑料排水檢查井
- 教學(xué)評一體化的教學(xué)案例 課件
- 父親去世訃告范文(通用12篇)
- 人教版八年級上Unit 2How often do you exercise Section A(Grammar Focus-3c)
- 導(dǎo)讀工作總結(jié)優(yōu)秀范文5篇
- SB/T 10851-2012會議中心運(yùn)營服務(wù)規(guī)范
- GB/T 6587-2012電子測量儀器通用規(guī)范
評論
0/150
提交評論