6.1 if 语句
检查除数是否为零。
-(double) convertToNum
{
if (denominator != 0)
return (double) numerator / denominator ;
else
return NAN;
}
现在我们测试这个新方法
int main (int argc, char * argc [ ] )
{
@autoreleasepool {
Fraction * aFraction = [ [ Fraction alloc ] init ];
Fraction * bFraction = [ [ Fraction alloc ] init ];
[ aFraction setNumerator : 1 ];
[ bFraction setDenomiantor : 4 ];
[ aFraction print ];
NSLog( @"=");
NSLog( @"%g", [aFraction convertToNum ];
[bFraction print ];
NSLog (@" =");
NSLog (@”%g", [ bFraction converToNum ];
}
return 0;
}
6.1.1 if else 结构
int main (int argc, char * argc [ ] )
{
@autoreleasepool {
int number, remainder;
NSLog (@“Enter your number to be tested:");
scanf ("%i",&number);
remainder = number / 2;
if ( remainder == 0);
NSLog (@"The number is even");
else
NSLog (@"The number is odd");
}
return 0
}
6.1.2 复合条件测试
例如,假设要计算一次考试中的分数介于70-79 之间的分数个数(含70和79)
所谓复合条件测试,就是用逻辑与(AND)或者逻辑或(OR)运算符连接起来的一个或多个简单条件测试,这两个运算符分别使用字符对 &&和|| 来表示。
if ( grade >= 70 && grade <= 79 )
++ grades_70_to_79;
只在grade 大于等于70 小于等于79的情况下 执行 grades_70_to_79加1。
&&的优先级比||低。
6.1.3 嵌套的if 语句
我们指出,如果圆括号中表达式的求职结果是true,将执行之后的语句,如果这是一条另外的if 语句也是完全可以的。
if ( [ chessGame isOver ] == NO )
if ( [ chesGame whoseTurn ] == YOU )
[chessGame yourMove ];
使用复合关系可以将语句等价转换一下形式。
if ( [ chessGame isOver ] == NO && [ chesGame whoseTurn ] == YOU)
[chessGame yourMove];
对于嵌套的if 语句 ,更实际的例子可能是对于上述例子添加else子句。如下。
if ( [ chessGame isOver ] == NO )
if ( [ chesGame whoseTurn ] == YOU )
[chessGame yourMove ];
else
[chessGame myMove];
上述例子中,可进一步为最外层的if语句添加else子句,这条子句将在对弈结束时执行。
if ( [ chessGame isOver ] == NO )
if ( [ chesGame whoseTurn ] == YOU )
[chessGame yourMove ];
else
[chessGame myMove];
else
[chessGame finish];
6.1.4 else if 的结构
int main(int argc,constchar * argv[]) {
@autoreleasepool {
int number , sign;
NSLog(@"Enter your number");
scanf ("%i",&number);
if (number ==0)
sign = 0;
elseif (number >0)
sign = 1;
else
sign = -1;
NSLog(@"The number is %i",sign);
}
return0;
}
int main(int argc,const char * argv[]) {
@autoreleasepool {
char c;
NSLog(@"Enter a single character:");
scanf (" %c",&c);
if ( (c >= 'a' && c <= 'z') || ( c >= 'A' && c <= 'Z' ) )
NSLog (@"It's an alphabetic character");
else if ( c >= '0' && c <= '9')
NSLog(@"It's a digit");
else
NSLog(@"It's a special character");
}
return 0
}
我们在scanf 的格式化字符%c 前面插入了一个空格,这会引起scanf ‘跳过’ 输入的空白字符。(例如,换行,回车,制表符,换行符)。读入单个字符需要牢记这个方法。
一下程序使用具有多个else if 子句的大型if 语句来确定要执行的运算。
#import <Foundation/Foundation.h>
@interface Calculator: NSObject
-(void) setAccumulator : (double) value;
-(void) clear;
-(double) accumulator;
-(void)add: (double) value;
-(void)subtract: (double) value;
-(void)multiply:(double)value;
-(void)divide:(double)value;
@end
@implementation Calculator
{
double accumulator;
}
-(void) setAccumulator: (double)value;
{
accumulator = value;
{
-(void) clear
{
accumulator = 0;
}
-(double) accumulator;
{
return accumulator;
}
-(void)add: (double) value
{
accumulator += value;
}
-(void)subract: (double) value;
{
accumulator -= value;
}
-(void)multiply:(double)value;
{
accumulator *= value;
}
-(void)divide:(double)value;
{
accumulator /= value;
}
@end
int main (int argc , char * argv[ ] )
{
@autoreleasepool{
double value1 ,value2;
char operator;
Calculator *deskCalc = [[Calculator alloc ] init];
NSLog(@" Type in your expression");
scanf("%lf %c %lf",&value1,&operator,&value2);
[deskCalc setAccumulator: value1];
if (operator == '+')
[deskCalc add: value2];
else if(operator == '-')
[deskCalc subtract: value2];
else if(operator == ‘*’)
[deskCalc multiply :value2];
else if(operator == '/')
[deskCalc divide: value2];
NSLog(@"%.2f",[deskCalc accumulator]);
{
return 0;
}
%c 格式字符可通知系统从终端读入下一个字符,格式字符串中的空格表示输入中允许存在任意个数的空格。
尽管以上程序完成了设置任务,但是它没有考虑用户所犯的错误,如果用户为运算符错误输入一个‘?’,或者输入一个0作为除数,程序只会失败。
尽量预测程序可能的失败或产生非预期结果的情况,修改后的代码:
#import <Foundation/Foundation.h>
//接口和实现部分
int main (int argc, char * argv[ ])
{
@autoreleasepool{
double value1,value2;
char operator;
Calculator *deskCalc = [[Calculator *alloc]init];
NSLog(@" Type in your expression:");
scanf("%lf %c %lf",&value1,&operator,&value);
[deskCalc setAccumulator:value1];
if (operator == '+')
[deskCalc add: value2];
else if(operator == '-')
[deskCalc subtract: value2];
else if(operator == ‘*’)
[deskCalc multiply :value2];
else if(operator == '/')
if (value2 ==0)
NSLog(@"Division by zero");
else
[deskCalc divide: value2];
else
NSLog(@"Unkown operator");
NSLog(@"%.2f",[deskCalc accumulator]);
}
return 0;
}
程序结尾的else 语句会检查所有的失败,因此,任何与测试的4个字符不匹配的 operaator值都会导致执行else 子句。
要处理除以0的这个问题,最好的方法是在计算除法的内部执行测试。
-(void) divide:(double)value
{
if (value != 0)
accumulator /=value;
else{
NSLog (@"division by zero");
accumulator = NAN;
}
}
6.2 switch 语句
将以上if语句代码转换为switch语句。
int main (int argc, char * argv[ ])
{
@autoreleasepool{
double value1,value2;
char operator;
Calculator *deskCalc = [[Calculator *alloc]init];
NSLog(@" Type in your expression:");
scanf("%lf %c %lf",&value1,&operetor,&value);
[deskCalc setAccumulator:value1];
switch (operator){
case '+':
[deskCalc add:value2];
break;
case '-':
[deskCalc subtract:value2];
break;
case '*':
[deskCalc multiply:value2];
break;
case '/':
[deskCalc divide:value2];
break;
default:
NSLog(@"Unkown operator");
break;
}
NSLog(@”%.2f",[deskCalc accumulator]);
}
return 0;
}
6.3 Boolean 变量
如何编写一个程序生成素数表,如果一个正整数p不能被1和它本身以外的任何整数整除,那它就是一个素数。
int main (int argc, char * argv[ ])
{
@autoreleasepool{
int p,d,isPrime;
for (p = 2 ; p <= 50; ++p ) {
isPrime = 1;
for ( d = 2 ; d < p ; ++d ) {
if ( p % d ==0 )
isPrime = 0;
if (isPrime != 0 )
NSLog (@"%i",p );
}
}
return 0;
}
最外层的for语句建立了一个循环,周期性遍历2到50间的整数,循环变量p表示当前正在测试以检查是否是素数的值,将语句值1 指派给变量isPrime.第二个循环用于将p除以2到p-1间的所有整数
在该循环中,要执行一个测试检查p除以d的余数是否等于0.如果为零,就知道p不可能是素数。
执行完最内层的循环时,测试isPrime的值,如果不等于0,表示没有发现能整除p的整数否则,p肯定是素数,并显示它的值。“非零意味着满足,零意味着不满足”。
while ( char != 'a' && count != 80 )
如果两个条件都满足,结果为1,如果有任何一个条件不满足,求值结果是0.
为方便测试标记值是否为false,需要用逻辑非(!)运算符,对逻辑值求反。if(!isPrime)这条语句可以读作如果非isPrime.
Objective-C有两个内置特性,可以使Boolean变量使用更加容易,特殊类型BOOL 可以用来声明值非真即假的变量,另一种是预定义的YES 和NO。
6.4 条件运算符
条件运算符是三元运算符,也就是说它要接受三个运算数,用于表示这种运算符的两个符号是问号(?)和冒号(:),第一个运算数放在问号(?)前面,第二个运算数放在他们之间,第三个运算数放在冒号(:)之后。
一般格式:condition ? expression1 : expression2
在这个语法中,condition 表示一个表达式,系统会对它先求值,如果condition 结果为true。将执行expression1,而且其结果将成为该运算的结果,如果求值结果为false ,将执行expression2.
如果在冒号(:)之后使用表达式(即“else"部分),中包含的另一个条件运算符,就可以达到else if 子句的效果,例如将两个条件运算符写到一个程序上。
sign = (number < 0) ? -1 :((number == 0) ? 0 : 1);
条件表达式并非只能放在赋值运算符的右边,它们可以用在能使用的表达式的任何位置,这意味着可以在没有变量number的符号指派给变量的情况下使用NSLog 语句来显示它
例如: NSLog(@"sign = %i", (number > 0) ?-1 :(number ==0) ? 0: 1);
Xcode 支持如下条件运算符的非ANSI扩展语句:
condition ? : expression
在这个语句中对condition求值,若为true,则返回值为condition,若condition为false,则返回expression。逻辑上,这个语句等价于如下,condition ? condition : expression