高级程序设计语言课件_第1页
高级程序设计语言课件_第2页
高级程序设计语言课件_第3页
高级程序设计语言课件_第4页
高级程序设计语言课件_第5页
已阅读5页,还剩316页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高級程式設計語言

電子科技大學通信與資訊工程學院第八章 函數電子科技大學通信與資訊工程學院概述模組化一個較大的程式一般被劃分為若干個程式模組,每個模組來實現某一個特定的功能C語言中,用函數來實現程式模組的功能例:(P143例8.1)

结果:

#include"stdio.h"voidprintstar(){printf("****************\n");}voidprint_message(){printf("Howdoyoudo!\n");}main(){printstar();print_message();printstar();}***************

Howdoyoudo

***************

電子科技大學通信與資訊工程學院概述C程式執行的入口點是main函數,並且程式的執行主體是在main函數內在main函數中調用其他函數(子函數)完成某項功能,該函數執行完成後,任回到main函數程式在main函數結束時結束。所有的子函數的地位都是平等的,不能在子函數中定義函數電子科技大學通信與資訊工程學院概述C語言函數分類從函數定義的角度:標準函數(庫函數):由系統提供,用戶可以直接使用(在使用庫函數的原始檔案中應首先#include其對應的頭檔)用戶定義函數:由用戶定義的函數從函數形式的角度:無參函數,例:getchar();有參函數,例:strcpy(str1,str2);電子科技大學通信與資訊工程學院函數體函數定義的一般形式函數定義的一般形式:

類型說明函數名([形式參數說明])

{

定义局部变量

声明外部变量、函数

语句

}形式參數說明的一般形式:

類型說明變數1[,類型說明變數2,...]intmax(intx,inty){ intz; z=x>y?x:y; return(z);}聲明部分電子科技大學通信與資訊工程學院函數定義的一般形式無參函數的定義形式

類型說明函數名()

{

声明部分

语句

}有參函數的定義形式

類型說明函數名(形式參數說明)

{

声明部分

语句

}空函數的定義形式

类型说明函数名([形式參數說明])

{

}voidprint_message(){printf("Howdoyoudo!\n");}intmax(intx,inty){ intz; z=x>y?x:y; return(z);}intdraw_circle(){/*drawacircle*/}電子科技大學通信與資訊工程學院intmax(intx,inty){ intz; z=x>y?x:y; return(z);}一般情況下,主調函數與被調函數之間存在數據傳遞關係(通信關係)main(){inta,b,g;scanf("%d%d",&a,&b);g=max(a,b);printf("Max_num:%d\n",g);}函數的參數和函數的值abz主調函數被調函數主調函數將數據傳遞給被調函數;——函數參數被調函數處理完成後,返回主調函數,並將得到的結果返回給主調函數——函數返回值電子科技大學通信與資訊工程學院#include"stdio.h"intmax(intx,inty){ intz; z=x>y?x:y; return(z);}main(){inta,b,g;scanf("%d%d",&a,&b);g=max(a,b);printf("Max_num:%d\n",g);}形式參數和實際參數函數參數:用於函數間數據的傳遞形式參數(形參):定義函數時使用的參數實際參數(實參):引用(調用)函數時使用的參數形式參數形式參數實際參數電子科技大學通信與資訊工程學院形式參數和實際參數C語言如何實現函數間的數據傳遞?傳遞方式:值傳遞單向傳遞(實參

形參)將實參的值拷貝給形參...intmax(intx,inty){....return(z);}main(){...g=max(a,b);...}2525主調函數記憶體空間被調函數記憶體空間abxy電子科技大學通信與資訊工程學院形式參數和實際參數值傳遞說明:在內存中,實參與形參存放在在不同的記憶體區域。在調用函數時,系統給形參分配存儲單元,並將實參對應的值拷貝給形參,調用結束後,形參單元被釋放,而在函數調用過程中,實參值沒有任何改動。因此,在執行一個被調用函數時,形參的值如果發生改變,並不會改變主調函數的實參的值。電子科技大學通信與資訊工程學院形式參數和實際參數注意:定義函數時,必須說明形參的類型,形參只能是變數(簡單、構造類型),而不能是常量形參只有在函數內部有效(函數調用結束返回主調函數後則不能再使用該形參變數):在函數調用前,形參不占記憶體;形參變數只有在函數被調用時才分配記憶體單元;在調用結束時,刻釋放所分配的記憶體單元實參可以是常量、變數、運算式、函數實參和形參在數量,類型,順序上應嚴格一致,否則會發生“類型不匹配”的錯誤電子科技大學通信與資訊工程學院形式參數和實際參數例:讀程式,求程式的輸出#include"stdio.h"intsum(intb,inta){ a=a+b; b=a+b; returna;}main(){inta=1,b=2,c;c=sum(a,b);printf("sum=%d\n",c);}電子科技大學通信與資訊工程學院函數的返回值函數的值就是函數的返回值,是指被調函數返回給主調函數值。函數的值是一個確定的值。返回函數值的方法函數的值只能通過return語句向主調函數返值一個函數可以有多個return語句,但不論執行到哪個return,都將結束函數的調用,返回主函數return語句格式:

return運算式;或者:return(運算式);例:intmax(intx,inty){ if(x>y)returnx; returny;}intmax(intx,inty){return(x>y?x:y);}電子科技大學通信與資訊工程學院函數的返回值函數的類型即是函數返回值的類型函數的類型和函數定義中函數返回值的類型應保持一致。如果兩者不一致,則以函數類型為准,自動進行類型轉換。在函數定義時如果省去類型說明,則函數的類型默認為整型(int)不需要返回值的函數如果一個函數不需要返回值,可以將函數類型設為voidVoid類型不能被引用intmax(intx,inty){ intz; z=x>y?x:y; return(z);}電子科技大學通信與資訊工程學院函數的調用函數調用的一般形式:

函數名(實參列表);說明:如果調用無參函數,實參列表忽略,但括弧應保留實際參數表中的參數可以是常數,變數或其他構造類型數據及運算式,各實參之間用逗號分隔實參和形參在數量,類型,順序上應意義對應注意:不同系統,函數實參的計算順序是不同的,微機一般是從右向左。為避免混亂,應儘量在調用函數之前,先計算實參。(P151)電子科技大學通信與資訊工程學院函數的調用例:實參的順序#include"stdio.h"intfun(inta,intb){ intc; if(a>b)c=1; elseif(a==b)c=0; elsec=-1 returnc;}main(){inti=2,r;r=fun(i,++i);printf("r=%d\n",r);}電子科技大學通信與資訊工程學院函數調用方式函數語句:

形式:函數名(實參表);例:printf("%d\n",a);這種方式不要求函數帶返回值,函數僅完成一定操作,適用於函數類型為void函數運算式函數返回值參與運算,函數類型不能為void例:m=max(a,b); n=max(a,b)*25;

printf("max=%d\n",max(a,b));電子科技大學通信與資訊工程學院函數原型聲明(Declaration)在程式中調用函數,必須滿足“先定義,後使用”如果被調函數的定義在主調函數之後,則應該在使用被調函數前,進行函數原型聲明——“先聲明(定義),後使用”函數原型說明格式:

類型符函數名(類型形參,類型形參…);

类型符函数名(類型,類型…);

電子科技大學通信與資訊工程學院“先聲明(定義),後使用”#include"stdio.h"intsum(intb,inta){ a=a+b; b=a+b; returna;}main(){inta=1,b=2,c;c=sum(a,b);printf("sum=%d\n",c);}#include"stdio.h"intsum(int,int);main(){inta=1,b=2,c;c=sum(a,b);printf("sum=%d\n",c);}intsum(intb,inta){ a=a+b; b=a+b; returna;}電子科技大學通信與資訊工程學院“先聲明(定義),後使用”對於調用庫函數,其函數的原型說明在相應的頭檔中(.h),在程式中通過使用#include預處理命令將其插入例#include"stdio.h"#include"math.h"intfunc(floata){ if(b!=0)return(sin(a)/a); return(-9999);}main(){floata,sam;scanf("%f",&a);sam=func(a);printf("sample=%f\n",sam);}電子科技大學通信與資訊工程學院函數的嵌套調用函數嵌套調用:被調函數的函數體中又調用其他函數#include"stdio.h"voidprintstar(){printf("****************\n");}voidprint_message(){

printstar();printf("Howdoyoudo!\n");}main(){print_message();printstar();}電子科技大學通信與資訊工程學院main(){...print_message();printstar();}print_message(){

printstar();...}printstar(){...}printstar(){...}第一層第二層第三層電子科技大學通信與資訊工程學院函數的嵌套調用例:計算s=(x!)3+(y!)3分析:題目中涉及到兩種運算:階乘和立方,可以考慮使用兩個函數來分別實現以上兩種運算——階乘(fac())立方(cube())#include"stdio.h"unsignedlongfra(int);unsignedlongpow(int);main(){intx,y;longs;scanf("%d%d",&x,&y);s=cube(x)+cube(y);printf("s=%ld\n");}longcube(intp){inti;longtmp;tmp=fac(p);for(i=0;i<3;i++) tmp*=tmp;returntmp;}longfac(intq){inti=1;longtmp=1;for(i=1;i<=q;i++) tmp*=i;returntmp;}電子科技大學通信與資訊工程學院數組作函數的參數數組元素作函數的實參:數組元素就是普通變數,仍然是單向值傳遞例:求10個數的最大數#include"stdio.h"intmax(intx,inty){return(x>y?x:y);}main(){inta[10],i,m=0;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++)m=max(m,a[i]);printf("max=%d\n",m);}電子科技大學通信與資訊工程學院數組名作為函數的實參數組名作為函數的實參:如果函數的形參是數組(或者是數組的首地址)則函數的實參必須是數組名(數組名就是數組的首地址)例:求10個數的最大數#include"stdio.h"intmax(intx[],intn){inti,m;m=x[0];for(i=0;i<n;i++) if(m<x[i])m=x[i];returnm;}main(){inta[10],i,m=0;for(i=0;i<10;i++)scanf("%d",&a[i]);printf("max=%d\n",max(a,10));}電子科技大學通信與資訊工程學院數組名作為函數的實參地址a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]注意:用數組名作實參時,傳遞的是數組的首地址;有時根據需要,可以增設一個形參,主函數可以傳通過此形參傳遞需要處理的數組元素的個數形參數組和實參數組共用同一記憶體單元如果在被調函數中修改形參數組的元素值,就相當於在主調函數中直接修改實參數組對應的元素值202A202B... 2033x[0]x[1]x[2]x[3]x[4]x[5]x[6]x[7]x[8]x[9]電子科技大學通信與資訊工程學院數組名作為函數的實參例:用冒泡法排序#include"stdio.h"voidsort(intx[],intn){inti,j,tmp;for(i=1;i<=n-1;i++){for(j=1;j<=n-i;j++) if(x[j]>x[j+1]){tmp=x[j];x[j]=x[j+1]; x[j+1]=tmp;}}}main(){inta[11],i;for(i=1;i<=10;i++)scanf("%d",&a[i]);sort(a,10);for(i=1;i<=10;i++)printf("a[%d]=%d",i,a[i]);}電子科技大學通信與資訊工程學院多維數組作函數參數如果形參為多維數組,可以省略第一維長度,其他維數不能省。實參仍然實數組名例:有一個3*4的矩陣,求出其中的最大元素的值#include"stdio.h"intmax(intx[3][4]){inti,j,m;for(i=0;i<3;i++)for(j=0;j<4;j++) if(x[i][j]>m)m=x[i][j];returnm;}main(){inta[3][4]={{1,2,3,9},{10,2,7,

4},{0,1,9},{12}};printf("max=%d\n",max(a));}電子科技大學通信與資訊工程學院局部變數和全局變數局部變數在一個函數內部定義的變數,它的有效範圍是它被定義的函數範圍內intf1(inta,intb){intx,y;floatf[10];scanf("%d",&x);...}intf2(floatpi){charc[]="hello";inti,j;...}main(){inti,p;...}x,y,

f[10]有效c[],i,j

有效i,p

有效電子科技大學通信與資訊工程學院局部變數局部變數函數的形參,有效範圍是在該函數內某個複合語句中定義的變數,有效範圍只在該複合語句中intf1(inta,intb){intx,y;scanf("%d",&x);...}intf2(floatpi){...}main(){inti,p;...{inti,j;...i=2+j;} }a,b有效pi

有效i,j

有效電子科技大學通信與資訊工程學院局部變數說明:局部變數只在定義它的範圍內有效有效:可以被其他代碼訪問、使用,即“可見”如果局部變數的有效範圍有重疊,則有效範圍小的優先main(){inta=1,b,c;...{inta,j;a=3+j;}}局部優先c有效電子科技大學通信與資訊工程學院全局變數全局變數(外部變數):在函數之外定義的變數全局變數的有效範圍:從定義變數的位置開始,到原始檔案結束函數可以使用局部變數和全局變數intk=10;intf1(inta,intb){intx,y;scanf("%d",&x);...}charq[]="hello";intf2(floatpi){...}main(){inti,p;...}k有效q[]

有效電子科技大學通信與資訊工程學院全局變數說明:可以利用全局變數在函數間傳遞數據,但應謹慎使用(儘量少用)如果全局變數與局部變數同名,則局部變數優先例:讀程式inta=3,b=5;intmax(inta,intb){return(a>b?a:b);}main(){inta=8;printf("max:%d",max(a,b));}電子科技大學通信與資訊工程學院全局變數例:P170例8.1510主調函數記憶體空間被調函數記憶體空間score[]array[]naveMaxMinaverMaxMinMaxMin電子科技大學通信與資訊工程學院變數存儲類別變數的作用域(即“可見”範圍):全局變數和局部變數變數的存儲類別/生存期(即變數在內存中存儲的位置):動態存儲變數和靜態存儲變數記憶體中用戶區:程式區存放程式的指令靜態存儲區存放全局變數和靜態的局部變數動態存儲區存放函數的局部變數,函數的形參變數,函數調用時的現場保護和返回地址;指令(程式區)數據段(靜態存儲區)堆疊段(動態存儲區)應用程式運行期

間,在內存中的映像電子科技大學通信與資訊工程學院#include"stdio.h"inta=1;charb[]="china";staticdoubled=1.2345;main(){ inti=0,j,k; intp[20]={0};printf("Input:\n"); scanf("%d",&k);...}可執行檔頭數據段初始化的全局和靜態變數文本段可執行代碼指令局部變數在可執行檔中沒有專門的存儲區域,它們在運行時創建C根源程式(hello.c)可執行檔(hello)編譯,連接電子科技大學通信與資訊工程學院可執行檔頭數據段初始化的全局和靜態變數文本段可執行代碼指令指令(程式區)數據段(靜態存儲區)堆疊段(動態存儲區)...可執行檔(hello)記憶體映像加載電子科技大學通信與資訊工程學院指令(程式區)數據段(靜態存儲區)堆疊段(動態存儲區)...返回地址前一個活動記錄函數形參局部變數過程活動記錄返回地址前一個活動記錄函數形參局部變數電子科技大學通信與資訊工程學院堆疊段(動態存儲區)

intnum=102001 main() {inta,b; ...20A1fun1(a);}301A fun1(intx) {charc;...30EFfun2(c); ...}3100 fun2(charp) {...return;}返回地址前一個活動記錄(空)函數形參(空)局部變數(a,b)返回地址(20A1)前一個活動記錄函數形參(x)局部變數(c)返回地址(30EF)前一個活動記錄函數形參(p)局部變數(空)靜態存儲區num=10動態存儲區電子科技大學通信與資訊工程學院變數存儲類別存放在靜態存儲區中的變數(靜態變數,全局變數)當程式執行時就分配記憶體空間;並且生存週期是程式的整個執行過程(直到程式結束)存放在動態存儲區中的變數(局部變數,形參)當定義該變數的函數被調用時,系統才自動為其分配記憶體空間,並且生存週期是函數的執行期間,當函數執行完畢,系統自動收回為其分配的記憶體空間電子科技大學通信與資訊工程學院動態存儲變數和靜態存儲變數變數的存儲類別(生存期)共有四種存儲類別:自動(auto)寄存器(register)靜態(static)外部的(extern)電子科技大學通信與資訊工程學院存儲在動態存儲區裏的變數自動變數:存儲在動態存儲區說明格式:auto類型說明變數名;例:f1(inta)

{

autofloatf;

charc;

...

}auto可以省略,系統默認維自動變數形參(a),局部變數(f和c)都是自動變數,函數執行時,系統為其分配記憶體空間,函數調用結束時,系統自動收回空間電子科技大學通信與資訊工程學院存儲在動態存儲區裏的變數寄存器變數(register)寄存器是電腦cpu的重要組成部分,在一個程式中,對於頻繁使用的變數從記憶體取數送到運算器中運算,再把運算的結果送回到記憶體中要花費很多的時間。在C語言中允許將一些頻繁使用的變數存放在電腦的寄存器中,以節省運算時間,提高效率。(P176)電子科技大學通信與資訊工程學院寄存器變數(register)格式:register類型名變數名;例:registerinti;說明:只有局部動態變數(形參)可以被定義為寄存器變數,而局部靜態變數不能被定義為寄存器變數電腦寄存器個數有限,不能任意定義寄存器變數的個數某些系統將寄存器變數轉化為自動變數處理,而有些系統會自動設置寄存器變數電子科技大學通信與資訊工程學院存儲在靜態存儲區裏的變數局部靜態變數格式:static類型說明變數名;例:staticinta=10;在函數內定義,其作用域屬於局部,即只能在被定義的函數內使用,其他的函數不能使用這個變數屬於靜態存儲類別,存儲在內存的靜態存儲區,在整個程式運行期間都不釋放空間在編譯時賦初值,且只賦一次(若未賦初值,系統會自動賦初值),當再次調用該函數時,不再進行賦初值,而是保留的是上次函數調用結束後的值電子科技大學通信與資訊工程學院局部靜態變數例:讀程式例:P174例:P175例8.18#include"stdio.h"longfac(intn){staticlongf=1;f=f*n;returnf;}main(){intj=5;for(j=1;j<=5;j++)printf("%d!=%ld\n",j,fac(j));}電子科技大學通信與資訊工程學院存儲在靜態存儲區裏的變數全局變數:都存儲在靜態存儲區中電子科技大學通信與資訊工程學院全局變數的作用域(有效範圍)全局變數的有效範圍:從定義變數的位置開始,到原始檔案結束擴展全局變數的作用域——extern情況1:在一個原始檔案中聲明全局變數#include"stdio.h"intmax(intx,inty){ return

(x>y?x:y);}main(){externintN1,N2;printf("%d\n",max(N1,N2));}intN1=12,N2=21;如果在全局變數定義點之前(即有效範圍之外)要使用該變數,可以在使用之前,使用extern來聲明該外部變數電子科技大學通信與資訊工程學院擴展全局變數的作用域情況1:在一個原始檔案中聲明全局變數格式:extern類型說明變數名;extern作用:聲明一個全局變數,擴展該全局變數的作用域,作用域為:從extern聲明開始,到原始檔案結束。extern的含義:告訴編譯器:代碼將使用一個全局變數(類型,變數名),而該變數的定義在原始檔案的某個地方。電子科技大學通信與資訊工程學院擴展全局變數的作用域情況2:在多個原始檔案中使用全局變數#include"stdio.h"externintN1,N2intmax(int,int);main(){printf("%d\n",max(N1,N2));}intN1=12,N2=21;intmax(intx,inty){ return

(x>y?x:y);}file1.cfile2.c使用extern來聲明該外部變數,將全局變數N1和N2的作用範圍從原始檔案file2擴展到原始檔案file1電子科技大學通信與資訊工程學院擴展全局變數的作用域情況2:在多個原始檔案中使用全局變數全局變數只能被定義一次,所以全局變數只能在一個原始檔案中被定義定義:告訴編譯器按照變數的類型,為其分配記憶體空間全局變數可以被extern聲明多次,當全局變數在多個原始檔案中被聲明時,其作用域也就擴展到多個原始檔案extern聲明只是告訴編譯器該變數的類型和名字,並不分配記憶體空間電子科技大學通信與資訊工程學院擴展全局變數的作用域情況3:將全局變數的作用域限制在一個原始檔案中使用關鍵字static例:#include"stdio.h"externintN1,N2intmax(int,int);main(){printf("%d\n",max(N1,N2));}staticintN1=12,N2=21;intmax(intx,inty){ return

(x>y?x:y);}file1.cfile2.c電子科技大學通信與資訊工程學院注意關鍵字static對局部變數和全局變數的作用不同修飾局部變數:設定局部變數的存儲類別為靜態存儲修飾全局變數:使全局變數的作用域限制在一個原始檔案內電子科技大學通信與資訊工程學院程式舉例例:編寫一個函數swap用於交換兩個整數方法1 方法2(全局變數)#include"stdio.h"voidswap(intx,inty){inttmp;tmp=x;x=y;y=tmp;}main(){inta,b;scanf("%d%d",&a,&b);swap(a,b);printf("%d,%d\n",a,b);}#include"stdio.h"intx,y;voidswap(){inttmp;tmp=x;x=y;y=tmp;}main(){scanf("%d%d",&x,&y);swap();printf("%d,%d\n",x,y);}2004-9-15第二章 程式的靈魂——演算法2004-9-15程式程式包括兩個方面:對數據的描述,即數據結構(datastructure)對操作的描述(操作步驟),即演算法(algorithm)操作的對象是數據,操作的目的是對數據進行加工處理,以獲取結果演算法:解決”做什麼”和”怎麼做”的問題語句(statements)只是演算法的具體體現沃思公式:數據結構+演算法=程式2004-9-15演算法的概念演算法(廣義):為解決一個問題而採用的方法和步驟。演算法多樣性不同的演算法具有簡單和複雜的分別,但首要保證演算法正確性,再考慮演算法的品質。電腦演算法:是電腦為解決一個問題而採用的方法和步驟。電腦演算法的兩大類:數值運算演算法:目的求數值解非數值運算演算法:應用廣泛2004-9-15簡單演算法舉例例2.1求5!思考:給定正整數n,求n

應具有通用性、靈活性累加,累乘等運算問題的基本演算法累計結果(total):需要設定初值;變化量(i):正確確定每次參與運算的變化量累次計算,直到i到達預期範圍total=totalOPERATOR(運算符)i;改變i值,重複計算應用:例2.42004-9-15簡單演算法舉例例2.3判斷2000-2500年中的每一年是否閏年,將結果輸出。仔細確定判斷條件,逐步縮小判斷範圍對範圍的確定要保證無遺漏2004-9-15演算法的特性有窮性:要確定合理的限定範圍確定性有零個或多個輸入有一個或多個輸出有效性2004-9-15怎樣表示一個演算法演算法表示的方法:自然語言:通俗易懂,但文字冗長,不嚴格,易出現歧義性傳統流程圖:直觀形象,易於理解用圖框表示各種操作。用流程線表示各圖框的執行順序要注意避免無規律的流程轉向結構化流程圖(N-S流程圖)演算法全部的矩形框內無流程線偽代碼PAD圖2004-9-15程式設計的三種基本結構順序結構:自頂向下,無分支,無轉移選擇結構:有分支,需條件判斷迴圈結構:有轉移,某些語句需要重複執行當型(While型)迴圈直到型(Until型)迴圈這三種基本結構可以組成任意複雜的演算法。2004-9-15順序結構順序結構:自頂向下順序執行,無分支,無轉移AB流程圖表示法ABN-S圖表示法ab2004-9-15選擇結構(選取結構、分支結構)選擇結構:有分支,需條件判斷無論條件p是否成立,只能執行A,B兩個分支中的一支A、B分支中,可以有一支是“空語句”(圖2.16)AB流程圖表示法N-S圖表示法pYes/成立NO/不成立ABp成立不成立ab2004-9-15迴圈結構(重複結構)當型(While型)迴圈流程順序:“判斷

執行

再判斷

再執行

...”由判斷條件P決定重複執行的次數,迴圈次數可控當P不成立時,停止迴圈循環體內應該有使迴圈停止的操作A流程圖表示法N-S圖表示法p成立不成立A當p成立ab2004-9-15迴圈結構(重複結構)直到(Until型)型迴圈先執行,再判斷(即操作A至少要執行一次)重複執行,直到條件滿足(即條件不成立時,重複執行)流程圖表示法N-S圖表示法p不成立成立A直到p成立Aab2004-9-15基本結構的特點基本結構的特點:只有一個入口只有一個出口結構內部每一部分都能被執行到結構內不存在“死迴圈”由基本結構所構成的演算法屬於”結構化”的演算法不存在無規律的轉向,只在結構內部才存在分支和跳轉2004-9-15偽代碼(pseudocode)偽代碼:用文字和符號描述演算法格式自由,書寫方便,修改容易一般在設計演算法時使用電子科技大學通信與資訊工程學院第六章 迴圈控制電子科技大學通信與資訊工程學院概述迴圈結構:在給定條件成立時,反復執行某程式段,直到條件不成立為止。給定的條件稱為迴圈條件,反復執行的程式段稱為循環體。實現迴圈的四種語句用goto語句和if語句構成迴圈;(不提倡)用while語句;(while型迴圈,先判斷,再執行)用do-while語句;(先執行,再判斷)用for語句;(多功能)電子科技大學通信與資訊工程學院goto語句以及用goto語句構成迴圈goto語句功能:無條件地轉向語句標號所在的語句行出開始執行格式為:goto語句標號;語句標號:屬於識別字,命名規則與變數相同不提倡使用,會破壞結構化,例: 例:求1+2+3…+100的和

for(...)for(...){...if(disaster)gotoerror;}...error:printf(“ERROR\n”);#include"stdio.h"main(){intsum=0,i=1;loop:if(i<=100){sum=sum+i;i++;gotoloop; } printf("sum=%d\n",sum);}電子科技大學通信與資訊工程學院while語句格式:while(運算式)

语句;例:求1+2+3…+100的和語句當(運算式)為真語句運算式0(假)非0(真)#include"stdio.h"main(){intsum=0,i=1;while(i<=100){sum=sum+i;i++;} printf("sum=%d\n",sum);}循環體迴圈變數電子科技大學通信與資訊工程學院while語句例:∑n

例:n!#include"stdio.h"main(){intsum,i;intn;printf("Inputn:\t");scanf("%d",&n);sum=0;i=1;while(i<=n){sum+=i;i++;} printf("sum=%d\n",sum);}#include"stdio.h"main(){intfac,i;intn;printf("Inputn:\t");scanf("%d",&n);fac=1;i=1;while(i<=n){sum*=i;i++;}printf("factorial=%d\n",fac);}電子科技大學通信與資訊工程學院while語句例:統計從鍵盤輸入一行字元的個數#include"stdio.h"main(){intnum=0;

printf("inputastring:\t");

while(getchar()!=‘\n’)num++;

printf("characternumber=%d\n",num);

}電子科技大學通信與資訊工程學院while語句注意事項迴圈前,應先給迴圈變數賦初值循環體中,一般應該有修改迴圈變數值的語句,使迴圈趨向結束(即使運算式的值變為假)循環體如包括有一個以上的語句,則必須用複合語句(即用{}括起來)循環體可以為空例:while((c=getchar())!='Q');

等價:c=getchar();

while(c!='Q')

c=getchar();電子科技大學通信與資訊工程學院do-while語句格式:do

语句;

while(運算式);特點:先執行,再判斷區別:while語句:先判斷,再執行語句直到(運算式)為假運算式非0(真)0(假)語句電子科技大學通信與資訊工程學院區別:dowhile&whilewhile dowhile #include"stdio.h"main(){intsum=0,n;scanf("%d",&n);while(n<=10){sum+=n;n++;}

printf("sum=%d\n",sum);

}

#include"stdio.h"main(){intsum=0,n;scanf("%d",&n);do{sum+=n;n++;}while(n<=10);

printf("sum=%d\n",sum);

}

電子科技大學通信與資訊工程學院dowhile語句例:求2+4+...+n(n為偶數) #include"stdio.h"main(){intsum,i;intn;do{ printf("Inputn(even):\t");scanf("%d",&n);}while(n%2);sum=0;i=2;while(i<=n){sum+=i;i+=2;} printf("sum=%d\n",sum);}電子科技大學通信與資訊工程學院for語句格式:

for(運算式1;運算式2;運算式3)

语句;注意:運算式1只執行一次,且在進入循環體之前執行,運算式1的功能一般為迴圈變數置初值;運算式3實際上循環體的一部分

非0(真)0(假)語句求解運算式1運算式2求解運算式3循環體外

下一條語句電子科技大學通信與資訊工程學院for語句例:求1+2+3…+100的和for語句 while語句#include"stdio.h"main(){intsum=0,i=1;while(i<=100){sum=sum+i;i++;} printf("sum=%d\n",sum);}#include"stdio.h"main(){intsum=0,i;for(i=0;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}電子科技大學通信與資訊工程學院{循環體}for語句運算式1省略時,應該在for迴圈前為迴圈變數賦初值運算式2省略時;不判斷迴圈條件,將成為“死迴圈”,可以在循環體內使用break語句退出迴圈運算式3省略時,循環體內應該有修改迴圈變數的語句for(;; )運算式1迴圈變數賦初值運算式2迴圈條件運算式3迴圈變數增值電子科技大學通信與資訊工程學院for語句例同時省略運算式1和運算式3,只有運算式2,則相當於while語句i=0;for(;i<=100;i++)sum+=i;i=0;for(;i<=100;){

sum+=i;

i++;}i=0;while(i<=100){sum+=i;

i++;}電子科技大學通信與資訊工程學院for語句運算式2一般是關係運算式或邏輯運算式,但也可是數值運算式或字元運算式,只要其值非零,就執行循環體。例:for(;(c=getchar())!='Q';)

printf(“%c”,c);例:for(i=1;i-4;i++)

sum+=i;达式1和運算式3可以是一個簡單運算式也可以是逗號運算式。例:for(sum=0,i=1;I<=100;i++)

sum+=

i;電子科技大學通信與資訊工程學院

外迴圈 內迴圈迴圈的嵌套循環體內包含另一個完整的迴圈,稱為迴圈嵌套。內嵌循環體中還可以嵌套迴圈三種迴圈結構可以相互嵌套例 while(){

......

for(...;...;...){

....

}

...

}電子科技大學通信與資訊工程學院迴圈的嵌套各重迴圈有各自的迴圈變數內迴圈變化快,外迴圈變化慢例:for(i=1;i<10;i++){ for(j=1;j<=i;j++) printf("%d*%d=%d",j,i,j*i); printf("\n");}電子科技大學通信與資訊工程學院迴圈的嵌套列印下圖1234567890123#include"stdio.h"main(){inti,j,k;for(i=0;i<4;i++){for(j=0;j<6-2*i;j++)printf("");for(k=1;k<=2*i+1;k++)printf("*");printf("\n");}}****************電子科技大學通信與資訊工程學院幾種迴圈的比較不提倡用goto語句構成迴圈迴圈控制的比較迴圈變數初始化while(運算式){

語句;

...}迴圈變數初始化do{

語句;

...}while(運算式)for(運算式1;運算式2;運算式3){

語句;

...}迴圈變數初始化迴圈控制條件修改迴圈變數電子科技大學通信與資訊工程學院break和continue語句break語句用在迴圈語句和開關語句中在switch中,break使程式跳出switch而執行switch以後的語句。在迴圈結構中,break使程式終止迴圈而執行迴圈後面的語句,

通常break語句總是與if語句聯在一起,即滿足條件時便跳出迴圈。在多層迴圈中,一個break語句只向外跳一層。電子科技大學通信與資訊工程學院continue語句continue語句作用:結束本次迴圈(跳過迴圈本中剩餘的語句),而強行執行下一次迴圈。continue語句只用在for、while、do-while等循環體中,常與if條件語句一起使用,用來加速迴圈。電子科技大學通信與資訊工程學院程式舉例例1:輸入正整數m、n,求m和n的最大公約數舉例的目的:體會迴圈結構的特點——重複執行相同的操作。求最大公約數:輾轉相除法例:求18和31

的最小公約數次數被除數除數餘數1183018230181231812641260電子科技大學通信與資訊工程學院例1輸入m,nr=m%nr!=0m=n;n=r;r=m%n;輸出n#include"stdio.h"main(){intm,n;intr;printf("Inputm&n:\t");scanf("%d%d",&m,&n);printf("(%d,%d)=",m,n);r=m%n; while(r!=0){ m=n; n=r;r=m%n;} printf("%d\n",n);} 初始化迴圈變數循環體for(r=m%n;r!=0;r=m%n){m=n;n=r;}電子科技大學通信與資訊工程學院例2判斷一個整數是否是素數#include"stdio.h"#include"math.h"main(){intm,i,tmp;printf("inputn:\t");scanf("%d",&m);tmp=sqrt(m);for(i=2;i<=tmp;i++)if(m%i==0)break;if(i>tmp&&m!=1)printf("%disaprimenumber\n",m);elseprintf("%disnotaprimenumber\n",m);}輸入mi=2i<=m1/2m%i==0YNi>m1/2YN退出迴圈i++列印“素數”列印“非素數”電子科技大學通信與資訊工程學院第七章 數組電子科技大學通信與資訊工程學院概述回顧:基本數據類型(整型、浮點型、字元型)存儲特點:每個變數單獨存放。構造類型:intn[100]100101102103104...199n[0]n[1]n[2]n[3]n[4]...n[199]structstudent{intnumber;charname[10];intage;unionsex;intphone;}108張三numbernamesexphone男83201234電子科技大學通信與資訊工程學院構造類型構造類型:是由基本類型構造而成(例如:數組、結構體、共同體、枚舉型)構造類型每一個分量可以是:基本類型,也可以是構造類型存儲特點:構造類型變數的每個分量佔用相鄰的存儲空間重點:如何訪問構造類型變數的分量電子科技大學通信與資訊工程學院數組有序數據的集合:例如:矩陣,成績表若干分量組成分量具有相同類型按順序形式組織數組:按序列排列的具有相同數據類型的若干變數的集合數組名——表示一個數組(例:intnum[10];)數組名結合下標——表示數組中元素例:數組num中的第3號元素(變數):num[2]電子科技大學通信與資訊工程學院一維數組定義:

類型名數組名[常量運算式];例:intnum[10] 例:charstr[5]...n[0]n[1]n[9]int型分量

(2bytes)10個分量(2*10=20B)str[0]str[1]char型分量

(1byte)5個分量(1*5=5B)str[2]str[3]str[4]電子科技大學通信與資訊工程學院一維數組的定義注意數組名是用戶定義的數組識別字,與變數的命名規則相同數組名後只能根方括號"[]"方括號中的常量運算式表示數據元素的個數,稱為數組的長度。常量運算式只能是可以是常量和符號常量,不能是變數。例如:intindex;

scanf(“%d”,&index);

intnum[index];錯誤!!電子科技大學通信與資訊工程學院一維數組的存儲用連續的記憶體單元來存放數組中的各元素數組所需的記憶體空間:由數組元素的類型和數組的長度(數組元素個數)共同決定總位元組數=sizeof(基本類型)*數組長度例:intnum[10],

总字节数=sizeof(int)*10=20Bytes電子科技大學通信與資訊工程學院一維數組元素的引用數組先定義,再使用在C語言中只能逐個地使用下標變數,而不能一次引用整個數組。例:輸出10個元素的數組:for(i=0;i<10;i++)

printf("%d",a[i]);

而不能用:printf("%d",a);數組元素引用的一般形式為:數組名[下標]例:a[6],a[i],a[i+1]電子科技大學通信與資訊工程學院一維數組元素的引用下標:表示元素在數組中的順序號下標取值從0~數組長度-1例:inta[10];下標取值:0~9,即該數組的元素為a[0],a[1],a[2],...a[9]下標取值可以是整型常量和整型運算式例:a[n]=a[n-1]+a[0];電子科技大學通信與資訊工程學院一維數組元素的引用例:讀程式注意:數組下標與迴圈變數的關係#include"stdio.h"main(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;i=9;while(i>=0)printf("%d",a[i]);}電子科技大學通信與資訊工程學院一維數組的初始化在定義數組時,給數組元素賦初值例:inta[4]={1,3,5,7};a[0]=1;a[1]=3;a[2]=5;a[1]=7;給部分元素賦初值例:inta[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。給全部元素賦值時,可以不寫數組長度例:inta[]={1,2,3,4,5};inta[5]={1,2,3,4,5};注意:當數組長度與提供的初始值的個數不想同時,數組長度不能省略電子科技大學通信與資訊工程學院一維數組的初始化例:讀程式#include"stdio.h"main(){inti;inta[5]={1,2,3,4,5};intb[5]={1,2,3};intc[]={1,2,3,4,5};intd[5]; for(i=0;i<5;i++)

printf("a[%d]=%d",i,a[i]);printf("\n");

for(i=0;i<5;i++) printf("b[%d]=%d",i,b[i]);printf("\n");for(i=0;i<5;i++) printf("c[%d]=%d",i,c[i]);printf("\n");for(i=0;i<5;i++) printf("d[%d]=%d",i,d[i]);}電子科技大學通信與資訊工程學院一維數組程式舉例例(P116例6.7和P124例7.2)Fibonacci數列:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),求前20項數據,要求每行輸出4個數據。#include"stdio.h"main(){longintf1=1,f2=1,tmp;inti;

printf("%16ld%16ld",f1,f2);for(i=2;i<10;i++){f1=f1+f2;f2=f2+f1;

printf("%16ld%16ld",f1,f2); if(i%2==0)

printf("\n");}}#include"stdio.h"main(){longintf[21]={0,1,1};inti;for(i=3;i<21;i++)f[i]=f[i-1]+f[i-2];for(i=1;i<21;i++){

printf("%16ld",f[i]);if(i%4==0)printf("\n");}}電子科技大學通信與資訊工程學院一維數組程式舉例例:統計全班某門考試的平均分數和最高分數(設全班30人)#include"stdio.h"main(){inti;floatsum=0.0,high=0.0,floatscore,average;printf("Inputscores(30)\n");for(i=0;i<30;i++){scanf("%f",&score);sum+=score;if(score>high)high=score;}average=sum/i;printf("average=%f\t",average);printf("Highscore=%f\n",high);} #include"stdio.h"main(){floatscore[30]={0};for(i=0;i<30;i++)scanf("%f",&score[i]);for(i=0;i<30;i++){sum+=score[i];if(score[i]>high)high=score[i];}average=sum/i;printf("average=%f\t",average);printf("Highscore=%f\n",high);}電子科技大學通信與資訊工程學院一維數組程式舉例例(P124例7.3)冒泡法排序9845209845209845209845209第一趟984520第二趟第三趟第四趟第五趟第一趟(共比較5次),大數9“沉底”,小數“浮起”;第二趟(共比較4次),次大數8“沉底”(倒數第二位),小數“浮起”;如此迴圈,可以推之6個數需要進行5趟冒泡;那麼N個數,需要進行N-1趟冒泡,並且,第i趟冒泡,需要兩兩比較N-i次84520098電子科技大學通信與資訊工程學院冒泡法排序要排序的數可以放在數組中(設有N個數)用二重迴圈控制排序過程:外迴圈i控制冒泡的趟數(N-1)內迴圈j控制每趟冒泡需要比較的次數(N-i)輸入n個數到s[1]~s[n]外迴圈:i從1~n-1趟內迴圈:j從1到n-i次s[j]>s[j+1]YN交換s[j]和s[j+1]的值輸出n個數:s[1]~s[n]#defineNUM6main(){ints[NUM+1]={0,9,8,4,5,2,0};inti,j,k,tmp;for(i=1;i<=NUM-1;i++){for(j=1;j<=NUM-i;j++)if(s[j]>s[j+1]){tmp=s[j];s[j]=s[j+1];s[j+1]=tmp;}for(k=1;k<=NUM;k++)printf("%10d",s[k]);printf("\n");}} 電子科技大學通信與資訊工程學院二維數組理解二維數組:數組的元素又是一個數組,所以可以將二維數組理解為“數組的數組”照次理解,還可以構造出三維數組,四維數組,等多維數組a00a01a02a10a11a12a20a21a22inta[0][3]:a[0][0];a[0][1];a[0][2]inta[1][3]:a[1][0];a[1][1];a[1][2]inta[2][3]:a[2][0];a[2][1];a[2][2]inta[3][]inta[3][3]電子科技大學通信與資訊工程學院二維數組定義:

類型說明符數組名[常量運算式1][常量運算式2]常量運算式1:表示第一維下標的長度常量運算式2:表示第二維下標的長度例:inta[3][4];理解1:定義了一個3行4列的數組,數組名為a,該數組的下標變數共有3×4個,即:

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3]理解2:定義了一個一維數組a,有三個元素:a[0]、a[1]、a[2],而每一個元素又是一個包含4個整型元素的一維數組二維數組的定義inta[][]inta[0][4]:a[0][0]a[0][1]a[0][2]a[0][3]inta[1][4]:a[1][0]a[1][1]a[1][2]a[1][3]inta[2][4]:a[2][0]a[2][1]a[2][2]a[2][3]電子科技大學通信與資訊工程學院二維數組的存儲二維數組在概念上可以理解成行×列矩陣,但在記憶體是一維的,所以二維數組在內存中是按照一定規則存儲:按行存放charc[2][3]c[0][0]c[0][1]c[0][2]c[1][0]c[1][1]c[1][2]200020012002200320042005地址電子科技大學通信與資訊工程學院二維數組元素的引用二維數組的元素也稱為雙下標變數,引用形式:

數組名[下標][下標]下標應為整型常量或整型運算式例:inta[3][4],b[4][2] /*定義數組*/

a[2][1+2]=b[i-1][1];/*對二維數組的引用*/注意:下標的取值範圍區別數組的定義與引用:數組定義:方括號中給出的是該數組某一維的長度,即可取下標的最大值,長度只能是整型常量數組引用:引用數組中的一個變數,該變數在數組中的位置由下標說明,下標可以是常量,變數或運算式電子科技大學通信與資訊工程學院二維數組的初始化按存放順序賦初值例:intx[2][3]={1,2,3,4,5,6};

等價:x[0][0]=1;x[0][1]=2;x[0][2]=3;x[1][0]=4;x[1][1]=5;x[1][2]=5;按行賦初值例:intx[2][3]={{1,2,3},{4,5,6}};部分賦初值,未賦初值的元素自動取0值intx[2][3]={1,2,3,4};等價:

x[0][0]=1;x[0][1]=2;x[0][2]=3;x[1][0]=4;x[1][1]=0;x[1][2]=0;intx[2][3]={{1,2,},{4}};

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论