C語言程序設計(第3版)何欽銘 顏 暉 第8章指針

上傳人:油** 文檔編號:70654240 上傳時間:2022-04-06 格式:DOC 頁數(shù):14 大?。?64.50KB
收藏 版權申訴 舉報 下載
C語言程序設計(第3版)何欽銘 顏 暉 第8章指針_第1頁
第1頁 / 共14頁
C語言程序設計(第3版)何欽銘 顏 暉 第8章指針_第2頁
第2頁 / 共14頁
C語言程序設計(第3版)何欽銘 顏 暉 第8章指針_第3頁
第3頁 / 共14頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《C語言程序設計(第3版)何欽銘 顏 暉 第8章指針》由會員分享,可在線閱讀,更多相關《C語言程序設計(第3版)何欽銘 顏 暉 第8章指針(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、【精品文檔】如有侵權,請聯(lián)系網(wǎng)站刪除,僅供學習與交流 C語言程序設計(第3版)何欽銘 顏 暉 第8章 指針 .....精品文檔...... 第8章 指針 【練習8-1】如果有定義”int m, 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=n。

2、 C:&n是n的地址。即把n的地址賦給m。 D:**p是指p指向的指針所指向的值,在此無意義。 故選B。 【練習8-2】調(diào)用函數(shù)求兩個數(shù)的和與差:計算輸入的兩個數(shù)的和與差,要求自定義一個函數(shù)sum_diff(float op1,float op2, float *psum, float *pdiff),其中op1和op2是輸入的兩個數(shù),*psum 和*pdiff 是計算得出的和與差。 解答: #include void sum_diff(float op1,float op2,float *psum,float *pdiff); int m

3、ain(void) float op1,op2,sum,diff; printf("Input op1 and op2: "); 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); return 0; void sum_diff(float op1,float op2,float *psum,float *pdiff) *psum=op1+op2;

4、 *pdiff=op1-op2; 【練習8-3】兩個相同類型的指針變量能不能相加?為什么? 解答: 不能。因為指針變量是一種特殊的變量,指針變量的值存放的是所指向變量的地址,兩個地址相加并不能保證結(jié)果為一個有效的地址值,因而在 C 語言中指針變量相加是非法的。 【練習8-4】根據(jù)表 8.2 所示,這組數(shù)據(jù)的冒泡排序其實循環(huán)到第 6 遍(即n-2)時就已經(jīng)排好序了,說明有時候并不一定需要 n-1 次循環(huán)。請思考如何改進冒泡排序算法并編程實現(xiàn)(提示:當發(fā)現(xiàn)一遍循環(huán)后沒有數(shù)據(jù)發(fā)生交換,說明已經(jīng)排好序了)。 解答: 設置一個標志變量 flag,進入一輪循環(huán)前設置為 0,在循環(huán)中有發(fā)生數(shù)

5、據(jù)交換就改寫flag 值為 1。當該輪循環(huán)結(jié)束后檢查 flag 值,如果變?yōu)?1 說明發(fā)生了數(shù)據(jù)交換,還沒有排好序,如果為 0 說明沒有發(fā)生交換,已經(jīng)排好序。 #include void bubble (int a[],int n); int main(void) int n,i,a[8]; printf("Enter n (n<=8):"); scanf("%d",&n); printf("Enter a[%d] : ",n); for(i=0;i

6、 bubble(a,n); printf("After sorted, a[%d]=", n); for(i=0;ia[j

7、+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; flag=1; if(flag==0) break; 【練習8-5】重做例 8-9,要求使用選擇排序算法。 解答: #include void bubble(int a[], int n); int main(void) int i,n,a[8]; printf("Enter n (n<=8): "); scan

8、f("%d",&n); printf("Enter a[%d] :",n); for(i=0;i

9、+){ index=i; for(j=i+1;j

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

11、以對一個常量進行賦值,所以不允許用賦值表達式直接對數(shù)組進行賦值。 【練習8-8】輸入一個字符串,把該字符串的前 3 個字母移到最后,輸出變換后的字符串。比如輸入“abcdef”,輸出為“defabc”。 解答: #include #include #define MAXLINE 100 int main(void) char line[MAXLINE],str[4]; int i; printf("Input the string:"); gets(line); if(strlen(line)<3){

12、 printf("字符串長度小于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","After changing: ",line); return 0; 【練習8-9】使用動態(tài)內(nèi)存分配的方法實現(xiàn)例 8-9 的冒泡

13、排序。 解答: #include #include void bubble(int a[],int n); int main(void) int n,j,*a,i,temp; printf("Enter n(n<=8):"); scanf("%d",&n); if((a=(int*)calloc(n,sizeof(int)))==NULL){ printf("Not able to allocate memory.\n"); exit(1); printf("Ente a[%d]:",n);

14、 for(i=0;i

15、 if(*(a+j)>*(a+j+1)){ temp=*(a+j); *(a+j)=*(a+j+1); *(a+j+1)=temp; 習題8 一、選擇題 1.下列語句定義 x 為指向 int 類型變量 a 的指針,其中哪一個是正確的 B 。 A.int a, *x = a; B. int a, *x = &a; C.int *x = &a,a; D.int a, x = a; 2. 以下選項中,對基本類型相同的指

16、針變量不能進行運算的運算符是 A 。 A.+ B.- C.= D.== 3.若有以下說明,且 0<=i<10,則對數(shù)組元素的錯誤引用是 C 。 int a[ ] = {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+i D.*(&a[i]) 4.下列程序的輸出結(jié)果是 B 。 int main(void) int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3;

17、printf(“%d”, *++p); return 0; A.3 B.4 C.a(chǎn)[4]的地址 D.非法 5.對于下列程序,正確的是 A 。 void f(int *p) *p = 5; int main(void) int a, *p; a = 10; p = &a; f(p); printf(“%d”, (*p)++); return 0; A.5 B.6 C.10 D.11 二、填空題 1. 下列函數(shù)在一維數(shù)組

18、 a 中將 x 插入到下標為 i(i>=0)的元素前。如果 i>=元素的個數(shù),則 x 插入到末尾。原有的元素個數(shù)存放在指針 n 所指向的變量中,插入后元素個數(shù)加 1。請?zhí)羁铡? void insert(double a[ ], int *n, double x, int i) int j; if _ (i<*n)_ for (j=*n-1;_j>=i_; j--) _a[j+1]_ = a[j]; else i = *n; a[i]=_x_; (*n)++; 2.下列程序先消除輸入字符串的前后空格,再判斷是否是“回文”(即字符串正讀和倒讀都是一樣),若是則輸出 YES,否則輸

19、出 NO。請?zhí)羁铡? #include #include int main(void) char s[80], ch, *p, *q; int i, j, n; gets(s); p = _s_; while ( *p ==’ ’) _p++_; n = strlen(s); q = _s+n-1_; while ( *q ==’ ’) _q--_; while ( _p

20、; return 0; 3. 下列程序在數(shù)組中同時查找最大元素和最小元素的下標,分別存放在main( )函數(shù)的fmax 和 min 變量中。請?zhí)羁铡? void find(int *, int, int *, int *); int main(void) int max, min, a[ ]={5,3,7,9,2,0,4,1,6,8}; find(_a, 10, &max, &min_); printf(“%d,%d\n”, max, min); return 0; void find(int *a, int n, int *max, int *min) int i; *m

21、ax=*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é)果 0 0 1 2 2 4 0 0 2 3 4 6 #include int main(void) int a[10], b[10], *pa, *pb, i; pa = a; pb = b; for( i=0; i<3; i++, pa++, pb++) *pa = i; *

22、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++); return 0; 三、程序設計題 1. 拆分實數(shù)的整數(shù)與小數(shù)部分:要求定義一個函數(shù) void splitfloat(float x,int *intpart,float *fracpart),其中x是被拆分的實數(shù),*intpart和*fracpart分別是將實數(shù)x拆分出來的整數(shù)部

23、分與小數(shù)部分。編寫主函數(shù),并在其中調(diào)用函數(shù)splitfloat()。試編寫相應程序。 解答: #include void splitfloat(float x,int *intpart,float *fracpart); int main(void) float x,fracpart; int intpart; printf("Input a number:"); scanf("%f",&x); splitfloat(x,&intpart,&fracpart); printf("The intpart is: %d",intpart); p

24、rintf("The fracpart is: %f",fracpart); return 0; void splitfloat(float x,int *intpart,float *fracpart) *intpart=(int)x; *fracpart=x-*intpart; 2. 在數(shù)組中查找指定元素:輸入1個正整數(shù)n(1

25、找元素 x,若找到則返回相應下標,否則返回-1,參數(shù) n 代表數(shù)組 list中元素的數(shù)量。試編寫相應程序。 解答: #include int search(int list[],int n,int x); int main(void) int i,n,res,x; int a[10]; printf("Input n:"); scanf("%d",&n); for(i=0;i

26、("%d",&x); res=search(a,n,x); if(res>=0) printf("index=%d\n",res); else printf("Not found\n"); return 0; int search(int list[],int n,int x) int i; for(i=0;i

27、移入。編寫一個函數(shù)實現(xiàn)以上功能,在主函數(shù)中輸入n個整數(shù)并輸出調(diào)整后的n個數(shù)。試編寫相應程序。 解答: #include void move(int *x,int n,int m); int main(void) int i,m,n; int a[80]; printf("Enter n:"); scanf("%d",&n); printf("Enter m:"); scanf("%d",&m); for(i=0;i

28、ove(a,n,m); printf("After move: "); for(i=0;i

29、 4.報數(shù):有 n 個人圍成一圈,按順序從 1 到 n 編好號。從第一個人開始報數(shù),報到 m(m int main(void) int count,i,j,m,n; int num[80]={0}; printf("Input n:"); scanf("%d",&n); printf("Input m:");

30、 scanf("%d",&m); i=j=count=0; while(count

31、) if(num[i]==0) printf("Last No is: %d\n",i+1); return 0; 5.使用函數(shù)實現(xiàn)字符串復制:輸入一個字符串t和一個正整數(shù)m,將字符串中從第m個字符開始的全部字符復制到字符串s中,再輸出字符串s。要求自定義并調(diào)用函數(shù)void strmcpy(char *s, char *t, int m)。試編寫相應程序。 解答: #include #include void strmcpy(char *s,char *t,int m); int main(void) char s

32、[80],t[80]; int m; printf("Input the string:"); gets(t); printf("Enter m:"); scanf("%d",&m); if(strlen(t)

33、 t=t+m-1; while(*t!='\0'){ *s=*t; s++; t++; *s='\0'; 6.刪除字符:輸入一個字符串,再輸入一個字符 ch,將字符串中所有的 ch 字符刪除后輸出該字符串。要求定義和調(diào)用函數(shù) delchar(s,c),該函數(shù)將字符串 s 中出現(xiàn)的所有 c 字符刪除。試編寫相應程序。 解答: #include void delchar(char *s,char c); int main(void) char c; char s[80];

34、 printf("Input the string:"); gets(s); printf("Input a ch:"); scanf("%c",&c); delchar(s,c); printf("result: "); puts(s); return 0; void delchar(char *s,char c) int i,j; i=j=0; while(s[i]!='\0'){ if(s[i]!=c){ s[j]=s[i];

35、 j++; i++; s[j]='\0'; 7. 字符串排序:輸入 5 個字符串,按由小到大的順序輸出。試編寫相應程序。 解答: #include #include int main(void) int n,i,j,index; char sx[80][80],stemp[80]; printf("Enter n:"); scanf("%d",&n); printf("Input %d strings:",n); for(i=0;i

36、) scanf("%s",sx[i]);//每行的基地址 for(i=0;i

37、ed: \n"); for(i=0;i<5;i++) printf("%s\t",sx[i]); return 0; 8. 判斷回文:判斷輸入的一串字符是否為“回文”。所謂“回文”是指順讀和倒讀都一樣的字符串。如“XYZYX”和“xyzzyx”都是回文。試編寫相應程序。 解答: #include int mirror(char *p); int main(void) char s[80]; printf("Input the string:"); gets(s); if(mirror(s

38、)==1) printf("Yes!\n"); else printf("No!\n"); return 0; int mirror(char *p) char *q; q=p; while(*q!='\0') q++; q--; while(p

39、> int mirror(char *p); int main(void) char s[80]; printf("Input the string:"); gets(s); if(mirror(s)==1) printf("Yes!\n"); else printf("No!\n"); return 0; int mirror(char *p) char *q; q=p; while(*q!='\0') q++; while(p<=q){ if(*p==*(q-1)){

40、 return 1; p++; q--; else return 0; 9. 分類統(tǒng)計字符個數(shù): 輸入一行文字,統(tǒng)計其中的大寫字母、小寫字母、空格、數(shù)字以及其他字符各有多少。試編寫相應程序。 解答: #include int main(void) char s[80],*p; int blank,digit,lower,other,upper; printf("Input the string:"); gets(s); upper=lower=blank=digit=ot

41、her=0; for(p=s;*p!='\0';p++) if(*p>='A'&&*p<='Z') upper++; else if(*p>='a'&&*p<='z') lower++; else if(*p>='0'&&*p<='9') digit++; else if(*p==' ') blank++; else other++; printf("upp

42、er: %d\nlower: %d\nblank: %d\ndigit: %d\nother: %d\n",upper,lower,blank,digit,other); return 0; 10.(選做)輸出學生成績(動態(tài)分布):輸入學生人數(shù)后輸入每個學生的成績,最后輸出學生的平均成績、最高成績和最低成績。要求使用動態(tài)內(nèi)存分配來實現(xiàn)。試編寫相應程序。 解答: #include #include int main(void) int n,i; float *p,sum,max,min,avg; printf

43、("Input students’number n: "); scanf("%d",&n); if((p=(float *)calloc(n,sizeof(float)))==NULL){ printf("Not able to allocate memory. \n"); exit(1); sum=0.0; max=-1; min=1000; printf("Input %d students’scores: ", n); for(i=0;i*(p+i)) min=*(p+i); if(max<*(p+i)) max=*(p+i); avg=sum/n; printf("The avg is %f,max is %f,min is %f\n",avg,max,min); free(p); return 0;

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!