版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第8章 指針【練習(xí)8-1】如果有定義”int m, n = 5, *p = &m;”與m = n等價(jià)的語句是 B 。A 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)赶虻闹?,在此無意義。 故選B。 【練習(xí)8-2】調(diào)用函數(shù)求兩個(gè)數(shù)的和與差:計(jì)算輸入的兩個(gè)數(shù)的和與差,要求自定義一個(gè)函數(shù)sum_diff(fl
2、oat op1,float op2, float *psum, float *pdiff),其中op1和op2是輸入的兩個(gè)數(shù),*psum 和*pdiff 是計(jì)算得出的和與差。解答:#include<stdio.h>void sum_diff(float op1,float op2,float *psum,float *pdiff);int main(void) float op1,op2,sum,diff; printf("Input op1 and op2: "); scanf("%f%f",&op1,&op2); sum_
3、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; *pdiff=op1-op2;【練習(xí)8-3】?jī)蓚€(gè)相同類型的指針變量能不能相加?為什么?解答:不能。因?yàn)橹羔樧兞渴且环N特殊的變量,指針變量的值存放的是所指向變量的地址,兩個(gè)地址相加并不能保證結(jié)果為一個(gè)有效的地址值,因而在 C 語言中指
4、針變量相加是非法的?!揪毩?xí)8-4】根據(jù)表 8.2 所示,這組數(shù)據(jù)的冒泡排序其實(shí)循環(huán)到第 6 遍(即n-2)時(shí)就已經(jīng)排好序了,說明有時(shí)候并不一定需要 n-1 次循環(huán)。請(qǐng)思考如何改進(jìn)冒泡排序算法并編程實(shí)現(xiàn)(提示:當(dāng)發(fā)現(xiàn)一遍循環(huán)后沒有數(shù)據(jù)發(fā)生交換,說明已經(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)?1 說明發(fā)生了數(shù)據(jù)交換,還沒有排好序,如果為 0 說明沒有發(fā)生交換,已經(jīng)排好序。#include<stdio.h>void bubble (int a,int n);int
5、 main(void) int n,i,a8; printf("Enter n (n<=8):"); scanf("%d",&n); printf("Enter a%d : ",n); for(i=0;i<n;i+) scanf("%d",&ai); bubble(a,n); printf("After sorted, a%d=", n); for(i=0;i<n;i+) printf("%3d",ai); return 0;void bub
6、ble(int a, int n) int i,j,temp,flag; 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(flag=0) break; 【練習(xí)8-5】重做例 8-9,要求使用選擇排序算法。解答:#include<stdio.h>void bubble(int a, int n);int main(void) int i,n,a8; printf("Enter n (n<=8): ");
7、scanf("%d",&n); printf("Enter a%d :",n); for(i=0;i<n;i+) scanf("%d",&ai); bubble(a,n); printf("After sorted, a%d=",n); for(i=0;i<n;i+) printf("%3d",ai); return 0;void bubble(int a,int n) int i,j,temp,index; for(i=0;i<n-1;i+) index=i;
8、 for(j=i+1;j<n;j+) if(aj<aindex) index=j; temp=ai;ai=aindex;aindex=temp; 8.4電碼加密【練習(xí)8-6】在使用scanf( )函數(shù)時(shí),輸入?yún)?shù)列表需要使用取地址操作符&,但當(dāng)參數(shù)為字符數(shù)組名時(shí)并沒有使用,為什么?如果在字符數(shù)組名前加上取地址操作符&,會(huì)發(fā)生什么?解答:因?yàn)樽址麛?shù)組名的值是一個(gè)特殊的固定地址,可以看作是常量指針,因此不需要再使用取地址符來獲取該數(shù)組的地址。如果在字符數(shù)組名 str 前加上取地址操作符&,那么對(duì)其取地址&str 可以看做是這個(gè)數(shù)組的第一個(gè)元素的地址,由于
9、數(shù)組地址和數(shù)組第一個(gè)元素的地址相同,所以&str 表示地址值和 str 表示的地址值是相等的。對(duì) scanf()的變長(zhǎng)參數(shù)列表的話,編譯器只負(fù)責(zé)參數(shù)傳遞,怎么解釋后邊的幾個(gè)地址的含義,是由前邊的字符串確定的。所以使用scanf(“%s”,str)和scanf(“%s”,&str)都能通過編譯且正常執(zhí)行。【練習(xí)8-7】 C 語言不允許用賦值表達(dá)式直接對(duì)數(shù)組賦值,為什么?解答:數(shù)組名可以看作是常量指針,因?yàn)椴豢梢詫?duì)一個(gè)常量進(jìn)行賦值,所以不允許用賦值表達(dá)式直接對(duì)數(shù)組進(jìn)行賦值?!揪毩?xí)8-8】輸入一個(gè)字符串,把該字符串的前 3 個(gè)字母移到最后,輸出變換后的字符串。比如輸入“abcdef”
10、,輸出為“defabc”。解答:#include<stdio.h>#include<string.h>#define MAXLINE 100int main(void) char lineMAXLINE,str4;int i; printf("Input the string:"); gets(line); if(strlen(line)<3) printf("字符串長(zhǎng)度小于3,不符合要求!n"); for(i=0;i<3;i+) stri=linei; stri='0' for(i=3;linei!=
11、'0'i+) linei-3=linei; linei-3='0' strcat(line,str); printf("%s%sn","After changing: ",line); return 0;【練習(xí)8-9】使用動(dòng)態(tài)內(nèi)存分配的方法實(shí)現(xiàn)例 8-9 的冒泡排序。解答:#include<stdio.h>#include<stdlib.h>void bubble(int a,int n); int main(void)int n,j,*a,i,temp; printf("Enter n(
12、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);for(i=0;i<n;i+) scanf("%d",a+i); bubble(a,n); printf("After sorted,a%d=",n);for(i=0;i<n;i+) printf(
13、"%3d",*(a+i); free(a); return 0;void bubble(int a,int n) int i,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.下列語句定義 x 為指向 int 類型變量 a 的指針,其中哪一個(gè)是正確的 B 。Aint a, *x = a; B. int a, *x = &a;Cint *x = &a,a; Dint
14、 a, x = a;2. 以下選項(xiàng)中,對(duì)基本類型相同的指針變量不能進(jìn)行運(yùn)算的運(yùn)算符是 A 。A+ B- C= D=3若有以下說明,且 0<=i<10,則對(duì)數(shù)組元素的錯(cuò)誤引用是 C 。int a = 0,1,2,3,4,5,6,7,8,9, *p = a,i;A*(a+i) Bap-a+i Cp+i D*(&ai)4下列程序的輸出結(jié)果是 B 。int main(void)int a10 = 0,1,2,3,4,5,6,7,8,9, *p = a+3;printf(“%d”, *+p); return 0;A3 B4 Ca4的地址 D非法5對(duì)于下列程序,正確的是 A 。void
15、 f(int *p)*p = 5;int main(void)int a, *p;a = 10;p = &a;f(p);printf(“%d”, (*p)+);return 0;A5 B6 C10 D11二、填空題1. 下列函數(shù)在一維數(shù)組 a 中將 x 插入到下標(biāo)為 i(i>=0)的元素前。如果 i>=元素的個(gè)數(shù),則 x 插入到末尾。原有的元素個(gè)數(shù)存放在指針 n 所指向的變量中,插入后元素個(gè)數(shù)加 1。請(qǐng)?zhí)羁?。void insert(double a , int *n, double x, int i)int j;if _ (i<*n)_for (j=*n-1;_j&g
16、t;=i_; j-)_aj+1_ = aj;elsei = *n;ai=_x_;(*n)+;2下列程序先消除輸入字符串的前后空格,再判斷是否是“回文”(即字符串正讀和倒讀都是一樣),若是則輸出 YES,否則輸出 NO。請(qǐng)?zhí)羁铡?include <stdio.h>#include <string.h>int main(void)char s80, 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 ( _
17、p<q_ && *p =*q)p+;_q-_;if ( p<q )printf(“NOn”);elseprintf(“YESn”);return 0;3. 下列程序在數(shù)組中同時(shí)查找最大元素和最小元素的下標(biāo),分別存放在main( )函數(shù)的fmax 和 min 變量中。請(qǐng)?zhí)羁铡oid 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,%dn”, max, min);r
18、eturn 0;void find(int *a, int n, int *max, int *min)int i;*max=*min=0;for (i = 1; i < n; i+)if (ai > a *max) _*max=i_;if (ai < a *min) _ *min=i_;4 .寫出下列程序的執(zhí)行結(jié)果 0 01 22 40 02 34 6#include <stdio.h>int main(void)int a10, b10, *pa, *pb, i;pa = a;pb = b;for( i=0; i<3; i+, pa+, pb+)*pa
19、= 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+);return 0;三、程序設(shè)計(jì)題1. 拆分實(shí)數(shù)的整數(shù)與小數(shù)部分:要求定義一個(gè)函數(shù) void splitfloat(float x,int *intpart,float *fracpart),其中x是被拆分的實(shí)數(shù),*intpart和*fracpart分別是將實(shí)數(shù)x拆分出來的整數(shù)部分與小數(shù)部分。編寫主函數(shù),并在
20、其中調(diào)用函數(shù)splitfloat()。試編寫相應(yīng)程序。解答:#include<stdio.h>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",intpa
21、rt);printf("The fracpart is: %f",fracpart);return 0; void splitfloat(float x,int *intpart,float *fracpart)*intpart=(int)x;*fracpart=x-*intpart;2. 在數(shù)組中查找指定元素:輸入1個(gè)正整數(shù)n(1<n<=10),然后輸入n個(gè)整數(shù)存入數(shù)組a中,再輸入一個(gè)整數(shù) x,在數(shù)組 a 中查找 x,若找到則輸出相應(yīng)的下標(biāo),否則顯示“Not found”。要求定義和調(diào)用函數(shù) search(int list ,int n,int x),在數(shù)組
22、list 中查找元素 x,若找到則返回相應(yīng)下標(biāo),否則返回-1,參數(shù) n 代表數(shù)組 list中元素的數(shù)量。試編寫相應(yīng)程序。解答:#include<stdio.h>int search(int list,int n,int x);int main(void) int i,n,res,x; int a10; printf("Input n:"); scanf("%d",&n); for(i=0;i<n;i+) scanf("%d",&ai); printf("Input x:"); sc
23、anf("%d",&x); res=search(a,n,x); if(res>=0) printf("index=%dn",res); else printf("Not foundn"); return 0;int search(int list,int n,int x) int i; for(i=0;i<n;i+) if(listi=x) return i; 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)
24、整后的n個(gè)數(shù)。試編寫相應(yīng)程序。解答:#include<stdio.h>void move(int *x,int n,int m);int main(void) int i,m,n; int a80; printf("Enter n:"); scanf("%d",&n); printf("Enter m:"); scanf("%d",&m); for(i=0;i<n;i+) scanf("%d", &ai); move(a,n,m); printf(&qu
25、ot;After move: "); for(i=0;i<n;i+) printf("%d ",ai);return 0; void move(int *p,int n,int m) int i,j,k=0,a80; for(i=0;i<n;i+) if(i<n-m) ai+m=pi; else ak+=pi; for(i=0;i<n;i+) pi=ai;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 的人退出圈子。如此下去,直到留下
26、最后一個(gè)人。編寫程序,輸入整數(shù) n 和 m,并按退出順序輸出退出圈子的人的編號(hào)。試編寫相應(yīng)程序。解答:#include<stdio.h>int main(void) int count,i,j,m,n; int num80=0; printf("Input n:"); scanf("%d",&n); printf("Input m:"); scanf("%d",&m); i=j=count=0; while(count<n-1) if(numi=0) j+; if(j%m=0&am
27、p;&j) count+; numi=-1; j=0;/報(bào)數(shù)報(bào)到m后,j重歸0,開始下次報(bào)數(shù) i+;/讀取下一個(gè)元素 i%=n;/一次n個(gè)跟報(bào)完數(shù),開始下一次 (除余n是因?yàn)閕是下標(biāo),從0開始,n是具體 數(shù)/從1 開始 /i為n時(shí)下次a0報(bào)數(shù))for(i=0;i<n;i+)if(numi=0)printf("Last No is: %dn",i+1);return 0;5.使用函數(shù)實(shí)現(xiàn)字符串復(fù)制:輸入一個(gè)字符串t和一個(gè)正整數(shù)m,將字符串中從第m個(gè)字符開始的全部字符復(fù)制到字符串s中,再輸出字符串s。要求自定義并調(diào)用函數(shù)void strmcpy(char *s,
28、char *t, int m)。試編寫相應(yīng)程序。解答:#include<stdio.h>#include<string.h>void strmcpy(char *s,char *t,int m);int main(void) char s80,t80; int m; printf("Input the string:"); gets(t); printf("Enter m:"); scanf("%d",&m); if(strlen(t)<m) printf("Error Input&qu
29、ot;); return 0; else strmcpy(s,t,m); puts(s); return 0;void strmcpy(char *s,char *t,int m) 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<stdio.h>void delchar(char
30、 *s,char c);int main(void) char c; char s80; 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(si!='0') if(si!=c) sj=s
31、i; j+; i+; sj='0'7. 字符串排序:輸入 5 個(gè)字符串,按由小到大的順序輸出。試編寫相應(yīng)程序。解答:#include<stdio.h>#include<string.h>int main(void) int n,i,j,index; char sx8080,stemp80; printf("Enter n:"); scanf("%d",&n); printf("Input %d strings:",n); for(i=0;i<n;i+) scanf("%s
32、",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,stemp); printf("after sorted: n"); for(i=0;i<5;i+) printf("%st",sxi); return 0;8. 判斷回文:判斷輸入的一串字符是否為“回文”。所謂“回文”是指順
33、讀和倒讀都一樣的字符串。如“XYZYX”和“xyzzyx”都是回文。試編寫相應(yīng)程序。解答:#include <stdio.h>int mirror(char *p);int main(void) char s80; 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'
34、) q+; q-; while(p<q) if(*p!=*q) return 0; p+; q-; return 1; 或#include <stdio.h>int mirror(char *p);int main(void) char s80; 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) return 1; p+; q-; elsereturn 0;9. 分類統(tǒng)計(jì)字符個(gè)數(shù): 輸入一行文字,統(tǒng)計(jì)其中的大寫字母、小寫字母、空格、數(shù)字以及其他字符各有多少。試編寫相應(yīng)程序。解答:#include<stdio.h>int main(void) c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 關(guān)于中學(xué)生人際關(guān)系(10篇)
- 市場(chǎng)社會(huì)實(shí)踐報(bào)告
- 開學(xué)安全第一課的心得體會(huì)(30篇)
- 2024分布式電站云邊協(xié)同技術(shù)規(guī)范
- 《機(jī)械制造基礎(chǔ)》課件 模塊8 機(jī)械裝配工藝的基礎(chǔ)知識(shí)
- 邏輯推斷題馬于玲
- 國(guó)內(nèi)外相似案例研究:錦薈PARK及碧桂園·森林城市
- 勾股定理復(fù)習(xí)課課件
- 16.2《登泰山記》課件 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊(cè)-9
- 江蘇省南京市第29中2025屆高考仿真卷語文試卷含解析
- 2024三方物流園區(qū)租賃與運(yùn)營(yíng)管理合同3篇
- 【MOOC】例解宏觀經(jīng)濟(jì)統(tǒng)計(jì)學(xué)-江西財(cái)經(jīng)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《中國(guó)的土地政策》課件
- 債權(quán)債務(wù)抵消協(xié)議-合同模板
- 【MOOC】電工學(xué)-西北工業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 第九版內(nèi)科學(xué)糖尿病
- 專題12 簡(jiǎn)·愛-2024年中考語文復(fù)習(xí)文學(xué)名著必考篇目分層訓(xùn)練(原卷版)
- 【高考語文】2024年全國(guó)高考新課標(biāo)I卷-語文試題評(píng)講
- 客戶滿意度論文開題報(bào)告
- 2024-2025學(xué)年八年級(jí)上冊(cè)歷史期末復(fù)習(xí)選擇題(解題指導(dǎo)+專項(xiàng)練習(xí))原卷版
- 課桌椅人體工程學(xué)
評(píng)論
0/150
提交評(píng)論