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.pswp.cn/news/388384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機 編程 教程 pdf,計算機專業教程-第3章編程接口介紹.pdf

下載第3章 編程接口介紹? DB2 UDB應用程序概述? 嵌入S Q L編程? CLI/ODBC應用程序? JAVA應用程序? DAO 、R D O 、A D O應用程序本章將介紹對DB2 UDB 可用的編程方法及其特色&#xff0c;其中一些方法附有簡單的例子&#xff0c;在這些例子中&#xff0c;有些并不是只適用…

導入數據庫怎么導入_導入必要的庫

導入數據庫怎么導入重點 (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…

供來賓訪問計算機打開安全嗎,計算機安全設置操作手冊(22頁)-原創力文檔

計算機安全設置操作手冊ISO27001項目實施電腦配置(以XP為例)賬戶設置user每臺電腦設置administrator和user帳戶&#xff1b;管理員賬戶密碼至少 8位, 賬戶至少6位user將Administrator和user賬戶以外的其他賬戶禁用用具體步驟如下&#xff1a;、右擊【我的電腦】選擇【管理】如圖…

Windows半透明窗口開發技巧

Windows半透明窗口開發技巧 www.visual-gear.com 原創技術文章 在windows平臺上從窗口繪圖有兩種方法&#xff1a; 第一種響應窗口的WM_PAINT消息&#xff0c;使用窗口DC進行繪制 第二種是將窗口樣式設置為層窗口&#xff0c;即 WS_EX_LAYERED設置為該樣式之后窗口將不會產生任…

標識為普通SQL語法

在SQL語句的最前面增加 /*dialect*/轉載于:https://www.cnblogs.com/zouhuaxin/p/10333209.html

的界面跳轉

在界面的跳轉有兩種方法&#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 預測 及 欺詐檢測…

計算機應用基礎成教作業,(計算機應用基礎成教08A卷1.doc

一、判斷題(每空1分&#xff0c;共10分&#xff0c;正確填A錯誤填B)1、計算機按照用途劃分可以分為數字計算機、模擬計算機、數字模擬混合式計算機。()2、微型計算機就是指體積微小的計算機。()3、WindowsXP的窗口是不可改變大小的。( )4、操作系統是用戶和計算機之間的接口。…

iPhone程序運行流程淺談

1. 和大多數語言一樣&#xff0c;每一個iPhone應用也都是從主函數開始運行&#xff0c;它的main函數都在XCode的Other Reasource邏輯目錄下。 [cpp] view plaincopyprint?UIApplicationMain(argc, argv, nil, nil); [cpp] view plaincopyprint?UIApplicationMain(argc, arg…

Trie樹kmpAC自動機后綴數組Manacher

Trie 計數Trie&#xff0c;讀清題意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自動機 模板&#xff1a;https://vjudge.net/problem/UVA-11488 https://vjudge.net/problem/UVA-11019 https://vjudge.net/problem/UVA-11468 https://vjudge.net/problem/UVALive-4…

矩陣線性相關則矩陣行列式_搜索線性時間中的排序矩陣

矩陣線性相關則矩陣行列式聲明 (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…

計算機英文版個人簡歷發文,計算機個人簡歷英文_英文簡歷.doc

計算機個人簡歷英文_英文簡歷I have the honor to present a brief introduction of myself to you in compliance with the requirements of your graduate admissionI was born in November 7th, 1966, at the town of Changing, Beijing. My parents are doing business and…

一地雞毛 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…

python 的datetime模塊使用

1.datetime模塊主要是5個類 date #日期類 年月日 datetime.date(year,month,day) time #時間類 時分秒 datetime.time(hour,minute,second,microsecond,tzoninfo),返回18:29:30 datetime #日期時間類 datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinf…

物聯網數據可視化_激發好奇心:數據可視化如何增強博物館體驗

物聯網數據可視化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;我上了一節語文…