c语言 输入n个点的坐标 求能组成多少个三角形 用结构体解答。。

如题所述

/*
三角形的生成过程,一条线段和不与该线段共线的一点可构成一个三角形,平面内n个点,每个点作为起始端点与其他n-1个点各
可连成n-1条线段,组成的线段跟不属于该线段的点判断是否共线,如果共线则不会生成三角形,否则则构成三角形。

注意:此程序中没有对是否有重合点进行判断,可以添加此功能。还有就是本程序的点坐标假设都是整型变量
*/

/*http://zhidao.baidu.com/question/396020525.html?fr=uc_push&push=core&oldq=1&group=1*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct _Point
{
int x; //x坐标值
int y; //y坐标值
}POINT, * pPoint;

pPoint setPt(int n); //要求用户输入三角形的坐标信息
void showCoorInfo(pPoint pt, int n); //显示各个点的坐标信息
int getNumofTan(pPoint pt, int n); //获取可以组成的多边形的个数
bool isLine(POINT pt1, POINT pt2, POINT pt3); //判断三点是否为共线

int main(void)
{
int n, num;
printf("Pls enter the num of pt:\n");
scanf("%d", &n);

pPoint pt = setPt(n);

num = getNumofTan(pt, n);
printf("您输入的坐标为:\n");

showCoorInfo(pt, n);

printf("\n共可以组成 %d 个三角形.\n", num);

return 0;
}

pPoint setPt(int n)
{
int i;
pPoint pt;
pt = (pPoint)malloc(sizeof(POINT)*n);
if(NULL==pt)
{
printf("Failed mem located!\n");
exit(-1);
}

printf("Now enter your coor, like 20 50\n");
for(i=0; i<n; i++)
{
printf("The %dth coor:\n", i+1);
scanf("%d %d", &(pt+i)->x, &(pt+i)->y);
}

return pt;
}

void showCoorInfo(pPoint pt, int n)
{
int i;
for(i=0; i<n; i++)
{
if(i>0 && i%5==0)
printf("\n");
printf("(%4d, %4d)\t", (pt+i)->x, (pt+i)->y);
}
printf("\n");

return ;
}

int getNumofTan(pPoint pt, int n)
{
int num = 0;
int i, j, k;
for(i=0; i<n-2; i++) //因为i标识的是线段的首点, 所以最大i是第n-2个点
{
for(j=i+1; j<n-1; j++) //j标识的是线段的尾点, 所以最大j是第n-1个点
{
//构成pt[i]--pt[j]的线段,由于j是从i+1开始的,所以没有重复线段
for(k=j+1; k<n; k++)//k可以一直循环到n
{
if(!isLine(*(pt+i), *(pt+j), *(pt+k)))
num++;
}
}
}

return num;
}

bool isLine(POINT pt1, POINT pt2, POINT pt3)
{
int dx1, dy1, dx2, dy2;
dy1 = pt2.y - pt1.y;
dx1 = pt2.x - pt1.x;
dy2 = pt3.y - pt2.y;
dx2 = pt3.x - pt2.x;

if(dy1*dx2 == dy2*dx1)
return true;
else
return false;

}

/*
IDE: VC 6.0 运行结果

Pls enter the num of pt:
5
Now enter your coor, like 20 50
The 1th coor:
0 0
The 2th coor:
100 0
The 3th coor:
100 100
The 4th coor:
200 50
The 5th coor:
100 0
您输入的坐标为:
( 0, 0) ( 100, 0) ( 100, 100) ( 200, 50) ( 100, 0)

共可以组成 10 个三角形.
Press any key to continue

这是另一组数据的测试效果
Pls enter the num of pt:
5
Now enter your coor, like 20 50
The 1th coor:
0 0
The 2th coor:
0 100
The 3th coor:
0 200
The 4th coor:
100 100
The 5th coor:
100 0
您输入的坐标为:
( 0, 0) ( 0, 100) ( 0, 200) ( 100, 100) ( 100, 0)

共可以组成 9 个三角形.
Press any key to continue
*/
温馨提示:内容为网友见解,仅供参考
无其他回答

c语言 输入n个点的坐标 求能组成多少个三角形 用结构体解答。。
void showCoorInfo(pPoint pt, int n);\/\/显示各个点的坐标信息 int getNumofTan(pPoint pt, int n);\/\/获取可以组成的多边形的个数 bool isLine(POINT pt1, POINT pt2, POINT pt3);\/\/判断三点是否为共线 int main(void){ int n, num;printf("Pls enter the num of pt:\\n");scanf...

C语言中,根据用户输入的三个顶点坐标计算三角形的面积。急求:点的坐...
结构体可以,楼上的说了。如果没学结构体可以用二维数组,float a[3][2]。第一维是第一个顶点第二个顶点第三个顶点。通过两层for循环进行数据输入,外层控制顶点次序,内层控制每个顶点的横左边和纵坐标。并且可以用printf输出语句提示该输入第几个顶点了。

用C语言编写程序找出输入的n个数字中的最大值和最小值。要求程序运行时...
int Max;int Min;}MaxMin;\/\/函数参数array:数组,length:数组长度。\/\/这里其实可以把最大值最小值作为指针传进去的。MaxMin GetMaxMin(int *array, int length){ int i;MaxMin maxMin;if (length <= 0)return maxMin;\/\/初始化最大值和最小值为数组第一个数 maxMin.Max = array[0];m...

判断平面四点能否构成四边形用c语言怎么表示
printf(" "); \/\/显示出这四个点在坐标轴的大致相对位置 if(j==10)printf("\\n");} } \/\/由于只是初学,还不能灵活运用结构体,链表,指针之类的。但问题同样解决了,不是么

如何在EXCEL中输入多个点坐标值,然后计算这些点连成的多边形的面积?
假设有n个角点,坐标分别为 (X1,Y1)……(Xn,Yn) 那角点依次连线围成的面积就是 S=((X2-X1)* (Y2+Y1)+(X2-X2)* (Y3+Y2)+(X4-X3)* (Y4+Y3)+……+(Xn-Xn-1)* (Yn+Yn-1)+(X1-Xn)* (Y1+Yn))\/2 ,计算结果的绝对值便是面积。你用EXCEL按以上公式输入各...

用C语言 定义一个关于空间点的结构体,它包含了点的3个坐标值,编写一个...
1、首先我们找到头文件与main函数之间。2、写上,我们的第一个关键字【struct】。3、然后我们对该结构体进行命名。4、在里面,我们便可以编写他的成员。5、可以编写数组也可以是普通变量。6、书写完毕后,我们一定要用分号结束。

用c语言做一个简单的计算器。要求能做四则运算就够了,越简单越好。刚学...
default: printf("输入错误!\\n");break;\/\/c不等于其中一个,这五个break;一定要的,每次做一次就break一次,不然就出错 } printf("\\n输入Q退出,任意键继续!"); scanf("%c",&x); if(x=='q'||x=='Q') break; else continue; }return;} 追问 我试用了下你的程序,可是得不到结果啊 追答 会...

有6个点判断任意三点是否能构成三角形 用C语言编程
scanf("%d",&n);if(n<3)printf("不足3个点,无法组成三角形\\n请重新输入总点数:");} while(n<3);pointArr = (Point *) malloc ( n*sizeof(Point) );\/*申请内存,也可用calloc(n,sizeof(Point))*\/ printf("请输入%d个点的坐标值:\\n\\n",n);for(i=0;i<n;i++){ printf(...

用C语言解答:编程输入3个学生的学号、姓名、三门课程的成绩,存入一个结...
int num;char name[12];int math;int english;int computer;long sum;double average;}a;main(){ int i , sum ;struct score *p for(i=0;i<10;i++){ printf("输入各项信息:\\n");printf("学号,姓名,数学,英语,计算机:\\n");scanf("%d%s%d%d%d",&p->num,&p->name,&p->...

C语言题目,求大神解答
printf("p1数组中的元素:\\n");int i;for (i = 0; i < num; i++){ printf("%ld %s %s\\n", p1[i].id, p1[i].name, p1[i].sex);} return 0;} 在上面的程序中,定义了一个结构类型PS,用于存储联系人信息。然后,定义了一个删除函数delete,用于从p1数组中删除在p2数组中重复...

相似回答