/*----------------------------------------------------------------------
【程序设计】
------------------------------------------------------------------------
题目:已知半径为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;
}
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 **********/
}
看起来比较复杂,或许会有更好的方案!
只写了那两个函数里面的东西,其他没动
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
int change(char s[],int num[][3])
{
/**********Program**********/
int *left = (int *)malloc(sizeof(int));//,号左
int *right = (int *)malloc(sizeof(int));//,号右
int *cur_l = left;
int *cur_r = right;
for(int i = 0; s[i] != '\0'; i++){
if(s[i] == ','){//获取,号下标
*left = i;
left++;
}
else if((s[i] == '0' || s[i] == '1') && s[i+1] == ' '){//获取每段二进制数后的第一个空位置下标
*right = i+1;
right++;
}
}
*left = *right = -1;//标记指针尾为-1
int sum = 0;//每段二进制码的值
int j = 1;
int count = 0;
for( ; *cur_l != -1; cur_l++){//,号左边的十进制数值
for(int i = *cur_l-1; s[i] != ' '; i--){
sum += (s[i]-'0') * j;
j *= 2;
}
num[count++][0] = sum;
sum = 0;
j = 1;
}
count = 0;
for( ; *cur_r != -1; cur_r++){//,号右边的十进制数值
for(int i = *cur_r-1; s[i] != ','; i--){
sum += (s[i]-'0') * j;
j *= 2;
}
num[count++][1] = sum;
sum = 0;
j = 1;
}
return count;
/********** End **********/
}
void calc(int num[][3],int n)
{
/**********Program**********/
int dis;
int r = pow(5,2);
for(int i = 0; i < n; i++){
dis = pow(num[i][0]-6, 2) + pow(num[i][1]-9,2);
if(dis < r)
num[i][2] = 2;
else if(dis == r)
num[i][2] = 0;
else
num[i][2] = 1;
}
/********** 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;
}