编写思路清晰的代码

本文来自:https://mp.weixin.qq.com/s/_Z4fjXFJtEYSXVG2eXzR3Q

更多内容访问:https://mp.weixin.qq.com/s/rHpW_eVKQ7Xs3WfMghJwLw

 

一位老师看了2020年江苏省计算机对口单招考试中一道程序设计题的参考答案后,和我说他的学生写的程序很条理、便于理解。我看了他给的答案后,感觉这位中职生了不起,编程思路非常清晰。现将该题的参考答案和这位同学的答案分享给大家。

题目:已知半径为5,圆心为(6,9)的圆,字符串s给出一组以空格为分隔符的点的坐标,每个坐标的横、纵坐标值以逗号分隔,并以二进制字符串表示。求各点与圆的相对位置(在圆上,圆外,圆内),如果s格式错显示“参数错”。

例如:char s[]= {" 101,10  11,101  1001,1010 "} 表示3个点,其坐标分别为(5,2), (3,5), (9,10),其中点(5,2)在圆外,点(3,5)在圆上,(9,10)在圆内。

试编写以下两个函数:

1.int change(char s[],int num[][3])函数,将s中所有二进制数字字符子串转换为用整数表示的点的坐标,存放在num数组的同一行前2列。函数返回坐标的个数。如果s的格式错,返回0。

2.void calc(int num[][3],int n)函数,根据num数组中每行前2个元素所对应的点,判断点在圆的位置,其结果存放在第三列,若在圆上为0,圆外为1,圆内为2。

本题的难点是change函数的设计,将二进制字符串表示的坐标值转换为十进制数。转换算法可描述如下:

1. 跳过空格;

2. 接收‘0’和‘1’字符串作为横坐标;

3. 接收逗号;

4. 接收‘0’和‘1’字符串作为纵坐标;

5. 如果前面2-4步都正确,则转1继续处理下一组坐标,直到串结束,否则格式错。

参考答案如下:

#include <stdio.h>
#include <stdlib.h>
int change(char s[],int num[][3]) {
    int i=0, n=0, flag=2; //flag=2表示格式正确
    for (i=0; s[i]&&flag==2; i++) {
        if (s[i]==' ') continue; // 跳过空格
        flag=0;
        num[n][0] = num[n][1] = 0;
        if (s[i]=='1' || s[i]=='0')  flag=1;
        while(s[i]=='1' || s[i]=='0') // 处理横坐标
              num[n][0]=num[n][0]*2+s[i++]-48;
         if (flag!=1 || s[i++]!=',') break; // 逗号
         if (s[i]=='1' || s[i]=='0') flag=2;
         while(s[i]=='1' || s[i]=='0') // 处理纵坐标
                num[n][1]=num[n][1]*2+s[i++]-48;
         i--;
         n++;  //接收下一组坐标
   }
   if (flag!=2) n=0;  // 格式错
   return n;
}
void calc(int num[][3],int n) {
    int i,y,x;
    for(i=0; i<n; i++) {
        x=num[i][0]-6; // 6 圆心横坐标
        y=num[i][1]-9; // 9 圆心纵坐标
        num[i][2] =x*x + y*y - 5*5; // 5 半径
        if(num[i][2]>0) num[i][2]=1;
        else if(num[i][2]<0) num[i][2]=2;
    }
}
int main() {
     char s[]= {" 11,10  11,101 1001,1010 "};    
     int num[10][3], i ,n;
     char disp[][10]= {"上","外","内"};
     n=change(s,num);
     if (n==0) { printf("参数错\n") ;
     } else {  calc(num,n);
         for(i=0; i<n; i++) 
             printf("点(%d,%d)在圆%s\n",num[i][0],
                        num[i][1],disp[num[i][2]]);
     }
     return 0;
}
  • 程序运行结果:

图片

下面是学生的答案,仅列出change函数的代码。

int change(char s[],int num[][3]) {
  int i=0,n=0,sum1=0,sum2=0;
  while(s[i]) {
    // 在处理X坐标前,s[i]可以是空格、‘0’和‘1’,
    // 否则“格式错”。
    if(s[i]!='0'&&s[i]!='1'&&s[i]!=' ') {
      n=0;
      break;
    }
    // 若s[i]是'0'或'1'时,开始处理X坐标
    if(s[i]=='0'||s[i]=='1') {
      // 计算X坐标
      while((s[i]=='0'||s[i]=='1')&& s[i]) {
        sum1=sum1*2+s[i++]-'0';
      }
      //X坐标后应该为',',且','后面应该为'0'或'1',否则“格式错”
      if((s[i]!=',')||(s[i+1])!='0'&&s[i+1]!='1') {
         n=0;
         break;
      } else {
        i++; // 跳过逗号
      }
      // 计算Y坐标
      while((s[i]=='0'||s[i]=='1')&& s[i]) {
        sum2=sum2*2+s[i++]-'0';
      }
      // Y坐标后应该为空格,或串结束符,否则“格式错”
      if(s[i]==' ' || s[i]==0) {
        // 格式正确,保存坐标
        num[n][0]=sum1;
        num[n++][1]=sum2;
        sum1=0;
        sum2=0;
      } else {
        n=0;  // 格式错
        break;   
      }
    } else { // s[i]为空格,则处理下一个字符
      i++;
    }
  }
  return n;
}

代码虽然很长,但易于理解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhw---9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值