C语言 直线问题
小明上来中学,开始学习直线方程,老师有一天要看看小明学的如何,于是问了他一个问题。给出两个坐标(x1, y1)和(x2, y2)可以唯一确定一条直线,那么,任意给你一个点,你是否可以判断这个点在该直线上吗?
输入:
x1, y1
x2, y2
n
n个坐标x1,y1 x2,y2 .....xn,yn
输出:在直线上的点坐标
包括延长线哦(按照原来的输入顺序),如果没有属于直线上的点,则输出"NoOut.”
#include <stdio.h>
#include <stdlib.h>
#define epsilon 0.00001
#define equ(a,b) ((a)-(b)<epsilon&&(b)-(a)<epsilon)
int foo(float x1, float x2, float y1, float y2, float x, float y)
{
if (equ(y1, y2)) return equ(y1, y);
float a = (y1 - y2) / (x1 - x2);
float b = y1 - x1 * a;
return equ(x * a + b, y);
}
int main()
{
float x1, x2, y1, y2;
scanf("%f,%f", &x1, &y1);
scanf("%f,%f", &x2, &y2);
int n;
scanf("%d", &n);
float * x = (float *)malloc(sizeof(float) * n);
float * y = (float *)malloc(sizeof(float) * n);
int * r = (int *)malloc(sizeof(int) * n);
int exist = 0;
for (int i = 0; i < n; i++)
{
scanf("%f,%f", &x[i], &y[i]);
r[i] = foo(x1, x2, y1, y2, x[i], y[i]);
if (r[i]) exist = 1;
}
for (int i = 0; i < n; i++)
{
if (r[i]) printf("%f,%f\n", x[i], y[i]);
}
if (!exist)
printf("NoOut.\n");
return 0;
}
有1个结果:
有多个结果:
直线垂直(无法求斜率)
无结果
这是效果图
#include<stdio.h>
#include<malloc.h>
int main()
{
int n,i,c=0;
float A,B;
printf("请输入a,b(y=ax+b)\n");
printf("a=");
scanf("%f",&A);
printf("\nb=");
scanf("%f",&B);
printf("请输入n:");
printf("\n");
scanf("%d",&n);
float *a=(float*)malloc(sizeof(float)*n);
float *b=(float*)malloc(sizeof(float)*n);
for (i=0;i<n;i++)
{
printf("请输入%d号点x坐标:",i+1);
scanf("%f",a+i);
printf("请输入%d号点y坐标:",i+1);
scanf("%f",b+i);
printf("\n");
}
for (i=0;i<n;i++)
{
if (*(a+i)*A+B==*(b+i))
{
printf("x%d=%.2f ",i+1,*(a+i));
printf("y%d=%.2f\n",i+1,*(b+i));
c+=1;
}
}
if(c==0)
{
printf("NoOut");
}
return 0;
}