本篇讲解第六章的课后题,6-4,6,7。代码皆为本人原创,如果有不足之处,望各位指点。
课后题 6-4
题目:
编写一个简单的打印计算器,允许用户输入以下形式的表达式
number operator
代码:
#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) subtract:(double)value
{
accumulator -= value;
}
-(void) multiply:(double)value
{
accumulator *= value;
}
-(void) divide:(double)value
{
accumulator /= value;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool
{
double value1;
char operation;
Calculator *deskCalc = [[Calculator alloc] init];
NSLog(@"Begin Calculations");
scanf(" %lf %c", &value1, &operation); //输入数字和字符
if (operation == 'S') //START,开始计算
[deskCalc setAccumulator: value1];
NSLog(@" = %.2f", [deskCalc accumulator]);
while (operation != 'E') //不输入'E'的前提下持续输入
{
scanf(" %lf %c", &value1, &operation);
if (operation == 'S')
[deskCalc setAccumulator: value1];
else if( operation == '+')
[deskCalc add: value1];
else if (operation == '-')
[deskCalc subtract: value1];
else if (operation == '*')
[deskCalc multiply: value1];
else if (operation == '/')
if (value1 != 0)
[deskCalc divide: value1];
else
NSLog(@"The divider is zero");
else if (operation != 'S' || operation != 'E' || operation != '+' || operation != '-' || operation != '*' || operation != '/') //输入错误操作字符
NSLog(@"Please enter the right operation");
NSLog(@"=%.2f", [deskCalc accumulator]);
if (operation == 'E') //EXIT,终止计算器
break;
}
NSLog(@" = %.2f", [deskCalc accumulator]);
NSLog(@"End of Calculation");
}
return 0;
}
课后题 6-6
题目:
用英语字母正序显示输入数字的各个位的数字。如果输入324,则显示
three
two
four
代码:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool
{
int i, j, number_0,number, right_digit,counter_0,counter,ten,left_digit;
counter = 0;
NSLog(@"Enter your number:");
scanf("%i", &number_0);
number = number_0;
NSLog(@"The reverse is:");
while (number != 0)
{
right_digit = number % 10;
number /= 10;
counter_0++;
}
counter = counter_0; //保存位数
for (i = 1; i <= counter_0 ; i++)
{
ten = 1;
//10的j次幂
for (j = 1; j <= counter-1 ; j++)
{
ten = ten * 10;
}
left_digit = number_0 / ten;
switch (left_digit) {
case 1:
NSLog(@"one");
break;
case 2:
NSLog(@"two");
break;
case 3:
NSLog(@"three");
break;
case 4:
NSLog(@"four");
break;
case 5:
NSLog(@"five");
break;
case 6:
NSLog(@"six");
break;
case 7:
NSLog(@"seven");
break;
case 8:
NSLog(@"eight");
break;
case 9:
NSLog(@"nine");
break;
case 0:
NSLog(@"zero");
break;
default:
break;
}
counter--;
number_0 = number_0 - left_digit * ten;
}
}
return 0;
}
课后题 6-7
题目:
对于例题6-10的低效性的改进:
1. 需要略过偶数查找素数。
2. 若发现第一个整除的数,则立即判定是非素数(因为比较大的奇数,可以整除的数不止一个)。
代码:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
int p, d;
BOOL isPrime; // isPrime, Boolean变量,判定是否是素数
for ( p = 2; p <= 100 ; ++p) //查找100以内的素数
{
isPrime = YES; //初始化isPrime
if (p % 2 == 0) //判定是否是偶数
continue; //跳出此次循环。
for (d = 2; d < p && isPrime == NO ; ++d)
if (p % d == 0)
isPrime = NO;
if (isPrime == YES)
NSLog(@"%i", p);
}
}
return 0;
}