我正在尝试使用struct编写一个程序来找到两点的中点。但是,当我尝试打印float时,输出总是为零,并且在print int时始终是最接近的整数(当需要分数时)。那么我怎么能正确地说它可以打印出一小部分。 (例如,当输出可以是诸如1.5的数字时)
#include <stdio.h>
#include <stdlib.h>
struct point{
int x;
int y;
};
struct rect{
struct point pt1;
struct point pt2;
};
struct point makepoint(int x, int y){
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
int main()
{
struct rect screen;
struct point middle;
struct point makepoint(int, int);
int XMAX, YMAX;
XMAX = YMAX = 0;
screen.pt1 = makepoint(0,0);
printf("Enter the x axis: ");
scanf("%d",&XMAX);
printf("Enter the y axis: ");
scanf("%d",&YMAX);
screen.pt2 = makepoint(XMAX,YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2);
printf("x = %f, ",middle.x);
printf("y = %f\n",middle.y);
return 0;
}
答案 0 :(得分:3)
你在任何地方都绝对没有“非整数”数学。
(screen.pt1.x + screen.pt2.x)/2
是整数。你需要强迫某些东西成为浮动。喜欢:(screen.pt1.x + screen.pt2.x)/2.0
正如AAT在评论中指出的那样,您似乎期望将浮点数存储为整数,因此您可能需要更改point
来存储浮点数而不是整数。
答案 1 :(得分:0)
首先,您的Point
结构存储x
,y
作为int,
对于这一行middle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2);
无论如何,你有两个整数坐标。
所以你必须改变两件事:
float
int
而不是Point
float
,如(screen.pt1.x + screen.pt2.x)/2.0
所提到的其他答案答案 2 :(得分:0)
这里有两个问题。
首先,middle.x
和middle.y
被声明为整数:
struct point{
int x;
int y;
};
您需要将它们声明为浮点数。
其次,middle.x
和middle.y
被设置为整数值。
C运算符/
有点奇怪:当两个参数都是整数时,结果是一个整数,因此在您的情况下,进行如下计算:(screen.pt1.x + screen.pt2.x)/2
或(screen.pt1.y + screen.pt2.y)/2
将是给你整数(向下舍入)。解决方案是通过给出精度来使这些参数中的至少一个成为浮点数,例如将其中一个转换为浮点数:(float)(screen.pt1.x + screen.pt2.x)/2
,或者使用2.0
(浮点数)而不是{{1 }}
一个有趣的事实:你实际上可以告诉C你想要多少个十进制值,所以在你的情况下,你可以创建你的printf语句:
2
要说您希望输出精确到2位小数。您可以找到规则列表here。
答案 3 :(得分:0)
这里的问题是你把中间点保持为一个整数,当它听起来你想要它是一个浮点数。当你对整数进行数学运算时,你将得到一个整数。让我们执行你的程序一秒......
我们有两个点,一个在(0,0),一个在我们设置的任何地方。假设我们使用(1,1)
好吧,所以在现实世界中,我们希望我们的输出为0.5,0.5。但是,当我们进行整数数学运算时,我们向下舍入到最近的数学。所以...
整数世界中(1 - 0)/ 2 = 0 ...
我认为你要改变的部分是:
struct point{
int x;
int y;
};
进入这个:
struct point{
float x;
float y;
};
和这个:
struct point makepoint(int x, int y){
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
进入这个:
struct point makepoint(float x, float y){
struct point temp;
temp.x = x;
temp.y = y;
return temp;
}
当你进入它时,你应该使用浮点数,这样你就可以在整数之间输入点。
希望这有帮助!