C語言程序設(shè)計(jì)-第八章優(yōu)化學(xué)生成績系統(tǒng)-指針_第1頁
C語言程序設(shè)計(jì)-第八章優(yōu)化學(xué)生成績系統(tǒng)-指針_第2頁
C語言程序設(shè)計(jì)-第八章優(yōu)化學(xué)生成績系統(tǒng)-指針_第3頁
C語言程序設(shè)計(jì)-第八章優(yōu)化學(xué)生成績系統(tǒng)-指針_第4頁
C語言程序設(shè)計(jì)-第八章優(yōu)化學(xué)生成績系統(tǒng)-指針_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目八優(yōu)化學(xué)生成績分析系統(tǒng)-指針1【項(xiàng)目要求】借助于指針對上一章的的學(xué)生成績分析系統(tǒng)進(jìn)行優(yōu)化,對某班一門課的成績進(jìn)行分析,要求有如下功能:1.查詢?nèi)砍煽儯?.查詢平均分;3.查詢不及格率;4.查詢最高分;5.按成績降序排列;0.退出。為了保存一個(gè)班的C語言成績需要借助于一維數(shù)組,通過指針對其數(shù)據(jù)進(jìn)行操作。將本項(xiàng)目分成兩部分,首先借助于指針對一維數(shù)組進(jìn)行訪問,然后介紹一種新的排序算法—選擇排序?!卷?xiàng)目分析】2問題情境及實(shí)現(xiàn)

通過前面所學(xué)知道,可以通過下標(biāo)法訪問數(shù)組元素,數(shù)組名代表數(shù)組的首地址,即指針,我們亦可通過其對數(shù)組元素進(jìn)行訪問。#defineN100#include<stdio.h>voidmain(){int

s[N],n,*p;printf("請輸入該班人數(shù)");scanf("%d",&n);printf("請錄入成績");for(p=s;p<s+n;p++)

scanf("%d",p);printf("該班的全部成績是:\n");for(p=s;p<s+n;p++)printf("%6d",*p);}344本講主要內(nèi)容2.指針與函數(shù)本講小結(jié)1.指針與字符串3.指針數(shù)組重點(diǎn):指針與函數(shù)4.指針應(yīng)用舉例1指針與字符串(1)1.1字符串的表示形式用字符數(shù)組存放一個(gè)字符串,并輸出該字符串。

main(){ charstring[]="IloveChina!";

printf("%s\n",string);}如果用字符指針,這段代碼應(yīng)如何修改?51指針與字符串(2)1.1字符串的表示形式(續(xù))用字符串指針指向一個(gè)字符串

main(){ char*string="IloveChina!";

printf("%s\n",string);}61指針與字符串(3)1.1字符串的表示形式(續(xù))例1寫出下面程序的運(yùn)行結(jié)果

#include<stdio.h>voidmain(){char*ptr1,*ptr2;ptr1=ptr2="abcde";

while(*ptr2!='\0')

putchar(*ptr2++);

putchar('\n');

while(--ptr2>=ptr1)

putchar(*ptr2);

putchar('\n');}運(yùn)行結(jié)果:abcdeedcba71指針與字符串(4)1.2使用字符串指針變量與字符數(shù)組的區(qū)別①字符數(shù)組由若干元素組成,每個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是地址(字符串的首地址)。②賦值方式不同。對字符數(shù)組只能對各個(gè)元素賦值,不能用一個(gè)字符串給一個(gè)字符數(shù)組賦值,但對于字符指針變量可以用一個(gè)字符串給它賦值。charstr[14];str=“IloveChina”;char*pstr;pstr=“IloveChina”;√81指針與字符串(5)1.2使用字符串指針變量與字符數(shù)組的區(qū)別(續(xù))例2分析下面程序的運(yùn)行結(jié)果

main(){char*a="ILoveChina!";

a=a+7;

printf(“%s\n",a);}運(yùn)行結(jié)果:China!91指針與字符串(6)1.2使用字符串指針變量與字符數(shù)組的區(qū)別(續(xù))例3分析下面程序的運(yùn)行結(jié)果

main(){char*a="ILoveChina!";

inti;

printf("thesixthcharacteris%c\n",a[5]);for(i=0;a[i]!='\0';i++)

printf("%c",a[i]);}運(yùn)行結(jié)果:thesixthcharacteriseILoveChina!返回主菜單102指針與函數(shù)(1)2.1指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù),實(shí)參變量和形參變量的傳遞方式為地址傳遞voidswap1(intx,inty){

intz; z=x; x=y; y=z;}voidswap2(int*x,int*y){

intz; z=*x; *x=*y; *y=z;}值傳遞地址傳遞112指針與函數(shù)(2)2.1指針變量作為函數(shù)參數(shù)(續(xù))例4程序填空,然后分析運(yùn)行結(jié)果。(輸入5,6)#include<stdio.h>main(){

int

a,b;voidswap1(intx,inty);voidswap2(int*x,int*y);

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

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

);

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

);

printf("a=%d\tb=%d\n",a,b);}運(yùn)行結(jié)果:a=5b=6a=5b=6a=6b=5a,b&a,&b122指針與函數(shù)(3)2.1指針變量作為函數(shù)參數(shù)(續(xù))例5

一個(gè)自然數(shù)是素?cái)?shù),且它的數(shù)字位置經(jīng)過任意對換后仍為素?cái)?shù),則稱為絕對素?cái)?shù),例如13,試求所有兩位絕對素?cái)?shù)。解題思路①使用哪種類型的程序結(jié)構(gòu)?②給出一個(gè)數(shù),如何求任意數(shù)字位置對換后的數(shù)?③如何判斷一個(gè)數(shù)為素?cái)?shù)?例5程序編寫思考:如果求所有三位絕對素?cái)?shù),132指針與函數(shù)(4)2.2指向函數(shù)的指針變量在C語言中,一個(gè)函數(shù)占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。142指針與函數(shù)(5)2.2指向函數(shù)的指針變量(續(xù))函數(shù)指針變量定義的一般形式為:類型說明符(*指針變量名)();表示被指函數(shù)的返回值的類型“*”后面的變量是定義的指針變量指針變量所指的是一個(gè)函數(shù)如:int(*pf)();152指針與函數(shù)(6)2.2指向函數(shù)的指針變量(續(xù))用函數(shù)指針變量調(diào)用函數(shù)的一般形式為:(*指針變量名)(實(shí)參表)162指針與函數(shù)(7)2.2指向函數(shù)的指針變量(續(xù))例6將給出的程序修改為使用函數(shù)指針變量定義的方式

main(){

int

max(int,int);

inta,b,c;

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

printf("a=%d,b=%d,max=%d",a,b,c);}max(int

x,inty){

intz;

if(x>y)z=x;elsez=y;return(z);}int(*p)();p=max;c=(*p)(a,b);172指針與函數(shù)(8)2.2指向函數(shù)的指針變量—函數(shù)指針作為函數(shù)參數(shù)例7分析下面程序的執(zhí)行過程#include<stdio.h>main(){int

add(int

a,intb);

int

sub(int

a,intb);

fun(int(*)p(),int

a,intb);

int(*ps)(),x,y,z;

scanf("%d,%d",&x,&y);

if(x<y) z=fun(add,x,y);else{ ps=sub; z=fun(ps,x,y);}

printf("x=%d,y=%d,z=%d\n",x,y,z);}add(int

a,intb){return(a+b);}sub(int

a,intb){return(a-b);}fun函數(shù)如何定義?fun(int(*pf)(),int

a,intb){return((*pf)(a,b));}182指針與函數(shù)(9)2.2指向函數(shù)的指針變量—返回值為指針的函數(shù)定義返回值為指針變量類型的函數(shù)的一般形式為:類型符*函數(shù)名(參數(shù)表)192指針與函數(shù)(10)2.2指向函數(shù)的指針變量—返回值為指針的函數(shù)例8分析給出程序的運(yùn)行結(jié)果#include<stdio.h>int*f(int*x,int*y){ if(*x<*y) returnx; else returny;}voidmain(){ inta=17,b=18,*p,*q,*r; p=&a; q=&b; r=f(p,q);

printf("%d,%d,%d\n",*p,*q,*r);}運(yùn)行結(jié)果:17,18,17返回主菜單203指針數(shù)組(1)3.1指針數(shù)組指針數(shù)組的定義形式為:類型符*指針數(shù)組名[常量表達(dá)式];課堂練習(xí),分析下面語句的含義:int*p[4];Int(*p)[4];指針數(shù)組,有4個(gè)元素,每個(gè)元素都是指向整型變量指針變量由4個(gè)整型變量組成的數(shù)組的指針213指針數(shù)組(2)3.1指針數(shù)組(續(xù))#include<stdio.h>main(){staticint

a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,122,133}};

int*p[3]={a[0],a[1],a[2]};

int

i,j;

for(i=0;i<3;i++){

for(j=0;j<4;j++)

printf("a[%d][%d]=%d\t",i,j,p[i][j]);

printf("\n");}}133122110998877665544332211p[0]p[1]p[2]223指針數(shù)組(3)3.1指針數(shù)組(續(xù))#include<stdio.h>main(){staticint

a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,122,133}};

int*p[3]={a[0],a[1],a[2]};

int(*q)[4];

int

i,j;q=a;

for(i=0;i<3;i++){

for(j=0;j<4;j++)

printf("a[%d][%d]=%d\t",i,j,(*(q+i))[j]);

printf("\n");}}133122110998877665544332211qq+1q+2(*q)[0](*q)[1](*q)[2](*q)[3]233指針數(shù)組(4)P223指向指針的指針P224main函數(shù)的參數(shù)返回主菜單244指針應(yīng)用舉例(1)例9

編寫程序,利用系統(tǒng)提供的圖形庫函數(shù)在屏幕上畫一個(gè)圖形,方法是將一個(gè)半徑為r1的圓周等分n份,再以每個(gè)等分點(diǎn)為圓心,以半徑rs畫n個(gè)圓,要求在命令方式下給出r1,rs的值及環(huán)的顏色值。本例主要說明main函數(shù)參數(shù)的使用,254指針應(yīng)用舉例(2)例10編寫程序,采用冒泡法對一組整數(shù)進(jìn)行升序或降序排序,然后輸出排序結(jié)果。要求:由計(jì)算機(jī)生成10—100以內(nèi)的隨機(jī)整數(shù)50個(gè),放入數(shù)組。通過函數(shù)指針,完成對數(shù)組的升序或者降序的排序。本例主要說明指針作為函數(shù)參數(shù),返回主菜單262727本講小結(jié)掌握字符指針的使用掌握指針作為函數(shù)參數(shù)的使用了解指向函數(shù)的指針變量的使用了解指針數(shù)據(jù)的使用【項(xiàng)目要求】借助于指針對上一章的的學(xué)生成績分析系統(tǒng)進(jìn)行優(yōu)化,對某班一門課的成績進(jìn)行分析,要求有如下功能:1.查詢?nèi)砍煽儯?.查詢平均分;3.查詢不及格率;4.查詢最高分;5.按成績降序排列;0.退出。為了保存一個(gè)班的C語言成績需要借助于一維數(shù)組,通過指針對其數(shù)據(jù)進(jìn)行操作。將本項(xiàng)目分成兩部分,首先借助于指針對一維數(shù)組進(jìn)行訪問,然后介紹一種新的排序算法—選擇排序。【項(xiàng)目分析】28問題情境及實(shí)現(xiàn)

通過前面所講可實(shí)現(xiàn)本系統(tǒng)的前4個(gè)功能,下面借助于指針實(shí)現(xiàn)數(shù)據(jù)的排序。采用簡單選擇排序方法進(jìn)行,程序如下:#defineN100#include<stdio.h>#include<string.h>voidfselectsort(int*a,intn){int*p,*q,*pmax,t;for(p=a;p<a+n-1;p++){pmax=p;

for(q=p+1;q<a+n;q++)if(*pmax<*q)pmax=q;

if(p!=pmax){t=*p;*p=*pmax;*pmax=t;}}}

29相關(guān)知識:簡單選擇排序

簡單選擇排序的基本方法是:第一趟,從n個(gè)記錄中找出關(guān)鍵字最小的記錄與第一個(gè)記錄交換;第二趟,從第二個(gè)記錄開始的n-1個(gè)記錄中再選出關(guān)鍵字最小的記錄與第二個(gè)記錄交換;如此,第i趟,則從第i個(gè)記錄開始的n-i+1個(gè)記錄中選出關(guān)鍵字最小的記錄與第i個(gè)記錄交換,直到整個(gè)序列按關(guān)鍵字有序排列。30

簡單選擇排序算法:voidselectsort(datatype

r[],intn){int

i,j,t;

for(i=1;i<=n;i++){t=i;

for(j=i+1;j<=n;j++)

if(r[t]>r[j])t=j;

if(i!=t){r[0]=r[t];

r[t]=r[i];

r[i]=r[0];} }}31對如下關(guān)鍵字(49,38,65,97,76,13,27,49)進(jìn)行簡單選擇排序的過程見下圖。

r012345678初始關(guān)鍵字4938659776132749

13[38

65

97764927

49]第一趟結(jié)果:第二趟結(jié)果:

1327

[65

97764938

49]第三趟結(jié)果:

1327

38

[97

764965

49]第四趟結(jié)果:

1327

38

49[769765

49]第五趟結(jié)果:

1327

38

4949[9765

76]第六趟結(jié)果:

1327

38

4949[6597

76]第七趟結(jié)果:

1327

38

49496576

97簡單選擇排序移動記錄的次數(shù)較少,但關(guān)鍵字的比較次數(shù)依然是n(n+1)/2,所以時(shí)間復(fù)雜度仍為O(n2)。

32樹形選擇排序按照錦標(biāo)賽的思想進(jìn)行,將n個(gè)參賽的選手看成完全二叉樹的葉結(jié)點(diǎn),則該完全二叉樹有2n-2或2n-1個(gè)結(jié)點(diǎn)。首先,兩兩進(jìn)行比賽(在樹中是兄弟的進(jìn)行,否則輪空,直接進(jìn)入下一輪),勝出的再兄弟間再兩兩進(jìn)行比較,直到產(chǎn)生第1名。接下來,將作為第1名的結(jié)點(diǎn)看成最差的,并從該結(jié)點(diǎn)開始,沿該結(jié)點(diǎn)到根路徑上,依次進(jìn)行各分枝結(jié)點(diǎn)子女間的比較,勝出的就是第2名。因?yàn)楹退荣惖木莿倓傒斀o第1名的選手。如此,繼續(xù)進(jìn)行下去,直到所有選手的名次排定。33對如下關(guān)鍵字(49,38,65,97,76,13,27,49)進(jìn)行簡單選擇排序的過程見下圖。

r012345678初始關(guān)鍵字4938659776132749492776133849976549977649977697存放排序012345678結(jié)果的數(shù)組97再將97設(shè)為最差(最小)。34

r012345678初始關(guān)鍵字49386507613274949277613384906549657649657676存放排序012345678結(jié)果的數(shù)組7697再將76設(shè)為最差(最小)。35

r012345678初始關(guān)鍵字493865001327494927013384906549651349654965存放排序012345678結(jié)果的數(shù)組657697再將65設(shè)為最差(最小)。36

r012345678初始關(guān)鍵字493800013274949270133849004901349494949存放排序012345678結(jié)果的數(shù)組49657697注意:若取49則為穩(wěn)定的排序。再將49設(shè)為最差(最小)。37

r012345678初始關(guān)鍵字0380001327490270133849003801349384949存放排序012345678結(jié)果的數(shù)組4949657697再將49設(shè)為最差(最小)。38

r012345678初始關(guān)鍵字03800013270027013380003801327382738存放排序012345678結(jié)果的數(shù)組384949657697再將38設(shè)為最差(最小)。39

r012345678初始關(guān)鍵字0000013270027013000000132702727存放排序012345678結(jié)果的數(shù)組27384949657697再將27設(shè)為最差(最小)。40

r012345678初始關(guān)鍵字0000013000001300000013001313最后排序012345678的結(jié)果132738494965769741堆排序堆排序是樹形選擇排序方法的改進(jìn),它使用的輔助空間較少,僅增加一個(gè)記錄空間進(jìn)行交換,同時(shí)關(guān)鍵字比較的次數(shù)和樹形選擇排序相當(dāng)。1.堆的定義和存儲結(jié)構(gòu)堆是一棵完全二叉樹,組成這棵完全二叉樹的n個(gè)元素序列k1,k2,…,kn,當(dāng)且僅當(dāng)滿足下述關(guān)系之一時(shí),稱之為堆。Ki≥k2iKi≥k2i+1大頭堆或者Ki≤k2iKi≤k2i+1小頭堆其中i=1,2,…,n/242如以下關(guān)鍵字(49,38,65,97,76,13,27,49)所建立的大頭堆和小頭堆如下圖所示:用一維數(shù)組存儲一個(gè)堆,則堆對應(yīng)的存儲結(jié)構(gòu)如下:9776654949132738大頭堆1338274976654997小頭堆

012345678大頭堆9776654949132738012345678小頭堆133827497665499743建立初始堆

對初始序列建堆的過程,就是一個(gè)反復(fù)進(jìn)行篩選的過程。對n個(gè)結(jié)點(diǎn)的完全二叉樹只需從第n/2個(gè)元素開始。例如:對元素(49,38,65,97,76,13,27,49)進(jìn)行篩選的過程見下圖(建小頭堆)。4938659776132749i=4將97與49交換4938654976132797i=3將65與13交換444938134976652797i=2不進(jìn)行交換4938134976652797i=1將49與13交換再與27交換1338274976654997建好的小頭堆45從篩選過程可以看出,所建小頭堆是從第4個(gè)元素97開始,最后到第1個(gè)元素為止。整個(gè)篩選過程應(yīng)該是在數(shù)組中進(jìn)行的,其數(shù)組的變化過程見下圖。876543210

r4927137697653849初始關(guān)鍵字

4938

65497613279797被篩選后:

4938

13497665279765被篩選后:

4938

13497665279738被篩選后:

1338

27497665499749被篩選后(初始堆):46堆排序

設(shè)有n個(gè)元素,首先將這n個(gè)元素按關(guān)鍵字建成堆(根據(jù)所排序列的要求建成大頭堆或小頭堆),用根結(jié)點(diǎn)元素與第n個(gè)結(jié)點(diǎn)元素交換;然后對前n-1個(gè)結(jié)點(diǎn)進(jìn)行篩選,重新建堆,再以根結(jié)點(diǎn)元素與第n-1個(gè)結(jié)點(diǎn)元素交換;重復(fù)上述操作,直到整個(gè)序列有序。對上例進(jìn)行堆排序的過程見下圖。133827497665499713與97交換9738274976654913重建堆472738494976659713973849497665271327與97交換3849499776652713重建堆38與65交換6549499776382713重建堆48496549977638271349與76交換7665499749382713重建堆496576974938271349與97交換9765764949382713重建堆49659776494938271365與76交換7697654949382713重建堆769765494938271376與97交換977665494938271350整個(gè)堆排序和重建堆的過程也是在數(shù)組中進(jìn)行的其變化過程見下圖所示。初始012345678小頭堆1338274976654997初始012345678小頭堆1338274976654997堆排序中的數(shù)組變化過程重建堆的數(shù)組變化過程

973827497665491313與97對調(diào):

273849

4976659713

973849497665271327與97對調(diào):

3849

499776652713

654949977638271338與65對調(diào):

4965499776382713

766549974938271349與76對調(diào):

4965769749382713

976576494938271349與97對調(diào):

6597764949382713

769765494938271365與76對調(diào):

7697654949382713

977665494938271376與97對調(diào):重建堆重建堆重建堆重建堆重建堆重建堆堆排序的時(shí)間復(fù)雜度也為O(nlog2n),是一個(gè)不穩(wěn)定的排序方法。51按遞減序列堆排序的算法:voidheapadjust(datatype

r[],int

s,intm){r[0]=r[s];

for(j=2*s;j<=m;j=j*2)/*沿關(guān)鍵字較小的孩子結(jié)點(diǎn)向下篩選*/ {if(j<m&&r[j]>r[j+1])j=j+1;/*為關(guān)鍵字較小的元素下標(biāo)*/ if(r[0]<r[j])break;/*r[0]應(yīng)插入在位置s上*/

else{r[s]=r[j];s=j;}/*使s結(jié)點(diǎn)滿足堆定義*/}

r[s]=r[0];/*插入*/}voidheapsort(datatype

r[],intn){for(i=n/2;i>0;i--)Heapadjust(r,i,n);/*將r[1..n]建成堆*/

for(i=n;i>1;i--){r[0]=r[1];r[1]=r[i];r[i]=r[0];/*堆頂與堆低元素交換*/heapadjust(r,1,i-1);/*將r[1..i-1]重新調(diào)整為堆*/ }}521指針與字符串(1)1.1字符串的表示形式用字符數(shù)組存放一個(gè)字符串,并輸出該字符串。

main(){ charstring[]="IloveChina!";

printf("%s\n",string);}如果用字符指針,這段代碼應(yīng)如何修改?531指針與字符串(2)1.1字符串的表示形式(續(xù))用字符串指針指向一個(gè)字符串

main(){ char*string="IloveChina!";

printf("%s\n",string);}541指針與字符串(3)1.1字符串的表示形式(續(xù))例1寫出下面程序的運(yùn)行結(jié)果

#include<stdio.h>voidmain(){char*ptr1,*ptr2;ptr1=ptr2="abcde";

while(*ptr2!='\0')

putchar(*ptr2++);

putchar('\n');

while(--ptr2>=ptr1)

putchar(*ptr2);

putchar('\n');}運(yùn)行結(jié)果:abcdeedcba551指針與字符串(4)1.2使用字符串指針變量與字符數(shù)組的區(qū)別①字符數(shù)組由若干元素組成,每個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是地址(字符串的首地址)。②賦值方式不同。對字符數(shù)組只能對各個(gè)元素賦值,不能用一個(gè)字符串給一個(gè)字符數(shù)組賦值,但對于字符指針變量可以用一個(gè)字符串給它賦值。charstr[14];str=“IloveChina”;char*pstr;pstr=“IloveChina”;√561指針與字符串(5)1.2使用字符串指針變量與字符數(shù)組的區(qū)別(續(xù))例2分析下面程序的運(yùn)行結(jié)果

main(){char*a="ILoveChina!";

a=a+7;

printf(“%s\n",a);}運(yùn)行結(jié)果:China!571指針與字符串(6)1.2使用字符串指針變量與字符數(shù)組的區(qū)別(續(xù))例3分析下面程序的運(yùn)行結(jié)果

main(){char*a="ILoveChina!";

inti;

printf("thesixthcharacteris%c\n",a[5]);for(i=0;a[i]!='\0';i++)

printf("%c",a[i]);}運(yùn)行結(jié)果:thesixthcharacteriseILoveChina!返回主菜單582指針與函數(shù)(1)2.1指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù),實(shí)參變量和形參變量的傳遞方式為地址傳遞voidswap1(intx,inty){

intz; z=x; x=y; y=z;}voidswap2(int*x,int*y){

intz; z=*x; *x=*y; *y=z;}值傳遞地址傳遞592指針與函數(shù)(2)2.1指針變量作為函數(shù)參數(shù)(續(xù))例4程序填空,然后分析運(yùn)行結(jié)果。(輸入5,6)#include<stdio.h>main(){

int

a,b;voidswap1(intx,inty);voidswap2(int*x,int*y);

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

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

);

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

);

printf("a=%d\tb=%d\n",a,b);}運(yùn)行結(jié)果:a=5b=6a=5b=6a=6b=5a,b&a,&b602指針與函數(shù)(3)2.1指針變量作為函數(shù)參數(shù)(續(xù))例5

一個(gè)自然數(shù)是素?cái)?shù),且它的數(shù)字位置經(jīng)過任意對換后仍為素?cái)?shù),則稱為絕對素?cái)?shù),例如13,試求所有兩位絕對素?cái)?shù)。解題思路①使用哪種類型的程序結(jié)構(gòu)?②給出一個(gè)數(shù),如何求任意數(shù)字位置對換后的數(shù)?③如何判斷一個(gè)數(shù)為素?cái)?shù)?例5程序編寫思考:如果求所有三位絕對素?cái)?shù),612指針與函數(shù)(4)2.2指向函數(shù)的指針變量在C語言中,一個(gè)函數(shù)占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。622指針與函數(shù)(5)2.2指向函數(shù)的指針變量(續(xù))函數(shù)指針變量定義的一般形式為:類型說明符(*指針變量名)();表示被指函數(shù)的返回值的類型“*”后面的變量是定義的指針變量指針變量所指的是一個(gè)函數(shù)如:int(*pf)();632指針與函數(shù)(6)2.2指向函數(shù)的指針變量(續(xù))用函數(shù)指針變量調(diào)用函數(shù)的一般形式為:(*指針變量名)(實(shí)參表)642指針與函數(shù)(7)2.2指向函數(shù)的指針變量(續(xù))例6將給出的程序修改為使用函數(shù)指針變量定義的方式

main(){

int

max(int,int);

inta,b,c;

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

printf("a=%d,b=%d,max=%d",a,b,c);}max(int

x,inty){

intz;

if(x>y)z=x;elsez=y;return(z);}int(*p)();p=max;c=(*p)(a,b);652指針與函數(shù)(8)2.2指向函數(shù)的指針變量—函數(shù)指針作為函數(shù)參數(shù)例7分析下面程序的執(zhí)行過程#include<stdio.h>main(){int

add(int

a,intb);

int

sub(int

a,intb);

fun(int(*)p(),int

a,intb);

int(*ps)(),x,y,z;

scanf("%d,%d",&x,&y);

if(x<y) z=fun(add,x,y);else{ ps=sub; z=fun(ps,x,y);}

printf("x=%d,y=%d,z=%d\n",x,y,z);}add(int

a,intb){return(a+b);}sub(int

a,intb){return(a-b);}fun函數(shù)如何定義?fun(int(*pf)(),int

a,intb)

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論