本节课思考

本节课思考

每次四则运算都得用等号输出无疑是反人类的,按照现实需要,计算器应该能完成连续的四则运算并在最后一次按=输出结果,尝试完成连续计算,如果fh里存有符号加减乘除,说明非第一次运算,应该直接计算上一次的计算结果,存储到btn_num1里,再进行本轮的计算,即每次按符号键将之前已有的运算完成得到结果,作为上一次的输入。

正在回答

登陆购买课程后可参与讨论,去登陆

6回答

同学你好,在js中是可以设置全局变量的,不使用var,直接给定义变量,隐式的声明了全局变量。如下所示:

http://img1.sycdn.imooc.com//climg/5eaa689f09cb3d7706440252.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕小尤 2020-04-30 10:33:37

同学你好,同学根据自己的思路实现四则运算,很棒哦~ 并感谢同学的分享代码。继续加油!

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 源治泷谷 #1
    遇到的问题:js里面不能设置全局变量吗,我希望设置全局变量btn_num1 fh 和文本框对象m 使得多个方法之间可以对相同的值进行操作 但是把这些变量提取到方法外面就提示无法找到这些变量,最后没办法只能通过返回值传递btn_num1=mathys(fh,btn_num1,m);存储上一次的运算结果或者第一个值;有没有办法设置全局变量,可以在函数方法中直接修改btn_num1 fh这些函数,可以节省一些代码。还是说只能在html里面找一个标签设一个value值用来存储btn_num1,然后通过js的方法修改,使得不同方法之间可以有一个公用的值当作全局变量
    2020-04-30 10:36:53
提问者 源治泷谷 2020-04-30 01:13:37

function init(){

var m=document.getElementById("num");

m.value=0;

m.disabled="disabled";

var btn_num1;

var fh;

var zz=true;

var oButton=document.getElementsByTagName("input");

for(var i=0;i<oButton.length;i++){

oButton[i].onclick=function(){

if(isNumber(this.value)){

if(zz){

m.value=(m.value+this.value)*1;

}

else{

m.value=this.value;

zz=true;

}

}

else{

var btn_num=this.value;

switch(btn_num){

case "+":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="+";

break;

case "-":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="-";

break;

case "*":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="*";

break;

case "/":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="/";

break;

case "=":

switch (fh){

case "+":

m.value=btn_num1+(m.value*1);

break;

case "-":

m.value=btn_num1-(m.value*1);

break;

case "*":

m.value=btn_num1*(m.value*1);

break;

case "/":

if(m.value==0){

m.value=0;

alert("除数不能为0!");

}else{

m.value=btn_num1/(m.value*1);

}

break;

}

fh=null;

zz=false;

break;

case ".":

m.value=dec_number(m.value);

break;

}

}

}

}

}


function isNumber(n){

return !isNaN(n);

}


function mathys(fh,btn_num1,m){

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

if(m.value==0){

m.value=0;

btn_num1=0;

alert("除数不能为0!");

}else{

btn_num1=btn_num1/(m.value*1);

}

break;

}

}

return btn_num1;

}


function dec_number(n){

if(n.indexOf(".")==-1){

n=n+".";

}

return n;

}


  • 提问者 源治泷谷 #1
    添加了判断变量zz,初始化为true,每次点击=后变为fales;当zz=false时直接点击数字,触发m.value=this.value即清空之前运算结果,并将zz调为true状态保证接下来正常输入数字。若点击等于之后,点击运算符号,此时因为显示页面m.value=0所以zz触发m.value=this.value不影响运算,同时zz回到true,保证接下来正常输入数字
    2020-04-30 01:19:01
提问者 源治泷谷 2020-04-30 01:13:23

还有一个问题是,在日常计算器中,当按了=之后如果不点击运算符号直接输入新的数字,那么计算器会丢弃以前的数字,直接用新数字代替,如1+1=2然后再按1显示器上应该只有1;因此应该设置一个判断变量,当点击等于号之后触发,此时若不选择运算符号直接点击数字,那么清空显示器并添加新数字,同时将判断变量关闭

提问者 源治泷谷 2020-04-29 23:21:36

function init(){

var m=document.getElementById("num");

m.value=0;

m.disabled="disabled";

var btn_num1;

var fh;

var oButton=document.getElementsByTagName("input");

for(var i=0;i<oButton.length;i++){

oButton[i].onclick=function(){

if(isNumber(this.value)){

m.value=(m.value+this.value)*1;

}

else{

var btn_num=this.value;

switch(btn_num){

case "+":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="+";

break;

case "-":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="-";

break;

case "*":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="*";

break;

case "/":

btn_num1=mathys(fh,btn_num1,m);

m.value=0;

fh="/";

break;

case "=":

switch (fh){

case "+":

m.value=btn_num1+(m.value*1);

break;

case "-":

m.value=btn_num1-(m.value*1);

break;

case "*":

m.value=btn_num1*(m.value*1);

break;

case "/":

if(m.value==0){

m.value=0;

alert("除数不能为0!");

}else{

m.value=btn_num1/(m.value*1);

}

break;

}

fh=null;

break;

}

}

}

}

}


function isNumber(n){

return !isNaN(n);

}


function mathys(fh,btn_num1,m){

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

if(m.value==0){

m.value=0;

btn_num1=0;

alert("除数不能为0!");

}else{

btn_num1=btn_num1/(m.value*1);

}

break;

}

}

m.value=0;

return btn_num1;

}


  • 提问者 源治泷谷 #1
    优化后代码。 遇到的问题:js里面不能设置全局变量吗,我希望设置全局变量btn_num1 fh 和文本框对象m但是把这些变量提取到{}外面就提示无法找到这些变量,最后没办法只能通过返回值传递btn_num1=mathys(fh,btn_num1,m);存储上一次的运算结果或者第一个值;有没有办法设置全局变量,可以在函数方法中直接修改btn_num1 fh这些函数,可以节省一些代码。还是说只能在html里面找一个标签设一个value值用来存储btn_num1,然后通过js的方法修改,使得不同方法之间可以有一个公用的值当作全局变量
    2020-04-29 23:27:51
  • 提问者 源治泷谷 #2
    导数第三行m.value=0;是无效的 删去
    2020-04-29 23:32:33
提问者 源治泷谷 2020-04-29 22:47:51

function init(){

var m=document.getElementById("num");

m.value=0;

m.disabled="disabled";


var oButton=document.getElementsByTagName("input");

var btn_num1;

var fh;

for(var i=0;i<oButton.length;i++){

oButton[i].onclick=function(){

if(isNumber(this.value)){

m.value=(m.value+this.value)*1;

}

else{

var btn_num=this.value;

switch(btn_num){

case "+":

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

btn_num1=btn_num1/(m.value*1);

break;

}

}

m.value=0;

fh="+";

break;

case "-":

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

btn_num1=btn_num1/(m.value*1);

break;

}

}

m.value=0;

fh="-";

break;

case "*":

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

btn_num1=btn_num1/(m.value*1);

break;

}

}

m.value=0;

fh="*";

break;

case "/":

if(fh==null){

btn_num1=m.value*1;

}

else{

switch (fh){

case "+":

btn_num1=btn_num1+(m.value*1);

break;

case "-":

btn_num1=btn_num1-(m.value*1);

break;

case "*":

btn_num1=btn_num1*(m.value*1);

break;

case "/":

btn_num1=btn_num1/(m.value*1);

break;

}

}

m.value=0;

fh="/";

break;

case "=":

switch (fh){

case "+":

m.value=btn_num1+(m.value*1);

break;

case "-":

m.value=btn_num1-(m.value*1);

break;

case "*":

m.value=btn_num1*(m.value*1);

break;

case "/":

m.value=btn_num1/(m.value*1);

break;

}

fh=null;

break;

}

}

}

}

}


function isNumber(n){

return !isNaN(n);

}


  • 提问者 源治泷谷 #1
    尝试多轮四则运算,没有提取函数精炼简化,暂时用重复的代码完成多轮运算,除数为零暂未考虑
    2020-04-29 22:49:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师