高级语言程序设计基础 (吉顺如版)课后习题(四至六章)答案

循环结构程序设计

高级语言程序设计基础一至三章

选择题

1.下述循环体语句的循环次数为(A)。

int x=-1;

do

 {  x=x*x; } while(!x);

 

A.1次          B.2次     C.无限次        D.有语法错误

 

2.在下列选项中,没有构成死循环的程序段是(C)。

A.int i=100;

while(1)

{  i=i%100+1;

if(i>100) break;

}

B.for(;;);

C.int k=1000;

do  {++k; } while(k>=10000);

D.int s=36;

while(s);–s;

 

3.下面程序输出结果是(B)。

#include<stdio.h>

int main(void)

{  int k=0; char c='A';

 do

     { switch( c++ )

       { case 'A': k++; break;

        case 'B': k--;

        case 'C': k+=2; break;

        case'D': k=k%2; continue;

        case 'E': k=k*10; break;

        default: k=k/3;

       }

k++;

}while( c<'G' );

  printf( "k=%d\n",k );

  return 0;

}

 

A.k=3          B.k=4        C.k=2         D.k=0

 

4.程序段“int num=0; while(num<=2)  printf(“%d,”,num++);”的运行结果是(C)。

A.0,1,     B.1,2,       C.0,1,2,      D.1,2,3,

 

5.下面程序段的运行结果为(A)。

 int a=1,b=2,c=2,t;

 while(a<b<c){t=a;a=b;b=t;c--;}

 printf("%d,%d,%d",a,b,c);

 

A.1,2,0        B.2,1,0       C.1,2,1       D.2,1,1

 

6.设有以下语句:

int x=3;

do

{

printf("%d\n",x-=2);

}

while(!(--x));

 

该程序段的执行结果为(B)。

A. 显示1        B. 显示1和-2

C. 显示0        D.是死循环

 

7.下面有关for循环的正确描述是(D)。

A.for循环只能用于循环次数已经确定的情况

B.for是先执行循环体语句,后判断表达式

C.在for循环中,不能用break语句跳出循环体

D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来

 

8.执行下面的程序后,a的值为(B)。

#include<stdio.h>

int main(void)

{  int a,b;

   for(a=1,b=1;a<=100;a++)

     {  if(b>=20)  break;

         if(b%3==1)

           { b+=3;  continue; }

         b-=5;

     }

return 0;

}

 

A.7     B.8     C.9     D.10

 

9.以下叙述正确的是(D)。

A.不能使用do-while语句构成的循环

B.do-while语句构成的循环必须用break语句才能退出

C.do-while语句构成的循环,当while语句中的表达式值为非零时结束循环

D.do-while语句构成的循环,当while语句中的表达式值为零时结束循环

 

10.以下叙述正确的是(B)。

A.continue语句的作用是结束整个循环的执行

B.只能在循环体内和switch语句体内使用break语句

C.在循环体内使用break语句或continue语句的作用相同

D.从多层循环嵌套中退出,只能使用goto语句

 

填空题

1.break语句只能用于 循环 语句和 switch  语句中。

2.下列for循环语句执行的次数是 4 

for(x=0,y=0;(y=123)&&(x<4);x++);

3.当运行以下程序时,从键盘键入right?,则下面程序运行结果是sjhiu 

#include<stdio.h>

int main(void)

  {

    char c;

    while((c=getchar())!='?')

          putchar(++c);

    return 0;

  }

 

4.下列程序的运行结果是 x=1,y=20 

#include<stdio.h>

int main(void)

  {

    int i,x,y;

    i=x=y=0;

    do{  ++i;

           if(i%2!=0)

            {  x=x+i;

               i++;

            }

          y=y+i++;

        }while(i<=7);

   printf("x=%d,y=%d\n",x,y);

   return 0;

 }

 

5.执行下列程序段后的输出是 02 

x=0;

 while(x<3)

 for(;x<4;x++)

   {

     printf("%d",x++);

     if( x<3) continue;

     else  break;

     printf("%d",x);

   }

 

6.设定义“int k=1,n=163;”,执行下面程序段后,k的值是 18 

do

 {

   k*=n%10;

   n/=10;

}while(n);

 

7.以下程序的运行结果是 1 

#include <stdio.h>

int main(void)

{   int y=10;

    do  { y--;} while (--y);

    printf("%d\n",++y);

 }

 

8.以下程序的运行结果是 s=7 

#include <stdio.h>

int main(void)

 {

   int s=0,k;

   for(k=7;k>=0;k--)

     {  switch(k)

         {  case 1: case 4:  

            case 7: s++; break;

            case 2:  case 3: case 6: break;

            case 0:  case 5: s+=2; break;

          }

     }

   printf( “s=%d \n”,s );

   return 0;

  }

 

9.下列程序的功能为:将从键盘输入的一组字符统计出大写字母的个数m和小写字母的个数 n,并输出m、n中的较大数。

#include<stdio.h>

int main(void)

{  int m=0,n=0;

   char c;

   while((  c=getchar() )!='\n')

    {   if(c>='A'&&c<='Z') m++;

        if(c>='a'&&c<='z') n++;

    }

   printf("%d\n",m<n?  n:m  );

  return 0;

 }

 

10.下列程序的功能为:求1~100以内所有能被13整除的数的累加和,当累加和超出100时停止累加。请填空。

#include <stdio.h> 

int main(void)

{  int i, sum = 0;

   for ( i=1; i<100; i++ )

    {   if (   i%13==0   )

               sum += i;

         if ( sum > 100 )  break ;

        }

   printf( “i=%d, sum=%d\n”, i,sum );

   return 0;

 }

 

编程题

(1)从键盘上输入若干字符,以按Enter键结束,统计其中字符’A’或’a’的个数。

源程序:



#include <stdio.h>

int main(void)

{

  char ch;

  int cnt=0;

  while((ch=getchar())!='\n')

   {

       if(ch=='A' || ch=='a')

       cnt=cnt+1;

   }      

  printf("cnt=%d\n",cnt);

  return 0;

}



运行结果:



wabcAAabc

cnt=4

-----------

(2)利用的前100项之积计算pi的值。

#include <stdio.h>

int main(void)

{

  double term, result = 1;     /*累乘项初值应为1*/

  int n;

  for (n=2; n<=100; n = n + 2)

   {

        term=(double)( n * n)/((n-1)*(n+1));  /*计算累乘项*/

        result = result * term;

   }

  printf("result = %f\n", 2*result);

  return 0;

}

 

运行结果:

result = 3.126079


(3)用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚?

#include <stdio.h>

int main(void)

{

  int five,two,one,count=0;

  for(five=1;five<=29;five++)

    for(two=1;two<=73;two++)

    {

      one=100-five-two;

      if(5*five+2*two+one==150)

      {

         count++;

         printf("five=%d,two=%d,one=%d\n",five,two,one);

      }

    }

  printf("count=%d\n",count);

  return 0;

}

 

运行结果:



five=1,two=46,one=53

five=2,two=42,one=56

five=3,two=38,one=59

five=4,two=34,one=62

five=5,two=30,one=65

five=6,two=26,one=68

five=7,two=22,one=71

five=8,two=18,one=74

five=9,two=14,one=77

five=10,two=10,one=80

five=11,two=6,one=83

five=12,two=2,one=86

count=12

----------------------

 

(4)鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。

#include <stdio.h>

int main(void)

{

  int x, y;

  for (x=1;x<=97;x++)

   {

        y=98-x;

        if(2*x+4*y==386)

       printf("鸡=%d,兔=%d",x,y);

   }

  return 0;

}

运行结果:

鸡=3,兔=95


 

(5)将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

#include <stdio.h>

int main(void)

{

  int n,i;

  printf("please input a number:");

  scanf("%d",&n);

  printf("%d=",n);

  for(i=2;i<=n;i++)

    while(n!=i)

     {

       if(n%i==0)

         {

           printf("%d*",i);

           n=n/i;

         }

      else  break;

       }

   printf("%d",n);

   return 0;

}

运行结果:



please input a number:80

80=2*2*2*2*5

------------------------

(6)从键盘任意输入一个4位数x,编程计算x的每一位数字相加之和。例如,输入x为1234,则由1234分离出其个位4、十位3、百位2、千位1,然后计算4+3+2+1=10并输出。

#include <stdio.h>

int main(void)

{

  int sum=0,x,i,y;

  printf("Input data:");

  scanf("%d",&x);

  if(x>=1000&&x<=9999)

  {

      for(i=1;i<4;i++)

     {

      y=x%10;

      sum+=y;

      if(y!=0)

        printf("%d+",y);

      x=x/10;

     }

     y=x%10;

    printf("%d=%d\n",y,sum+y);

  }

  else printf("data error!");

  return 0;

}
运行结果:

 

(1)

Input data:9876

6+7+8+9=30

 

(2)

Input data:1002

2+1=3

---------------

 

(7)打印出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数

#include <stdio.h>

int main(void)

{

  int i,j,k,n;

  printf("narcissus numbers are:\n");

  for (n=100;n<1000;n++)

   {

    i=n/100;

    j=n/10%10;

    k=n%10;

    if (n==i*i*i+j*j*j+k*k*k)

      printf("%d\n",n);

   }

  return 0;

}
narcissus numbers are:

153

370

371

407

----------------------

 

(8)利用泰勒级数 计算的值,要求最后一项的绝对值小于10^-5,并统计出此时累加了多少项(x由键盘输入)。注意键盘输入值为弧度。

#include <stdio.h>

#include  <math.h>

int main(void)

{

  int n=1,count=1;

  float x;

  double sum,term;     

  printf("Input x: "); //输入值为弧度

  scanf("%f", &x);

  sum=x;

  term=x;            

  do

       {

         term=-term*x*x/((n+1)*(n+2));

         sum=sum+term;      

         n=n+2;

         count++;

       }while(fabs(term)>=1e-5);

  printf("sin(x)=%.1f,count=%d\n",sum,count);

  return 0;

}
运行结果:



Input x: 0.523598

sin(x)=0.5,count=4

-------------------

(9)编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。

#include <stdio.h>

int main(void)

{

  int num=123,x,n;

  printf("hint:0<number<1000\n");

  for(n=1;n<=10;n++)

  {

   printf("guess:");

   scanf("%d",&x);

   if(x==num) 

{

printf("Right!\n");

break;

}

   if(x>num)  printf("bigger!\n");

   if(x<num)  printf("smaller!\n");

  }

  if(n==11) 

    printf("END! The number is %d\n",num);

  return 0;

}

运行结果:



hint:0<number<1000

guess:0

smaller!

guess:200

bigger!

guess:100

smaller!

guess:150

bigger!

guess:125

bigger!

guess:112

smaller!

guess:118

smaller!

guess:121

smaller!

guess:123

Right!

---------------------

(10)编程输出以下图案。

#include <stdio.h>

int main(void)

{

  int i,j;

  for(i=1;i<=4;i++)

  {

    for(j=10-i;j>=1;j--)

      printf("%c",' ');

    for(j=0;j<2*i-1;j++)    

      printf("*");

    printf("\n");

  }

  for(i=3;i>=1;i--)

  {

    for(j=10-i;j>=1;j--)    

      printf("%c",' ');

    for(j=0;j<2*i-1;j++)        

      printf("*");

    printf("\n");

  }

 return 0;

}


 

章节测验

【单选题】
以下说法正确的是(  A  )
  • A、用do-while语句构成的循环,在while后的表达式为0时结束循环
  • B、do-while语句构成的循环不能用其他语句构成的循环来代替
  • C、do-while语句构成的循环只能用break语句退出
  • D、用do-while语句构成的循环,在while后的表达式为非0时结束循环

 

【单选题】以下程序运行时从键盘输入3.6,2.4,输出结果是(A  )。

#include<math.h>

void main()

{ 

 float x,y,z;

    scanf("%f,%f",&x,&y);

    z=x/y;

    while(1)

    {  if(fabs(z)>1.0)

      { 

 x=y;

 y=x;

 z=x/y;

 }

     else  break;

   }

   printf("%f",y);

}
  • A、2.4
  • B、1.5
  • C、1.6
  • D、2

如果c是大于1的正整数,与以下程序段功能相等的赋值语句是( D )。

s=a;

for(b=1;b<=c;b++)

   s=s+1;

 

  • A、s=b+c;
  • B、s=s+c;
  • C、s=a+b;
  • D、s=a+c;

有一条长阶梯,若每步跨2阶,则最后剩余1阶,若每步跨3阶,则最后剩余2阶,若每步跨5阶,则最后剩余4阶,若每步跨6阶,则最后剩余5阶,若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯共有多少阶。

请补充while语句后的判断条件。(C)

 

  #include<stdio.h>

         void main()

{ 

int i=1;

    while(         )

        ++i;

    printf("阶梯共有%d阶.\n",i);

}

 

  • A、!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==1))
  • B、!((i%2==0)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))
  • C、!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))
  • D、(i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)

【单选题】以下程序段的输出结果是(  C )。

#include<stdio.h>

void main()

{

  int a=3;

  do

  {

  printf("%d",a--);

  }while(!a);

}

 

  • A、32
  • B、不输出任何内容
  • C、3
  • D、321

【单选题】若定义int i; 则以下for语句的执行结果是( B   )。

 for(i=1;i<10;i++)

 { 

     if(i%3) i++;

     ++i;

     printf("%d",i);

 }

 

  • A、35811
  • B、369
  • C、258
  • D、2468

【单选题】以下程序段的输出结果是(    )。

  int n=10;

  while(n>7)

  { 

 printf("%d,",n);

      n--;

   }

 

  • A、9,8,7,
  • B、9,8,7,6,
  • C、10,9,8,
  • D、10,9,8,7,

【单选题】以下程序的输出结果是(  A  )。

#include<stdio.h>

void main()

{ 

int i=5;

  for(;i<15;)

  { 

 i++;

    if(i%4==0)    printf("%2d",i);

    else          continue;

  }

}

 

  • A、812
  • B、81216
  • C、1216
  • D、8
【单选题】
以下关于for语句的说法不正确的是(  B  )
  • A、for循环是先判断表达式,后执行循环体语句
  • B、for循环只能用于循环次数已经确定的情况
  • C、for循环中,可以用break语句跳出循环体
  • D、for循环体语句中,可以包含多条语句,但要用花括号括起来。
【单选题】
C语言中,while语句和do-while语句的主要区别是(  B  )
  • A、do-while的循环体不能是复合语句
  • B、do-while的循环体至少无条件执行一次
  • C、while的循环控制条件比do-while的循环控制条件严格
  • D、do-while允许从外部转到循环体内

【单选题】若定义int i;则以下循环语句的循环执行次数是(  C  )。

for(i=2;i==0;)

printf(“%d”,i–);

  • A、1
  • B、2
  • C、0
  • D、无限次

语句while(!y)中的!y等价于y!=0。(X)

下面程序段循环一次也不执行。(√)

int x=10;

while(x=0)

x=x-1;

for语句中的表达式可以部分或全部省略,但是两个分号不能省略。(

用于直接中断最内层循环的语句是break。(√)

以下程序的输出结果是n=4(√)

#include<stdio.h>

void main()

{

int i,n=0;

  for(i=2;i<5;i++)

  {

do {

  if(i%3) continue;

         n++;

      } while(!i);

      n++;

   } printf("n=%d",n);

}

 

【简答题】

图形打印。

题目描述

题目内容:编写程序,打印以下图形(行n的值由键盘输入)。

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define JUN

int main()



{

  volatile int i, j, n;

  char a = ' ', b = '*';

  scanf("%d", &n);

  for (i = 0; i<n; i++)

  {

    for (int j = i; j; j--)



    {

      printf("%c", a);



    }

    for (j = n; j>i; j--) {

      printf("%c", b);



    }

    printf("\n");

  }

  return 0;



}

 

【简答题】

特征四位数。

题目描述

题目内容:已知四位数3025具有一个特殊性质:它的前两位数字30与后两位数字25之和是55,而55的平方正好等于3025。编程找出所有具有这种性质的四位数。

 

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define JUN

int main()



{

  volatile int n, x, y;

  for (n = 1000; n <= 9999; n++)

  {

    x = n % 100;

    y = n / 100;

    if (n == (x + y)*(x + y))

    {

      printf("%d\n", n);



    }

  }

  return 0;



}

 

【简答题】

求和S。

题目描述

题目内容:求s=1+(1+2)+…+(1+2+3+…+n)的值,其中n由键盘输入。

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define JUN

int main()



{

  volatile int i, n, s = 0;

  scanf("%d", &n);

  if (n <= 0)



  {

    printf("Error!\n");

  }

  else {



    int a = 0;

    for (i = 1; i <= n; i++)

    {

      a = a + i;

      s = s + a;

    }

    printf("%d\n", s);

  }

  return 0;





}

【简答题】

追查车号。

题目描述

题目内容:一辆卡车违反交通规则,撞人逃逸。现场三人目击事件,但都没有记住车号,只记下车的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号正好是一个整数的平方。请根据以上线索求出车号。

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define JUN

int main()



{

  volatile int a, b;

  int x;

  for (a = 1; a<10; a++)

    for (b = 1; b<10; b++) {



      x = sqrt(a * 1000 + a * 100 + b * 10 + b);

      if (x*x == (a * 1000 + a * 100 + b * 10 + b))

      {

        printf("The number is %d%d%d%d\n", a, a, b, b);

      }

    }

  return 0;



}

 


数组

选择题

1.已定义“int i; char x[10];”,为了给x数组赋值,以下正确的语句是(D)。

A.x[10]= “Hello! “;

B.x=”Hello! “;

C.x[]=”Hello! “;

D.for(i=0; i<6; i++)  x[i]=getchar();

 

2.若有以下的数组定义:“char a[ ]=”abcd”; char b[]={‘a’,’b’,’c’,’d’,’e’};”,则以下正确的描述是(A)。

A.a数组和b数组长度相同

B.a数组长度大于b数组长度

C.a数组长度小于b数组长度

D.两个数组中存放相同的内容

 

3.若有定义“int i; int x[3][3]={2,3,4,5,6,7,8,9,10};”,则执行语句

“for(i=0;i<3;i++)  printf(“%4d”,x[i][2-i]);”的输出结果是(D)。

A.2 5  8            B.2 6  10

C.4 7  10         D.4 6  8

 

4.下列对二维数组a进行正确初始化的是(B)。

A.int a[2][3]={{1,2},{3,4},{5,6}};

B.int a[ ][3]={1,2,3,4,5,6};

C.int a[2][ ]={1,2,3,4,5,6};

D.int a[2][ ]={{1,2},{3,4}};

 

5.下列说法正确的是(D)。

A.数组的下标可以是float类型

B.数组的元素的类型可以不同

C.初始化列表中初始值的个数多于数组元素的个数也是可以的

D.区分数组的各个元素的方法是通过下标

 

6.若有定义“char str1[30],str2[30];”,则输出较大字符串的正确语句是(C)。

A.if(strcmp(strl,str2))  printf(“%s”,strl);

B.if(strl>str2)  printf(“%s”,strl);

C.if(strcmp(strl,str2)>0)  printf(“%s”,strl);

D.if( strcmp(strl)>strcmp(str2)) printf(“%s”,strl);

 

7.下列程序段的输出结果是(B)。

int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};

int i,s=0;

for(i=0;i<4;i++)

s+=aa[i][1];

printf("%d\n",s);

 

A. 11  B. 19    C. 13    D. 20

 

8.下列程序段的输出结果是(D)。

charstr[15]= "hello!";

printf("%d\n",strlen(str));

 

A.15   B.14    C.7    D.6

 

9.有以下程序段,当输入为happy!时,程序运行后输出结果是(B)。

charstr[14]={"I am "};

strcat(str,"sad!");

scanf("%s",str);

printf("%s",str);

 

A.I am sad!         B.happy!

C.I am happy!    D.happy!sad!

 

10.下列关于数组的描述中错误的是(D)。

A.一个数组只允许存储同种类型的数据

B.数组名是数组在内存中的首地址

C.数组必须先定义,后使用

D.如果在对数组进行初始化时,给定的数据元素个数比数组元素少,多余的数组元素自动初始化为最后一个给定元素的值

 

填空题

1.有定义语句“int i=3,x[4]={1,2,3};”,则数组元素x[i]的值是  0  

2.有定义语句“char a[ ]={ “I am a student”};”,该字符串的长度是  14  ,a[3]=  m  

3.有二维数组定义“k[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};”,则其中元素k[2][1]的值是 10 ,k[1][2] 的值是  7  

4.若有定义“int a[4][4];”,则a数组中行下标的下限为  0  ,列下标的上限为   3   

5.若有定义“char a[]=”abcdef”;”,则执行语句

“printf(“%d,%d\n”,sizeof(a),strlen(a));”后的输出结果是  7,6   

6.下列程序段的运行结果是  4  

char str[20]="This is my book";

str[4]='\0'; str[9]= '\0';

printf(" %d",strlen (str));

 

7.下列程序的运行结果是  Tony  

char name[3][20]={"Tony", "Join", "Mary"};

int m=0,k;

for(k=1;k<=2;k++)

if(strcmp (name[k],name[m])>0)

 m=k;

puts(name[m]);

 

8.下列程序运行时输入:20 30 5 85 40,运行结果为:

max=85

min=5

sum=180

aver=30.00 

#include<stdio.h>

#define N 5

int main(void)

{

int a[N],max,min,sum,i;

 for (i=0;i<N;i++)

        scanf("%d",&a[i]);

sum=max=min=a[0];

for (i=1;i<N;i++)

       {

  sum+=a[i];

         if (a[i]>max)  max=a[i];

         if (a[i]<min)  min=a[i];

    }

printf("max=%d\nmin=%d\nsum=%d\naver=%4.2f\n",max,min,sum,(float)(sum-max-min)/(N-2));

 return 0;

}

 

9. 下列程序运行时输入:This_is_a_C_Program! 运行结果为:

   Ti_saCPorm

Tss_Pgm   

#include<stdio.h>

#include<string.h>

int main(void)

{

char str[81], a[81], b[81];

 int n, i, j=0, k=0;

 gets( str );

 n=strlen( str );

for ( i=0; i<n; i++ )

{

       if ( i%2==0 )  a[j++] = str[i];

       if ( i%3==0 )   b[k++] = str[i];

}

a[j] = b[k] = '\0';

puts( a );

 puts( b );

 return 0;

}

 

10.下列程序的运行结果为:  1 1 1 5  

#include<stdio.h>

int main(void)

{

  char s[]="12345678";

  int c[4]={0},k,i;

  for (k=0; s[k]; k++)

    {

        switch (s[k])

       {

           case'1': i=0; break;

            case'2': i=1; break;

         case'3': i=2; break;

            case'4': i=3;

         }

        c[i]++;

    }

  for(k=0;k<4;k++)

        printf("%d ",c[k]);

  return 0;

}

 

 

编程题

 

(1)求最小数

从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。

#include<stdio.h>

#define N 15

int main(void)

{

  int min,i,j=0,a[N];

printf("Enter %d integers:\n",N);

for(i=0;i<N;i++)

     scanf("%d",&a[i]);

min=a[0];

  for(i=1;i<N;i++)

    if(min>a[i])

     {

  min=a[i];

        j=i;

     }

  printf("min=%d,loc=%d",min,j);

  return 0;

}

运行结果:



Enter 15 integers:

6 5 4 3 0 5 4 33 23 -9 6 5 1 2 8

min=-9,loc=9

-----------------------------

 

(2)进制转换

将输入的十进制正整数化为十六进制数。

#include <stdio.h>

int main(void)

{

int i,x,j,a[20];

while(1)

  { 

    scanf("%d",&x);

    if(x<0)

      printf("Data error,Reenter:\n");

    else break;

  }

i=0;

while(x)

  {

a[i]=x%16;

   x=x/16;

i++;

  }

  for(j=i-1;j>=0;j--)

  if(a[j]<=9)

         printf("%d",a[j]);

  else if(a[j]<=15)

         printf("%c",a[j]+'A'-10);

return 0;

}
运行结果:



123

7B

---------

 

(3)统计单词数

从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。

#include <stdio.h>

int main(void)

{

  char string[81];

  int i,num=0,word=0;

  char c;

  gets(string);

  for (i=0;(c=string[i])!='\0';i++)

     if(c==',') word=0;

     else if(word==0)

           {  word=1;

              num++;

           }

  printf("There are %d words in the line.\n",num);

  return 0;

}
运行结果:



I,love,Shanghai!

There are 3 words in the line.

--------------------------

 

(4)字符排序

从键盘输入一字符串,放在字符数组a中,将字符数组a中下标值为偶数的元素按从小到大排序。例如:原始字符串为zabkam,则排序后字符串为aabkzm。

#include<stdio.h>

#include<string.h>

int main(void)

{

  char a[80],t,m;

  int i,j,k;

  printf("Input String:\n");

  gets(a);

  k=strlen(a);

  //采用选择排序算法

  for(i=0;i<=k-2;i+=2)

   {

     m=i;

     for(j=i+2;j<k; j+=2  )

       if(a[m]>a[j])

         m=j;

     if(m!=i)

       {

 t=a[i];

 a[i]=a[m];

a[m]=t;

 }

  }

  puts(a);

  printf("\n");

  return 0;

}
运行结果:



Input String:

zabkam

aabkzm

----------

 

(5)扬灰三角形

编写程序输出以下杨辉三角形(要求输出10行)。

1      

1    1

1    2    1

1    3    3    1

1    4    6    4    1

1    5    10  10   5    1

…    …  …   …   …   …
#include<stdio.h>

int main(void)

{

int i,j;

  int a[10][10];

  for(i=0;i<10;i++)

{

 a[i][0]=1;

 a[i][i]=1; 

    }

for(i=2;i<10;i++)

for(j=1;j<i;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i<10;i++)

{   for( j=0;j<=i;j++)

printf("%4d",a[i][j]);

printf("\n");

}

   return 0;

 }
运行结果:



1

1   1

1   2   1

1   3   3   1

1   4   6   4   1

1   5  10  10   5   1

1   6  15  20  15   6   1

1   7  21  35  35  21   7   1

1   8  28  56  70  56  28   8   1

1   9  36  84 126 126  84  36   9   1

------------------------------

 

(6)字符串逆序连接

编程将s数组中的字符串的正序和反序进行连接,形成一个新串放在t数组中。例如,当s数组中字符串为”ABCD” 时,则t数组中的内容应为:”ABCDDCBA”。

#include<stdio.h>

#include<string.h>

int main(void)

{
//ZZYMMM

char s[100], t[100];

int i,d;

printf("Enter string:");

scanf("%s",s);

d=strlen(s);

for(i=0;i<d;i++) 

  t[i]=s[i];

for(i=0;i<d;i++)

  t[d+i]=s[d-1-i];

t[2*d]='\0';

printf("The result is: %s\n",t);

return 0;

}
运行结果:



Enter string:ABCD

The result is: ABCDDCBA

----------------------

(7)数据加密 歪比外币

某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012。

#include<stdio.h>

int main(void)

{

  int x,i,aa[4],t;

printf("输入一个四位整数:");

scanf("%d",&x);

aa[0]=x%10;

aa[1]=x%100/10;

aa[2]=x%1000/100;

aa[3]=x/1000;

 for(i=0;i<=3;i++)

 {

   aa[i]+=5;

   aa[i]%=10;

 }

for(i=0;i<=3/2;i++)

  {

   t=aa[i];

   aa[i]=aa[3-i];

   aa[3-i]=t;

  }

 printf("加密后的数字为:");

 for(i=3;i>=0;i--)

    printf("%d",aa[i]);

 printf("\n");

 return 0;

}
运行结果:



输入一个四位整数:7659

加密后的数字为:4012

----------------------

(8)查找数值位置

编写程序查找数值18在以下二维数组中第一次出现的位置。

#include <stdio.h>

int main(void)

{

  int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}};

  for(i=0;i<3;i++)

   { 

      for(j=0;j<4;j++)

         if(a[i][j]==18) break;

     if(j<4)break;

  }

  printf("数值18第一次出现的位置在%d行,第%d列\n",i+1,j+1);

  return 0;

}
运行结果:



数值18第一次出现的位置在1行,第4列

----------------------------------

 

(9)求二维数组元素的和平均值及个数统计

设有4行4列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能:(1) 求第二行4元素的累加和;(2) 求第四列4元素的平均值;(3) 求主对角线4元素中负数的个数。

#include <stdio.h>

int main(void)

{ 

   int a[4][4],i,j,s=0,m=0;

float n=0;

for(i=0;i<4;i++)

     for(j=0;j<4;j++)                                        

        a[i][j]=3*i+2*j-6;                                  

  printf("原始数组为:\n");

for(i=0;i<4;i++)

 {  

    for(j=0;j<4;j++)

 printf("%3d",a[i][j]);

printf("\n");

}

for(j=0;j<4;j++)

 s+=a[1][j];

printf("第二行4元素累加和为:%d\n",s);

for(j=0;j<4;j++)

n+=a[j][3];

printf("第四列4元素平均值为:%.2f\n",n/4.0);

for(i=0;i<4;i++)

if(a[i][i]<0)

m++;

printf("主对角线4元素中负数的个数为:%d\n",m);

return 0;

}
运行结果:



原始数组为:

-6 -4 -2  0

-3 -1  1  3

 0  2  4  6

 3  5  7  9

第二行4元素累加和为:0

第四列4元素平均值为:4.50

主对角线4元素中负数的个数为:2

---------------------------

(10)约瑟夫环问题

编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。

#include <stdio.h>

int main(void)

{

  int a[100];  /* 数组a中保存n个人的密码*/

  int i,j,m,n,k=0;

  printf("输入人数n和报数上限m:");

  scanf("%d%d",&n,&m);

  printf("输入%d个人的密码: ",n);

  for(i=0;i<n;i++)

     scanf("%d",&a[i]);

  printf("\n出列顺序为: ");

  for(i=0;i<n;i++)

    {

       j=1;

      while(j<m)

       { 

         while(a[k]==0)  /*跳过已出列的人*/

             k=(k+1)%n;

          j++;

         k=(k+1)%n;

      }

     while(a[k]==0)  /*跳过已出列的人*/

          k=(k+1)%n;

     printf("%d ",k+1);

     m=a[k];

     a[k]=0;

   }

return 0;

}
运行结果: 
输入人数n和报数上限m:5 6 
输入5个人的密码: 3 2 1 4 5 
出列顺序为: 1 4 5 2 3 
------------------------

 

章节测验

【单选题】若定义以下变量和数组:   (A)

int i;

int a[3][3]={1,2,3,4,5,6,7,8,9};

则下列语句的输出结果是(    )。

for(i=0;i<3;i++)

printf("%d  ",a[i][2-i]);

 

 
  • A、3 5 7
  • B、1 5 9
  • C、3 6 9
  • D、1 4 7

【单选题】以下程序执行后的输出结果是(  B  )。

    #include<stdio.h>

    void main()

   {

    int i,j,s=0;

    int a[4][4]={1,2,3,4,0,2,4,6,3,6,9,12,3,2,1,0};

    for(j=0;j<4;j++)

   {

      i=j;

      if(i>2) i=3-j;

      s+=a[i][j];

   }

   printf("%d\n",s);

   }

 

  • A、18
  • B、16
  • C、12
  • D、11
【单选题】
设有定义语句int a[2][4];则以下叙述不正确的是(  D  )。
  • A、元素a[0]是由4个整型元素组成的一维数组
  • B、a[0]代表一个地址常量
  • C、a数组可以看成是由a[0]、a[1]两个元素组成的一维数组
  • D、可以用a[0]=5;的形式给数组元素赋值
【单选题】
假设a、b均为字符数组,则以下正确的输入语句是(  D  )。
  • A、gets(“a”);gets(“b”);
  • B、gets(a,b);
  • C、scanf(“%s %s”,&a,&b);
  • D、scanf(“%s %s”,a,b);
【单选题】
下列描述正确的是(  C  )。
  • A、两个字符串所包含的字符个数相同时,才能比较字符串
  • B、字符个数多的字符串比字符个数少的字符串大
  • C、字符串”That”小于字符串”The”
  • D、字符串 “STOP   ” 与 “STOP” 相等
【单选题】
以下能对二维数组a进行正确初始化的是(  A  )。
  • A、int a[][3]={{1,2,3},{4,5,6}};
  • B、int a[2][4]={1,2,3},{{4,5},{6}};
  • C、int a[2][]={{1,0,1},{5,2,3}};
  • D、int a[][3]={{1,0,1},{},{1,1}};
【单选题】
以下合法的数组定义是(  B  )。
  • A、int a[]=”Language”;
  • B、char a[]=”C Program Language.”;
  • C、char a=”C Program”;
  • D、int a[5]={0,1,2,3,4,5};
【单选题】
在C语言中引用数组元素时,其数组下标的数据类型允许是(   B )。
  • A、整型常量
  • B、整型常量或整型表达式
  • C、整型表达式
  • D、任何类型的表达式

【单选题】以下程序的输出结果是(  A  )。

#include<stdio.h>

#include<string.h>

void main()

{ 

char str[10]="Ch\nina";

printf("%d",strlen(str));

}

 

  • A、6
  • B、5
  • C、7
  • D、10

【单选题】已知int a[3][2]={3,2,1};则表达式“a[0][0]/a[0][1]/a[1][0]”的值是(  C  )。

  • A、0.16667
  • B、错误的表达式
  • C、1
  • D、0

调用strlen(“abcd\0ed\0g”)的返回值为4。(√)

当接受用户输入的含空格的字符串时,应使用getc函数。(X)

数组名实际是该数组首元素的起始地址。(√)
一个字符数组就是一个字符串。(X)
指向数组元素的指针只能指向数组的首元素。(X)
你知道什么是指针数组吗?

函数

选择题

1.以下关于函数的说法中正确的是(A)。

A.调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参

B.一个函数可以定义在其他函数中

C.函数必须有返回值和参数

D.一个函数只能调用定义在其之前的函数

2.对于声明为int fun();的函数,以下不能作为返回值的语句是(B)。

A.return ‘A’;   B.return 3.14;    C.return0;      D.return (int)(3.14);

3.对于声明为void func(char ch, double x);的函数,以下能调用该函数的语句是(C)。

A.func(“abc”, 3.0);

B.func(’65’,10.5);

C.func(‘A’, 10.5);

D.int t = func(‘a’, 65);

4. 已知调用函数的语句f(f1(al,a2),(a3,a4),a5=x+y);,则该语句中f()的参数个数为(C)。

A.l      B.2      C.3     D.5

5.用数组名作为函数调用时的实参,则传递给形参的是(A)。

A.数组首地址

B.数组的第一个元素值

C.数组中全部元素的值

D.数组元素的个数

6.以下关于函数声明的说法正确的是(B)。

A.函数必须先声明再定义才可以调用

B.如果要在定义位置之前使用函数,则必须先声明函数

C.函数声明必须和函数定义中的首部完全一致

D.函数声明可以省略参数类型说明符

7.关于函数的递归调用,以下说法错误的是(D)。

A.递归可以分为直接递归和间接递归

B.递归函数中一定有递归出口

C.通常使用选择结构设置结束递归或继续递归的条件

D.递归函数的效率比功能相同的非递归函数更高

8.以下说法中不正确的是(D)。

A.在不同的函数中可以定义相同名字的变量

B.形式参数是函数内的局部变量

C.在函数内定义的变量只在该函数范围内可访问

D.在函数内的复合语句中定义的变量在整个函数范围内都可访问

9.全局变量的作用域为(D)。

A.定义该变量的整个源文件

B.离变量定义位置最近的函数

C.所有函数

D.变量定义的位置开始到文件结束

10.关于静态存储的变量,以下说法正确的是(C)。

A.全局变量不是静态变量

B.局部变量默认不是静态变量

C.静态变量只初始化一次

D.局部静态变量可以在任何位置访问

填空题

1.程序执行的入口点、不能被其他函数调用的是  main()  函数。

2.若函数没有返回值语句,则函数的返回值类型说明符为  void  

3.函数由  函数首部  和函数体两个部分组成。

4.若函数类型缺省没定义,则隐含的函数返回值类型是  int  

5.已知函数的定义为int fun(int a, double b){…},则声明函数的语句为  int fun(int a, double b); 

6.声明一个局部变量用静态方式存储的关键字是  static  

7.以下程序的输出结果是  7,14  

#include<stdio.h>

int func(int a, int b)

{       

  static int m = 1, i = 2;

  i += m;

  m = i + a + b;

  return m;

}

int main(void)

{

  int k = 3, m = 1, p;

  p = func(k, m);

  printf("%d,", p);

  p = func(k, m);

  printf("%d\n", p);

  return 0;

}

 

8.以下程序的输出结果是  1  2  

#include<stdio.h>

int func(int a)

{

  int m = 0;

  switch (a)

  {

    case 1: m = 0; return a;

    case 2: m = 1;

    case 3: m = 2; break;

    case 4: m = 3;

   }

  return m;

}

int main(void)

{

  int n = 1;

  printf("%d ", func(n));

  n = 2;

  printf("%d ", func(n));

  return 0;

}

 

9.以下程序的输出结果是  a=48  

#include<stdio.h>

int f(intd[], int m)

{

  int j, s = 1;

  for (j = 0; j < m; j++)

   {

     s = s*d[j];

   }

  return s;

}

int main(void)

{

  int a, z[] = { 2,4,6,8,10 };

  a = f(z, 3);

  printf("a=%d\n", a);

  return 0;

}

 

10.以下程序的输出结果是  654321 

#include<stdio.h>

void func(int n)

{

  printf("%d", n % 10);

 if (n >= 10)

  {

    func(n / 10);

  }

 else

  {

    printf("\n");

  }

}

int main(void)

{

  func(123456);

  return 0;

}

 

 

编程题

编写一个判断质数的函数,在主函数输入一个整数,输出是否是质数。

#include <stdio.h>

#include<math.h>

int prime(int);

int main(void)

{

int n;

printf("n=");

scanf("%d", &n);

if (n == 1 || n == 0 || !prime(n))

{

       printf("%d is not a prime number.\n", n);

}

else

{

       printf("%d is a prime number.\n", n);

}

return 0;

}

int prime(int n)

{

int flag = 1, i, m = (int)(sqrt(n));

for (i = 2; i <= m; i++)

{

       if (n%i == 0)

       {

         flag = 0;

         break;

       }

}

return flag;

}

编写一个能比较字符串大小的函数,将两个字符串中第一个不相同字符的ASCII码值之差作为返回值。

#include <stdio.h>

#define N 100

int MyStrcmp(char s[], char t[]);

int main()

{

  char  c, str1[N], str2[N];

  printf("Input a string:");

  scanf("%s", str1);

  printf("Input another string:");

  scanf("%s",str2);

  if (MyStrcmp(str1, str2) > 0)

    printf("str1>str2\n");

  else if (MyStrcmp(str1, str2) < 0)

        printf("str1<str2\n");

      else

 printf("str1=str2\n");

  return 0;

}



int MyStrcmp(char s[], char t[])

{

  int i;

  for (i = 0; s[i] == t[i]; i++)

  {

    if (s[i] == '\0')

return 0;

  }

  return (s[i] - t[i]);

}

编写程序,从键盘输入10个整数,用函数实现将其中最大数与最小数的位置对换,输出调整后的数组。

#include <stdio.h>

#define ARRSIZE 10  

void MaxMinExchang(int a[], int n);

int main(void)

{

  int a[ARRSIZE], i;

  printf("Input %d numbers:\n",ARRSIZE);

  for(i=0; i<ARRSIZE;i++)

scanf("%d", &a[i]);

  MaxMinExchang(a, ARRSIZE);

  printf("After exchange:\n");

  for(i=0;i<ARRSIZE;i++)

printf("%4d",a[i]);

  return 0;

}

void MaxMinExchang(int a[], int n)

{

  int maxValue=a[0],minValue=a[0],maxPos=0,minPos=0;

  int i, temp;

  for(i=1;i<n;i++)

  {

if (a[i] > maxValue)

{

maxValue = a[i];

maxPos = i;

}

else if (a[i] < minValue)

{

 minValue = a[i];

minPos = i;

}

  }

  temp = a[maxPos];

  a[maxPos] = a[minPos];

  a[minPos] = temp;

}

 

编写函数,对给定的二维数组(3×3)进行转置(即行列互换)。

#include <stdio.h>

#define N 3

void convert(int array[][3]);

int main()

{

  int array[N][N];

  int i, j;

  printf("Input array:\n");

  for(i=0;i<N;i++)

   for(j=0;j<N;j++)

     scanf("%d",&array[i][j]);

  printf("Original array :\n");

  for(i=0;i<N;i++)

  {

    for(j=0;j<N;j++)

      printf("%5d",array[i][j]);

    printf("\n");

  }

  convert(array);

  printf("New array:\n");

  for(i=0;i<N;i++)

   {

     for(j=0;j<N;j++)

          printf("%5d", array[i][j]);

     printf("\n");

   }

 return 0;

}

void convert(int array[][3])

{

  int i, j, t;

  for (i = 0; i < N; i++)

   for (j = i + 1; j < N; j++)

     {

        t=array[i][j];

         array[i][j]=array[j][i];

         array[j][i]=t;

     }

}

编写函数,用冒泡法对输入的字符(不超过10个)按从小到大顺序排序。

#include <stdio.h>

#include <string.h>

#define N 10

void sort(char str[]);

int main(void)

{

  char str[N+1];

  printf("Input a string with less than %d characters: \n", N);

  while(1)

  {

      scanf("%s", str);

     if(strlen(str)>N)

         printf("String too long, input again!\n");

       else break;

  }

  sort(str);

  printf("Sorted string: %s\n", str);

  return 0;

}

void sort(char str[])

{

  int i,j,len=strlen(str);

  char t;

  for(j=0;j<len-1;j++)

       for(i=0;i<len-1-j;i++)

       {

         if(str[i]>str[i+1])

              {

             t=str[i];

                str[i]=str[i+1];

                str[i+1]=t;

              }

       }

}

 

编写程序,输出3~10000内的可逆质数。可逆质数是指:一个质数将其各位数字的顺序倒过来构成的反序数也是质数。如157和751均为质数,它们是可逆质数。要求调用两个函数实现。

#include<stdio.h>

#include<math.h>

int invert(int a)

{

  int s=0;

  while(a>0)

       {

         s=10*s+a%10;

         a/=10;

       }

  return s;

}

int prime(int a)

{

  int i,r;

  r=(int)sqrt(a);

  for(i=2;i<=r;i++)

       {

        if (a%i == 0)

             return 0;

       }

  return 1;

}

int main(void)

{

  int i;

  for(i=3;i<10000;i++)

  {

        if(prime(i) && prime(invert(i)))

        {

          printf("%5d", i);

        }

  }

  return 0;

}

编写函数,将一个十进制数转换成八进制数。

#include <stdio.h>

int trans10_8(char x[], int m);

int main(void)

{

       int i, num,len;

       char a[33];

       printf("Input a positive integer: ");

       scanf("%d", &num);

       len=trans10_8(a,num);

       for(i=len-1;i>=0;i--)

       {

              printf("%c",a[i]);

       }

       printf("\n");

       return 0;

}



int trans10_8(char x[], int m)

{

       int r,i=0;

       while(m>0)

       {

              r=m%8;

              x[i]=r+48;

              m=m/8;

              i++;

       }

       x[i]='\0';

       return i;

}

从键盘输入一个正整数,逆序输出。要求使用循环和递归两种方法分别实现。

循环

#include <stdio.h>

void Inverse(int num);

int main(void)

{

  int num;

  printf("Input an Integer: ");

  scanf("%d",&num);

  Inverse(num);

  return 0;

}

void Inverse(int num)

{

  while(1)

  {

    if(num<10)

     {

       printf("%d\n",num);

       break;

     }

    else

     {

       printf("%d",num%10);

         num=num/10;

        } 

  }

}

递归

#include <stdio.h>

void Inverse(int num);

int main(void)

{

  int num;

  printf("Input an Integer: ");

  scanf("%d",&num);

  Inverse(num);

  return 0;

}

void Inverse(int num)

{

  if(num<10)

    printf("%d\n",num);

  else

  {

      printf("%d",num%10);

      Inverse(num/10);

  } 

}

 

定义带参数的宏,计算三角形的周长和面积。

#include<stdio.h>

#include<math.h>

#define lt(a,b,c) ((a)+(b)+(c))

#define hlt(a,b,c) 0.5*lt(a,b,c)

#define st(a,b,c) sqrt(hlt(a,b,c)*(hlt(a,b,c)-(a))*(hlt(a,b,c)-(b))* (hlt(a,b,c)-(c))) 

int main(void)

{

  double a, b, c;

  printf("a=");

  scanf("%lf", &a);

  printf("b=");

  scanf("%lf", &b);

  printf("c=");

  scanf("%lf", &c);

  printf("Perimeter=%.2f\n", lt(a, b, c));

  printf("Area=%.2f\n", st(a, b, c));

  return 0;

}

定义函数,参数分别表示行数、列数和字符,输出由该行该列该字符构成的以下这种空心图形。

********

*      *

*      *

********
#include<stdio.h>

void drawRectangle(int Row, int Column, char symbol);

int main(void)

{

       int Row, Column;

       char symbol;

       printf("Row=");

       scanf("%d",&Row);

       printf("Column=");

       scanf("%d",&Column);

       getchar();

       printf("Input a character as a symbol: ");

       scanf("%c",&symbol);

       drawRectangle(Row, Column, symbol);

       return 0;

}

void drawRectangle(int Row, int Column, char symbol)

{



       int i,j;

       for(i=0;i<Column;++i)

       {

              printf("%c",symbol);

       }

       printf("\n");

       for(j=1;j<Row-1; ++j)

       {

              printf("%c", symbol);

              for(i = 1;i<Column-1;++i)

              {

                     printf(" ");

              }

              printf("%c\n",symbol);

       }

       for(i=0;i<Column;++i)

       {

              printf("%c",symbol);

       }

       printf("\n");

}

 

发表评论

邮箱地址不会被公开。 必填项已用*标注

17 + 11 =