习题九
一、 单选题
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);
}
}