C语言程序设计习题6.docx
《C语言程序设计习题6.docx》由会员分享,可在线阅读,更多相关《C语言程序设计习题6.docx(15页珍藏版)》请在冰豆网上搜索。
C语言程序设计习题6
习题6参考解答
1.请解释以下术语的含义:
地址指针指针变量直接访问间接访问
解:
(1)地址:
内存单元的编号叫做地址.
(2)指针:
内存单元的编号叫做地址,通常也叫做指针。
(3)指针变量:
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。
(4)直接访问:
通过变量名称引用变量内存单元的方式称为直接访问.
(5)间接访问:
利用了指针变量,通过变量的指针(即变量的内存地址)来引用内存单元的值,这种方式称为间接访问.
2.指针能参与哪几种运算?
举例说明。
解:
(1)指针变量和整数可以进行加/减运算:
p++、p--、p+i、p-i、p+=i、p—=i
(2)指针变量可进行赋值运算:
p=&a;变量a的地址赋给p,即指针p指向a
p=array;数组array首地址赋给p
p=&array[i];数组元素array[i]的地址赋给p
p=max;函数max的入口地址赋给p
p1=p2;指针p2的值赋给指针p1,即p1、p2所指的数据相同
(3)同类指针变量在一定的条件下可以作相减运算:
p-q
(4)同类指针变量在一定的条件下可以作比较运算:
p〈q
3.判断下面两个程序的正误,若错误指出原因。
(1)#include〈stdio.h>
intmain()
{
char*p;
p="DATA”;
printf(”%s\n",*p);
return0;
}
解:
该程序错。
应为:
printf("%s\n",p);
(2)#include〈stdio。
h〉
intmain()
{
int*p;
*p=25;
printf(”%d”,*p);
return0;
}
解:
该程序错。
指针变量没有赋初值。
4.输入3个整数,输出其中最大数。
要求用指针变量实现。
解:
#include”stdio。
h"
intmain()
{
inta=0,b=0,c=0;
int*aa=NULL,*bb=NULL,*cc=NULL,*p=NULL;
aa=&a,bb=&b,cc=&c;
printf("input3number:
”);
scanf(”%d%d%d",&a,&b,&c);
printf(”a=%db=%dc=%d\n",a,b,c);
p=aa;
if(*p<*bb)p=bb;
if(*p〈*cc)p=cc;
printf(”%d\n",*p);
return0;
}
程序运行情况如下:
input3number:
459↙
a=4b=5c=9
9
5.有3个整型变量i,j,k。
请编写一个程序,设置3个指针变量p1,p2,p3,分别指向i,j,k,然后通过指针变量使i,j,k3个变量的值顺序交换,即原来i的值赋给j,把j的原值赋给k,把k的原值赋给i。
i,j,k的原值由键盘输入,要求输出i,j,k的原值和新值.
解:
#includeintmain()
{
inti,j,k,tmp;
int*p1,*p2,*p3;
scanf(”%d%d%d",&i,&j,&k);
printf("Beforechange:
%d\t%d\t%d\n”,i,j,k);
p1=&i;
p2=&j;
p3=&k;
tmp=*p3;
*p3=*p2;
*p2=*p1;
*p1=tmp;
printf("Afterchange:
%d\t%d\t%d\n”,i,j,k);
return0;
}
程序运行情况如下:
123↙
Beforechange:
123
Afterchange:
312
6.输入一个10个元素的一维数组,在主函数中用scanf函数输入。
用指针方式编程找出最大和最小数,并指出最大数和最小数的位置。
解:
inty_max(int*p,intn)
{
intmax=*p,i,k=0;
for(i=0;i{
if(max<*(p+i))
{
k=i;
max=*(p+i);/*记得要在这里更新一下max的记录*/
}
}
returnk;
}
#defineN10
#include〈stdio。
h>
intmain()
{
inta[N];
inti,m,max;
for(i=0;iscanf("%d”,&a[i]);
for(i=0;i〈N;i++)
printf(”%d”,a[i]);
m=y_max(a,N);
printf("\nmax=a[%d]=%d",m,a[m]);
return0;
}
程序运行情况如下:
15678964723↙
15678964723
max=a[3]=78
7.输入一段文字,统计其中所包含的数字字符和字母字符个数.
解:
#include#include
#include〈string。
h〉
#defineN80
intcnum=0,dnum=0;/*全局变量用于在两个函数之间传递数据*/
intmain()
{
charch[N];
voidcount(charc);
inti,n;
gets(ch);
n=strlen(ch);
for(i=0;icount(ch[i]);/*数组元素作为函数的实参*/
printf("%d,%d\n",cnum,dnum);
}
voidcount(charc)
{
if(c>=’0’&&c〈='9')
dnum++;
if((c〉='A’&&c<=’Z')||(c〉='a’&&c<=’z’))
cnum++;
return0;
}
程序运行情况如下:
hello12345↙
5,5
8.请写出下列程序段的输出结果。
(1)#includeintmain()
{
inta[]={1,2,3,4,5,6},*p;
p=a;
*(p+3)+=2;
printf("%d,%d”,*p,*(p+3));
return0;
}
解:
1,6
(2)#include〈stdio。
h〉
intmain()
{
inta[]={1,2,3,4,5,6};
int*p;
p=a;
printf("%5d%5d%5d%5d\n”,*p,*(++p),*++p,*(p——));
printf("%5d%5d\n”,*p,*(a+2));
return0;
}
解:
3321
23
(3)#include〈stdio。
h>
#includeh〉
intmain()
{
char*s1=”AbDeG";
char*s2="AbdEg”;
s1+=2;s2+=2;
printf(”%d\n”,strcmp(s1,s2));
return0;
}
解:
-1
(4)#includeh〉
#include〈string.h〉
fun(char*w,intn)
{
chart,*s1,*s2;
s1=w;s2=w+n-1;
while(s1〈s2)
{
t=*s1;
*s1=*s2;
*s2=t;
s1++;
s2--;
}
}
intmain()
{
charp[]="1234567”;
fun(p,strlen(p));
puts(p);
return0;
}
解:
7654321
(5)#includeh〉
intmain()
{
char*a[]={"Pascal”,”Clanguage”,"dBase”,"Coble"};
char(**p)[];
intj;
p=a+3;
for(j=3;j〉=0;j--)
printf(”%s\n”,*(p-—));
return0;
}
解:
Coble
dBase
Clanguage
Pascal
9.用一个函数实现两个字符串的比较,即自己写一个strcmp函数:
strcmp(s1,s2)
如果s1==s2,则函数返回值为0;如果s1!
=s2,返回它们两者第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字符不同,“O”与“A”之差为79-65=14);如果s1〉s2,则输出正值,如果s1两个字符串s1,s2由main函数输入,strcmp函数的返回值也在main函数中输出。
解:
#includeh〉
intstrcmp(char*s1,char*s2)
{
for(;*s1==*s2&&*s1&&*s2;s1++,s2++);/*找不同的字符*/
return(*s1—*s2);
}
voidmain()
{
chara[10],b[10];
gets(a);
gets(b);
printf("%d\n”,strcmp(a,b));
}
程序运行结果如下:
hello↙
world↙
—15
10.设计一个程序,管理一个班的计算机成绩,要求采用一维数组来存储学生的成绩。
解:
#include〈stdio。
h〉
intmain(void)
{
floata[10];
inti=0;
doublesum=0。
0;
floatavg=0.0;
for(i=0;i<10;i++)
{
printf("请输入第%d个同学的成绩:
",i+1);
scanf(”%f",&a[i]);
printf("\n");
sum+=a[i];
}
avg=sum/10。
0;
printf("%f\n”,avg);
return0;
}
程序运行结果如下:
请输入第1个同学的成绩:
85↙
请输入第2个同学的成绩:
89↙
请输入第3个同学的成绩:
90↙
请输入第4个同学的成绩:
78↙
请输入第5个同学的成绩:
69↙
请输入第6个同学的成绩:
58↙
请输入第7个同学的成绩:
78↙
请输入第8个同学的成绩:
95↙
请输入第9个同学的成绩:
100↙
请输入第10个同学的成绩:
89↙
83。
100000
11.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换,用指针来实现。
解:
#includeh>
voidaa(int*array)
{
inti;
for(i=0;i<10;i++)
scanf(”%d,”,&array[i]);
}
voidbb(int*array)
{
int*max,*min,t;
int*p;
max=min=array;
for(p=array;p<=array+9;p++)
{
if(*max<*p)max=p;
if(*min〉*p)min=p;
}
t=*max;*max=array[9];array[9]=t;
t=*min;*min=array[0];array[0]=t;
}
voidcc(int*array)
{
int*p;
for(p=array;p〈=array+9;p++)
printf("%d,”,*p);
}
voidmain()
{
intnumber[10];
aa(number);
bb(number);
cc(number);
}
程序运行结果如下:
0—91020304050607066↙
—9,0,10,20,30,40,50,60,66,70
12.分析下列程序的运行结果。
#include〈stdio。
h〉
intf1(intx)
{
returnx+1;
}
intf2(intx)
{
returnx—1;
}
intsum_square(int(*f)(),intm,intn)
{
intk,sum=0;
for(k=m;k<=n;k++)
sum+=(*f)(k)*(*f)(k);
returnsum;
}
intmain()
{
printf("result=%d\n",sum_square(f1,1,2)+sum_square(f2,1,2));
return0;
}
解:
result=14