• 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++)
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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_______); ( ++ )
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    三、编程题
    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");
     }_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    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);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    解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);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    解3

    #include "string.h"
    main()
    {char s1[80],s2[30];
     int n;
     gets(s1);
     gets(s2);
     printf("Input n(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末尾*/
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3、用指针编写比较两个字符串s和t的函数strcmp(s,t)。要求st时,返回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,k);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    解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);
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    }
    解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);
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    解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);
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    解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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    /* 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);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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]);
     }_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    解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]);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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);
       }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【SpringBoot】| SpringBoot 集成 Redis
    单核与多核CPU的区别与联系-结合ESP32浅谈
    Map集合(TreeMap)的使用
    “Node.js 包已不值得信任”
    nginx basic认证以及重复提示账号密码问题处理
    DNS WEB HTTP
    秋招之路 面经
    【K8S】二进制安装
    Python基础快速入门
    el-tree横向纵向滚动条
  • 原文地址:https://blog.csdn.net/weixin_44071904/article/details/126828749