风流才子流弊 2021-03-12 15:26 采纳率: 0%
浏览 65

c程序设计题,对于有空行的二进制字符串转十进制怎么转?

/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:已知半径为5,圆心为(6,9)的圆,字符串s给出一组以空格为分隔符的点的
      坐标,每个坐标的横、纵坐标值以逗号分隔,并以二进制字符串表示。
例如:char s[]= {"   101,10   11,101   1001,1010   "};
      表示的坐标为:(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。
---------------------------------------------------------
注意:请勿改动主函数main()中的任何语句。
-------------------------------------------------------*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>

int change(char s[],int num[][3]) 
{
/**********Program**********/




/**********  End  **********/
}

void calc(int num[][3],int n) 
{
/**********Program**********/




/**********  End  **********/
}
int main() 
{
    char s[]= {"   101,10   11,101   1001,1010   "};
    int num[10][3],i,n;
    char disp[][10]= {"上","外","内"};
    FILE *fp;
    if((fp=fopen("DATA.dat","w"))==NULL) 
    {
        printf("File open error\n");
        exit(0);
    }
    n=change(s,num);
    if (n==0) 
    {
        printf("参数错\n") ;
        fprintf(fp,"参数错\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]]);
            fprintf(fp,"点(%d,%d)在圆%s\n",num[i][0],num[i][1],disp[num[i][2]]);
        }
    }
    fclose(fp);
    return 0;

}
  • 写回答

3条回答 默认 最新

  • 随缘|为而不争 2021-03-12 18:10
    关注
    int change(char s[],int num[][3]) 
    {
    /**********Program**********/
    	int i=0;
    	int point=0;
    	int x_hex, y_hex;
    	int x, y;
    	int count = 0;
    	int ret = 0;
    	int x_temp = 0;
    	int y_temp = 0;
    
    	while(s[i])
    	{
    		if(s[i] == ' '){ //找到坐标的起始位置, 忽略空格是为了方便查找下一个坐标
    			i++;
    			continue;
    		}
    		//通过sscanf函数读取XY坐标值
    		ret = sscanf(&s[i], "%x,%x", &x_hex, &y_hex);  //以十六进制读取,坐标的二进制字符"101"读取后为"0x101"。目的是方便用位移来转换成十进制数值
    		if(ret == 1)//格式错误。正常情况要么2要么0。
    			return 0;
    		if(ret == 0 )//后面没有坐标了
    			return count;
    		printf("x hex=0x%x, y hex=0x%x\n", x_hex, y_hex);
    
    		//将十六进制表示的X坐标转换成十进制数值
    		point = 0;//二进制数值的位置
    		x  = 0;
    		while(x_hex)
    		{
    			if(x_hex & 0xf)//判断后4位是否为1,这里每4位是一个二进制位的值
    				x  += pow(2, point);//当为1时,累加2^point,point是二进制字符位置
    			x_hex  = x_hex >>4;//右移4位
    			point ++;
    		}
    
    		//将十六进制表示的Y坐标转换成十进制数值
    		point = 0;//二进制数值的位置
    		y  = 0;
    		while(y_hex)
    		{
    			if(y_hex & 0xf)//判断后4位是否为1,这里每4位是一个二进制位的值
    				y  += pow(2, point);//当为1时,累加2^point,point是二进制字符位置
    			y_hex  = y_hex >>4; //右移4位
    			point ++;
    		}
    
    		//保存坐标数值
    		num[count][0] = x;
    		num[count][1] = y;
    		num[count][2] = 0;//位置默认0
    		count ++;
    		printf("x=%d, y=%d\n", x, y);
    
    		//查找下一个坐标,以空格为标记
    		while(s[i])
    		{
    			if(s[i] == ' ')
    			    break;
    			i++;
    		}
    	}
    	return count;
    /**********  End  **********/
    }

    看起来比较复杂,或许会有更好的方案!

    评论

报告相同问题?

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!