初学者的问题——if语句

时间:2022-11-28 04:41:03
/*两点同象限判断                        

用户在向计算机输入一个点的坐标时,采用了如下的输入方式:点名(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文件中

#3


为什么会和in.txt和out.txt扯上关系?

#4


另外你的代码框架是原题的吗,我觉得有点问题
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

#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文件中

#3


为什么会和in.txt和out.txt扯上关系?

#4


另外你的代码框架是原题的吗,我觉得有点问题
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

#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);