C語言知識學習程序設(shè)計何欽銘顏暉第8章指針_第1頁
C語言知識學習程序設(shè)計何欽銘顏暉第8章指針_第2頁
C語言知識學習程序設(shè)計何欽銘顏暉第8章指針_第3頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8章指針【練習8-1】如果有定義”intm,n=5,*p=&m;”與m=n等價的語句是B。A.m=*p;B.*p=*&n;C.m=&n;D.m=*p;解答:A:p是指向m的指針變量,所以*p等價丁m。即m=m。B:&n是n的地址,*&n是n的值,即把n的值賦給p指向的值m。即m=ncC:&n是n的地址。即把n的地址賦給m。D:*p是指p指向的指針所指向的值,在此無意義。故選Bo【練習8-2】調(diào)用函數(shù)求兩個數(shù)的和與差:計算輸入的兩個數(shù)的和與差,要求自定義一個函數(shù)sum_diff(floatop1,floatop2,float*psum,float

2、*pdiff),其中op1和op2是輸入的兩個數(shù),*psum和*pdiff是計算得出的和與差。解答:#include<stdio.h>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;%

3、f-%f=%fn",op1,op2,sum,op1,op2,diff);return0;voidsum_diff(floatop1,floatop2,float*psum,float*pdiff)*psum=op1+op2;*pdiff=op1-op2;【練習8-3】兩個相同類型的指針變量能不能相加?為什么?解答:不能。因為指針變量是一種特殊的變量,指針變量的值存放的是所指向變量的地址,兩個地址相加并不能保證結(jié)果為一個有效的地址值,因而在C語言中指針變量相加是非法的?!揪毩?-4】根據(jù)表8.2所示,這組數(shù)據(jù)的冒泡排序其實循環(huán)到第6遍(即n-2)時就已經(jīng)排好序了,說明有時候并不一定需要

4、n-1次循環(huán)。請思考如何改進冒泡排序算法并編程實現(xiàn)(提示:當發(fā)現(xiàn)一遍循環(huán)后沒有數(shù)據(jù)發(fā)生交換,說明已經(jīng)排好序了)。解答:設(shè)置一個標志變量flag,進入一輪循環(huán)前設(shè)置為0,在循環(huán)中有發(fā)生數(shù)據(jù)交換就改寫flag值為1。當該輪循環(huán)結(jié)束后檢查flag值,如果變?yōu)?說明發(fā)生了數(shù)據(jù)交換,還沒有排好序,如果為0說明沒有發(fā)生交換,已經(jīng)排好序。#include<stdio.h>voidbubble(inta,intn);intmain(void)intn,i,a8;printf("Entern(n<=8):");scanf("%d",&n);pri

5、ntf("Entera%d:",n);for(i=0;i<n;i+)scanf("%d",&ai);bubble(a,n);printf("Aftersorted,a%d=",n);for(i=0;i<n;i+)printf("%3d",ai);return0;voidbubble(inta,intn)for(i=1;i<n;i+)(flag=0;for(j=0;j<n-i;j+)if(aj>aj+1)(temp=aj;aj=aj+1;aj+1=temp;flag=1;if(f

6、lag=0)break;【練習8-5】重做例8-9,要求使用選擇排序算法。解答:#include<stdio.h>voidbubble(inta,intn);intmain(void)inti,n,a8;printf("Entern(n<=8):");scanf("d”,&n);printf("Entera%d:",n);for(i=0;i<n;i+)scanf("%d",&ai);bubble(a,n);printf("Aftersorted,a%d=",n);f

7、or(i=0;i<n;i+)printf("%3d",ai);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(aj<aindex)index=j;temp=ai;ai=aindex;aindex=temp;8.4電碼加密【練習8-6】在使用scanf()函數(shù)時,輸入?yún)?shù)列表需要使用取地址操作符&,但當參數(shù)為字符數(shù)組名時并沒有使用,為什么?如果在字符數(shù)組名前加上取地址操作符&,會發(fā)生什么?解答:因為字

8、符數(shù)組名的值是一個特殊的固定地址,可以看作是常量指針,因此不需要再使用取地址符來獲取該數(shù)組的地址。如果在字符數(shù)組名str前加上取地址操作符&,那么對其取地址&str可以看做是這個數(shù)組的第一個元素的地址,由丁數(shù)組地址和數(shù)組第一個元素的地址相同,所以&str表示地址值和str表示的地址值是相等的。對scanf()的變長參數(shù)列表的話,編譯器只負責參數(shù)傳遞,怎么解釋后邊的幾個地址的含義,是由前邊的字符申確定的。所以使用scanf("s”,str)和scanf(“s”,&str)都能通過編譯且正常執(zhí)行。【練習8-7】C語言不允許用賦值表達式直接對數(shù)組賦值,為什么

9、?解答:數(shù)組名可以看作是常量指針,因為不可以對一個常量進行賦值,所以不允許用賦值表達式直接對數(shù)組進行賦值?!揪毩?-8】輸入一個字符申,把該字符申的前3個字母移到最后,輸出變換后的字符申。比如輸入“abcdef”,輸出為“defabc”。解答:#include<stdio.h>#include<string.h>#defineMAXLINE100intmain(void)charlineMAXLINE,str4;inti;printf("Inputthestring:");gets(line);if(strlen(line)<3)printf(

10、"字符申長度小丁3,不符合要求!n");for(i=0;i<3;i+)stri=linei;stri='0'for(i=3;linei!='0'i+)linei-3=linei;linei-3='0'strcat(line,str);printf("%s%sn","Afterchanging:",line);return0;【練習8-9】使用動態(tài)內(nèi)存分配的方法實現(xiàn)例8-9的冒泡排序。解答:#include<stdio.h>#include<stdlib.h>

11、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("%cT',a+i);bubble(a,n);prin

12、tf("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;習題8、選擇題下歹0語句定義x為指向int類型變量a的指針,其中哪一個是正確的B。A.inta,*x=a;B.inta,*x=&

13、;a;C.int*x=&a,a;C.int*x=&a,a;C.int*x=&a,a;D.inta,x=a;以下選項中,對基本類型相同的指針變量不能進行運算的運算符是B.-C.D.若有以下說明,且0<=i<10,則對數(shù)組元素的錯誤引用是Cinta=0,1,2,3,4,5,6,7,8,9,*p=a,i;A.*(a+i)B.ap-a+iC.p+iD.*(&ai)4.下列程序的輸出結(jié)果是B。intmain(void)inta10=0,1,2,3,4,5,6,7,8,9,*p=a+3;printf(“d”,*+p);return0;A.3B.4C.a4的地址D

14、.非法5.對丁下列程序,正確的是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插入到下標為i(i>=0)的元素前。如果i>=元素的個數(shù),則x插入到末尾。原有的元素個數(shù)存放在指針n所指向的變量中,插入后元素個數(shù)加1。請?zhí)羁铡oidinsert(doublea,int*n,doublex,inti)(intj;if_(i<*n)_for(j=*n-1;_j>=i_;j-)_aj+1

15、_=aj;elsei=*n;ai=_x_;(*n)+;2.下列程序先消除輸入字符申的前后空格,再判斷是否是“回文”(即字符申正讀和倒讀都是一樣),若是則輸出YES,否則輸出NO。請?zhí)羁铡?include<stdio.h>#include<string.h>intmain(void)(chars80,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)pri

16、ntf("NOn”);elseprintf("YESn”);return0;3.下歹0程序在數(shù)組中同時查找最大元素和最小元素的下標,分別存放在main()函數(shù)的fmax和min變量中。請?zhí)羁?。voidfind(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,%dn”,max,min);return0;voidfind(int*a,intn,int*max,int*min)inti;*max=*min=0;for

17、(i=1;i<n;i+)if(ai>a*max)_*max=i_;if(ai<a*min)_*min=i_;4.寫出下列程序的執(zhí)行結(jié)果0024002346#include<stdio.h>inta10,b10,*pa,*pb,i;pa=a;pb=b;for(i=0;i<3;i+,pa+,pb+)(*pa=i;*pb=2*i;printf(“dt%dn”,*pa,*pb);pa=&a0;pb=&b0;for(i=0;i<3;i+)(*pa=*pa+i;*pb=*pb+i;printf(“dt%dn”,*pa+,*pb+);return0;

18、三、程序設(shè)計題拆分實數(shù)的整數(shù)與小數(shù)部分:要求定義一個函數(shù)voidsplitfloat(floatx,int*intpart,float*fracpart),其中x是被拆分的實數(shù),*intpart和*fracpart分別是將實數(shù)x拆分出來的整數(shù)部分與小數(shù)部分。編寫主函數(shù),并在其中調(diào)用函數(shù)splitfloat()。試編寫相應程序。解答:#include<stdio.h>voidsplitfloat(floatx,int*intpart,float*fracpart);intmain(void)floatx,fracpart;intintpart;printf("Inputan

19、umber:");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個正整數(shù)n(1<n<=1

20、0),然后輸入n個整數(shù)存入數(shù)組a中,再輸入一個整數(shù)x,在數(shù)組a中查找x,若找到則輸出相應的下標,否則顯示“Notfound”。要求定義和調(diào)用函數(shù)search(intlist,intn,intx),在數(shù)組list中查找元素x,若找到則返回相應下標,否則返回-1,參數(shù)n代表數(shù)組list中元素的數(shù)量。試編寫相應程序。解答:#include<stdio.h>intsearch(intlist,intn,intx);intmain(void)(inti,n,res,x;inta10;printf("Inputn:");scanf("%d",&n

21、);for(i=0;i<n;i+)scanf("%d",&ai);printf("Inputx:");scanf("%d",&x);res=search(a,n,x);if(res>=0)printf("index=%dn",res);elseprintf("Notfoundn");return0;intsearch(intlist,intn,intx)inti;for(i=0;i<n;i+)if(listi=x)returni;return-1;循環(huán)后移:有n

22、個整數(shù),使前面各數(shù)順序向后移m個位置,移出的數(shù)再從開頭移入。編寫一個函數(shù)實現(xiàn)以上功能,在主函數(shù)中輸入n個整數(shù)并輸出調(diào)整后的n個數(shù)。試編寫相應程序。解答:#include<stdio.h>voidmove(int*x,intn,intm);inti,m,n;inta80;printf("Entern:");scanf("d”,&n);printf("Enterm:");scanf("%d",&m);for(i=0;i<n;i+)scanf("%d",&ai);mov

23、e(a,n,m);printf("Aftermove:");for(i=0;i<n;i+)printf("%d",ai);return0;voidmove(int*p,intn,intm)(inti,j,k=0,a80;for(i=0;i<n;i+)if(i<n-m)ai+m=pi;elseak+=pi;for(i=0;i<n;i+)pi=ai;報數(shù):有n個人圍成一圈,按順序從1到n編好號。從第一個人開始報數(shù),報到m(m<n)的人退出圈子,下一個人從1開始報數(shù),報到m的人退出圈子。如此下去,直到留下最后一個人。編寫程序,輸入

24、整數(shù)n和m,并按退出順序輸出退出圈子的人的編號。試編寫相應程序。解答:#include<stdio.h>intmain(void)intcount,i,j,m,n;intnum80=0;printf("Inputn:");scanf("%d",&n);printf("Inputm:");scanf("%d",&m);i=j=count=0;while(count<n-1)(if(numi=0)j+;if(j%m=0&&j)count+;numi=-1;j=0;/報數(shù)

25、報到m后,j重歸0,開始下次報數(shù)i+;/讀取下一個元素i%=n;/一次n個跟報完數(shù),開始下一次(除余n是因為i是下標,從0開始,n是具體數(shù)/從1開始/i為n時下次a0報數(shù))for(i=0;i<n;i+)if(numi=0)printf("LastNois:%dn",i+1);return0;使用函數(shù)實現(xiàn)字符申復制:輸入一個字符申t和一個正整數(shù)m,將字符申中從第m個字符開始的全部字符復制到字符申s中,再輸出字符申s。要求自定義并調(diào)用函數(shù)voidstrmcpy(char*s,char*t,intm)。試編寫相應程序。解答:#include<stdio.h>#i

26、nclude<string.h>voidstrmcpy(char*s,char*t,intm);intmain(void)chars80,t80;intm;printf("Inputthestring:");gets(t);printf("Enterm:");scanf("%d",&m);if(strlen(t)<m)printf("ErrorInput");return0;elsestrmcpy(s,t,m);puts(s);return0;voidstrmcpy(char*s,char

27、*t,intm)(t=t+m-1;while(*t!='0')*s=*t;s+;t+;*s='0'刪除字符:輸入一個字符申,再輸入一個字符ch,將字符申中所有的ch字符刪除后輸出該字符申。要求定義和調(diào)用函數(shù)delchar(s,c),該函數(shù)將字符申s中出現(xiàn)的所有c字符刪除。試編寫相應程序。解答:#include<stdio.h>voiddelchar(char*s,charc);intmain(void)charc;chars80;printf("Inputthestring:");gets(s);printf("Inpu

28、tach:");scanf("%c”,&c);delchar(s,c);printf("result:");puts(s);return0;voiddelchar(char*s,charc)inti,j;i=j=0;while(si!='0')if(si!=c)sj=si;j+;i+;sj='0'字符申排序:輸入5個字符申,按由小到大的順序輸出。試編寫相應程序解答:#include<stdio.h>#include<string.h>intmain(void)intn,i,j,index;c

29、harsx8080,stemp80;printf("Entern:");scanf("%d",&n);printf("Input%dstrings:",n);for(i=0;i<n;i+)scanf("%s”,sxi);/每行的基地址for(i=0;i<n-1;i+)index=i;for(j=i+1;j<n;j+)if(strcmp(sxj,sxindex)<0)index=j;strcpy(stemp,sxi);strcpy(sxi,sxindex);strcpy(sxindex,stem

30、p);printf("aftersorted:n");for(i=0;i<5;i+)printf("%st",sxi);return0;判斷回文:判斷輸入的一申字符是否為“回文”。所謂“回文”是指順讀和倒讀都一樣的字符申。如“XYZYX”和“xyzzyx”都是回文。試編寫相應程序。解答:#include<stdio.h>intmirror(char*p);intmain(void)chars80;printf("Inputthestring:");gets(s);if(mirror(s)=1)printf("

31、;Yes!nH);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<stdio.h>intmirror(char*p);intmain(void)chars80;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+;while(p<=q)(if(*p=*(q-1)(return1;p+;q-;elsereturn0;分類統(tǒng)計字符個數(shù):輸入一行文字,統(tǒng)計其中的大寫字母、小寫字母、空格、數(shù)字以及其他字符各有多少。試編寫相應程序。解答:#include<stdio.h>intmain(void)(chars80,*p;intbl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論