用户在向计算机输入一个点的坐标时,采用了如下的输入方式:点名(X坐标,Y坐标)
例如:P(10.2,-2.0)表示在第四象限某位置的点P
规定点的名称为大小写不区分的单字符,如P,Q.注意点p和点P表示同一个点.在计算机内部处理是统一按大写字符处理.
编写程序,用户向程序中输入两个点坐标,你的程序判断这两个点是否在同一象限.若是在同一象限则输出象限名称,否则输出不在同一象限.
如果用户输入点在原点或者坐标轴上,你的程序应当提示用户输入数据异常.
若用户输入的两个点的名称一样,你的程序应提示用户点输入了重复点.
输入输出样例1:
请输入两个点的坐标:
p(1,1),Q(2,2)
P点和Q点都在第一象限
Press any key to continue
输入输出样例2:
请输入两个点的坐标:
P(1,1),S(-2,2)
P点和S点不在同一象限
Press any key to continue
输入输出样例3:
请输入两个点的坐标:
P(1,1),p(-2,2)
错误:点重复
Press any key to continue
输入输出样例4:
请输入两个点的坐标:
P(1,1),Q(1,0)
错误:数据异常
Press any key to continue
以上样例中,第一行是程序的提示
第二行是用户的输入。注意例1中p是小写,在输出时按大写字符处理.
第三行是计算机的判断结果的输出。这里的输出应当有4种结果:
都在第X象限
不在同一象限
错误:数据异常
错误:点重复
最后一行的Press any key to continue是计算机结束程序时的输出.
程序的主要框架已经给出,请仅在
********** Begin **********
********** End ***********
注释对之间的空行中添加你的代码,任何修改该两行注释,以及修改注释外代码均将被判失败
*/
#include <stdio.h>
#include <ctype.h>
void f()
{
/********** Begin **********/
char x,y;
float a,b,c,d;
printf("请输入两个点的坐标:\n");
scanf("%c(%f,%f),%c(%f,%f)\n",&x,&a,&b,&y,&c,&d);
if(x>='a'&&x<='z') x-=32;
if(y>='a'&&y<='z') y-=32;
if(x==y) printf("错误:点重复\n");
else
{
if(a*b*c*d==0)
printf("错误:数据异常\n");
else
{
if(a*b*c*d<0)
printf("%c点和%c点不在同一象限",x,y);
else
{
if(a>0&&b>0&&c>0&&d>0)
printf("%c点和%c点都在第一象限",x,y);
else if(a<0&&b>0&&c<0&&d>0)
printf("%c点和%c点都在第二象限",x,y);
else if(a<0&&b<0&&c<0&&d<0)
printf("%c点和%c点都在第三象限",x,y);
else if(a>0&&b<0&&c>0&&d<0)
printf("%c点和%c点都在第四象限",x,y);
}
}
}
/********** End ***********/
}
void call_f()
{
char c;
f();
c=getchar();
if(c!='\n')
ungetc(c,stdin);
}
void main()
{
int m;
call_f();
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&m);
getchar();
while(m--)
call_f();
}
6 个解决方案
#1
请大家帮我看一下,添加处的程序问题在哪里,编译没问题,但是好像死循环了。
#2
1. 首先 scanf("%c(%f,%f),%c(%f,%f)\n",&x,&a,&b,&y,&c,&d); 多了\n
改为 scanf("%c(%f,%f),%c(%f,%f)",&x,&a,&b,&y,&c,&d);
2. 你应该建立in.txt文件,内容类似为
4
p(1,1),Q(2,2)
P(1,1),S(-2,2)
P(1,1),p(-2,2)
P(1,1),Q(1,0)
3. 程序运行结果在out.txt文件中
改为 scanf("%c(%f,%f),%c(%f,%f)",&x,&a,&b,&y,&c,&d);
2. 你应该建立in.txt文件,内容类似为
4
p(1,1),Q(2,2)
P(1,1),S(-2,2)
P(1,1),p(-2,2)
P(1,1),Q(1,0)
3. 程序运行结果在out.txt文件中
#3
为什么会和in.txt和out.txt扯上关系?
#4
另外你的代码框架是原题的吗,我觉得有点问题
1. char c; 应该为int c;
2. int m;
call_f(); --> 这个应该没有吧
freopen("in.txt","r",stdin);
1. char c; 应该为int c;
2. int m;
call_f(); --> 这个应该没有吧
freopen("in.txt","r",stdin);
#5
为什么要判断a*b*c*d<0 ?
如果一个在第一象限,一个在第三象限,那也不满足这条件,但他们惹你不在同一个象限。
另外,浮点数无法精确表示,涉及到浮点数的大小判断,请用0.00001代替0等。例如a*b*c*d<0.00001
如果一个在第一象限,一个在第三象限,那也不满足这条件,但他们惹你不在同一个象限。
另外,浮点数无法精确表示,涉及到浮点数的大小判断,请用0.00001代替0等。例如a*b*c*d<0.00001
#6
void f()
{
/********** Begin **********/
char x,y;
float a,b,c,d;
printf("请输入两个点的坐标:\n");
scanf("%c(%f,%f),%c(%f,%f)\n",&x,&a,&b,&y,&c,&d);
printf("%c (%f,%f), %c (%f,%f)", x, a, b, y, c, d);
if(x>='a'&&x<='z')
x-=32;
if(y>='a'&&y<='z')
y-=32;
if(x==y)
printf("错误:点重复\n");
else
{
if(a*b*c*d==0)
printf("错误:数据异常\n");
else
{
if(a*b*c*d<0)
printf("%c点和%c点不在同一象限",x,y);
else
{
if(a>0&&b>0&&c>0&&d>0)
printf("%c点和%c点都在第一象限",x,y);
else if(a<0&&b>0&&c<0&&d>0)
printf("%c点和%c点都在第二象限",x,y);
else if(a<0&&b<0&&c<0&&d<0)
printf("%c点和%c点都在第三象限",x,y);
else if(a>0&&b<0&&c>0&&d<0)
printf("%c点和%c点都在第四象限",x,y);
}
}
}
/********** End ***********/
}
在函数f的scanf后面加这样的一条语句,用于验证输入的数据是否正确。
在保证输入的数据没问题下,再去判断处理逻辑是否正确。
printf("%c (%f,%f), %c (%f,%f)", x, a, b, y, c, d);
#1
请大家帮我看一下,添加处的程序问题在哪里,编译没问题,但是好像死循环了。
#2
1. 首先 scanf("%c(%f,%f),%c(%f,%f)\n",&x,&a,&b,&y,&c,&d); 多了\n
改为 scanf("%c(%f,%f),%c(%f,%f)",&x,&a,&b,&y,&c,&d);
2. 你应该建立in.txt文件,内容类似为
4
p(1,1),Q(2,2)
P(1,1),S(-2,2)
P(1,1),p(-2,2)
P(1,1),Q(1,0)
3. 程序运行结果在out.txt文件中
改为 scanf("%c(%f,%f),%c(%f,%f)",&x,&a,&b,&y,&c,&d);
2. 你应该建立in.txt文件,内容类似为
4
p(1,1),Q(2,2)
P(1,1),S(-2,2)
P(1,1),p(-2,2)
P(1,1),Q(1,0)
3. 程序运行结果在out.txt文件中
#3
为什么会和in.txt和out.txt扯上关系?
#4
另外你的代码框架是原题的吗,我觉得有点问题
1. char c; 应该为int c;
2. int m;
call_f(); --> 这个应该没有吧
freopen("in.txt","r",stdin);
1. char c; 应该为int c;
2. int m;
call_f(); --> 这个应该没有吧
freopen("in.txt","r",stdin);
#5
为什么要判断a*b*c*d<0 ?
如果一个在第一象限,一个在第三象限,那也不满足这条件,但他们惹你不在同一个象限。
另外,浮点数无法精确表示,涉及到浮点数的大小判断,请用0.00001代替0等。例如a*b*c*d<0.00001
如果一个在第一象限,一个在第三象限,那也不满足这条件,但他们惹你不在同一个象限。
另外,浮点数无法精确表示,涉及到浮点数的大小判断,请用0.00001代替0等。例如a*b*c*d<0.00001
#6
void f()
{
/********** Begin **********/
char x,y;
float a,b,c,d;
printf("请输入两个点的坐标:\n");
scanf("%c(%f,%f),%c(%f,%f)\n",&x,&a,&b,&y,&c,&d);
printf("%c (%f,%f), %c (%f,%f)", x, a, b, y, c, d);
if(x>='a'&&x<='z')
x-=32;
if(y>='a'&&y<='z')
y-=32;
if(x==y)
printf("错误:点重复\n");
else
{
if(a*b*c*d==0)
printf("错误:数据异常\n");
else
{
if(a*b*c*d<0)
printf("%c点和%c点不在同一象限",x,y);
else
{
if(a>0&&b>0&&c>0&&d>0)
printf("%c点和%c点都在第一象限",x,y);
else if(a<0&&b>0&&c<0&&d>0)
printf("%c点和%c点都在第二象限",x,y);
else if(a<0&&b<0&&c<0&&d<0)
printf("%c点和%c点都在第三象限",x,y);
else if(a>0&&b<0&&c>0&&d<0)
printf("%c点和%c点都在第四象限",x,y);
}
}
}
/********** End ***********/
}
在函数f的scanf后面加这样的一条语句,用于验证输入的数据是否正确。
在保证输入的数据没问题下,再去判断处理逻辑是否正确。
printf("%c (%f,%f), %c (%f,%f)", x, a, b, y, c, d);