精华内容
下载资源
问答
  • 有时需要对十六进制数做加减乘除,某些手机app能实现此功能,但使用起来未免有些麻烦,其实...提示:HEX是十六进制,DEC是十进制,OCT是八进制,BIN是二进制,大家也可以根据自己的实际需要选择是哪一种进制。 ...

    有时需要对十六进制数做加减乘除,某些手机app能实现此功能,但使用起来未免有些麻烦,其实Windows自带的计算器就可以实现十六进制数的运算。

    1.找到并打开计算器

    在这里插入图片描述

    2.点击如图所示的位置

    在这里插入图片描述

    3.点击程序员选项

    在这里插入图片描述

    4.选择HEX

    在这里插入图片描述提示:HEX是十六进制,DEC是十进制,OCT是八进制,BIN是二进制,大家也可以根据自己的实际需要选择是哪一种进制。

    展开全文
  • 链接: : 行动应用程式: : 官方Google Play商店下载链接...您可以在以下设备上使用二进制计算器: :mobile_phone: :laptop: :desktop_computer: (Android / iOS等) :mobile_phone: (Chrome,Firefox,Edge,Saf
  • 好歹是第一个嘛。...缩放字体花了点时间,连续运行的逻辑折腾了半天,其他也没什么了,留下一些坑:double类型二进制转十进制的诡异问题,连续按等号,预留按键,退格键,以后再说吧。(估计是不会有以后了。。)

    好歹是第一个嘛。

    缩放字体花了点时间,连续运行的逻辑折腾了半天,其他也没什么了,留下一些坑:double类型二进制转十进制的诡异问题,连续按等号,预留按键,退格键,以后再说吧。(估计是不会有以后了。。)


    MainActivity

    package cn.michael.calculator;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextPaint;
    import android.util.TypedValue;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    /**
     * Created by Michael on 2016/1/12.
     * Finish by Michael on 2016/1/13.
     * 实现加减乘除,屏幕缩放,连续运算等功能。
     */
    public class MainActivity extends AppCompatActivity {
    
        double ansNum=0;
        double showNum=0;
        double aNum=0;
        double bNum=0;
        int dotCount=0;
        int operator=0;
        boolean hasANum = false;
    
        //统一屏显输出函数
        public void showText(double showNum)
        {
            TextView text=(TextView)findViewById(R.id.textView);
            String str=Double.toString(showNum);
            int len=str.length();
            text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 100);
            //判断计数法,去尾零
            if (!str.contains("E"))
                str=str.substring(len-1,len).equals("0") ? str.substring(0,len-1) : str;
            //缩放字体
            TextPaint FontPaint = new TextPaint();
            FontPaint.setTextSize(text.getTextSize());
            if (FontPaint.measureText(str)>text.getWidth())
                text.setTextSize(TypedValue.COMPLEX_UNIT_PX,text.getTextSize()*text.getWidth() / FontPaint.measureText(str)-10);
            text.setText(str);
        }
    
        @Override
        protected void onCreate(Bundle saveInstanceState) {
            super.onCreate(saveInstanceState);
            setContentView(R.layout.main_layout);
            //数字键监视实现
            View.OnClickListener numListener= new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (MainActivity.this.operator==0)
                        MainActivity.this.hasANum=false;
                    //将按键名转换为数字
                    int b=Integer.parseInt(((Button)v).getText().toString());
                    //小数点
                    if (MainActivity.this.dotCount==0)
                        MainActivity.this.showNum=MainActivity.this.showNum*10+b;
                    else {
                        MainActivity.this.showNum+=b/Math.pow(10,dotCount);
                        dotCount++;
                    }
                    MainActivity.this.showText(MainActivity.this.showNum);
                }
            };
            //数字键监视定义
            findViewById(R.id.num1).setOnClickListener(numListener);
            findViewById(R.id.num2).setOnClickListener(numListener);
            findViewById(R.id.num3).setOnClickListener(numListener);
            findViewById(R.id.num4).setOnClickListener(numListener);
            findViewById(R.id.num5).setOnClickListener(numListener);
            findViewById(R.id.num6).setOnClickListener(numListener);
            findViewById(R.id.num7).setOnClickListener(numListener);
            findViewById(R.id.num8).setOnClickListener(numListener);
            findViewById(R.id.num9).setOnClickListener(numListener);
            findViewById(R.id.num0).setOnClickListener(numListener);
            //点键监听实现,定义
            findViewById(R.id.dot).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.dotCount = 1;
                }
            });
            //等于键监听实现
            final View.OnClickListener equalListener=new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.bNum=MainActivity.this.showNum;
                    switch (MainActivity.this.operator)
                    {
                        case 1:
                            MainActivity.this.ansNum=MainActivity.this.aNum+MainActivity.this.bNum;
                            break;
                        case 2:
                            MainActivity.this.ansNum=MainActivity.this.aNum-MainActivity.this.bNum;
                            break;
                        case 3:
                            MainActivity.this.ansNum=MainActivity.this.aNum*MainActivity.this.bNum;
                            break;
                        case 4:
                            MainActivity.this.ansNum=MainActivity.this.aNum/MainActivity.this.bNum;
                            break;
                        case 0:
                    }
                    MainActivity.this.showText(MainActivity.this.ansNum);
                    MainActivity.this.showNum=0;
                    MainActivity.this.operator=0;
                    MainActivity.this.aNum=MainActivity.this.ansNum;
                    MainActivity.this.dotCount=0;
                }
            };
            //等于键监听定义
            findViewById(R.id.equal).setOnClickListener(equalListener);
            //运算符键监听实现
            View.OnClickListener operatorListener=new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!MainActivity.this.hasANum) {
                        MainActivity.this.aNum = MainActivity.this.showNum;
                        MainActivity.this.hasANum=true;
                    }
                    else
                        equalListener.onClick(null);
                    MainActivity.this.showNum = 0;
                    MainActivity.this.dotCount=0;
                    switch (v.getId()) {
                        case R.id.plus:
                            MainActivity.this.operator=1;
                            break;
                        case R.id.minus:
                            MainActivity.this.operator=2;
                            break;
                        case R.id.multiply:
                            MainActivity.this.operator=3;
                            break;
                        case R.id.divide:
                            MainActivity.this.operator=4;
                            break;
                    }
                }
            };
            //运算符键监听定义
            findViewById(R.id.plus).setOnClickListener(operatorListener);
            findViewById(R.id.minus).setOnClickListener(operatorListener);
            findViewById(R.id.multiply).setOnClickListener(operatorListener);
            findViewById(R.id.divide).setOnClickListener(operatorListener);
            //清空键监听实现,定义
            findViewById(R.id.clearevery).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    TextView text = (TextView) findViewById(R.id.textView);
                    text.setText("0.");
                    text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 100);
                    MainActivity.this.showNum = 0;
                    MainActivity.this.ansNum = 0;
                    MainActivity.this.operator = 0;
                    MainActivity.this.hasANum = false;
                    MainActivity.this.dotCount = 0;
                }
            });
            //清除键监听实现,定义。清除键只清除屏幕显示。
            findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.showText(MainActivity.this.showNum = 0);
                    MainActivity.this.dotCount = 0;
                }
            });
        }
    }


    main_layout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="0."
            android:id="@+id/textView"
            android:layout_gravity="center_horizontal"
            android:textSize="100dp"
            android:gravity="center_vertical|right"
            android:padding="5dp"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:padding="10dp">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textSize="50sp"
                    android:id="@+id/button1" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text=""
                    android:textSize="50sp"
                    android:id="@+id/button2" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="CE"
                    android:textSize="50sp"
                    android:id="@+id/clearevery" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="C"
                    android:textSize="50sp"
                    android:id="@+id/clear" />
    
            </LinearLayout>
    
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="7"
                    android:textSize="50sp"
                    android:id="@+id/num7" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="8"
                    android:textSize="50sp"
                    android:id="@+id/num8" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="9"
                    android:textSize="50sp"
                    android:id="@+id/num9" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="/"
                    android:textSize="50sp"
                    android:id="@+id/divide" />
    
            </LinearLayout>
    
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="4"
                    android:textSize="50sp"
                    android:id="@+id/num4" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="5"
                    android:textSize="50sp"
                    android:id="@+id/num5" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="6"
                    android:textSize="50sp"
                    android:id="@+id/num6" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="×"
                    android:textSize="50sp"
                    android:id="@+id/multiply" />
    
            </LinearLayout>
    
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="1"
                    android:textSize="50sp"
                    android:id="@+id/num1" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="2"
                    android:textSize="50sp"
                    android:id="@+id/num2" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="3"
                    android:textSize="50sp"
                    android:id="@+id/num3" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="-"
                    android:textSize="50sp"
                    android:id="@+id/minus" />
    
            </LinearLayout>
    
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="0"
                    android:textSize="50sp"
                    android:id="@+id/num0" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="."
                    android:textSize="50sp"
                    android:id="@+id/dot" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="="
                    android:textSize="50sp"
                    android:id="@+id/equal" />
    
                <Button
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="+"
                    android:textSize="50sp"
                    android:id="@+id/plus" />
            </LinearLayout>
    
        </LinearLayout>
    
    </RelativeLayout>

    附源码http://download.csdn.net/download/a254244460/9402429


    更新:

    1.删去所有MainActivity.this.,多余。

    2.统一double转String使用String.format()

    展开全文
  • mfc 计算器

    热门讨论 2012-12-27 12:18:23
    // CAboutDlg dialog used for App About int focus=0,point1=0,point2=0,i=0,j=0; double temp1=1,temp2=1,equal; double temp3[100],temp4[100]; class CAboutDlg : public CDialog { public: CAboutDlg(); // ...
  • 本文是《打破国外垄断,开发中国人自己的编程语言》系列文章的第2篇。本系列文章的主要目的是教大家学会如何从零开始设计一种编程语言(marvel语言),... 编译成二进制文件,本地执行(基于LLVM)本文详细讲解如何用Lis...
    28f6ae6307aba85d8ee02de93fb91c03.png

    本文是《打破国外垄断,开发中国人自己的编程语言》系列文章的第2篇。本系列文章的主要目的是教大家学会如何从零开始设计一种编程语言(marvel语言),并使用marvel语言开发一些真实的项目,如移动App、Web应用等。marvel语言可以通过下面3种方式运行:

    1. 解释执行

    2. 编译成Java Bytecode,利用JVM执行

    3. 编译成二进制文件,本地执行(基于LLVM)

    ce910e1839b9a694386fb7c597381540.png

    本文详细讲解如何用Listener方式实现一个可以计算表达式的程序,该程序不仅可以计算表达式,也可以识别表达式的错误,如果某一个表达式出错,那么该表达式不会输出任何结果。

    1. Visitor与Listener 在上一篇文章中使用Antlr和Visitor实现了一个可以计算表达式的程序MarvelCalc。这个程序非常简单,相当于Antlr的HelloWorld。不过Antlr除了Visitor方式外,还支持Listener方式,也就是监听器方式。不管是哪种方式,其目的都是遍历AST(抽象语法树),只是Visitor方式需要显式访问子节点(通过visit方法访问),例如,下面的代码访问了MulDiv的两个子节点,也就是MulDiv的左有操作数(ctx.expr(0)和ctx.expr(1))。

    @Override public void enterMulDiv(CalcParser.MulDivContext ctx) {}@Override public void exitMulDiv(CalcParser.MulDivContext ctx) {}

    而Listener方式是由系统自动访问当前节点的子节点的,并不需要显式访问子节点。而且Listener可以拦截当前节点的开始处理和结束处理动作。开始处理动作的事件方法以enter开头,结束处理动作的事件方法以exit开头。例如,处理MulDiv动作时,会生成两个事件方法:enterMulDiv和exitMulDiv,分别表示开始处理MulDiv和结束处理MulDiv,这两个方法的代码如下:

    @Override public void enterMulDiv(CalcParser.MulDivContext ctx) {}@Override public void exitMulDiv(CalcParser.MulDivContext ctx) {}

    那么开始处理动作和结束处理动作有什么区别呢?如果是原子表达式(内部不包含其他表达式的表达式),如id、数值等,这两个事件方法没什么不同的(用哪一个处理表达式都可以)。但如果是非原子表达式,就要考虑下使用enter还是exit了。例如,下面的表达式:

    3 * (20 / x * 43)

    这个表达式明显是非原子的。编译器会从左向右扫描整个表达式,当扫描到第一个符号(*)时,会将右侧的所有内容(20 / x * 43)当做一个整体处理,这就会第一次调用enterMulDiv方法和exitMulDiv方法。只不过在调用enterMulDiv方法后,还会做很多其他的工作,最后才会调用exitMulDiv方法。那么中间要做什么工作呢?当然是处理表达式(20 / x * 43)了。由于这个表达式中有一个变量x,所以在扫描到x时,需要搜索该变量是否存在,如果存在,需要提取该变量的值。也就是说,在第一次调用enterMulDiv方法时还没有处理这个变量x,如果在enterMulDiv方法中要计算整个表达式的值显然是不可能的(因为x的值还没有确定),所以正确的做法应该是在exitMulDiv方法中计算整个表达式的值,因为在该方法被调用时,整个表达式的每一个子表达式的值都已经计算完了。

    enterXxx和exitXxx方法也经常被用于处理作用域,例如,在扫描到下面的函数时, 在该函数对应的enterXxx方法中会将当前作用域切换到myfun函数(通常用Stack处理),而在exitXxx方法中,会恢复myfun函数的parent作用域。类、条件语句、循环语句也同样涉及到作用域的问题。关于作用域的问题,在后面的文章中会详细介绍作用域的实现方法。

    void myfun() {}

    从前面的介绍可知,Listener比Visitor更灵活,Listener也是我推荐的遍历AST的方式,后面的文章也基本上使用Listener的方式实现编译器。

    2. Listener对应的接口和基类

    现在回到本文的主题上来,本文的目的是使用Listener的方式取代Visitor的方式实现计算器。在编译Calc.g4时,除了生成CalcVisitor.java和CalcBaseVisitor.java,还生成了另外两个文件:CalcListener.java和CalcBaseListener.java。其中CalcListener.java文件是Listener的接口文件,接口中的方法会根据Calc.g4文件中的产生式生成,该文件的代码如下:

    import org.antlr.v4.runtime.tree.ParseTreeListener;public interface CalcListener extends ParseTreeListener {    void enterProg(CalcParser.ProgContext ctx);    void exitProg(CalcParser.ProgContext ctx);    void enterPrintExpr(CalcParser.PrintExprContext ctx);    void exitPrintExpr(CalcParser.PrintExprContext ctx);    void enterAssign(CalcParser.AssignContext ctx);    void exitAssign(CalcParser.AssignContext ctx);    void enterBlank(CalcParser.BlankContext ctx);    void exitBlank(CalcParser.BlankContext ctx);    void enterParens(CalcParser.ParensContext ctx);    void exitParens(CalcParser.ParensContext ctx);    void enterMulDiv(CalcParser.MulDivContext ctx);    void exitMulDiv(CalcParser.MulDivContext ctx);    void enterAddSub(CalcParser.AddSubContext ctx);    void exitAddSub(CalcParser.AddSubContext ctx);    void enterId(CalcParser.IdContext ctx);    void exitId(CalcParser.IdContext ctx);    void enterInt(CalcParser.IntContext ctx);    void exitInt(CalcParser.IntContext ctx);}

    通常来讲,并不需要实现CalcListener接口中的所有方法,所以antlr还为我们生成了一个默认实现类CalcBaseListener,该类位于CalcBaseListener.java文件中。CalcListener接口的每一个方法都在CalcBaseListener类中提供了一个空实现,所以使用Listener方式遍历AST,只需要从CalcBaseListener类继承,并且覆盖必要的方法即可。

    3. 用Listener方式实现可计算器

    现在创建一个MyCalcParser.java文件,并在该文件中编写一个名为MyCalcParser的空类,代码如下:

    public class MyCalcParser  extends  CalcBaseListener{    ... ...}

    现在的问题是,在MyCalcParser类中到底要覆盖CalcBaseListener中的哪一个方法,而且如何实现这些方法呢?

    要回答这个问题,就要先分析一下上一篇文章中编写的EvalVisitor类的代码了。其实在EvalVisitor中覆盖了哪一个动作对应的方法,在MyCalcParser类中也同样需要覆盖该动作对应的方法,区别只是使用enterXxx,还是使用exitXxx,或是都使用。

    现在将EvalVisitor类的关键点提出来:

    (1) 在EvalVisitor类中有一个名为memory的Map对象,用来保存变量的值,这在Listener中同样需要;

    (2)在EvalVisitor类中有一个error变量,用来标识分析的过程中是否有错误,在Listener中同样需要;

    (3)每一个visitXxx方法都有返回值,其实这个返回值是向上一层节点传递的值。而Listener中的方法并没有返回值,但仍然需要将值向上一层节点传递,所以需要想其他的方式实现向上传值;

    那么为什么要向上传值呢?先来举一个例子,看下面的表达式:

     private Map values = new HashMap<>();

    这是一个乘法表达式,编译器对这个表达式扫描时,会先识别两个整数(4和5),这两个整数是两个原子表达式。如果使用Listener的方式,需要在这两个整数对应的enterInt方法(exitInt方法也可以)中将'4'和'5'转换为整数,这是因为不管值是什么类型,编译器读上来的都是字符串,所以需要进行类型转换。

    包含4和5的表达式是MulDiv,对应的动作方法是exitMulDiv(不能用enterMulDiv,因为这时4和5还没有扫描到)。在exitMulDiv方法中要获取乘号(*)左右两个操作数的值(ctx.expr(0)和ctx.expr(1))。而这两个操作数的值在enterInt方法中已经获取了,我们要做的只是将获取的值传递给上一层表达式,也就是MulDiv表达式。向上一层传值的方法很多,这里采用一个我非常推荐的方式,通过用一个Map对象保存所有需要传递的值,key就是上一层节点的ParseTree对象(每一个enterXxx和exitXxx方法的ctx参数的类型都实现了ParseTree接口),而value则是待传递的值,可以使用下面的方式定义这个Map对象。

     private Map values = new HashMap<>();

    同时还需要两个方法来设置和获取值,分别是setValue和getValue,代码如下:

    public void setValue(ParseTree node, int value) {    values.put(node,value);}public int getValue(ParseTree node) {    try {        return values.get(node);    } catch (Exception e) {        return 0;    }}

    下面给出MyCalcParser类的完整代码:

    1+3 * 4 - 12 /6;x = 40;y = 13;x * y + 20 - 42/6;z = 12;4;x + 41 * z - y;

    现在编写用于遍历AST和计算结果的MarvelListenerCalc类,代码如下:

    import org.antlr.v4.runtime.CharStream;import org.antlr.v4.runtime.CharStreams;import org.antlr.v4.runtime.CommonTokenStream;import org.antlr.v4.runtime.tree.ParseTree;import org.antlr.v4.runtime.tree.ParseTreeWalker;import java.io.FileInputStream;import java.io.InputStream;public class MarvelListenerCalc {    public static void main(String[] args) throws Exception  {        String inputFile = null;        if ( args.length>0 ) {            inputFile = args[0];        } else {            System.out.println("语法格式:MarvelCalc inputfile");            return;        }        InputStream is = System.in;        if ( inputFile!=null ) is = new FileInputStream(inputFile);        CharStream input = CharStreams.fromStream(is);        // 创建词法分析器        CalcLexer lexer = new CalcLexer(input);        CommonTokenStream tokens = new CommonTokenStream(lexer);        //         CalcParser parser = new CalcParser(tokens);        ParseTree tree =  parser.prog();        MyCalcParser calc = new MyCalcParser();        ParseTreeWalker walker = new ParseTreeWalker();        // 开始遍历AST        walker.walk(calc, tree);    }}

    我们仍然使用上一篇文章使用的测试用例:

    1+3 * 4 - 12 /6;x = 40;y = 13;x * y + 20 - 42/6;z = 12;4;x + 41 * z - y;

    运行MarvelListenerCalc的执行结果如下图所示:

    276f3ee33f0c642a2d881e64b28dbdc6.png

    本文实现的程序还支持错误捕捉,例如,将最后一个表达式的变量x改成xx,再执行程序,就会抛出异常,出错的表达式没有输出任何值,异常会指示出错的位置(行和列),如下图所示:

    c64b11b05481452ef8e9961a31da8218.png
    d2e1bf2ec54ccae28f4c2328d89b04a0.png

    原文:

    https://www.cnblogs.com/nokiaguy/p/13539090.html

    展开全文
  • 是谁说Android没有原生Python了那可是正儿八经的Linux内核,安装齐全了完整POSIX环境后,和一台Linux电脑没有什么区别(硬要说的话,原生的图形是没有的)Android的Termux就是干这个的,只要是有arm的二进制包就能装...

    是谁说Android没有原生Python了

    那可是正儿八经的Linux内核,安装齐全了完整POSIX环境后,和一台Linux电脑没有什么区别(硬要说的话,原生的图形是没有的)

    Android的Termux就是干这个的,只要是有arm的二进制包就能装(都2020年了,哪个还没有似的),没有预编译的也有很多能自己编译

    我在上面装Python有两个用途,一个是装IPython当计算器用,另一个是用you-get下点儿视频

    所以回归正题

    想要用Python做app,最大的障碍有若干个

    第一个是性能。这个真没辙,但你又不是用Python写什么渲染管线,日常简单应用场景下,使用起来问题不大

    第二个是有无成熟的工具链。面向移动的Python gui工具包,成熟的也就是Kivy了,硬要算的话还有一个专门用来写AVG的Ren’Py。如果是要快糙猛操作移动硬件的话,Android上还有个QPython

    第三点是分发。写命令行那种App,分发到PyPi也算分发到移动平台了,不止上面说的Termux,特化一点的QPython也用得上;写实打实的以触摸操作为主的App,发到PyPi不大现实,QPython的gui有是有,但总不能和用户说“去下载QPython”吧;因此最合理的方案是Kivy和Ren’Py这类自带Python环境的东西,这两者都有相对成熟的上架应用,质量上是过关的

    展开全文
  • 实用工具

    2016-07-11 15:31:23
    云算笔记http://www.yunsuan.org/ IP地址,十六进制 二进制 二进制转换在线计算器http://www.yunsuan.org/app/c126 转载于:https://blog.51cto.com/xueyue8/1825375
  • 计算机基本概述

    2020-12-26 17:21:01
    1.计算机基本概述 计算机的概念:计算机就是我们非常常见的电脑,是可以用来实现超高速计算的电子计算器。 ————作用:进行数字运算,逻辑...————最初的机械语言仅仅是由0和1构成的二进制数,二进制数是计算机
  • 1.计算机的概念及组成 计算机的概念:计算机就是我们非常常见的电脑,是可以用来实现超高速计算的电子计算器。 ————作用:进行数字运算,逻辑...————最初的机械语言仅仅是由0和1构成的二进制数,二进制数是计
  • android logcat使用

    2011-09-17 00:22:05
    -B 输出log到二进制中。 过滤器的格式是一个这样的串: [:priority] 其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示: V Verbose D Debug I Info W Warn E Error F ...
  • adb1.0.26包含fastboot.exe

    2019-03-05 15:11:03
    INSTALL_FAILED_CPU_ABI_INCOMPATIBLE 包含不兼容设备 CPU 应用程序二进制接口的 native code INSTALL_FAILED_MISSING_FEATURE 应用使用了设备不可用的功能 INSTALL_FAILED_CONTAINER_ERROR 1. sdcard 访问失败; 2...
  • Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
  • ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 持续更新中,欢迎提 PR 和 Issue 补充指正,觉得有用的可以将 此 GitHub 仓库 Star 收藏备用。...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • Java资源包01

    2016-08-31 09:16:25
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包101

    2016-07-13 10:11:08
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包4

    热门讨论 2013-06-28 09:26:54
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
  • java开源包7

    热门讨论 2013-06-28 09:52:16
    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

二进制计算器app