二、综合应用题

1对于下列for循环语句,请将其改写为功能完全相同的while循环语句。[北京航空航天大学2018研]

int i,j,count=0;
for(i=0;i<100;i++)
{
  for(j=100;j>=i;j-=2)
  {
    count+=j-i;
  }
}

【答案】此题可以在定义时先令i=0,j=100,在第一层while循环时只需判断i<100即可,在第二层while循环时只需判断j>=i即可,j-=2放在内层循环体中即可,具体程序如下:

int i=0, j=100, count=0;
while(i<100)
{
  while(j>=i)
  {
    count+=j-i;
    j-=2;
  }
  i++;
}

2输入一个字符,判别它是否为大写字母,如果是,将它变为小写字母;如果不是,不转换。然后输出最后得到的字符。请在下面空白处填上适当语句。[华南理工大学2018研]

#include<stdio.h>
int main()
{
  char ch;
  scanf("%c", );
  ch=(ch>='A'&& )?(ch+32): ;
  printf( ,ch);
  return ;
}

【答案】

&ch

ch<='Z'

ch

"%c"

0

【解析】程序进行输入时要加上地址符&;main函数中的第三行为一个三目运算符,当ch在A~Z之间时ch为真,此时ch+32变为小写字母,否则不变;程序进行输出时应用%加上数据类型进行输出,最后用return 0来结束程序。

3有一个分数序列

求这个数列的前20项之和。请在下面空白处填上适当语句。[华南理工大学2018研]

int main()
{
  int i,n=20;
  double a=2,b=1,s=0,t;
  for(i=1; ;i++)
  {
    s= ;
         ;
    a=a+b;
         ;
  }
  printf("sum=%16.10f\n", );
  return 0;
}

【答案】

i<=n

s+a/b

t=a

b=t

s

【解析】此程序循环是从=1开始,所以要计算数列前20项,则循环条件应为i<=n;s用来累加求和,所以每次进行累加操作,即s=s+a/b;通过分析数列可知,数列中分子是上一项的分子分母之和,而分母是上一项的分子,依照此关系可以通过中间变量t进行换算,最后输出所求结果s。

4从键盘输入10个整数,编程求其中大于3且小于100的数的平均值并输出结果。[华南理工大学2018研]

【答案】此题可以先利用循环从屏幕读取10个数,存放在一个一位数组中,然后循环判断大于3且小于100的数,最后取平均值进行输出,程序如下:

#include<stdio.h>
void main()
{
  int num[10],s=0,n=10;
  printf("input 10 numbers:");
  for(int i=0;i<10;i++)
  {
  scanf("%d",&num[i]);
    if(num[i]<=3||num[i]>=100)
    {
      num[i]=0;
      n--;
    }
    s+=num[i];
  }
  if(n==0)
    printf("no exist!");
  else
    printf("%d\n",s/n);
}

5编程求100~200间的全部素数。[华南理工大学2018研]

【答案】素数意思是只能被1和本身整除,因此将1到本身之间的数做除数,进行求余,如果余数为0,则不是素数,否则是素数。根据经验,假设所要判断的数为n,则一般只需要判断1到根号n之间的数即可,具体程序如下:

#include<stdio.h>
#include<math.h>
void main()
{ int i,j,count;
  for(i=100;i<=200;i++)
  {
    count=0;
    for(j=2;j<sqrt(i);j++)
    {
      if(i%j==0)
      count++;
    }
    if(count==0)
    printf("%d 是素数!\n",i);
  }
}

6有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,如图4-8所示。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。[四川大学2017研]

【答案】N-S图如图1-1所示。

图1-1 计算某点建筑高度的N-S流程图

程序如下:

#include<stdio.h>
int main()
{
  int h=10;
  float x1=2,y1=2,x2=-2,y2=-2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;
  printf("请输入一个点(x,y):");
  scanf("%f,%f",&x,&y);
  d1=(x-x4)*(x-x4)+(y-y4)*(y-y4); //求该点到各中心点距离
  d2=(x-x1)*(x-x1)+(y-y1)*(y-y1);
  d3=(x-x2)*(x-x2)+(y-y2)*(y-y2);
  d4=(x-x3)*(x-x3)+(y-y3)*(y-y3);
  if(d1>1&&d2>1&&d3>1&&d4>1) h=0; //判断该点是否在塔外
  printf("该点高度为%d\n",h);
  return 0;
}

7从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束。[四川大学2017研]

【答案】本题先利用循环逐个读入所输入的字符,同时判断所输入字符是否为“!”,若是则停止输入,结束程序;若不是,则判断该字符是否是小写字母,若是则转换为大写字母,最后写入文件text中,具体程序如下:

#include<stdio.h>
#include<stdlib.h>
void main()
{
  FILE *fp;
  char ch;
  fp=fopen("text.txt","w+");
  if(fp == NULL)
  {
    printf("Cannot open file strike any key exit!");
    exit(1);
  }
  printf("input the string:");
  while(1)
  {
  scanf("%c",&ch);
    if(ch=='!') break;
  if(ch>='a'&&ch<='z')
    ch-=32;
    fprintf(fp,"%c",ch);
  }
  fclose(fp);
}