Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

В программе 21.2 намного больше клавиш, чем в первом приложении. Наиболее сложной частью в implementation-файле контроллера представлений является формирование и отображение дробей. Как говорилось выше, при нажатии числовой клавиши от 0 до 9 выполняется action-метод clickDigit:. Этот метод вызывает метод processDigit:, который помещает цифру в конец числа, формируемого в переменной currentNumber. Этот метод также добавляет цифру в текущую строку отображения, которая поддерживается в переменной displaystring, и обновляет отображение. -(void) processDigit: (int) digit ( currentNumber = currentNumber * 10 + digit; [displaystring appendString: [NSString stringWithFormat: @"%i", digit]]; [display setText: displaystring];}

При нажатии клавиши со знаком равенства (=) для выполнения операции вызывается метод clickEquals:. Калькулятор выполняет операцию между двумя дробями, сохраняя результат в накопителе (accumulator). Этот накопи гель считывается внутри метода clickEquals:, и результат выводится па дисплей. Класс Fraction

Класс Fraction мало отличается от предыдущих примеров этой книги. В нем имеется новый метод convertToString, который добавлен для преобразования дроби в эквивалентное строковое представление. В программе 21.2 показан файл секции interface для класса Fraction, после которого следует соответствующий файл секции implementation.

Программа 21.2. Interlace-файл Fraction.h #import <UIKit/UIKit.h> @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(void) print; -(void) setTo: -(Fraction *) add: (Fraction *) f; -(Fraction *) subtract: (Fraction *) f; -(Fraction *) multiply: (Fraction *) f; -(Fraction *) divide: (Fraction *) f; -(void) reduce; -(double) convertToNum; -(NSString *) convertToString; (int) n over: (int) d; @end

Программа 21.2. Implementation-файл Fraction.m #import "Fraction.h" @implementation Fraction @synthesize numerator, denominator; (void) setTo: (int) n over: (int) d { numerator = n; denominator = d; } -(void) print { NSLog (@"%i/%i", numerator, denominator); } -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 1.0; } -(NSString *) convertToString; { if (numerator == denominator) if (numerator == 0) return @»0"; else return @»1"; else if (denominator == 1) return [NSString stringWithFormat: @"%i", numerator]; else return [NSString stringWithFormat: @"%i/%i", numerator, denominator]; } // Сложение дроби (Fraction) с получателем -(Fraction *) add: (Fraction *) f { // Сложение двух дробей // a/b + c/d = ((a*d) + (b*c)) / (b * d) // в result будет сохраняться результат сложения Fraction * result = [[Fraction alloc] init]; int resultNum, resultDenom; resultNum = numerator * f.denominator + denominator * f.numerator; resultDenom = denominator * f.denominator; [result setTo: resultNum over: resultDenom]; [result reduce]; return [result autorelease]; } -(Fraction *) subtract: (Fraction *) f { // Вычитание двух дробей // a/b - c/d = ((a’ d) - (b*c)) / (b * d) Fraction *result = [[Fraction alloc] init]; int resultNum, resultDenom; resultNum = numerator * f.denominator - denominator * Enumerator; resultDenom = denominator * f.denominator; [result setTo: resultNum over: resultDenom]; [result reduce]; return [result autorelease]; } [Fraction *) multiply: (Fraction *) f { Fraction *result = [[Fraction alloc] init]; [result setTo: numerator * f.numerator over: denominator * f.denominator]; [result reduce]; return [result autorelease]; } -(Fraction *) divide: (Fraction *) f { Fraction *result = [[Fraction alloc] init]; [result setTo: numerator * f.denominator over: denominator * f.numerator]; [result reduce]; return [result autoreiease]; } -(void) reduce { int u = numerator; int v = denominator; int temp; if (u == 0) return; else if (u <0) u = -u; while (v != 0) { temp = u % v; u =v; v = temp; } numerator /= u; denominator /= u; } @end

Метод convertToString: проверяет числитель и знаменатель дроби, чтобы создать вид числа для внешнего отображения. Если числитель и знаменатель равны (но не равны нулю), возвращается @"Г. Если числитель равен нулю, то возвращается строка @"0". Если знаменатель равен 1, результатом является целое число, то есть показывать знаменатель не нужно.

Метод stringWithFormat:, который используется внутри convertToString:, возвращает строку в соответствии со строкой формата (аналогично NSLog) и список аргументов с разделителями-запятыми. Мы передаем аргументы методу, который принимает переменное число параметров, разделяя их запятыми, как при передаче аргументов функции NSLog. Класс Calculator, который работает с дробями

Теперь рассмотрим класс Calculator. Он аналогичен одноименному классу, с которым мы работали раньше, но теперь наш калькулятор должен «знать», как работать с дробями. Ниже приводятся файлы секций interface и implementation для класса Calculator.

Программа 21.2. Interface-файл Calculator.h #import <UIKit/UIKit.h> #import"Fraction.h" @interface Calculator: NSObject ( Fraction *operand1; Fraction *operand2; Fraction *accumulator; } @property (retain, nonatomic) Fraction *operand 1, *operand2, *accumulator; -(Fraction *) performOperation: (char) op; -(void) clear; @end

Программа 21.2. Implementation-файл Calculator.m «import "Calculator.h" @implementation Calculator @synthesize operand 1, operand2, accumulator; -(id) init { self = [super init]; operand 1 = [[Fraction alloc] init]; operand2 = [[Fraction alloc] init]; accumulator = [[Fraction alloc] init]; return self; } -(void) clear { if (accumulator) { accumulator.numerator = 0; accumulator.denominator = 0; } -(Fraction *) performOperation: (char) op { Fraction *result; switch (op) { case result = [operandl add: operand2]; break; case result = [operandl subtract: operand2]; break; case '*': result = [operandl multiply: operand2]; break; case result= [operandl divide: operand2]; break; accumulator.numerator = result.numerator; accumulator.denominator = result.denominator; return accumulator; } -(void) dealloc { [operand 1 release]; [operand2 release]; [accumulator release]; [super dealloc]; } @end Разработка пользовательского интерфейса (Ul)

В папке Resources этого проекта содержатся два xib-файла: MainWindow.xib и Fraction CalculatorViewController.xib. Вам не требуется работать с первым файлом. Откроем второй файл, дважды щелкнув на его имени. При запуске Interface Builder вы увидите значокс именем “View" в окне с именем Fraction CalculatorViewController.xib (рис. 21.23).

Если окно View еще не открыто, дважды щелкните на этом значке и откройте его. Внутри окна View мы будем разрабатывать пользовательский интерфейс нашего калькулятора. Мы будем связывать каждую числовую клавишу с методом ctickDigit:. Для это нужно при нажатой клавише Control протянуть мышь к значку File’s Owner по очереди от каждой клавиши в окне Fraction_CalculatorViewController.xib и выбрать clickDigit: в раскрывающемся меню Events (События). Кроме того, для каждой числовой клавиши нужно задать в окне Inspector значение Tag, соответствующее названию клавиши. Дтя числовой клавиши с меткой 0 нужно задать значение Tag, равное 0, для клавиши с меткой 1 — значение 1, и т.д.

Протяните мышь от остальных клавиш в окне View и создайте соответствующие привязки. Не забудьте вставить метку для отображения (display) калькулятора и протяните мышь при нажатой клавише Control от File’s Owner к этой метке. Выберите display из появившегося списка Outlets.

Все! Структура интерфейса создана, и приложение с калькулятором дробей готово к работе.

Рис. 21.23. Окно Fraction_CalculatorViewController.xib 21.4. Сводка шагов

  • Читать дальше
  • 1
  • ...
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: