风险人群筛查-以java图形化编程思想带你一步步解决

前言

本题不涉及时间,内存限制,仅是以面向对象,通过图形化编程思想解决问题

图形化编程:根据(问题得的需求)思维导图,UML涉及到的图,直接编码
用户体验友好:提示,数据检验,菜单…

题目

image-20211214165052152

思维导图

image-20211218202746793image-20211219103836390

知识点

好好理解面向对象,分析完问题,先找对象,把几个有关联的对象抽象成类,模块化思想,分装方法属性

1.IO流

在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:

​ 标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据从外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

标准I/O

Java程序可通过命令行参数与外界进行简短的信息交换,同时,也规定了与标准输入、输出设备,如键盘、显示器进行信息交换的方式。而通过文件可以与外界进行任意数据形式的信息交换。

java自带的标准数据流:java.lang.System:

  1. 标准输出流 System.out

    System.out向标准输出设备输出数据,其数据类型为PrintStream。方法:

    Void print( 参数)

    Void println( 参数)

  2. 标准输入流 System.in

    System.in读取标准输入设备数据(从标准输入获取数据,一般是键盘),其数 据类型为InputStream。

2.数据存储方式

有5种,大家先了解堆,栈

读取输入并赋值:先存储再读取,底层是存到中,new对象给属性赋值,对象间有联系可以进一步把对象放容器中(数组,集合)

顺序访问只访问一次:直接操作数据,底层是存到中,本道题不推荐,后期如何读取,其实是考验你的数学

3.对象与数组

Java和C++都是面向对象的语言。在使用这些语言的时候,我们可以直接使用标准的类库,也可以使用组合和继承等面向对象的特性构建自己的类,并且根据自己构建的类创建对象

代码

Main
import java.util.Scanner;
public class Main {
    static int n, k, t, xl, yd, xr, yu, passpeo = 0, staypeo = 0,count=0,flag=0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("=====欢迎使用======");
        while (true) {
            System.out.println("Please Input:n k t xl yd xt yu!");
            n = sc.nextInt();
            k = sc.nextInt();
            t = sc.nextInt();
            xl = sc.nextInt();
            yd = sc.nextInt();
            xr = sc.nextInt();
            yu = sc.nextInt();
            if (xl >= xr || yd >= yu) {
                System.out.println("Error input!Please reinput!");
            } else
                break;
        }
        Resident[][] resident = new Resident[n][2 * t];//居民类二维数组,行是编号,列是t个时刻2t个点
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < t; j++) { //注意内层循环是t,不是2t
                resident[i][j] = new Resident();//resident[i][j]是一个居民,第i个,第j时刻,初始化时两个属性x,y为0
                resident[i][j].setX(sc.nextInt());
                resident[i][j].setY(sc.nextInt());
                flag= judge(resident[i][j]);
            }
            //注意这里判断条件改成了连续累计的flag,不是count
            if (flag >= k) { //注意两个if执行顺序,连续k的判断
                staypeo++;
                passpeo++;
            } else if (flag >= 1) {
                passpeo++;
            }
            flag = 0;//count记录居民t个时刻的,flag记录当前进入连续最多的,遍历下一个居民时,注意都要清零
        }
        System.out.println(passpeo);
        System.out.println(staypeo);
    }

    private static int judge(Resident resident) {
        if (xl <= resident.getX() && resident.getX() <= xr && yd <= resident.getY() && resident.getY() <= yu) {
            count++;
            if (count > flag)
                flag = count;   // 在高危区域最多连续时刻数
        } else {
            count = 0;//中间有间断点,count清零
        }
        return flag;
    }
}

Resident

public class Resident {
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

问题解决

1.连续k个

思路:使用当前最多连续时刻数flag进行判断,不是计数的count,注意区分两者不同

if (count > flag)
     flag = count;   // 在高危区域最多连续时刻数

注意,flag和count都要清零

2.双层for

​ loop:

​ break loop; 类似于goto,不建议使用

break语句可以跳出当前循环;通常配合if,在满足条件时提前结束整个循环;总是跳出最近的一层循环;

小结

  1. 图形化思想很重要
  2. 对象&&数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值