基本面向对象编程-计算机基本功能实现_
《C/S项目实训》实验报告
实验名称: 基本面向对象编程-计算机基本功能实现_
一、实验目的
通过综合实践项目,理解Java 程序设计是如何体现面向对象编程基本思想,掌握OOP方法,掌握事件触发、消息响应机制。进一步巩固面向对象编程基本知识和技能,为C/S模式项目开发打下基础。
二、实验题目及要求
运用GUI技术,事件触发、消息响应机制,实现一个完整综合设计项目“模拟基本的计算机程序”的设计开发开发。
2.实验要求
(1)客户体验
以组为单位,分别体验不同计算机类型的计算流程以及计算的结果展现方式,根据体验结果,总结体验感受,并根据个人用户需求,提出更人性化、功能更完善的系统,使得实验项目更接近实战,让学生理解一切项目都来源于应用,归于用户体验和使用。
三、实验步骤、结果(程序代码)
计算器的运行页面
源代码如下:
package cacu;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Mycacu extends JFrame{
JTextField tfResult;
//输入结果显示框
JButton btNum[],btOper[],btEqual,btPoint;//设计输入按钮分为四种数字按钮,加减乘除操作按钮,等于号按钮, 小数点按钮.
boolean isNum,isOper;//设计两个布尔型变量
double firstNum,secondNum;//定义两个双精度的变量
String operStr;
public void init(){
//定义各个功能输入按钮的内容
tfResult=new JTextField();
btNum=new JButton[10];
for(int i=0;i<=9;i++)
btNum[i]=new JButton(i+"");
btOper=new JButton[4];
btOper[0]=new JButton("+");
btOper[1]=new JButton("-");
btOper[2]=new JButton("*");
btOper[3]=new JButton("/");
btEqual=new JButton("=");
btPoint=new JButton(".");
JPanel panel=new JPanel();
panel.setLayout(new GridLayout(4,4));//创建流失布局依次部署按钮
panel.add(btNum[1]);
panel.add(btNum[2]);
panel.add(btNum[3]);
panel.add(btOper[0]);
panel.add(btNum[4]);
panel.add(btNum[5]);
panel.add(btNum[6]);
panel.add(btOper[1]);
panel.add(btNum[7]);
panel.add(btNum[8]);
panel.add(btNum[9]);
panel.add(btOper[2]);
panel.add(btPoint);
panel.add(btNum[0]);
panel.add(btEqual);
panel.add(btOper[3]);
//设计窗体的显示功能
this.add(tfResult,"North");
this.add(panel);
this.setFont(new Font("宋体",Font.BOLD,18));
this.setTitle("浩宇牌计算器");
this.setSize(400,400);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗体居中显示
// 得到显示器屏幕的宽、高
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 得到窗体的宽、高
int windowsWidth = this.getWidth();
int windowsHeight = this.getHeight();
this.setBounds((width - windowsWidth) / 2,(height - windowsHeight) / 2, windowsWidth, windowsHeight);
//注册监听
MyActLis mal=new MyActLis();
for(int i=0;i<=9;i++){
btNum[i].addActionListener(mal);
}
for(int i=0;i<4;i++){
btOper[i].addActionListener(mal);
}
btEqual.addActionListener(mal);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Mycacu().init();
}
//监听器类设计
class MyActLis implements ActionListener{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String s=e.getActionCommand();
if(s.equals("0")||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
isOper=false;
if(isNum==false){
isNum=true;
tfResult.setText(s);
}else{
tfResult.setText(tfResult.getText()+s);
}
}
else if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
isOper=true;
isNum=false;
firstNum=Double.parseDouble(tfResult.getText());
operStr=s;
}
else if(s.equals("=")){
isNum=false;
isOper=false;
if(operStr.equals("+")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum+secondNum+"");
}
else if(operStr.equals("-")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum-secondNum+"");
}
else if(operStr.equals("*")){
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum*secondNum+"");
}
else if(operStr.equals("/")){
if(firstNum==0){
JOptionPane.showMessageDialog(Mycacu.this, "输入错误,除数不为0!");
//优化1:数学规则除数不为0,当除数为0的时候弹出 框体提示
}
else if(secondNum==0) {
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(secondNum+"");
//优化2:当除数为0 的时候系统输出结果为0,而不是计算机当中的infinite了
}
else {
secondNum=Double.parseDouble(tfResult.getText());
tfResult.setText(firstNum/secondNum+"");
}
}
else if(1>0){
firstNum=Double.parseDouble(tfResult.getText());
//取出第一个输入的数字,并以文本的方式来展现出来。
tfResult.setText(firstNum+"");
}
四、实验中的问题以及解决方案
1、
问题:在实际的计算过程中出现了,被除数为0,计算结果出错的情况。不符合实际的数学定理以及实际的应用的过程。
解决措施:利用else-if语句对其进行了多条的验证,判断第一个数字是否为0,要是为0,则弹出提示框,提示被除数不为0,达到了预期的效果;
解决后的运行结果截图:

2、问题:当只点击一
个数字的时候,就点击等于号程序会在展示页面,没有反应,出现上图的类似的状况。
解决:也是借用else-if语句,设置了一个我自己认为的永真条件,只输出和展示一个数字的结果
解决代码截图:
3、问题:当出现一个不为零的数除以0的时候运算结果不清楚,与实际的数学意义上的结果存在差异


解决:当进行除数运算的时候判断第二个数是否为0,要是为0则输出设定好的答案。
4.问题:当你只输入一个数字并点击运算符号,而不输入第二个数字的时候它会将当前的数字当为第二个数字
解决:正在解决当中ing~~~~~
- 总结
通过此次的cs项目的编程试验,使我进一步了解和体会了事件响应机制的原理,自己在实际的编程过程中对于Java的基本知识,也有了更为深入的理解。对于功能不同的按键的归纳总结有了更为深入的了解,通过功能输入键的相同可以减少所编写的代码量,减少工作量,通过此次的实际编程对于java的基本知识,和实际的操作流程。
相关文章:
基本面向对象编程-计算机基本功能实现_
《C/S项目实训》实验报告 实验名称: 基本面向对象编程-计算机基本功能实现_ 一、实验目的 通过综合实践项目,理解Java 程序设计是如何体现面向对象编程基本思想,掌握OOP方法,掌握事件触发、消息响应机制。进一步巩固面向对…...
C++面向对象之多态性
文章目录C面向对象之多态性1.静态多态2.动态多态3.多态的好处3.1使用方法4.纯虚函数5.虚析构与纯虚析构5.1问题5.2解决6.其他知识点7.代码8.测试结果8.1父类中无虚函数,父类的指针指向子类对象,将调用父类中的函数,无法调用子类中的重写函数&…...
Android性能优化系列篇:弱网优化
弱网优化1、Serializable原理通常我们使用Java的序列化与反序列化时,只需要将类实现Serializable接口即可,剩下的事情就交给了jdk。今天我们就来探究一下,Java序列化是怎么实现的,然后探讨一下几个常见的集合类,他们是…...
Mysql 插入大批量数据调优方法
Mysql 插入大批量数据调优方法[toc]1、多线程插入(单表)在数据里做插入操作的时候,整体时间的分配是这样的:链接耗时 (30%)发送query到服务器 (20%)解析query (20%&#…...
matlab基础
系列文章目录 文章目录系列文章目录前言1 基本用法总结基础语法桌面管理矩阵均匀间隔矢量矩阵创建矩阵索引前言 介绍了matlab的基本用法 1 基本用法 >> save filename.mat % 将当前工作区的所有变量保存为mat文件 >> load filename.mat % 加载文件>> loa…...
自动化测试——多窗口切换和切换frame
这里写目录标题一、多窗口切换1、base.py:公共代码2、切换句柄的方式1,通过for循环3、切换句柄的方式2,通过索引切换4、源代码二、frame窗口1、什么是frame?2、Frame 分类3、判断要定位的元素在不在frame中两种方式方式一:鼠标选…...
C#中,Elasticsearch.Net判断空字符串
之前有个业务需求,由于最开始存储到es里的,是默认空字符串。 后面程序取数据时,发现需要取空字符串的数据时,不好取出来。 字符串的字段如图: 实际数据如图: 我用的是C#语言,使用的是Elastic…...
23种设计模式-适配器模式
适配器模式(Adapter Pattern)是一种常用的设计模式,它可以将不兼容的接口转换成可兼容的接口,使得原本不能一起工作的类可以协同工作。 在Java中,适配器模式一般有两种实现方式,即类适配器模式和对象适配器…...
深入理解this指向问题
this指向 在运行时绑定,所以this和函数的调用方式和调用的位置有关,和定义的位置没关系 绑定规则 默认绑定(非严格模式下this指向全局变量,在严格模式下函数内的this指向undefined) 独立函数调用,没有主题 …...
事业单位联考(综合应用A类)典型例题教案
【联考A类】根据材料2,请你概括C市B县旅游质监所投诉处理科小王在接待投诉时存在的主要问题,并指出问题的具体表现。(35分)要求:准确、全面、分条作答。字数在300字以内。材料2:某日,几位游客家…...
frp内网穿透实验
Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站, 帮你实现 公网 ←→ FRP(服务器) ←→ 内网…...
认识JavaScript中的防抖函数
👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言一、防抖是什么?1. deounce-v1的基本…...
macOS 13.3 Beta 2 (22E5230e)With OpenCore 0.8.9正式版 and winPE双引导分区原版镜像
原文地址:http://www.imacosx.cn/112340.html,转载需注明出处镜像特点完全由黑果魏叔官方制作,针对各种机型进行默认配置,让黑苹果安装不再困难。系统镜像设置为双引导分区,全面去除clover引导分区(如有需要…...
JetPack—DataStore核心原理与使用
简介 首先,DataStore是Jetpack一部分,是一种数据存储解决方案。其次,DataStore使用协程及flow以异步、一致的方式实现数据的存储。最后是DataStore的实现,分为Preferences DataStore和Proto DataStore:Preferences Da…...
热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会
酒事有鲤(济南)品牌管理有限公司是一家致力于将世界顶级精酿啤酒技术和理念与“ 在地”文化有机融合,做世界认 可的多元化好啤酒,通过精致 舒适的家门口酒馆,让啤酒的 世界观更为完整。 中国生物发酵产业协会联合齐鲁…...
深度强化学习DLR
1 强化学习基础知识 强化学习过程:⾸先环境(Env)会给智能体(Agent)⼀个状态(State),智能体接收到环境给的观测值之后会做出⼀个动作(Action),环境接收到智能体给的动作之后会做出⼀系列的反应,例如对这个动作给予⼀个奖励(Reward…...
Android Handler机制(四) Message源码分析
一. 简介 接上一篇文章:Android Handler机制(三) Looper源码分析 ,我们来继续分析一下Message源码 这一系列文章都是为了深入理解Handler机制. Message 作为消息传递的载体,源码主要分为以下 几个部分: 1. 操作数据相关,类似 getter()和 setter()这种…...
【Git】git命令(全)
Git1、本地操作2、版本管理3、远端仓库4、分支管理5、缓存stash6、遗留rebase7、标签管理8、解决冲突9、参考教程10、示例代码1、本地操作 Linux安装git:yum install git查看git版本 git version查看git设置 git config --list设置git属性 git config --global初始…...
软考论文-成本管理(1)
成本管理 1.成本管理的主要内容? 规划成本:制定一个成本管理的计划。估算成本:根据项目范围说明书,项目管理计划和wbs等文档,采用xxx方法进行估算成本成本预算:可以算工作包的费用,制定预算和…...
Java 多线程 --- 锁的概念和类型划分
Java 多线程 --- 锁的概念和类型划分锁的概念乐观锁与悲观锁公平锁与非公平锁什么是可重入锁独占锁与共享锁轻量级锁和重量级锁自旋锁 (Spinlock)锁的概念 锁可以将多个线程对共享数据的并发访问转换为串行访问, 这样一个共享数据一次只能被一个线程访问, 该线程访问结束后其他…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
