分享

4.1 单项选择题

 ┣█一生有你 2007-01-10

    4.1  单项选择题

    1.若有下列说明,则数值为4的表达式是( 
      int a[12]
{ l23456789101112 }
      char c
‘a‘d g
    ①a[g
c]           ②a[4] 
    ③a[‘d‘-‘c‘]            ④a[‘d‘-c] 
    
【解】数组元素的下标自0开始顺序编号,值为4的元素是a[3]。所以只有下标表达式的值为3的才是正确的。下标表达式g-C中的的变量gc的值是还未被设定的,其值不确定。a[4]的值为5,下标为4是不对的。‘d‘-‘c‘的值为1a[l]的值是2,所以也是不对的。变量c的值为‘a‘ ‘d‘-c3,所以正确解答是


    2
.设有定义:"char s[12]={"string"};" printf("%d\n"strlen(s));的输出是( 
    ① 6              ② 7                
    ③11             ④ 12
      
【解】在C语言中,字符串是指在有效字符之后有字符率结束标记符的字符列,并约定字符串的长度是指字符率中有效字符个数,不包括字符串的结束标记符。存放于字符数组s中的字符串是“string”,该字符串的长度为6,所以输出该字符串的长度应是6。正确的解答是

    3
.下列语句中,正确的是(  
      ① char a[3][]={‘abc"
‘1‘}         ② char a[][3]={‘abc‘‘l‘}
      ③char a[3][]={‘a‘
"1"}                ④char a[][3]={"a","1"}
      
【解】如定义数组时有初始化,其最高维的长度可以省缺,由系统根据初始化时的初值个数确定,而其它维的长度是不可以缺省的。对二维字符数组的初始化,可以按行用字符串对其初始化,也可以按二维数组元素的存储顺序逐一用字符对其元素初始化。在供选择解答中,有不是最高维的长度被缺省,所以是错误的。在供选择解答中,还将字符串常量写作‘abc‘,这也是错误的。只有,用字符率按行给二维字符数组初始化,这才是正确的。正确构解答是

    4
.合法的数组定义是(   
       ①int a[]={"string"}               ②int a[5]={0,1,2,3,4,5};
       ③char a={"string"}                ④char a[]={0,1,2,3,4,5};
     
【解】错误的原因是整数数组不可以用字符串对其初始化。错误的原因是,数组初始化时,初始化指定的值的个数多于数组的元素个数。错误的原因是,能用字符串初始化的只;有字符指针变量,或字符数组。字符率不能对其它类型的变量初始化,包括字符变量。是正确的,因为字符数组可以用小整数(作为字符的ASCII代码值)对其元素初始化。

    5
.语句"printf("%d\n"strlen("ats\nol2\1\\"))"的输出结果是(   
             ①11            ②10              ③ 9              ④ 8
     
【解】字符串中的字符可以是一般的普通字符,也可以是由反斜杠字符开头的转义字符。在字符串"abs\no12\11\\" 中,有三个转义字符,它们是\n\1\\,所以该字符串的有效字符个数是9。所以正确的回答是

    6
.函数调用“strcat(strcpy(strlstr2)str3)”的功能是(  
      ①
将字符串strl复制到字符串str2中后再连接到字符串str3之后
      ②
将字符串strl连接到字符串str2中后再复制到字符率str3之后
      ③
将字符串str2复制到字符串strl中后再将字符串str3连接到字符串strl之后
      ④
将字符串str2连接到字符率strl之后再将字符串strl复制到字符串str3
     
【解】函数调用strcat(s1s2)是将s2字符串复制连接到s1字符串之后,使s1字符串变得更长。函数调用strcpy(s1s2)是将s2字符串复制到s1,使s1字符串的内容与s2字符串的内容相同。函数调用strcat(strcpy(strlstr2) str3) 是先执行strcpy(strlstr2),然后再执行strcat(strl,str3),所以其功能是将字符串str2复制到字符串strl中,然后再将字符串str3复制连接到字符串strl之后。正确的选择是

    7
.设有如下定义,则正确的叙述为(  
      char x[]
{"abcdefg"}
      char y[]
{‘a‘‘b‘‘c‘‘d‘‘e‘‘f‘‘g‘}
      ①
数组x和数组y等价数组x和数组y长度相同
      ③
数组X的长度大于数组y的长度数组X的长度小于数组y的长度
    
【解】不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。但用字符初始化时,尽管给出了字符串中的全部字符,还是不会自动有字符率结束字符。但字符串初始化自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多1个字节。所以只有才是正确的。

 

    4.2  填充题

    1.根据变量定义“static int b[5] a[][3]={123456};”b[4]_____a[1][2] 
    
【解】系统规定,静态变量定义时,若末初始化,系统自动给定二进制代码全0的值。所以态数组b的元素全为0,当然包括b[4]也为几静态数组a是二维数组,每行有三个元素,在初始化中结出了六个初值,所以数组a2行。由于数组的元素按行顺序存储,并按行顺序初始化。前三个值是第一行,后三个值是第二行。a[1][2]是第二行的第三列元素,也是 a的最后一个元素,所以其值是6


    2
.设有定义语句“static int a[3][4]={{1}{2}{3}}a[l][l]值为_,a[2][1]的值为_。
     
【解】给二维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对哪些未给出初值的部分元素,系统自动置二进制代码全0的值。由于定义语句只给a[0][0]给定初值la[l][0]给定初值2a[2][0]给定初值3。这样,其它元素都为0值。所以,a[1][1] 0a[2][1] 0

    3
.若在程序中用到“putchar( )”函数时,应在程序开头写上包含命令_____,若在程序中用到“strlen( )”函数时,应在程序开头写上包含命令______。
   
【解】putchar()是系统提供的头文件stdio.h中定义的宏,所以程序要使用它,必须写上包含命令:#include<stdio.h>。函数strlen()是系统提供的字符串处理函数之一,字符串处理函数的函数原型说明和它们用到的有关常量、数据结构等,在系统提供的头文件tring.h中定义,所以使用该函数的程序应在程序开头写上包含命令并include<String.h>

    4
.下面程序的功能是输出数组s中最大元素的下标,请填空。
    main()
    {int k
p
     int s[]={1,
972-103};
     for(p
0, kpp<6
p++)
      if(s[p]>s[k])____________
      printf("%d\n"
k)

    } 
     
【解】为要寻找数组中的最大元素的下标,需先预设1个临时最大元素的下标,并顺序逐一考察数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考察了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考察是从首元素开始顺序向后继元素考察。程序中,存储临时最大元素下标的变量是k,变量p控制顺序考察的循环控制变量。当发现当前元素s[p]比临时最大元素s[k]更大时,应该用p更新k。所以在空框处应填入代码“kp

    5
.下面程序的功能是将一个字符串str的内容颠倒过来,请填空。
    # include<string.h> 
    main()
    {int i
j_____________
     char str[]={"1234567"}

     for(i
0jstrlen(str)          i<ji++j++)
    { k
str[i]; str[i]=str[j]
str[j]=k; }
     printf("%s\n"
str)

    }
       
【解】颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量ij, j是前端元素的下标, j是后端元素的下标, 交换以这两个变量值为下标的元素str[i] str[j]。开始时,i的值为 0j的值为字符率未元素的不标(字符串长度减1)。每次交换后,i 1j1。继续交换的条件是str[i]还位于str[j]的前面,即i<j。字符串末元素的不标是它的长度减1,所以在第二个空框处应填入-1。程序为了交换str[i]str[j],使用了变量k,该变量应在程序的变量定义部分中一起定义,所以在第一个空框处应填入k

    6
.以下程序可把输入的十进制数以十六进制数的形式输出,请填空。
       main(  )
     { char b[17]={"0123456789ABCDEF"};
       int c[64],d,i
0,base16;
       long n

       printf("Enter a number
\n");.
       scanf("%ld"
&n)
      do  { c[i]=________;i++;n
n/base;}
      while(n!
0);
      printf("Transmite new base
\n")

      for(--i; i>= 0;--i)
     {d
c[i] printf("%c"b     )}
      printf("\n")

     
【解】程序中,字符数组b存储十六进制的 16个数字符,整型数组C存储泽出的十六进制数的各位数值.从整数n译出它的各位十六进制数值,需采用除16取余的方法,即求n16 的余.得到它的十六进制的个位数,接着将n除以16。在n不等于0的情况下循环,能顺序求出n的十六进制的个位数、十位数、百位数等等。程序中变量base已预置16,所以在第一个空框处可填代码n%basen%16。当n的十六进制数的个位、十位、百位等数字依次存放于数组C中后,就从最高位至最低位,参照数组c[i]的内容d(以其内容为下标),取十六进制数字符表中的字符b[d]输出。所以在第二个空框处可填入代码[d]

    4.3  程序分析题

    1.阅读程序,写出程序运行结果。,
      main
()
   {  static int a[][3]
{9753l24,68};
      int i
jsl0s20

     for(i
0 i<3i++)
     for(j
0j<3
j++)
     { if(i
==j) s1s1
a[i][j];
     if(i+j
== 2) s2s2
a[i][j];
      }
     printf("%d\n%d\n"
sls2)

    }

    【解】已知数组。共有33列席一行依次是9,7,5;每二行是3,1,2;第三行是4,6,8。程序引用数组元素的游标变量是ij,外循环控制变量i是数组的行下桥,内循环控制变量j是数组的列下标。循环体的工作是将数组的某些元素累计到sl,某些元素累计到S2。将行下标i和列下标j相同的元素累计到slsla[0][0]a[l][1]a[2][2]。将行下标i与列下标j的和为 2的元素累计到 s2s2a[0][2]a[l][l]a[2][0]。所以sl18s210。程序输出:
    18
    10

    2
.说明下列程序的功能。
   main()
   { int i
j
    float a[3][3]
b[3][3]x
    for(i
0i<3i++) 
    for(j
0j<3
j++)
    { scanf("%f",&x)
a[i][j] x

   }
    for(i
0i<3i++)
    for(j
0j<3
j++)
   b[j][i]
a[i][j]

   for(i=0
i<3i++)
   {printf("\n")

    for(j
0j<3j++)
    printf("%f"
b[i][j])

    }
    printf("\n")

    }
     
【解】程序第一段两重循环,实现按行顺序输入数组a的全部元素的值。程序第二段两重循环是将数组a转置复制到数组b。程序第三段两重循环实现按行输出数组b的全部元素。所以程序的功能是按行顺序输入3*3二维数组的全部元素,然后按列顺序输出。

    3
.写出下列程序的运行结果。
    main()
    {static char a[]
={‘*‘,‘*‘,‘*‘,‘*‘,‘*‘,‘*‘}
    int i
jk
    for( i
0i<5i++)
    { printf("\n")
    for(j
0j<ij++) printf("%c"‘‘)

    for
j0j<5 j++)printf"%c"a[k])
    }
    printf( "\n")

     }

   【解】程序的外循环控制循环五次,每次开始先输出一个换行符,共输出5行信息。对于i(自0开始计算)行,先输出i个空白符,接着输出字符数组a中的五个字符,由于a中的五个字符都是字符。,所以输出五个*字符。这样程序是输出以下形式的图案:
            * * * * *
            * * * * *
            * * * * *
            * * * * *
            * * * * *

    4
.说明下列程序的功能。
      main()
     {  int i
j
       float a[3][3]
b[3][3]c[3][3]x
       for(i
0i<3i++)
      for(j=0;j<3
j++)
    { scanf("%f"
&x) a[i][j]= x

     }
     for(i
0i<3i++)
     for(j
0j<3
j++)
     {scanf("%f"
&x)b[i][j]x

     }
     for(i
0 i<3; i++)
    for(j
0j<3
j++)
    c[i][j]
a[i][j] b[i][j]

    for(i
0 i<3i++)
    { printf("\n")

    for(j
0j<3j++)
    printf("%f"
c[i][j])

    }
     printf("\n")

    }
   
【解】程序第一段的功能是按行顺序输入数组a 的元素。程序第二段的功能是按行顺序输入数组b的元素。程序第三段的功能是顺序累加数组a和数组b的对应元素,并将和存于数组C的对应元素中。最后,按行顺序输出数组C的全部元素。

 

    4.4  程序设计题

 

    1.编程序,输入单精度型一维数组 a[10] ,计算并输出 a数组中所有元素的平均值。
    
【解】为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成C程序如下:
     # include<stdio.h> 
     main()

  { int i n10
     float s
a[10]
     printf("Enter %d numbers! \n"
n)
     for( i=0
i< n i++)
    { scanf("%f"
&s) a[i]= s

     }
    for(s=0.0,i=0;i<n;i++)
    s+= a[i]

     s /
n
     printf("
平均值是%.2f\n" s)
     }

    2
.编程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。
     
【解】将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量iji是前端元素的下标,j是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i的值为0j的值为末元素的下标。每次交换后,i1j1。继续交换的
条件是i<j。程序如下:
    # include<stdio.h>
        main()
       { int a[10]
ijtn10
         printf("Enter %d numbers! \n"
n)
     for(i
0i<ni++)
         scanf("%d"
&a[i] );
       for(i=0,j
n-1i<ji++
j--) {
      t
a[i] a[i]a[j] a[j] t

       }
       for(i
0 i<n i++)
       printf("%d\t"
a[i])

       printf("\n")

       }

    3
.编程序,输入两个字符串(<40个字符) ,连接后输出(不准用系统函数)
     
【解】将字符串s2连接到字符串s1的计算过程可分两个步骤完成。首先找到字符串s1的末尾,然后参照字符串s2,将字符串s2的全部有效字符逐一复制到字符串s1,最后在字符串s1的末尾接上字符率结束标记符。完整程序如下:
      # include<stdio.h> 
      # define N 40
      main()
     {  char s1[N]
s2[N]
        int i,j; 
        printf("Enter stringl!\n")

       scanf("%s"
s1)

     printf("Enter string2! \n")
       scanf("%s"
s2)
       for(i
0 sl[i]!‘\0‘ i++)
       for(j
0s2[j]!‘\0‘ i++j++) 
       so[i]
s[j]

        s1[i]
‘\0‘
       printf("sl
%s\n" sl)

       }

    4
.编程序按下列公式计算S的值(其中X1X2Xn由键盘输入)
       s
∑(xi-x0)(xi-x0) (其中x0X1x2Xn的平均值
    
【解】输入数组xn个元素的值,按公式计算。程序首先输入n,设n<100,然后输入n个数据,接着求它们的平均值,最后按计算公式求出s,并输出。程序如下:

      # include<stdio.h> 
     # define N 100
     main()
     { double x[N+1]
s
       int i,n

      do {
       printf("Enter n(<100)")
scanf("%d" &n)
       } while(<=0||n>=100);
       for(i=1
i<=ni++){ 
      scanf("%lf"
&s)x[i]s

       } 
       for(s
0.0i1i<=n; i++)
      s+=x[i]

     x[0]
s/n
     for(s
0.0 i=1;i<= ni++)
      s+=(x[i]-x[0])*(x[i]
x[0])

      printf("s=%f\n"
s)
      }

    5
.输入一个3X5的整数矩阵,输出其中最大值、最小值和它们的下标。
   
【解】输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下:
     # include<stdio.h> 
    main()
    { int a[3][5]
ijtn3 m5
      min
max, minrow, mincol maxrow, maxcol
      printf("Enter %d*%d numbers !\n"
nm)
      for(i
0 i<ni++)

    for( j0j<mj++){
     scanf("%d"
&t) a[i][j] t

     }
     min
max=a[0][0] minrowmincolmaxrow=maxcol=0;
     for(i
0i<n
i++)
     for(j
0j<m
j++){ 
     if( a[i][j]> max ){
     max= a[i][j]
maxrow= imaxcol=j

     }
     if( a[i][j]<min) { 
     min
a[i][j] minrow= i mincolj
     }
     }
      printf("MAX
a[%d][%d] %d MIN a[%d][%d] %d \n"
     maxrow,maxcol,max
minrow,mincol,min)
      }

    6
.输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。
   
【解】程序先输入字符率,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量ch中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch- ‘A‘‘a‘ ;类似地,若变量ch中的字符是小写字母,则与它对应的大写字母的表达式可以写成ch‘a‘‘A‘ 。完整程序如下:
      # include<stdio.h> 
      # define N 200
        main()
       { char s[N]

         int i

        printf(" Enter string! \n")

        scanf ("%s"
s)
       for(i
0 s[i]!‘\0‘i++)
       if(s[i] >=‘A‘&&s[i] <=‘Z‘ )
      s[i]
s[i] -‘x‘‘a‘

      else if(s[i] >=‘a‘&& s[i] <=‘z‘) 
      s[i]
s[i]‘a‘ ‘A‘
      printf("s
%s\n", s)
      }

    7
.设某班50名学生的三科成绩表如下:
    
课程一    课程二     课程三

          ...        ...        ...

    试编一个程序,输入这50个学生的三科成绩,计算并输出每科成绩的平均分。
   
【解】程序定义一个503列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下:
     # include<stdio.h>
     # define N 50
     # define M 3
      main()
     {int score[N][M]
ijt
     double a[M]

     printf("Enter scores!\n")

     for(i
0i< N; i++)
     for(j
0j<M
j++) { 
     scanf("%d"
&t)score[i][j]t

      }
     for(j
0j<Mj++)a[j]0.0
     for(j
0j< Mj++){ 
     for(i
0i< N
i++)
     a[j]+= score[i][j]

    a[j]/
N
    }
     for(j
0j<Mj++)
      printf("
课程%d的平均分是%.2f\n" j+1a[j])

     }

    8
.编一个程序,输入一个整型数据,输出每位数字,其间用远号分隔。例如,输入整数为2345,则输出应为: 2 3 4 5
    
【解】程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以10的余数的办法来求出它的个位,每分拆出一位就将被分拆的数除以10。循环过程直至被分拆的数为0结束。完整程序如下:
      # include<stdio.h> 
       main()
      {int a[20]
ibase10
       int n

       printf("Enter a number! \n")

       scanf("%d"
&n)/*整数输入*/
        i
0/*n进行分拆,各位数字自低位到高位存于数组
a*/
       do{
      a[i++]
n% base

      n/
base
      } while(n)

    for(i--i>=0i--)/*自高位到低位输出*/
       printf("%d%c"
a[i] i? ‘
‘\n‘);
         }

    9
.编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3。然后输出加密后的字符串。

   
【解】程序的主要工作是输入字符串,并顺序考察输入字符率中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下:
      # include<stdio.h> 
      # define N 200
        main()
       {char s[N]
int i;
        printf("Enter string! \n")

        scanf("%s"
s)
        for(i
0s[i] !‘\0‘; i++)
       if(s[i] >=‘A‘ && s[i]
‘Z‘)
       s[i]
3

       else if(s[i]
‘a‘&& s[i]‘z‘ ) 
       s[i]
3

       printf("s
%s\n"s)
       }

    10
.编一个程序,将按第9题中加密的字符率(从键盘输入)解密后输出。
   
【解】本问题编写的程序是完成上一程序的逆操作。同样是顺序考察输入字符串,对满足要求的字符作恢复更改。要求是当字符减3后是大写英文字母时,则对其作减3处理的替换;当字符加3后是小写英文字母时,则对它作加3的处理。如此做法是有错误的,程序未考虑原
先不是英文字母,而未被加3或减3处理,但对它减3或加3后是英文字母时,将被下面的程序转换成英文字母。所以下面的程序不是完成上题程序的逆操作。但没有简单的办法能避免这个错误。完整程序如下:
      # include<stdio.h> 
      # define N 200
      main()
     {char s[N]
int i;
       printf("Enter string!\n")

       scanf("%s"
s)
       for(i
0s[i] !‘\0‘i++)
       if(s[i]-3>=‘A‘&&s[i]-3<=‘Z‘)
       s[i]-=3

       else if(s[i]+3>=‘a‘ && s[i]+3<= ‘Z‘)
       s[i]+=3

        printf("s=%s\n"
s)
        }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多