本篇講解第六章的課後題,6-4,6,7。代碼皆為本人原創,如果有不足之處,望各位指點。
課後題 6-4
題目:
編寫一個簡單的列印電腦,允許使用者輸入以下形式的表達式
代碼:
#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 = ;
}
-(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 != )
[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 ;
}
課後題 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 = ;
NSLog(@"Enter your number:");
scanf("%i", &number_0);
number = number_0;
NSLog(@"The reverse is:");
while (number != )
{
right_digit = number % ;
number /= ;
counter_0++;
}
counter = counter_0; //儲存位數
for (i = ; i <= counter_0 ; i++)
{
ten = ;
//10的j次幂
for (j = ; j <= counter- ; j++)
{
ten = ten * ;
}
left_digit = number_0 / ten;
switch (left_digit) {
case :
NSLog(@"one");
break;
case :
NSLog(@"two");
break;
case :
NSLog(@"three");
break;
case :
NSLog(@"four");
break;
case :
NSLog(@"five");
break;
case :
NSLog(@"six");
break;
case :
NSLog(@"seven");
break;
case :
NSLog(@"eight");
break;
case :
NSLog(@"nine");
break;
case :
NSLog(@"zero");
break;
default:
break;
}
counter--;
number_0 = number_0 - left_digit * ten;
}
}
return ;
}
課後題 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 = ; p <= ; ++p) //查找100以内的素數
{
isPrime = YES; //初始化isPrime
if (p % == ) //判定是否是偶數
continue; //跳出此次循環。
for (d = ; d < p && isPrime == NO ; ++d)
if (p % d == )
isPrime = NO;
if (isPrime == YES)
NSLog(@"%i", p);
}
}
return ;
}