当前位置: 首页 > news >正文

基本面向对象编程-计算机基本功能实现_

《C/S项目实训》实验报告

实验名称:  基本面向对象编程-计算机基本功能实现_    

一、实验目的

通过综合实践项目,理解Java 程序设计是如何体现面向对象编程基本思想,掌握OOP方法,掌握事件触发、消息响应机制。进一步巩固面向对象编程基本知识和技能,为C/S模式项目开发打下基础。

二、实验题目及要求

1.实验题目

运用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项目实训》实验报告 实验名称&#xff1a; 基本面向对象编程-计算机基本功能实现_ 一、实验目的 通过综合实践项目&#xff0c;理解Java 程序设计是如何体现面向对象编程基本思想&#xff0c;掌握OOP方法&#xff0c;掌握事件触发、消息响应机制。进一步巩固面向对…...

C++面向对象之多态性

文章目录C面向对象之多态性1.静态多态2.动态多态3.多态的好处3.1使用方法4.纯虚函数5.虚析构与纯虚析构5.1问题5.2解决6.其他知识点7.代码8.测试结果8.1父类中无虚函数&#xff0c;父类的指针指向子类对象&#xff0c;将调用父类中的函数&#xff0c;无法调用子类中的重写函数&…...

Android性能优化系列篇:弱网优化

弱网优化1、Serializable原理通常我们使用Java的序列化与反序列化时&#xff0c;只需要将类实现Serializable接口即可&#xff0c;剩下的事情就交给了jdk。今天我们就来探究一下&#xff0c;Java序列化是怎么实现的&#xff0c;然后探讨一下几个常见的集合类&#xff0c;他们是…...

Mysql 插入大批量数据调优方法

Mysql 插入大批量数据调优方法[toc]1、多线程插入&#xff08;单表&#xff09;在数据里做插入操作的时候&#xff0c;整体时间的分配是这样的&#xff1a;链接耗时 &#xff08;30%&#xff09;发送query到服务器 &#xff08;20%&#xff09;解析query &#xff08;20%&#…...

matlab基础

系列文章目录 文章目录系列文章目录前言1 基本用法总结基础语法桌面管理矩阵均匀间隔矢量矩阵创建矩阵索引前言 介绍了matlab的基本用法 1 基本用法 >> save filename.mat % 将当前工作区的所有变量保存为mat文件 >> load filename.mat % 加载文件>> loa…...

自动化测试——多窗口切换和切换frame

这里写目录标题一、多窗口切换1、base.py&#xff1a;公共代码2、切换句柄的方式1&#xff0c;通过for循环3、切换句柄的方式2&#xff0c;通过索引切换4、源代码二、frame窗口1、什么是frame?2、Frame 分类3、判断要定位的元素在不在frame中两种方式方式一&#xff1a;鼠标选…...

C#中,Elasticsearch.Net判断空字符串

之前有个业务需求&#xff0c;由于最开始存储到es里的&#xff0c;是默认空字符串。 后面程序取数据时&#xff0c;发现需要取空字符串的数据时&#xff0c;不好取出来。 字符串的字段如图&#xff1a; 实际数据如图&#xff1a; 我用的是C#语言&#xff0c;使用的是Elastic…...

23种设计模式-适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种常用的设计模式&#xff0c;它可以将不兼容的接口转换成可兼容的接口&#xff0c;使得原本不能一起工作的类可以协同工作。 在Java中&#xff0c;适配器模式一般有两种实现方式&#xff0c;即类适配器模式和对象适配器…...

深入理解this指向问题

this指向 在运行时绑定&#xff0c;所以this和函数的调用方式和调用的位置有关&#xff0c;和定义的位置没关系 绑定规则 默认绑定&#xff08;非严格模式下this指向全局变量&#xff0c;在严格模式下函数内的this指向undefined&#xff09; 独立函数调用&#xff0c;没有主题 …...

事业单位联考(综合应用A类)典型例题教案

【联考A类】根据材料2&#xff0c;请你概括C市B县旅游质监所投诉处理科小王在接待投诉时存在的主要问题&#xff0c;并指出问题的具体表现。&#xff08;35分&#xff09;要求&#xff1a;准确、全面、分条作答。字数在300字以内。材料2&#xff1a;某日&#xff0c;几位游客家…...

frp内网穿透实验

Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器) ←→ 内网…...

认识JavaScript中的防抖函数

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;前端领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录前言一、防抖是什么&#xff1f;1. deounce-v1的基本…...

macOS 13.3 Beta 2 (22E5230e)With OpenCore 0.8.9正式版 and winPE双引导分区原版镜像

原文地址&#xff1a;http://www.imacosx.cn/112340.html&#xff0c;转载需注明出处镜像特点完全由黑果魏叔官方制作&#xff0c;针对各种机型进行默认配置&#xff0c;让黑苹果安装不再困难。系统镜像设置为双引导分区&#xff0c;全面去除clover引导分区&#xff08;如有需要…...

JetPack—DataStore核心原理与使用

简介 首先&#xff0c;DataStore是Jetpack一部分&#xff0c;是一种数据存储解决方案。其次&#xff0c;DataStore使用协程及flow以异步、一致的方式实现数据的存储。最后是DataStore的实现&#xff0c;分为Preferences DataStore和Proto DataStore&#xff1a;Preferences Da…...

热烈祝贺|酒事有鲤盛装亮相2023中国(山东)精酿啤酒产业发展创新论坛暨展览会

酒事有鲤&#xff08;济南&#xff09;品牌管理有限公司是一家致力于将世界顶级精酿啤酒技术和理念与“ 在地”文化有机融合&#xff0c;做世界认 可的多元化好啤酒&#xff0c;通过精致 舒适的家门口酒馆&#xff0c;让啤酒的 世界观更为完整。 中国生物发酵产业协会联合齐鲁…...

深度强化学习DLR

1 强化学习基础知识 强化学习过程&#xff1a;⾸先环境(Env)会给智能体(Agent)⼀个状态(State)&#xff0c;智能体接收到环境给的观测值之后会做出⼀个动作(Action)&#xff0c;环境接收到智能体给的动作之后会做出⼀系列的反应&#xff0c;例如对这个动作给予⼀个奖励(Reward…...

Android Handler机制(四) Message源码分析

一. 简介 接上一篇文章:Android Handler机制(三) Looper源码分析 ,我们来继续分析一下Message源码 这一系列文章都是为了深入理解Handler机制. Message 作为消息传递的载体&#xff0c;源码主要分为以下 几个部分: 1. 操作数据相关&#xff0c;类似 getter()和 setter()这种…...

【Git】git命令(全)

Git1、本地操作2、版本管理3、远端仓库4、分支管理5、缓存stash6、遗留rebase7、标签管理8、解决冲突9、参考教程10、示例代码1、本地操作 Linux安装git&#xff1a;yum install git查看git版本 git version查看git设置 git config --list设置git属性 git config --global初始…...

软考论文-成本管理(1)

成本管理 1.成本管理的主要内容&#xff1f; 规划成本&#xff1a;制定一个成本管理的计划。估算成本&#xff1a;根据项目范围说明书&#xff0c;项目管理计划和wbs等文档&#xff0c;采用xxx方法进行估算成本成本预算&#xff1a;可以算工作包的费用&#xff0c;制定预算和…...

Java 多线程 --- 锁的概念和类型划分

Java 多线程 --- 锁的概念和类型划分锁的概念乐观锁与悲观锁公平锁与非公平锁什么是可重入锁独占锁与共享锁轻量级锁和重量级锁自旋锁 (Spinlock)锁的概念 锁可以将多个线程对共享数据的并发访问转换为串行访问, 这样一个共享数据一次只能被一个线程访问, 该线程访问结束后其他…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...