版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目八優(yōu)化學(xué)生成績(jī)分析系統(tǒng)-指針1【項(xiàng)目要求】借助于指針對(duì)上一章的的學(xué)生成績(jī)分析系統(tǒng)進(jìn)行優(yōu)化,對(duì)某班一門(mén)課的成績(jī)進(jìn)行分析,要求有如下功能:1.查詢(xún)?nèi)砍煽?jī);2.查詢(xún)平均分;3.查詢(xún)不及格率;4.查詢(xún)最高分;5.按成績(jī)降序排列;0.退出。為了保存一個(gè)班的C語(yǔ)言成績(jī)需要借助于一維數(shù)組,通過(guò)指針對(duì)其數(shù)據(jù)進(jìn)行操作。將本項(xiàng)目分成兩部分,首先借助于指針對(duì)一維數(shù)組進(jìn)行訪問(wèn),然后介紹一種新的排序算法—選擇排序?!卷?xiàng)目分析】2問(wèn)題情境及實(shí)現(xiàn)
通過(guò)前面所學(xué)知道,可以通過(guò)下標(biāo)法訪問(wèn)數(shù)組元素,數(shù)組名代表數(shù)組的首地址,即指針,我們亦可通過(guò)其對(duì)數(shù)組元素進(jìn)行訪問(wèn)。#defineN100#include<stdio.h>voidmain(){int
s[N],n,*p;printf("請(qǐng)輸入該班人數(shù)");scanf("%d",&n);printf("請(qǐng)錄入成績(jī)");for(p=s;p<s+n;p++)
scanf("%d",p);printf("該班的全部成績(jī)是:\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寫(xiě)出下面程序的運(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è)字符,而字符指針變量中存放的是地址(字符串的首地址)。②賦值方式不同。對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值,不能用一個(gè)字符串給一個(gè)字符數(shù)組賦值,但對(duì)于字符指針變量可以用一個(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)過(guò)任意對(duì)換后仍為素?cái)?shù),則稱(chēng)為絕對(duì)素?cái)?shù),例如13,試求所有兩位絕對(duì)素?cái)?shù)。解題思路①使用哪種類(lèi)型的程序結(jié)構(gòu)?②給出一個(gè)數(shù),如何求任意數(shù)字位置對(duì)換后的數(shù)?③如何判斷一個(gè)數(shù)為素?cái)?shù)?例5程序編寫(xiě)思考:如果求所有三位絕對(duì)素?cái)?shù),132指針與函數(shù)(4)2.2指向函數(shù)的指針變量在C語(yǔ)言中,一個(gè)函數(shù)占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱(chēng)入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過(guò)指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱(chēng)為“函數(shù)指針變量”。142指針與函數(shù)(5)2.2指向函數(shù)的指針變量(續(xù))函數(shù)指針變量定義的一般形式為:類(lèi)型說(shuō)明符(*指針變量名)();表示被指函數(shù)的返回值的類(lèi)型“*”后面的變量是定義的指針變量指針變量所指的是一個(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í)行過(guò)程#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ù)定義返回值為指針變量類(lèi)型的函數(shù)的一般形式為:類(lèi)型符*函數(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ù)組的定義形式為:類(lèi)型符*指針數(shù)組名[常量表達(dá)式];課堂練習(xí),分析下面語(yǔ)句的含義: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
編寫(xiě)程序,利用系統(tǒng)提供的圖形庫(kù)函數(shù)在屏幕上畫(huà)一個(gè)圖形,方法是將一個(gè)半徑為r1的圓周等分n份,再以每個(gè)等分點(diǎn)為圓心,以半徑rs畫(huà)n個(gè)圓,要求在命令方式下給出r1,rs的值及環(huán)的顏色值。本例主要說(shuō)明main函數(shù)參數(shù)的使用,254指針應(yīng)用舉例(2)例10編寫(xiě)程序,采用冒泡法對(duì)一組整數(shù)進(jìn)行升序或降序排序,然后輸出排序結(jié)果。要求:由計(jì)算機(jī)生成10—100以?xún)?nèi)的隨機(jī)整數(shù)50個(gè),放入數(shù)組。通過(guò)函數(shù)指針,完成對(duì)數(shù)組的升序或者降序的排序。本例主要說(shuō)明指針作為函數(shù)參數(shù),返回主菜單262727本講小結(jié)掌握字符指針的使用掌握指針作為函數(shù)參數(shù)的使用了解指向函數(shù)的指針變量的使用了解指針數(shù)據(jù)的使用【項(xiàng)目要求】借助于指針對(duì)上一章的的學(xué)生成績(jī)分析系統(tǒng)進(jìn)行優(yōu)化,對(duì)某班一門(mén)課的成績(jī)進(jìn)行分析,要求有如下功能:1.查詢(xún)?nèi)砍煽?jī);2.查詢(xún)平均分;3.查詢(xún)不及格率;4.查詢(xún)最高分;5.按成績(jī)降序排列;0.退出。為了保存一個(gè)班的C語(yǔ)言成績(jī)需要借助于一維數(shù)組,通過(guò)指針對(duì)其數(shù)據(jù)進(jìn)行操作。將本項(xiàng)目分成兩部分,首先借助于指針對(duì)一維數(shù)組進(jìn)行訪問(wèn),然后介紹一種新的排序算法—選擇排序。【項(xiàng)目分析】28問(wèn)題情境及實(shí)現(xiàn)
通過(guò)前面所講可實(shí)現(xiàn)本系統(tǒng)的前4個(gè)功能,下面借助于指針實(shí)現(xiàn)數(shù)據(jù)的排序。采用簡(jiǎn)單選擇排序方法進(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)知識(shí):簡(jiǎn)單選擇排序
簡(jiǎn)單選擇排序的基本方法是:第一趟,從n個(gè)記錄中找出關(guān)鍵字最小的記錄與第一個(gè)記錄交換;第二趟,從第二個(gè)記錄開(kāi)始的n-1個(gè)記錄中再選出關(guān)鍵字最小的記錄與第二個(gè)記錄交換;如此,第i趟,則從第i個(gè)記錄開(kāi)始的n-i+1個(gè)記錄中選出關(guān)鍵字最小的記錄與第i個(gè)記錄交換,直到整個(gè)序列按關(guān)鍵字有序排列。30
簡(jiǎn)單選擇排序算法: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對(duì)如下關(guān)鍵字(49,38,65,97,76,13,27,49)進(jìn)行簡(jiǎn)單選擇排序的過(guò)程見(jià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簡(jiǎn)單選擇排序移動(dòng)記錄的次數(shù)較少,但關(guān)鍵字的比較次數(shù)依然是n(n+1)/2,所以時(shí)間復(fù)雜度仍為O(n2)。
32樹(shù)形選擇排序按照錦標(biāo)賽的思想進(jìn)行,將n個(gè)參賽的選手看成完全二叉樹(shù)的葉結(jié)點(diǎn),則該完全二叉樹(shù)有2n-2或2n-1個(gè)結(jié)點(diǎn)。首先,兩兩進(jìn)行比賽(在樹(shù)中是兄弟的進(jìn)行,否則輪空,直接進(jìn)入下一輪),勝出的再兄弟間再兩兩進(jìn)行比較,直到產(chǎn)生第1名。接下來(lái),將作為第1名的結(jié)點(diǎn)看成最差的,并從該結(jié)點(diǎn)開(kāi)始,沿該結(jié)點(diǎn)到根路徑上,依次進(jìn)行各分枝結(jié)點(diǎn)子女間的比較,勝出的就是第2名。因?yàn)楹退荣惖木莿倓傒斀o第1名的選手。如此,繼續(xù)進(jìn)行下去,直到所有選手的名次排定。33對(duì)如下關(guān)鍵字(49,38,65,97,76,13,27,49)進(jìn)行簡(jiǎn)單選擇排序的過(guò)程見(jià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堆排序堆排序是樹(shù)形選擇排序方法的改進(jìn),它使用的輔助空間較少,僅增加一個(gè)記錄空間進(jìn)行交換,同時(shí)關(guān)鍵字比較的次數(shù)和樹(shù)形選擇排序相當(dāng)。1.堆的定義和存儲(chǔ)結(jié)構(gòu)堆是一棵完全二叉樹(shù),組成這棵完全二叉樹(shù)的n個(gè)元素序列k1,k2,…,kn,當(dāng)且僅當(dāng)滿足下述關(guān)系之一時(shí),稱(chēng)之為堆。Ki≥k2iKi≥k2i+1大頭堆或者Ki≤k2iKi≤k2i+1小頭堆其中i=1,2,…,n/242如以下關(guān)鍵字(49,38,65,97,76,13,27,49)所建立的大頭堆和小頭堆如下圖所示:用一維數(shù)組存儲(chǔ)一個(gè)堆,則堆對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)如下:9776654949132738大頭堆1338274976654997小頭堆
012345678大頭堆9776654949132738012345678小頭堆133827497665499743建立初始堆
對(duì)初始序列建堆的過(guò)程,就是一個(gè)反復(fù)進(jìn)行篩選的過(guò)程。對(duì)n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)只需從第n/2個(gè)元素開(kāi)始。例如:對(duì)元素(49,38,65,97,76,13,27,49)進(jìn)行篩選的過(guò)程見(jiàn)下圖(建小頭堆)。4938659776132749i=4將97與49交換4938654976132797i=3將65與13交換444938134976652797i=2不進(jìn)行交換4938134976652797i=1將49與13交換再與27交換1338274976654997建好的小頭堆45從篩選過(guò)程可以看出,所建小頭堆是從第4個(gè)元素97開(kāi)始,最后到第1個(gè)元素為止。整個(gè)篩選過(guò)程應(yīng)該是在數(shù)組中進(jìn)行的,其數(shù)組的變化過(guò)程見(jiàn)下圖。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)元素交換;然后對(duì)前n-1個(gè)結(jié)點(diǎn)進(jìn)行篩選,重新建堆,再以根結(jié)點(diǎn)元素與第n-1個(gè)結(jié)點(diǎn)元素交換;重復(fù)上述操作,直到整個(gè)序列有序。對(duì)上例進(jìn)行堆排序的過(guò)程見(jiàn)下圖。133827497665499713與97交換9738274976654913重建堆472738494976659713973849497665271327與97交換3849499776652713重建堆38與65交換6549499776382713重建堆48496549977638271349與76交換7665499749382713重建堆496576974938271349與97交換9765764949382713重建堆49659776494938271365與76交換7697654949382713重建堆769765494938271376與97交換977665494938271350整個(gè)堆排序和重建堆的過(guò)程也是在數(shù)組中進(jìn)行的其變化過(guò)程見(jiàn)下圖所示。初始012345678小頭堆1338274976654997初始012345678小頭堆1338274976654997堆排序中的數(shù)組變化過(guò)程重建堆的數(shù)組變化過(guò)程
973827497665491313與97對(duì)調(diào):
273849
4976659713
973849497665271327與97對(duì)調(diào):
3849
499776652713
654949977638271338與65對(duì)調(diào):
4965499776382713
766549974938271349與76對(duì)調(diào):
4965769749382713
976576494938271349與97對(duì)調(diào):
6597764949382713
769765494938271365與76對(duì)調(diào):
7697654949382713
977665494938271376與97對(duì)調(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寫(xiě)出下面程序的運(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è)字符,而字符指針變量中存放的是地址(字符串的首地址)。②賦值方式不同。對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值,不能用一個(gè)字符串給一個(gè)字符數(shù)組賦值,但對(duì)于字符指針變量可以用一個(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)過(guò)任意對(duì)換后仍為素?cái)?shù),則稱(chēng)為絕對(duì)素?cái)?shù),例如13,試求所有兩位絕對(duì)素?cái)?shù)。解題思路①使用哪種類(lèi)型的程序結(jié)構(gòu)?②給出一個(gè)數(shù),如何求任意數(shù)字位置對(duì)換后的數(shù)?③如何判斷一個(gè)數(shù)為素?cái)?shù)?例5程序編寫(xiě)思考:如果求所有三位絕對(duì)素?cái)?shù),612指針與函數(shù)(4)2.2指向函數(shù)的指針變量在C語(yǔ)言中,一個(gè)函數(shù)占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱(chēng)入口地址)賦予一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過(guò)指針變量就可以找到并調(diào)用這個(gè)函數(shù)。我們把這種指向函數(shù)的指針變量稱(chēng)為“函數(shù)指針變量”。622指針與函數(shù)(5)2.2指向函數(shù)的指針變量(續(xù))函數(shù)指針變量定義的一般形式為:類(lèi)型說(shuō)明符(*指針變量名)();表示被指函數(shù)的返回值的類(lèi)型“*”后面的變量是定義的指針變量指針變量所指的是一個(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í)行過(guò)程#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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省煙臺(tái)市愛(ài)華雙語(yǔ)學(xué)校2023-2024學(xué)年七年級(jí)上學(xué)期第一次月考生物試題(解析版)-A4
- 河北省滄州市獻(xiàn)縣2023-2024學(xué)年八年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 養(yǎng)老院老人生活照顧人員考核獎(jiǎng)懲制度
- 養(yǎng)老院老人健康監(jiān)測(cè)人員行為規(guī)范制度
- 財(cái)務(wù)管理體系改革方案
- 《硅酸鹽的分析》課件
- 2024年度污水外運(yùn)處理與環(huán)保產(chǎn)業(yè)扶持政策合同范本3篇
- 文玩買(mǎi)賣(mài)合同(2篇)
- 撤銷(xiāo)贈(zèng)與房產(chǎn)合同(2篇)
- 2024年二手房買(mǎi)賣(mài)專(zhuān)業(yè)代簽服務(wù)合同3篇
- 鍋爐工崗位安全風(fēng)險(xiǎn)告知卡
- 中藥飲片采購(gòu)配送服務(wù)投標(biāo)方案
- 中國(guó)流行音樂(lè) 課件-2022-2023學(xué)年高中音樂(lè)湘教版(2019)必修音樂(lè)鑒賞下篇
- 《商務(wù)禮儀》案例分析題匯編
- 國(guó)開(kāi)電大本科《管理英語(yǔ)4》機(jī)考真題(第十五套)
- 計(jì)算機(jī)視覺(jué)PPT完整全套教學(xué)課件
- 新湘少版英語(yǔ)四年級(jí)上冊(cè):unit10 Welcome to our home!說(shuō)課稿
- 國(guó)開(kāi)機(jī)考《建筑工程質(zhì)量檢驗(yàn)》
- 軍隊(duì)文職招聘考試-數(shù)量關(guān)系100題
- 江海區(qū)婦聯(lián)維權(quán)典型案例-農(nóng)村出嫁女維權(quán)案
- 醫(yī)院消防安全季度檢查表與消防安全隱患排查表
評(píng)論
0/150
提交評(píng)論