C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘 顏 暉 第8章 指針_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘 顏 暉 第8章 指針_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘 顏 暉 第8章 指針_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘 顏 暉 第8章 指針_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘 顏 暉 第8章 指針_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘顏暉第8章指針C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘顏暉第8章指針C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘顏暉第8章指針xxx公司C語(yǔ)言程序設(shè)計(jì)(第3版)何欽銘顏暉第8章指針文件編號(hào):文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計(jì),管理制度第8章指針【練習(xí)8-1】如果有定義”intm,n=5,*p=&m;”與m=n等價(jià)的語(yǔ)句是B。m=*p;B.*p=*&n;C.m=&n;D.m=**p;解答:A:p是指向m的指針變量,所以*p等價(jià)于m。即m=m。B:&n是n的地址,*&n是n的值,即把n的值賦給p指向的值m。即m=n。C:&n是n的地址。即把n的地址賦給m。D:**p是指p指向的指針?biāo)赶虻闹?,在此無(wú)意義。故選B。【練習(xí)8-2】調(diào)用函數(shù)求兩個(gè)數(shù)的和與差:計(jì)算輸入的兩個(gè)數(shù)的和與差,要求自定義一個(gè)函數(shù)sum_diff(floatop1,floatop2,float*psum,float*pdiff),其中op1和op2是輸入的兩個(gè)數(shù),*psum和*pdiff是計(jì)算得出的和與差。解答:#include<>voidsum_diff(floatop1,floatop2,float*psum,float*pdiff);intmain(void){floatop1,op2,sum,diff;printf("Inputop1andop2:");scanf("%f%f",&op1,&op2);sum_diff(op1,op2,&sum,&diff);printf("%f+%f=%f;%f-%f=%f\n",op1,op2,sum,op1,op2,diff);return0;}voidsum_diff(floatop1,floatop2,float*psum,float*pdiff){*psum=op1+op2;*pdiff=op1-op2;}【練習(xí)8-3】?jī)蓚€(gè)相同類型的指針變量能不能相加為什么解答:不能。因?yàn)橹羔樧兞渴且环N特殊的變量,指針變量的值存放的是所指向變量的地址,兩個(gè)地址相加并不能保證結(jié)果為一個(gè)有效的地址值,因而在C語(yǔ)言中指針變量相加是非法的?!揪毩?xí)8-4】根據(jù)表所示,這組數(shù)據(jù)的冒泡排序其實(shí)循環(huán)到第6遍(即n-2)時(shí)就已經(jīng)排好序了,說(shuō)明有時(shí)候并不一定需要n-1次循環(huán)。請(qǐng)思考如何改進(jìn)冒泡排序算法并編程實(shí)現(xiàn)(提示:當(dāng)發(fā)現(xiàn)一遍循環(huán)后沒有數(shù)據(jù)發(fā)生交換,說(shuō)明已經(jīng)排好序了)。解答:設(shè)置一個(gè)標(biāo)志變量flag,進(jìn)入一輪循環(huán)前設(shè)置為0,在循環(huán)中有發(fā)生數(shù)據(jù)交換就改寫flag值為1。當(dāng)該輪循環(huán)結(jié)束后檢查flag值,如果變?yōu)?說(shuō)明發(fā)生了數(shù)據(jù)交換,還沒有排好序,如果為0說(shuō)明沒有發(fā)生交換,已經(jīng)排好序。#include<>voidbubble(inta[],intn);intmain(void){intn,i,a[8];printf("Entern(n<=8):");scanf("%d",&n);printf("Entera[%d]:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);bubble(a,n);printf("Aftersorted,a[%d]=",n);for(i=0;i<n;i++)printf("%3d",a[i]);return0;}voidbubble(inta[],intn){inti,j,temp,flag;for(i=1;i<n;i++){flag=0;for(j=0;j<n-i;j++)if(a[j]>a[j+1]){temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; flag=1;}if(flag==0)break;}}【練習(xí)8-5】重做例8-9,要求使用選擇排序算法。解答:#include<>voidbubble(inta[],intn);intmain(void){inti,n,a[8];printf("Entern(n<=8):");scanf("%d",&n);printf("Entera[%d]:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);bubble(a,n);printf("Aftersorted,a[%d]=",n);for(i=0;i<n;i++)printf("%3d",a[i]);return0;}voidbubble(inta[],intn){inti,j,temp,index;for(i=0;i<n-1;i++){index=i;for(j=i+1;j<n;j++)if(a[j]<a[index])index=j;temp=a[i]; a[i]=a[index]; a[index]=temp; }}電碼加密【練習(xí)8-6】在使用scanf()函數(shù)時(shí),輸入?yún)?shù)列表需要使用取地址操作符&,但當(dāng)參數(shù)為字符數(shù)組名時(shí)并沒有使用,為什么如果在字符數(shù)組名前加上取地址操作符&,會(huì)發(fā)生什么解答:因?yàn)樽址麛?shù)組名的值是一個(gè)特殊的固定地址,可以看作是常量指針,因此不需要再使用取地址符來(lái)獲取該數(shù)組的地址。如果在字符數(shù)組名str前加上取地址操作符&,那么對(duì)其取地址&str可以看做是這個(gè)數(shù)組的第一個(gè)元素的地址,由于數(shù)組地址和數(shù)組第一個(gè)元素的地址相同,所以&str表示地址值和str表示的地址值是相等的。對(duì)scanf()的變長(zhǎng)參數(shù)列表的話,編譯器只負(fù)責(zé)參數(shù)傳遞,怎么解釋后邊的幾個(gè)地址的含義,是由前邊的字符串確定的。所以使用scanf(“%s”,str)和scanf(“%s”,&str)都能通過(guò)編譯且正常執(zhí)行。【練習(xí)8-7】C語(yǔ)言不允許用賦值表達(dá)式直接對(duì)數(shù)組賦值,為什么解答:數(shù)組名可以看作是常量指針,因?yàn)椴豢梢詫?duì)一個(gè)常量進(jìn)行賦值,所以不允許用賦值表達(dá)式直接對(duì)數(shù)組進(jìn)行賦值。【練習(xí)8-8】輸入一個(gè)字符串,把該字符串的前3個(gè)字母移到最后,輸出變換后的字符串。比如輸入“abcdef”,輸出為“defabc”。解答:#include<>#include<>#defineMAXLINE100intmain(void){charline[MAXLINE],str[4]; inti; printf("Inputthestring:");gets(line);if(strlen(line)<3){printf("字符串長(zhǎng)度小于3,不符合要求!\n");}for(i=0;i<3;i++)str[i]=line[i];str[i]='\0';for(i=3;line[i]!='\0';i++)line[i-3]=line[i];line[i-3]='\0';strcat(line,str);printf("%s%s\n","Afterchanging:",line);return0;}【練習(xí)8-9】使用動(dòng)態(tài)內(nèi)存分配的方法實(shí)現(xiàn)例8-9的冒泡排序。解答:#include<>#include<> voidbubble(inta[],intn); intmain(void){ intn,j,*a,i,temp; printf("Entern(n<=8):"); scanf("%d",&n); if((a=(int*)calloc(n,sizeof(int)))==NULL){ printf("Notabletoallocatememory.\n"); exit(1); } printf("Entea[%d]:",n); for(i=0;i<n;i++) scanf("%d",a+i); bubble(a,n); printf("Aftersorted,a[%d]=",n); for(i=0;i<n;i++) printf("%3d",*(a+i));free(a); return0;}voidbubble(inta[],intn){inti,j,temp; for(i=1;i<n;i++)for(j=0;j<n-i;j++) if(*(a+j)>*(a+j+1)){ temp=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=temp; }}習(xí)題8一、選擇題1.下列語(yǔ)句定義x為指向int類型變量a的指針,其中哪一個(gè)是正確的B。A.inta,*x=a;B.inta,*x=&a;C.int*x=&a,a;D.inta,x=a;以下選項(xiàng)中,對(duì)基本類型相同的指針變量不能進(jìn)行運(yùn)算的運(yùn)算符是A。A.+B.-C.=D.==3.若有以下說(shuō)明,且0<=i<10,則對(duì)數(shù)組元素的錯(cuò)誤引用是C。inta[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;A.*(a+i)B.a(chǎn)[p-a+i]C.p+iD.*(&a[i])4.下列程序的輸出結(jié)果是B。intmain(void){inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a+3;printf(“%d”,*++p);return0;}A.3B.4C.a(chǎn)[4]的地址D.非法5.對(duì)于下列程序,正確的是A。voidf(int*p){*p=5;}intmain(void){inta,*p;a=10;p=&a;f(p);printf(“%d”,(*p)++);return0;}A.5B.6C.10D.11二、填空題1.下列函數(shù)在一維數(shù)組a中將x插入到下標(biāo)為i(i>=0)的元素前。如果i>=元素的個(gè)數(shù),則x插入到末尾。原有的元素個(gè)數(shù)存放在指針n所指向的變量中,插入后元素個(gè)數(shù)加1。請(qǐng)?zhí)羁?。voidinsert(doublea[],int*n,doublex,inti){intj;if_(i<*n)_for(j=*n-1;_j>=i_;j--)_a[j+1]_=a[j];elsei=*n;a[i]=_x_;(*n)++;}2.下列程序先消除輸入字符串的前后空格,再判斷是否是“回文”(即字符串正讀和倒讀都是一樣),若是則輸出YES,否則輸出NO。請(qǐng)?zhí)羁铡?include<>#include<>intmain(void){chars[80],ch,*p,*q;inti,j,n;gets(s);p=_s_;while(*p==’’)_p++_;n=strlen(s);q=_s+n-1_;while(*q==’’)_q--_;while(_p<q_&&*p==*q){p++;_q--_;}if(p<q)printf(“NO\n”);elseprintf(“YES\n”);return0;}3.下列程序在數(shù)組中同時(shí)查找最大元素和最小元素的下標(biāo),分別存放在main()函數(shù)的fmax和min變量中。請(qǐng)?zhí)羁铡oidfind(int*,int,int*,int*);intmain(void){intmax,min,a[]={5,3,7,9,2,0,4,1,6,8};find(_a,10,&max,&min_);printf(“%d,%d\n”,max,min);return0;}voidfind(int*a,intn,int*max,int*min){inti;*max=*min=0;for(i=1;i<n;i++){if(a[i]>a[*max])_*max=i_;if(a[i]<a[*min])_*min=i_;}}4.寫出下列程序的執(zhí)行結(jié)果001224002346#include<>intmain(void){inta[10],b[10],*pa,*pb,i;pa=a;pb=b;for(i=0;i<3;i++,pa++,pb++){*pa=i;*pb=2*i;printf(“%d\t%d\n”,*pa,*pb);}pa=&a[0];pb=&b[0];for(i=0;i<3;i++){*pa=*pa+i;*pb=*pb+i;printf(“%d\t%d\n”,*pa++,*pb++);}return0;}三、程序設(shè)計(jì)題1.拆分實(shí)數(shù)的整數(shù)與小數(shù)部分:要求定義一個(gè)函數(shù)voidsplitfloat(floatx,int*intpart,float*fracpart),其中x是被拆分的實(shí)數(shù),*intpart和*fracpart分別是將實(shí)數(shù)x拆分出來(lái)的整數(shù)部分與小數(shù)部分。編寫主函數(shù),并在其中調(diào)用函數(shù)splitfloat()。試編寫相應(yīng)程序。解答:#include<>voidsplitfloat(floatx,int*intpart,float*fracpart);intmain(void){ floatx,fracpart; intintpart; printf("Inputanumber:"); scanf("%f",&x); splitfloat(x,&intpart,&fracpart); printf("Theintpartis:%d",intpart);printf("Thefracpartis:%f",fracpart); return0;}voidsplitfloat(floatx,int*intpart,float*fracpart){ *intpart=(int)x; *fracpart=x-*intpart;}在數(shù)組中查找指定元素:輸入1個(gè)正整數(shù)n(1<n<=10),然后輸入n個(gè)整數(shù)存入數(shù)組a中,再輸入一個(gè)整數(shù)x,在數(shù)組a中查找x,若找到則輸出相應(yīng)的下標(biāo),否則顯示“Notfound”。要求定義和調(diào)用函數(shù)search(intlist[],intn,intx),在數(shù)組list中查找元素x,若找到則返回相應(yīng)下標(biāo),否則返回-1,參數(shù)n代表數(shù)組list中元素的數(shù)量。試編寫相應(yīng)程序。解答:#include<>intsearch(intlist[],intn,intx);intmain(void){inti,n,res,x;inta[10];printf("Inputn:");scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);printf("Inputx:");scanf("%d",&x);res=search(a,n,x);if(res>=0)printf("index=%d\n",res);elseprintf("Notfound\n");return0;}intsearch(intlist[],intn,intx){inti;for(i=0;i<n;i++)if(list[i]==x)returni;return-1;}3.循環(huán)后移:有n個(gè)整數(shù),使前面各數(shù)順序向后移m個(gè)位置,移出的數(shù)再?gòu)拈_頭移入。編寫一個(gè)函數(shù)實(shí)現(xiàn)以上功能,在主函數(shù)中輸入n個(gè)整數(shù)并輸出調(diào)整后的n個(gè)數(shù)。試編寫相應(yīng)程序。解答:#include<>voidmove(int*x,intn,intm);intmain(void){inti,m,n;inta[80];printf("Entern:");scanf("%d",&n);printf("Enterm:");scanf("%d",&m);for(i=0;i<n;i++)scanf("%d",&a[i]);move(a,n,m);printf("Aftermove:");for(i=0;i<n;i++)printf("%d",a[i]); return0;}voidmove(int*p,intn,intm){inti,j,k=0,a[80];for(i=0;i<n;i++)if(i<n-m)a[i+m]=p[i];elsea[k++]=p[i];for(i=0;i<n;i++)p[i]=a[i];}4.報(bào)數(shù):有n個(gè)人圍成一圈,按順序從1到n編好號(hào)。從第一個(gè)人開始報(bào)數(shù),報(bào)到m(m<n)的人退出圈子,下一個(gè)人從1開始報(bào)數(shù),報(bào)到m的人退出圈子。如此下去,直到留下最后一個(gè)人。編寫程序,輸入整數(shù)n和m,并按退出順序輸出退出圈子的人的編號(hào)。試編寫相應(yīng)程序。解答:#include<>intmain(void){intcount,i,j,m,n;intnum[80]={0};printf("Inputn:");scanf("%d",&n);printf("Inputm:");scanf("%d",&m);i=j=count=0;while(count<n-1){ if(num[i]==0) j++; if(j%m==0&&j){ count++; num[i]=-1; j=0;用函數(shù)實(shí)現(xiàn)字符串復(fù)制:輸入一個(gè)字符串t和一個(gè)正整數(shù)m,將字符串中從第m個(gè)字符開始的全部字符復(fù)制到字符串s中,再輸出字符串s。要求自定義并調(diào)用函數(shù)voidstrmcpy(char*s,char*t,intm)。試編寫相應(yīng)程序。解答:#include<>#include<>voidstrmcpy(char*s,char*t,intm);intmain(void){chars[80],t[80];intm;printf("Inputthestring:");gets(t);printf("Enterm:");scanf("%d",&m);if(strlen(t)<m){printf("ErrorInput");return0;}else{strmcpy(s,t,m);puts(s);}return0;}voidstrmcpy(char*s,char*t,intm){t=t+m-1;while(*t!='\0'){*s=*t;s++;t++;}*s='\0';}6.刪除字符:輸入一個(gè)字符串,再輸入一個(gè)字符ch,將字符串中所有的ch字符刪除后輸出該字符串。要求定義和調(diào)用函數(shù)delchar(s,c),該函數(shù)將字符串s中出現(xiàn)的所有c字符刪除。試編寫相應(yīng)程序。解答:#include<>voiddelchar(char*s,charc);intmain(void){charc;chars[80];printf("Inputthestring:");gets(s);printf("Inputach:");scanf("%c",&c);delchar(s,c);printf("result:");puts(s);return0;}voiddelchar(char*s,charc){inti,j;i=j=0;while(s[i]!='\0'){if(s[i]!=c){s[j]=s[i];j++;}i++;}s[j]='\0';}7.字符串排序:輸入5個(gè)字符串,按由小到大的順序輸出。試編寫相應(yīng)程序。解答:#include<>#include<>intmain(void){intn,i,j,index;charsx[80][80],stemp[80];printf("Entern:");scanf("%d",&n);printf("Input%dstrings:",n);for(i=0;i<n;i++)scanf("%s",sx[i]);判斷回文:判斷輸入的一串字符是否為“回文”。所謂“回文”是指順讀和倒讀都一樣的字符串。如“XYZYX”和“xyzzyx”都是回文。試編寫相應(yīng)程序。解答:#include<>intmirror(char*p);intmain(void){chars[80];printf("Inputthestring:");gets(s);if(mirror(s)==1)printf("Yes!\n");elseprintf("No!\n");return0;}intmirror(char*p){char*q; q=p;while(*q!='\0')q++;q--;while(p<q){if(*p!=*q)return0;p++;q--;} return1;}或#include<>intmirror(char*p);intmain(void){chars[80];printf("Inputthestring:");gets(s);if(mirror(s)==1)printf("Yes!\n"); else printf("No!\n"); return0;}intmirror(char*p){ char*q; q=p; while(*q!='\0') q++; while(p<=q){ if(*p==*(q-1)){ return1; p++; q--; } else return0; }}9.分類統(tǒng)計(jì)字符個(gè)數(shù):輸入一行文字,統(tǒng)計(jì)其中的大寫字母、小寫字母、空格、數(shù)字以及其他字符各有多少。試編寫相應(yīng)程序。解答:#include<>intmain(void){chars[80],*p;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論