c语言线段
⑴ c语言编程题 在X轴上给你一些线段,问被这些线段覆盖的区间长。
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#defineN10000
typedefstruct{
inthead;
intnail;
}NODE;
NODEa[N];
intn;
intcmp(constvoid*a,constvoid*b){
return((NODE*)a)->head-((NODE*)b)->head;
}
intmain()
{
scanf("%d",&n);
while(n!=0){
inti;
for(i=0;i<n;i++)
scanf("%d%d",&a[i].head,&a[i].nail);
qsort(a,n,sizeof(a[0]),cmp);
for(i=0;i<n-1;i++){
while(a[i].nail>a[i+1].head){
if(a[i].nail>a[i+1].nail){
a[i+1].head=a[i].head,a[i+1].nail=a[i].nail;
//a[i].nail=a[i].head;
}else{
a[i+1].head=a[i].head;
}
a[i].nail=a[i].head;
i++;
}
}
intsum=0;
for(i=0;i<n;i++)sum+=a[i].nail-a[i].head;
printf("%d ",sum);
scanf("%d",&n);
}
return0;
}
这样就可以了
⑵ 用C语言二维数组怎么写连接的几个线段及其颜色函数
在形参是数组的情况下,只要是数组,无论维数,实际上在调用函数时,传给函数的将是一个数组的首地址,以及维数等相关信息
也就是说,在函数执行过程中,并不会新开辟内存空间,而是形参实参共用同一段内存空间
所以,在这种情况下,函数内部对数组进行修改,其值会返回给实参
你的例子中调用部分有问题,不能这样
shuru(a[10][2])
而是
shuru(a)
因为a[10][2]代表数组a中的一个元素,而且是越界的
而a才是数组名
⑶ 怎样用c语言编出能输出一条线段的程序,还有不知下面的程序有何错误。
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
intmain(void)//void即可
{
initgraph(640,480);
setcolor(RED);//设置前景色
line(50,250,250,250);
getch();
closegraph();
return0;
}
⑷ 用c语言 求点到线段垂线的交点,怎么求
设线段两点是 (x1,y1)(x2,y2),另外一个点是(x3,y3),那么他的方向向量就是 (a,b)=(x2-x1,y2-y1),那么他的垂线段的方向向量就是 (-b,a); 那么垂线的方程l就是就是 (x-x3)/(-b)=(y-y3)/a,l上的点就是x=t*(-b)+x3,y=a*t+y3,把(x,y)代入线段方程就可以求出t;
#include<stdio.h>
struct point
{
double x,y;
point(double _x,double _y):
x(_x),y(_y){}
};
struct Line
{
double x,y;
point a;
Line(double _x,double _y,point _a):
x(_x),y(_y),a(_a){}
};
int main()
{
double x,y;
printf("输入线段两点\n");
scanf("%lf%lf",&x,&y);point a=point(x,y);
scanf("%lf%lf",&x,&y);point b=point(x,y);
printf("输入线段外一点\n");
scanf("%lf%lf",&x,&y);point c=point(x,y);
Line l=Line(a.x-b.x,a.y-b.y,a);
Line l1=Line(b.y-a.y,a.x-b.x,c);
//ansx=(b.y-a.y)*t+c.x;ansy=(a.x-b.x)*t+c.y
//(ansx-a.x)/(a.x-b.x)=(ansy-a.y)/(a.y-b.y)
double t=((c.y-a.y)*(a.x-b.x)-(c.x-a.x)*(a.y-b.y))/((a.y-b.y)*(b.y-a.y)-(a.x-b.x)*(a.x-b.x));
if(t>1||t<0) puts("不存在");
else
{
double ansx=(b.y-a.y)*t+c.x;
double ansy=(a.x-b.x)*t+c.y;
printf("%lf %lf\n",ansx,ansy);
}
}
⑸ 用C语言制作一个求两条线段交点的程序
//先判断两条线段是否不平行(最好同时判断是否有交点并且不平行,因为浮//点运算不精确),然后计算两条线段的交点。以下是C语言代码:
#include<stdio.h>
#include<math.h>
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
struct point{double x,y;};
//计算交叉乘积(P1-P0)x(P2-P0)
double xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
//判点是否在线段上,包括端点
int dot_online_in(point p,point l1,point l2){
return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}
//判两点在线段同侧,点在线段上返回0
int same_side(point p1,point p2,point l1,point l2){
return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}
//判两直线平行
int parallel(point u1,point u2,point v1,point v2){
return zero((u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y));
}
//判三点共线
int dots_inline(point p1,point p2,point p3){
return zero(xmult(p1,p2,p3));
}
//判两线段相交,包括端点和部分重合
int intersect_in(point u1,point u2,point v1,point v2){
if (!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2))
return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}
//计算两线段交点,请判线段是否相交(同时还是要判断是否平行!)
point intersection(point u1,point u2,point v1,point v2){
point ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}
int main(void)
{
point u1,u2,v1,v2,ans;
printf("请输入线段1的两个端点:\n");
scanf("%lf%lf%lf%lf",&u1.x,&u1.y,&u2.x,&u2.y);
printf("请输入线段2的两个端点:\n");
scanf("%lf%lf%lf%lf",&v1.x,&v1.y,&v2.x,&v2.y);
if (parallel(u1,u2,v1,v2)||!intersect_in(u1,u2,v1,v2)){
printf("无交点!\n");
}
else{
ans=intersection(u1,u2,v1,v2);
printf("交点为:(%lf,%lf)",ans.x,ans.y);
}
return 0;
}
⑹ C语言中如何删除线段(清屏的不算,因为还有其他东西)
我一般都是这样实现的,就是把你想要删除的线段,在原位置再画一次,只不过把颜色换成和背景色一样的颜色,这样看起来就像删除了一样