習題11(指標)
1、讀程式題:對以下程式語句分析輸出語句的輸出,並對錯誤的語句分析其錯誤原因。
#include <stdio.h>
void main()
{
int x=12,a[3]={1,5,8},*p1=&x,**p2=&p1,*p3[3]={&x,a,a+1};
float y=9.9,*p4=&y;
char s[]="fighting!",*ps=s;//去掉s前面的&
printf("%d,%d,%d,%d\n",x,*p1,**p3,**p2);//12,12,12,12
printf("%d,%d,%d\n",*a,*p3[1],*(*(p3+1)));//1,1,1
printf("%d,%d,%d\n",*(a+1),*p3[2],**(p3+2));//5,5,5
printf("%.1f,%.1f,%.1f\n",y,*p4,*&y);//9.9,9.9,9.9
++ps;
printf("%c,%c\n",*s,*ps++);//f,i
printf("%d,%d\n",ps-s,ps==s+2);//2,1
printf("%c\n",*s+1);//*s++ 常量不能自加
printf("%x",p1+p2);//地址不能相加,沒意義。
}
2、程式改錯題:以下程式功能是任意輸入三個整數按大到小的順序輸出。
#include <stdio.h>
void main()
{
void sort3(int *q1,int *q2,int *q3);
int a,b,c,*p1,*p2,*p3;
printf("請輸入三個整數:");
scanf("%d%d%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
sort3(p1,p2,p3);
printf("大到小是:%d %d %d\n",a,b,c);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
void sort3(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}
3、編寫函式pfact:功能為求任意一個正整數的階乘,結果用指標變數的方式傳回。
程式設計實現:求n!。
#include <stdio.h>
void pfact(int n,long *pn)
{
int i;
for(i=1,*pn=1;i<=n;i++)
{
*pn=*pn*i;
}
}
void main()
{
int x,len;
long *plen=&len;
printf("請輸入一個正整數:");
scanf("%ld",&x);
pfact(x,plen);
printf("%d!是:%ld",x,len);
}
4、編寫函式pflower:功能為判斷一個數是否是水仙花數。水仙花數指的是一個三位正整數,其每一位的數字的立方之和等於其本身。如153=+水仙花數。形參要求是指標變數。
程式設計實現:輸出所有的水仙花數。
#include <stdio.h>
#include <math.h>
int pflower(int n,int *pm)
{
int a,b,c;
a=n/100;
c=n%10;
b=(n-100*a-c)/10;
if(n==pow(a,3)+pow(b,3)+pow(c,3))
*pm=1;
else
*pm=0;
}
void main()
{
int i,len,*plen=&len;
printf("輸出三位數的水仙花數:");
for(i=100;i<1000;i++)
{
pflower(i,plen);
if(len==1)
printf("%d ",i);
}
}
小胖專屬學習分享