Xcode做简易计算器

1.创建一个新项目,选择“View-based Application”。输入名字“Cal”,这时会有如下界面。

2.选择Resources->CalViewController.xib并双击,便打开了资源编辑对话框。

3.我们会看到几个窗口。其中有一个上面写着Library,这里面全是控件。如果没有显示的话,就在最上面的“TOOLS”里单击一下就出来了。还有一个标题为“View”,这个就是视图了,在这里面加上控件,运行时就可以显示出来了。还有一个标题为“Attributes”,这个很明显的是属性,关于某个控件的属性就在这里面设置。

4.我们这次主要用的是两个控件。如下图:

上面的是按钮,下面的是一个文本框。按钮是用来负责单击123那些的,文本框是用来显示的。

5.拖动控件到View的合适位置,具体怎么拖动是你自己的事,我的结果如下图:

这里也有一个小技巧,这里有很多按钮,一个一个拖动是很麻烦的,这时,拖动一个后,选中它,按住Option(alt)键,直接拖动就可以出现一个副本,弄好上面一排后,选中一排四个,再向下拖动,就可以一下出现4个。

6.下面我们给按钮添加文字。方法是,先选中文字,然后在属性窗口里,找到Title项,在里面写上名字,最后点一下回车键。如图:

把其他的都添加好,我的结果是这样的:

7.设置文本框的属性,按下图设置:

因为计算器默认会显示一个0。

8.我们要添加代码了。

  (1)在CaleViewController.h里,修改代码成如下形式:

@interface CaleViewController : UIViewController {

  UITextField* txtResult;//用来表示输出口的,和TextField类型一致

}

@property(nonatomic, retain) IBOutlet UITextField* txtResult;//表示这是一个输出口

-(IBAction)ButtonPressed:(id)sender;//这是一个事件的操作部分的声明

@end

  (2)在CaleViewController.m文件里按如下修改:

#import "CaleViewController.h"

 

@implementation CaleViewController

@synthesize txtResult;//通知编译器为我们创建访问方法和修改方法

上面的是在文件最上面,然后添加函数:

-(IBAction)ButtonPressed:(id)sender{

    

}

只要在@end之前就行。这是一个空函数,现在我们还没有写到功能部分。

在- (void)dealloc {}函数里加上一句,当然应该在它原有的那句之前了,[txtResult release];

这是释放内存。因为IPHONE的机身内存有限,不可能像平时用电脑一样,所以一定要记得释放内存。而且由于都是指针操作,释放内存要注意,有时候就会释放错了,要多多理解指针。

9.下面要进行的是连接,只有把输入输出口连接起来,才能实现交互操作。所以,我们要把控件和表示控件的变量,操作的函数等连接起来。

具体操作如下:

连接UITextField* txtResult;和文本框控件,在控件操作程序下,按住键盘上的“CTRL”键,再单击并拖动,会出现一条蓝色的线,拖动到VIEW里的文本框控件上松开鼠标,会弹出小下拉菜单,里面就有一个txtResult,如果没有的话,检查你的定义和声明,看看类型是否一致等。再单击一下txtResult就可以了。这就连接上了。这时我们有了一个输出口,就是说以后txtResult变量就是文本框的内容。

连接按钮和操作。有两种方法,方法一:在按钮上单击右键,在对应的事件的右边圆圈里单击并拖动到上,松开就可以了。如图:

方法二:先单击按钮,然后在属性窗口里,找到如图所示:

单击ButtonPressed后面的那个小圆圈(有可能里面有黑点,没事的,正常现象),拖动到对应的按钮上松手,选择相应的事件就OK了。

最后说,我们选择的是Touch Up Inside事件,至于原因,参考《IPhone3开发基础教程》第38页。

我们把所有的按钮都添加上同一个事件,这样就使我们的接口减少了很多。

想试试都管用吗?很简单,在ButtonPressed函数里添加如下代码就可以了。

NSString* strInput = [sender titleForState:UIControlStateNormal];

  txtResult.text=strInput;

它的功能是改变文本框的内容为按钮上的字。试试吧。

当然,做完这一切,千万不要忘了保存。

10.现在就是写计算器主程序的时候了,我们的数字不能太大,Double的才能支持到多少位啊,所以要考虑的问题很多。

现在要开始真正的编程了。

好吧,我们现在来添加一个成员变量,用来表示当前屏幕上显示的数字。double displayNum;并且在viewDidLoad事件中初始化为0.0。

然后我们来给按钮添加tag,数字上1就是1,然后我的列表是如下的,你自己要记住自己是怎么添加的。

0~9-----------0~9; 点------10; +-×/---------11~14; =---------15; 平方------16;正负--------17;CE--------18。

当然,这样写是我的个人习惯,您们可以把数字连接一个事件,加减连接一个,我就不在这里说了。

先说一下,这个是我的制作过程记录,以后会出现修改,这是很正常的,做程序肯定是会经常修改的。我把写错的地方也记录下来是为了让大家(尤其是初学者)来看清楚制作过程,制作过程永远不会一帆风顺。

添加一个成员函数,记住,要添加声明和定义两部分。

(double)NumPress:(int)Num;//我们用它来处理按下数字的操作

变量入口是按下的数字,返回值是目前这个数字是什么。

这个函数里先添加一句 displayNum = displayNum*10 + num;//修改显示的数字

貌似就结束了。但是这肯定是不正确的。

比如我们还要处理点和加减等操作。

我们把这个操作放到按钮的单击事件里。

代码如下:

-(IBAction)ButtonPressed:(id)sender{

     //UIButton* btn = (UIButton*)sender;//用变量指向指令发送者

     int num = [sender tag];//获取tag

     switch (num) {

            case0:case1:case2:

            case3:case4:case5:

            case6:case7:case8:

            case9://这部分是处理数字输入的

                   [selfNumPress: num];

                   break;

            default:

                   break;

     }

}

我们先来处理小数点被按下时。先添加一个成员变量,指示小数点是否被按下。BOOL IsDotPressed;并在viewDidLoad里将其初始化为NO。

添加函数,(void)DotPress{IsDotPressed = YES;}

这样的话,我们的数字按下事件就又要有变化了。

-(void)NumPress:(int)num{

     if (IsDotPressed) {

            ++afterDotNum;//先让按下的小数点后的位数加1

            displayNum = displayNum + pow((double)0.1,afterDotNum)*num;

     }

     else {

            displayNum = displayNum*10 + num;//修改显示的数字

     }

}

我们当然要让它能显示出来,否则也无法测试,不过,控件只能显示NSSTring*类型,所以要转换一下。

用以下函数,添加进去。

- (NSString *)changeFloat:(double)Right

{  

     NSString *stringFloat;

     stringFloat = [NSStringstringWithFormat:@"%.10f",Right];

     constchar *floatChars = [stringFloat UTF8String];

    NSUInteger length = [stringFloat length];

     int i;

    for( i = length-1; i>=0; i--)

    {

        if(floatChars[i] == '0')

                   ;

            else

            {

            if(floatChars[i] == '.')

                i--;

            break;

        }

    }

    NSString *returnString;

    if(i == -1)

        returnString = @"0";

     else

        returnString = [stringFloat substringToIndex:i+1];

    return returnString;

}

然后我们就要调用了,在按钮单击事件里的switch的数字处理中,添加如下代码:

[txtResultsetText:[selfchangeFloat:displayNum]];

这样就可以调用了,不过,我们发现按下点后,点却并不出现,直到再按下一个数字时,点才会出现,这显然不是我们想要的。所以,要修改处理点按下的操作。

改成如下状态:

-(void)DotPress{

     if(IsDotPressed == NO)

     {

            [txtResultsetText:[NSStringstringWithFormat:@"%@%@", [txtResulttext], @"."]];//这里是格式化字符串,在字符串后面添加个点

            IsDotPressed = YES;

     }

}

这样就OK了。

还有一点,就是数字长度问题,数字不能无限大,所以要添加一个判定条件,在数字按下的函数最前面添加以下代码:

//长度大于等于9位时,不再操作了

     if ([txtResult.text length] >= 9 ) {

            return;

     }

下面是操作符号和等于的做法了,先说符号的。

先回忆一下计算器的工作流程,输入第一个数字,输入符号,输入第二个数,等于。这是一般的情况。我们先按一般情况来做。

添加两个函数,一个负责处理符号,一个负责等于。

-(void)OperPress:(int)oper{

     WhichOperPressed = oper-10;

     preInputNum = displayNum;

}

WhichOperPressed这个是int类型的成员变量,用来记录是哪个符号的,其中0-无,1-加,2-减,3-乘,4-除。

然后是等于的操作函数。

-(void)EquPress{

     switch (WhichOperPressed) {

            case1://

                   displayNum += preInputNum;

                   break;

            case2://

                   displayNum = preInputNum-displayNum;

                   break;

            case3://

                   displayNum *= preInputNum;

                   break;

            case4://

                   if (displayNum==0) {

                          [txtResultsetText:@"除数不能为0"];

                          return;

                   }

                   else {

                          displayNum = preInputNum/displayNum;

                   }

                   break;

            default:

                   break;

     }

     [selfinit];

     [txtResultsetText:[selfchangeFloat:displayNum]];

}

嗯,init也是一个函数,主要是清除工作,也可以说是初始化工作。代码如下:

-(void)init{

     preInputNum = 0.0;

     IsNumPressed=NO;

     WhichOperPressed=0;

     IsDotPressed=NO;

     afterDotNum=0;

     IsCaled=YES;

}

一般情况就是这样的,但是,我们有时会有这样的情况,输入数字,按了加号,但是发现按错了,于是按减号再输入第二个数字,再等于。这是一种,还有一种,我们输入第一个数字,按加,输入第二个数字,按加(此时应该显示的是前面两个数字的和),再输入第三个数字,等等。

所以有必要修改一下代码。

将操作符的代码做如下修改:

-(void)OperPress:(int)oper{

     if (IsNumPressed) {

            //计算结果

            [selfEquPress];

     }

     WhichOperPressed = oper-10;

     preInputNum = displayNum;

     IsNumPressed=NO;

     IsCaled=NO;

     IsDotPressed=NO;

}

其中IsNumPressed是BOOL类型的成员变量,初始化为NO,用来表示是否有数字按下,这是处理这两种特殊情况的。

IsCaled是BOOL类型的成员变量,初始化为NO,这个的用处不在此处,而是要在NumPress函数里,修改一下代码:

-(void)NumPress:(int)num{

     IsNumPressed = YES;

     //如果有操作符号按下,则将显示的先归0

     if (WhichOperPressed!=0 || IsCaled) {

            displayNum = 0;

            [txtResultsetText:[selfchangeFloat:displayNum]];

     }……

下面的代码都一样,就不粘了,这里主要是为了在按了等于后,再次按数字,会使数字从0开始,否则按了等于后,再按数字就在数字后面继续添加数字了。

然后是平方的运算,按了平方后的做法,特别简单,就不用再添加成员函数了,就在btnPress的switch里添加就行了,添加如下代码:

            case16://平方

                   displayNum*=displayNum;

                   [txtResultsetText:[selfchangeFloat:(displayNum)]];

                   [selfinit];

                   break;

然后该正负的按钮了。正负的出现很简单,在上面的后面再加一句:

            case17:

                   displayNum = 0-displayNum;

                   [txtResultsetText:[selfchangeFloat:(displayNum)]];

                   break;

是不是很简单?不过,你可以试验一下,如果现在你按了3,再按正负,再按6,出现的不是-36而是-24,这是为什么呢?因为前面我们是加的-30+6当然是-24了。

所以,NumPress函数又要修改了。

。。。。。。

//长度大于等于9位时,不再操作了

     if ([txtResult.textlength] >= 9 ) {

            return;

     }

//添加的是如下部分

     if (displayNum<0) {//主要负责按了正负号后

            num = 0-num;

     }

/添加的是以上部分

     if (IsDotPressed) {

            ++afterDotNum;//先让按下的小数点后的位数加1

            displayNum = displayNum + pow((double)0.1,afterDotNum)*num;

     }

…...

其他的部分相同,就省略了。

下面是CE按钮了,这个是清除用的,用我们的init就差不多了,在BtnPress里添加如下代码:

            case18://CE

                   [selfinit];

                   displayNum=0;

                   [txtResultsetText:@"0"];

                   break;

现在,一个基本的计算器就完成了,我们还要测试一下,打开后,输入0.8,按+再按点,怎么了,是不是出现了“0.8.”呢?这显然有问题,修改吧,肯定是点处理的错,回想一下,点操作只是判断了一下以前有没有输入过点,而无论是符号的,还是等号的,都把其归为NO了,所以出现是很正常的,因此,我们修改成以下代码:

-(void)DotPress{

     //如果有操作符号按下,则将显示的先归0

     if (WhichOperPressed!=0 || IsCaled) {

            displayNum = 0;

            [txtResultsetText:[selfchangeFloat:displayNum]];

     }

     if(IsDotPressed == NO)

     {

            [txtResultsetText:[NSStringstringWithFormat:@"%@%@", [txtResulttext], @"."]];

            IsDotPressed = YES;

     }

     IsNumPressed=YES;

     IsCaled=NO;

}

因为如果有操作符按下后,按点时就相当于按了0和点,所以这样就没问题了。再试试除个0,怎么样,提示出现了吧,再按任意的数字键呢?怎么?没问题?多点几个试试 ,问题有了没?就是只能显示一位数了。这可如何是好呢?在EquPress函数里,找到以下地方:

case4://

                   if (displayNum==0) {

                          [txtResultsetText:@"除数不能为0"];

                          [selfinit];//在这添加一句就OK

                          return;

                   }

我们只要在上面注释的地方添加一句就OK了。大家去想想原因吧。到此,一个简单的计算器就做好了,基本功能全都有了。像界面什么的,自己去动脑子吧。

写在最后:这个功能很简单,目的只是为了将初学者引进门。因为乍一遇到XCODE这样的编译器,有很多人会很不习惯,而且会感觉无从下手。其实IPHONE编程还是很简单的,大家稍微用点心,练习一下,手熟点就没有任何问题的。关键还有就是XCODE是全英文的,有很多人会用起来别扭。以后也许会继续有一些简单的教程。大家有什么意见或者建议尽管告诉我啊,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导入数据库怎么导入_导入必要的库

导入数据库怎么导入重点 (Top highlight)With the increasing popularity of machine learning, many traders are looking for ways in which they can “teach” a computer to trade for them. This process is called algorithmic trading (sometimes called algo-trading)…

windows查看系统版本号

windows查看系统版本号 winR,输入cmd&#xff0c;确定&#xff0c;打开命令窗口&#xff0c;输入msinfo32&#xff0c;注意要在英文状态下输入&#xff0c;回车。然后在弹出的窗口中就可以看到系统的具体版本号了。 winR,输入cmd&#xff0c;确定&#xff0c;打开命令窗口&…

02:Kubernetes集群部署——平台环境规划

1、官方提供的三种部署方式&#xff1a; minikube&#xff1a; Minikube是一个工具&#xff0c;可以在本地快速运行一个单点的Kubernetes&#xff0c;仅用于尝试Kubernetes或日常开发的用户使用。部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube/kubeadm Kubea…

更便捷的画决策分支图的工具_做出更好决策的3个要素

更便捷的画决策分支图的工具Have you ever wondered:您是否曾经想过&#xff1a; How did Google dominate 92.1% of the search engine market share? Google如何占领搜索引擎92.1&#xff05;的市场份额&#xff1f; How did Facebook achieve 74.1% of social media marke…

的界面跳转

在界面的跳转有两种方法&#xff0c;一种方法是先删除原来的界面&#xff0c;然后在插入新的界面&#xff1a;如下代码 if (self.rootViewController.view.superview nil) { [singleDollController.view removeFromSuperview]; [self.view insertSubview:rootViewControlle…

计算性能提升100倍,Uber推出机器学习可视化调试工具

为了让模型迭代过程更加可操作&#xff0c;并能够提供更多的信息&#xff0c;Uber 开发了一个用于机器学习性能诊断和模型调试的可视化工具——Manifold。机器学习在 Uber 平台上得到了广泛的应用&#xff0c;以支持智能决策制定和特征预测&#xff08;如 ETA 预测 及 欺诈检测…

矩阵线性相关则矩阵行列式_搜索线性时间中的排序矩阵

矩阵线性相关则矩阵行列式声明 (Statement) We have to search for a value x in a sorted matrix M. If x exists, then return its coordinates (i, j), else return (-1, -1).我们必须在排序的矩阵M中搜索值x 。 如果x存在&#xff0c;则返回其坐标(i&#xff0c;j) &#x…

一地鸡毛 OR 绝地反击,2019年区块链发展指南

如果盘点2018年IT技术领域谁是“爆款流量”,那一定有个席位是属于区块链的,不仅经历了巨头、小白纷纷入场的光辉岁月,也经历了加密货币暴跌,争先退场的一地鸡毛。而当时间行进到2019年,区块链又将如何发展呢? 近日,全球知名创投研究机构CBInsight发布了《What’s Next …

iphone UITableView及UIWebView的使用

1。新建一个基于Navigation&#xff0d;based Application的工程。 2。修改原来的RootViewController.h,RootViewController.m,RootViewController.xib为MyTableViewController.h,MyTableViewController.m,MyTableViewController.xib。 3。点击MainVindow.xib&#xff0c;将R…

物联网数据可视化_激发好奇心:数据可视化如何增强博物馆体验

物联网数据可视化When I was living in Paris at the beginning of this year, I went to a minimum of three museums a week. While this luxury was made possible by the combination of an ICOM card and unemployment, it was founded on a passion for museums. Looking…

计算机公开课教学反思,语文公开课教学反思

语文公开课教学反思引导语&#xff1a; 在语文的公开课结束后&#xff0c;教师们在教学 有哪些需要反思的呢?接下来是yjbys小编为大家带来的关于语文公开课教学反思&#xff0c;希望会给大家带来帮助。篇一&#xff1a;语文公开课教学反思今天早上&#xff0c;我上了一节语文…

bigquery数据类型_将BigQuery与TB数据一起使用后的成本和性能课程

bigquery数据类型I’ve used BigQuery every day with small and big datasets querying tables, views, and materialized views. During this time I’ve learned some things, I would have liked to know since the beginning. The goal of this article is to give you so…

中国计算机学科建设,计算机学科建设战略研讨会暨“十四五”规划务虚会召开...

4月15日下午&#xff0c;信息学院计算机系举办了计算机科学与技术学科建设战略研讨会暨“十四五”规划务虚会。本次会议的主旨是借第五轮学科评估的契机&#xff0c;总结计算机学科发展的优劣势&#xff0c;在强调保持优势的同时&#xff0c;更着眼于短板和不足&#xff0c;在未…

服务器被攻击怎么修改,服务器一直被攻击怎么办?

原标题&#xff1a;服务器一直被攻击怎么办&#xff1f;有很多人问说&#xff0c;网站一直被攻击&#xff0c;什么被挂马&#xff0c;什么被黑&#xff0c;每天一早打开网站&#xff0c;总是会出现各种各样的问题&#xff0c;这着实让站长们揪心。从修改服务器管理账号开始&…

脚本 api_从脚本到预测API

脚本 apiThis is the continuation of my previous article:这是我上一篇文章的延续&#xff1a; From Jupyter Notebook To Scripts从Jupyter Notebook到脚本 Last time we discussed how to convert Jupyter Notebook to scripts, together with all sorts of basic engine…

Iphone代码创建视图

要想以编程的方式创建视图&#xff0c;需要使用视图控制器中定义的viewDidLoad方法&#xff0c;只有在运行期间生成UI时才需要实现该方法。 在此只贴出viewDidLoad方法的代码&#xff0c;因为只需要在这个方法里面编写代码&#xff1a; [cpp] view plaincopyprint?- (void)vi…

binary masks_Python中的Masks概念

binary masksAll men are sculptors, constantly chipping away the unwanted parts of their lives, trying to create their idea of a masterpiece … Eddie Murphy所有的人都是雕塑家&#xff0c;不断地消除生活中不必要的部分&#xff0c;试图建立自己的杰作理念……埃迪墨…

Iphone在ScrollView下点击TextField使文本筐不被键盘遮住

1.拖一个Scroll View视图填充View窗口&#xff0c;将Scroll View视图拖大一些&#xff0c;使其超出屏幕。 2.向Scroll View拖&#xff08;添加&#xff09;多个Label视图和Text View视图。 3.在.h头文件中添加如下代码&#xff1a; [cpp] view plaincopyprint?#import <U…

python 仪表盘_如何使用Python刮除仪表板

python 仪表盘Dashboard scraping is a useful skill to have when the only way to interact with the data you need is through a dashboard. We’re going to learn how to scrape data from a dashboard using the Selenium and Beautiful Soup packages in Python. The S…

VS2015 定时服务及控制端

一. 服务端 如下图—新建项目—经典桌面—Windows服务—起名svrr2. 打到server1 改名为svrExecSqlInsert 右击对应的设计界面&#xff0c;添加安装服务目录结构如图 3. svrExecSqlInsert里有打到OnStart()方法开始写代码如下 /// <summary>/// 服务开启操作/// </su…