Objective-C 学习笔记 6 选择结构

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



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值