C语言程序设计教程(第三版)李凤霞 第九章课后习题答案

习题九
一、 单选题
1、 已知:int p,a;则语句"p=&a;“中的运算符”&"的含义是( )。
A)位与运算 B)逻辑与运算 C)取指针内容 D)取变量地址
2、已知:int a,x;则正确的赋值语句是( )。
A)a=(a[1]+a[2])/2 B)a
=*a+1; C)a=(x=1,x++,x+2); D)a=“goog”;
3、已知:int a,p=&a; 则下列函数调用中错误的是( )。
A)scanf(“%d”,&a); B)scanf(“%d”,p); C)printf(“%d”,a); D)printf(“%d”,p);
4、main(argc,argv)中形式参数argv的正确说明形式应当为( A )。
A)char argv[ ]
B)char argv[ ][ ] C)char argv[ ] D)char *argv
5、说明语句"int (*p)(); “的含义是( )。
A) p是一个指向一维数组的指针变量
B) p是一个指针变量,指向一个整型数据
C) p是一个指向函数的指针,该函数的返回值是一个整型
D) 以上都不对
6、设有说明int(*ptr)[M];其中的标识符ptr是( )。
A) M个指向整型变量的指针
B) 指向M个整型变量的函数指针
C) 一个指向有M个整型元素的一维数组的指针
D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型变量
7、已知:double *p[6]; 它的含义是( )。
A)p是指向double型变量的指针 B)p是double型数组
C)p是指针数组 D)p是数组指针
8、已知函数说明语句:void *f(); 则它的含义是( )。
A)函数f的返回值是一个通用型的指针 B)函数f的返回值可以是任意的数据类型
C)函数f无返回值 D)指针f指向一个函数,该函数无返回值
9、已知:char s[10],*p=s,则在下列语句中,错误的语句是( )。
A)p=s+5; B)s=p+s; C)s[2]=p[4]; D)*p=s[0];
10、已知:char b[5],*p=b; 则正确的赋值语句是( )。
A)b=“abcd” B)*b=“abcd” C)p=“abcd” D)*p=“abcd”
11、下列对字符串的定义中错误的是( )。
A)char str[7]=“FORTRAN” B)char str[ ]=” FORTRAN"
C)char *str=“FORTRAN” D)char str[ ]={‘F’,‘O’,‘R’,‘T’,‘R’,‘A’,‘N’,‘\0’}
12、已知:char s[20]=“programming”, *ps=s; 则不能引用字母o的表达式是( )。
A)ps+2 B)s[2] C)ps[2] D)ps+=2,*ps
13、已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; 则不能表示数组a中元素的表达式是( )。
A)*p B)a[10] C)*a D)a[p-a]
14、已知:char **s; 正确的语句是( B )。
A)s=“computer”; B)*s=“computer”; C)**s=“computer”; D)*s='A’;
15、已知:char c[8]=“beijing”,*s=c; int i; 则下面的输出语句中,错误的是( B)。
A)printf(%s\n",s); B)printf(“%s\n”,s);
C)for(i=0;i<7;i++) D)for(i=0;i<7;i++)
printf(“%c”,c[i]); printf(“%c”,s[i]);
16、已知:int i=0,j=1,p=&i,q=&j; 错误的语句是( D )。
A)i=
&j; B)p=&
&i; C)j=p++; D)i=&q;
17、已知:char p,q; 选择正确的语句( C )。
A)p
=3; B)p/=q; C)p+=3; D)p+=q;
18、已知:int a,p=&a; 则为了得到变量a的值,下列错误的表达式为( A );
A)
&p B)p C)p[0] D)&a
19、C语言主函数main()最多允许有( B )个参数。
A)1 B)2 C)0 D)3
20、已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10}; int(ptr)[3]=a,p=a[0]; 则以下能够正确表示数组元素a[1][2]的表达式是( D )。
A)
((ptr+1)[2]) B)
(
(p+5)) C)(ptr+1)=2 D)(
(a+1)+2)

二、填空题
1、下面的函数是求两个整数之和,并通过行参传回结果。
int add(int x, int y,________ z) (int *)
{________=x+y;} ( *z )
2、下面程序通过指向整型的指针将数组a[3][4]的内容按3行4列的格式输出,请给printf()填入适当的参数,使之通过指针p将数组元素按要求输出。

 #include "stdio.h"
   int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a;
   main()
   {int i,j;
for(i=0;i<3;i++)
  {printf("\n");
for(j=0;j<4;j++)
    printf("%4d",___________);  (*p+i*4+j或*p++)
   }
}

3、下面程序的功能是:从键盘上输入一行字符;存入一个字符数组中,然后输出该字符串。

#include "stdio.h"
main()
{char str[81],*sptr;
 int i;
for(i=0;i<80;i++)
 {str[i]=getchar();
  if(str[i]=='\n')break;
  }
str[i]=___________;  ('\0' )
sptr=str;
while(*sptr)
  putchar(*sptr_______); ( ++ )
}

4、下面的程序实现从10个数中找出最大和最小值。

#include "stdio.h"
int max,min;
find_max_min(int *p,int n)
{int *q;
 max=min=*p;
 for(q=________;________;q++)   (q=p q<p+n)
  if(________)max=*q;       (*q>max)
  else if (________)min=*q;  (*q<min)
 }
main()
{int i,num[10];
 printf("input 10 numbers:\n")
 for(i=0;i<10;i++)
  scanf("%d",&num[i]);
find_max_min(num,10);
printf("max=%d;min=%d\n",max,min);
}

三、编程题
1、编写一函数,其功能是交换两个变量x、y的值。编程序实现对数组a[100],b[100]调用此函数,交换a、b中具有相同下标的数组元素的值,且输出交换后的a、b数组。

/*p279_1.c*/
#include "stdlib.h"
void swap(int *pa,int *pb)
{int t;
 t=*pa;*pa=*pb;*pb=t;
 }
main()
{int a[100],b[100],i;
 for(i=0;i<100;i++)    /*产生数组a和b */
  {a[i]=random(100);
   b[i]=random(100);
   }
 printf("before swap A:\n");   /*输出交换前数组a */
 for(i=0;i<100;i++)
   printf("%3d",a[i]);
 printf("\n");
 printf("before swap B:\n");  /*输出交换前数组b */
 for(i=0;i<100;i++)
   printf("%3d",b[i]);
 printf("\n");
 for(i=0;i<100;i++)          /*a、b数组元素交换 */
   swap(&a[i],&b[i]);
 printf("after swap A:\n");  /*输出交换后数组a */
 for(i=0;i<100;i++)
   printf("%3d",a[i]);
 printf("\n");
 printf("after swap B:\n");/*输出交换后数组b */
 for(i=0;i<100;i++)
   printf("%3d",b[i]);
 printf("\n");
 }_

2、用数组方案和指针方案分别编写函数insert(s1,s2,f),其功能是在字符串s1中的指定位置f处插入字符串s2。
解1:

/* P279_2A.c */
#include "string.h"
insert(char *sa,char *sb,int n)
{char sf[80],*p,*q;
 int i=0;
 for(p=sa+n;*p!='\0';p++)
   sf[i++]=*p;
   sf[i]='\0';
 for(p=sa+n;*sb!='\0';p++,sb++)
   *p=*sb;
 for(q=sf;*q!='\0';p++,q++)
   *p=*q;
 *q='\0';
 }

main()
{char s1[80]="dsahfdjkahfke";
 char s2[40]="sdajkhew";
 int n;
 puts(s1);puts(s2);
 n=strlen(s1);
 printf("Input n(0----%d):\n",n);
 scanf("%d",&n);
 insert(s1,s2,n);
 puts(s1);
 }

解2:

/* P279_2B.C */
#include "string.h"
insert(char sa[],char sb[],int n)
{char sf[80];
 int i=0,k=0;
 while(sa[n+i]!='\0')
   sf[i]=sa[n+i++];
   sf[i]='\0';
   i=0;
 while(sb[i]!='\0')
   sa[n+i]=sb[i++];
 while(sf[k]!='\0')
   sa[n+i++]=sf[k++];
   sa[n+i]='\0';
 }

main()
{char s1[80]="dsahfdjkahfke";
 char s2[40]="sdajkhew";
 int n;
 puts(s1);puts(s2);
 n=strlen(s1);
 printf("Input n(0----%d):\n",n);
 scanf("%d",&n);
 insert(s1,s2,n);
 puts(s1);
 }

解3

#include "string.h"
main()
{char s1[80],s2[30];
 int n;
 gets(s1);
 gets(s2);
 printf("Input n(n<strlen(s1):\n");
 do
  scanf("%d",&n);
  while(n>=strlen(s1));
 insert(s1,s2,n);
 puts(s1);
 }
insert(char *p1,char *p2,int k)
{char tem[80];
 strcpy(tem,p1+k);  /*保存第k个字符开始的字符*/
 *(p1+k)='\0'; /*使第k个字符之前的字符为一个独立字符串*/
 strcat(p1,p2); /*将p2复制到p1之后*/
 strcat(p1,tem);/*再将保存再tem中的字符串连接到p1末尾*/
 } 

3、用指针编写比较两个字符串s和t的函数strcmp(s,t)。要求s<t时返回-1,s=t时返回0,s>t时,返回1。
解1:

/* P279_3.C */
int strcmp(char *s1,char *t1)
{ while(*s1!='\0'&&*t1!='\0')
  {if(*s1>*t1)return 1;
   if(*s1<*t1)return -1;
   if(*s1++==*t1++)continue;
  }
  if(*s1>*t1)return 1;
  if(*s1==*t1)return 0;
  if(*s1<*t1) return -1;
 }
main()
{int k;
 char s[80]="123456";
 char t[40]="123456";
 puts(s);puts(t);
 k=strcmp(s,t);
 if(k==1)printf("s>t:%d\n",k);
 if(k==0)printf("s==t:%d\n",k);
 if(k==-1)printf("s<t:%d\n",k);
 }

解2:

/*P279_3b.c */
#include "string.h"
int sstrcmp(char *s,char *p)
{while(*s!='\0'&&*p!='\0'&&*s++==*p++);
 if(*s>*p)return 1;
 else if (*s==*p)return 0;
 else return -1;
 }
main()
{char a[80],b[80];
 int k;
 gets(a);gets(b);
 k=sstrcmp(a,b);
 if(k==1)printf("a>b\n");
 if(k==0)printf("a==b\n");
 if(k==-1)printf("a<b\n");
 } 

4、编写程序,其中包括一个函数,此函数的功能是:对一个长度为N的字符串从第K个字符起,删除M个字符,组成长度为N-M的新字符串(其中N、M<=80,K<=N)。要求输入字符串"We are poop poor students.",利用此函数进行删除"poor"的处理,并输出处理后的字符串。

/* P279_4.C */
#include "stdio.h"
main()
{int a[10],b[10],*pa,*pb,i;
 pa=a;pb=b;
 for(i=0;i<3;i++,pa++,pb++)
  {*pa=i;*pb=2*i;
   printf("%d\t%d\n",*pa,*pb);
   }
  printf("\n");pa=&a[0];pb=&b[0];       /*输出 0  0 */
  for(i=0;i<3;i++)                      /*     1  2 */
   {*pa=*pa+i;*pb=*pb+i;                /*     2  4 */
    printf("%d\t%d\n",*pa++,*pb++);   /*输出  0  0 */ 
    }                                 /*      2  3 */
 }                                  /*      4  6 */

5、输入一行字符串,将其中的字符从小到大排列后输出。
解1:

/*p279_5A.c */
#include "string.h"
sort(char *s,int n)
{int i,j;
 char *p,ch;
 for(i=0;i<n;i++)
  {p=s+i;
   for(j=i;j<n;j++)
    if(*(s+j)<*p)p=s+j;
    ch=*p;*p=*(s+i);*(s+i)=ch;
    }
  }
main()
{char a[80];
 int k;
 printf("Entry a string for a:");
 gets(a);
 k=strlen(a);
 sort(a,k);
 puts(a);

}
解2:

/*p279_5b.c */
#include "string.h"
sort(char *s,int n)
{int i,j,k;
 char p,ch;
 for(i=0;i<n;i++)
  {k=i;
   for(j=i;j<n;j++)
    if(s[j]<s[k])k=j;
    ch=s[i];s[i]=s[k];s[k]=ch;
    }
  }
main()
{char a[80];
 int k;
 printf("Entry a string for a:");
 gets(a);
 k=strlen(a);
 sort(a,k);
 puts(a);
 } 

6、输入若干行字符串,求出每行的串长。当串中保含"stop"时,停止输入,并打印出最长的行的内容。
解1:

/*P279_6A.c*/
main()
{char s[80],*p,*q,*f,cc;
 printf("Input a string:\n");
 scanf("%s",s);
 for(p=s;*p!='\0';p++)
  {f=p;
   for(q=p;*q!='\0';q++)
     if(*f>*q)f=q;
   cc=*f;*f=*p;*p=cc;
  }
  printf("%s\n",s);
  }

解2:

/*P279_6B.c*/
#include "string.h"
main()
{char s[25][80],*p;
 int i,k,m=0;
 for(i=0;i<25;i++)
 {gets(s[i]);
  if(strcmp(s[i],"stop")==0)break;
   k=strlen(s[i]);
   printf("%d:%d\n",i,k);
  if(k>m){p=s[i];m=k;}
  }
  printf("%s",p);
 } 

7、将空格分开的字符串称为单词。输入多行字符串,直到输入"stop"单词时才停止。最后输出单词的数量。
解1:

#include "string.h"
main()
{char s[200];
 long n=0;
 int i,m;
 gets(s);
 while(strcmp("stop",s)!=0)
 {m=strlen(s);
  for(i=0;i<m;i++)
   {if(s[i]!=' '&&s[i+1]==' ')n++;
    if(s[i]!=' '&&s[i+1]=='\0')n++;
    if(s[i]==' '&&s[i+1]==' ')continue; 
    if(s[i]==' '&&s[i+1]!=' ')continue;
    }
   gets(s);
   }
printf("n=%ld\n",n);
 }

解2

 /* P280_8 */
#include "string.h"
main()
{char s[80],*p=s,s1[80];
 int n,n1=0;
 printf("Input a string:\n");
 scanf("%s",s);
 while(strcmp(s,"stop")!=0)
   {n=0;p=s;
    while(*p!='\0'){n++;p++;}
    if(n>n1){ n1=n;strcpy(s1,s);}
    printf("Input a string:\n");
    scanf("%s",s);
    }
  printf("%s:%d\n",s1,n1);
}
/* P280_8 */
#include "string.h"
main()
{char s[80],*p=s;
 int n=0;
 printf("Input a string:\n");
 gets(s);
 while(strcmp(s,"stop")!=0)
   {p=s;
    while(*p!='\0')
    {if(*p==32||*p=='\0')n++;
     p++;}
    if(strlen(s)>0)n++;
    printf("Input a string:\n");
    gets(s);
   }
   printf("words number:%d\n",n);
  }

8、将输入的两行字符串连接后,将串中的空格全部移到串首后输出。

/* P280_8A */
#include "string.h"
main()
{char s1[80],s2[40],*p1=s1,*p2=s2;
 printf("Input 2 string:\n");
 gets(s1);
 gets(s2);
 while(*p1!='\0')p1++;/*指针指向s1的末尾*/
 while(*p2!='\0')/*连接s2*/
    *p1++=*p2++;
 *p1='\0';
 while(p1!=s1)  /*将空格移到字符串前面*/
   {if(*p1!=32){p1--;continue;}
    else
    {p2=p1;
     while(p2!=s1) /*将空格之前的所有字符向后移动一个字符位置*/
      {*p2=*(p2-1);p2--;} 
     *p2=' ';
     p1--;
     }
    }
    puts(s1);
  }

9、输入字符串,请分别统计字符串中所包含的各个不同的字符及其各个字符的数量。如:
输入字符串:abcedabcdcd
则输出: a=2 b=2 c=3 d=3 e=1
解1:

/* P280_9b */
#include "stdlib.h"
#include "string.h"
int a[27];
main()
{int i=0;
 char s[80],*p=s;
 printf("Enter strint:");
 gets(s);
 while(*p!='\0')
  {if(*p>='A'&&*p<='Z')*p=*p+32;
   if(*p>='a'&&*p<='z')a[*p-'a']++;
   else a[26]++;
   p++;
   }
 for(i=0;i<26;i++ )
 printf("%c=%d ",i+'a',a[i]);
 printf("other=%d\n",a[26]);
 }_

解3:

/* P280_9C */
#include "string.h"
main()
{char s[80],*p=s;
 static int n[128],i;
 printf("Input a string:\n");
 gets(s);
 while(*p!='\0')
  {n[*p]=n[*p]+1;
   p++;}
 for(i=32;i<128;i++)
  printf("%c=%d ",i,n[i]);
  }

11、设一个以符号’.'结束的英文句子长度小于80字节。请编写程序读入改句子,并检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:
读入:madam i’m adam. 输出:yes
读入:abcdba 输出:no

/* P280_11.c */
#include "string.h"
main()
{char a[20],*ps,*pe;
 int n;
 gets(a);
 n=strlen(a);
 ps=a;pe=ps+n;
 while(ps<=pe)
  {if(*ps<'A'||*ps>'Z'&&*ps<'a'||*ps>'z')ps++;
   if(*pe<'A'||*pe>'Z'&&*pe<'a'||*pe>'z')pe--;
   if(*ps!=*pe)break;
   ps++;pe--;
   }
 if(ps>pe)printf("%s:yes!\n",a);
 else printf("%s:No!\n",a);
 }

12、将一个数的数码倒过来所到的新数教原数的反序数。如果一个数等于它的的反序数,则程它为对称数。求不超过1993的最大的二进制的对称数。

/* P256_37.c */
#include "string.h"
main()
{int n,i,j;
 char nb[15],*p,*q;
 for(i=3;i<1993;i++)
  {n=i;
   j=0;
   while(n!=0)
    {nb[j]=n%2+48;n=n/2;j++;}
   nb[j]='\0';
   p=nb;q=p+strlen(nb)-1;
   while(p<=q)
    if(*p++!=*q--)break;
    if(p>q)printf("%s\n",nb);
   }
 }
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是筱倩阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值