C語言程序設(shè)計(第3版)何欽銘 顏 暉 第8章指針
《C語言程序設(shè)計(第3版)何欽銘 顏 暉 第8章指針》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計(第3版)何欽銘 顏 暉 第8章指針(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、【精品文檔】如有侵權(quán),請聯(lián)系網(wǎng)站刪除,僅供學習與交流 C語言程序設(shè)計(第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
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)排好序了)。 解答: 設(shè)置一個標志變量 flag,進入一輪循環(huán)前設(shè)置為 0,在循環(huán)中有發(fā)生數(shù)
5、據(jù)交換就改寫flag 值為 1。當該輪循環(huán)結(jié)束后檢查 flag 值,如果變?yōu)?1 說明發(fā)生了數(shù)據(jù)交換,還沒有排好序,如果為 0 說明沒有發(fā)生交換,已經(jīng)排好序。
#include 6、
bubble(a,n);
printf("After sorted, a[%d]=", n);
for(i=0;i 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 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 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 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 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 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;
三、程序設(shè)計題
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 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 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 28、ove(a,n,m);
printf("After move: ");
for(i=0;i 29、
4.報數(shù):有 n 個人圍成一圈,按順序從 1 到 n 編好號。從第一個人開始報數(shù),報到 m(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 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 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 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 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 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 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
- 溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點美食推薦
- XX國有企業(yè)黨委書記個人述責述廉報告及2025年重點工作計劃
- 世界濕地日濕地的含義及價值
- 20XX年春節(jié)節(jié)后復工安全生產(chǎn)培訓人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點節(jié)后常見的八大危險
- 廈門城市旅游介紹廈門景點介紹廈門美食展示
- 節(jié)后開工第一課復工復產(chǎn)十注意節(jié)后復工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓
- 深圳城市旅游介紹景點推薦美食探索
- 節(jié)后復工安全生產(chǎn)培訓勿忘安全本心人人講安全個個會應急
- 預防性維修管理
- 常見閥門類型及特點
- 設(shè)備預防性維修
- 2.乳化液泵工理論考試試題含答案