图形窗口问题求解代码

本文详细描述了一道关于窗口管理的编程题,涉及结构体、顺序表的使用,以及如何根据点击事件调整窗口的层次。程序通过输入窗口信息和点击坐标,判断点击是否在窗口内并相应调整窗口顺序。
摘要由CSDN通过智能技术生成

这是一道2014年3月CCF-CSP考试真题第2题,也是本周的一道作业题,先看题目描述。在这里插入图片描述

在这里插入图片描述
窗口的编号是始终不变的,这一点首先要明确,我一开始做题以为窗口编号是随位置变化而变化的,其实这是错误的。

接下来开始讲解这一题

窗口用结构体来实现,其成员包括5个整型数据,4个坐标点和一个编号。我们用顺序表来实现这道题。

typedef struct
{
    int x1,x2,y1,y2;
    int no;
}window;

然后我们开始输入窗口的数量以及“点击”的数量,接着输入窗口的信息,这些比较好实现。此处需注意窗口先输入的在下层,后输入的在上层。

紧接着我们就要输入“点击”的信息,每次点击我们需要对窗口的顺序做一个调整,这是这道题目的关键。每次我没得到点击的信息,需要把点击的信息依次从最上层(也就是窗口数组最后一个)的窗口进行比对,若点击点在当前窗口范围内,则输出窗口编号,然后把此窗口放在最上层(数组最后一个),其他的窗口顺序依次调整,此时需要用到顺序表的相关操作

整体代码见下

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int x1,x2,y1,y2;
    int no;
}window;
window win[10];

void exchange(int pos,int wincount)
{
    int i;
    window temp;
    temp=win[pos];
    for(i=pos+1;i<=wincount;i++)
    {
        win[i-1]=win[i];
    }
    win[wincount]=temp;
}

int main()
{
    int wincount,cnt,i,j,flag;
    int X1,X2,Y1,Y2;
    scanf("%d",&wincount);
    scanf("%d",&cnt);
    for(i=1;i<=wincount;i++)
    {
        scanf("%d %d %d %d",&X1,&Y1,&X2,&Y2);
        win[i].no=i;
        win[i].x1=X1;
        win[i].x2=X2;
        win[i].y1=Y1;
        win[i].y2=Y2;
    }

    for(i=1;i<=cnt;i++)
    {
        scanf("%d %d",&X1,&Y1);
        flag=1;
        for(j=wincount;j>=1;j--)
        {
            if(win[j].x1<=X1&&win[j].x2>=X1&&win[j].y1<=Y1&&win[j].y2>=Y1)
            {
                printf("%d\n",win[j].no);
                flag=0;
                exchange(j,wincount);
                break;
            }
        }

        if(flag)
            printf("IGNORED\n");

    }
    return 0;
}

全文完,欢迎评论区探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值