Программирование на Objective-C 2.0
Шрифт:
Внимание. Никогда не делайте предположений о типе правого сдвига (арифме-тическом или логическом), реализуемом в вашей системе. Программа, которая выполняет правый сдвиг значений со знаком, может работать правильно на одном компьютере и давать сбой на другом.
Если переменная w1 имеет тип unsigned int, представленный 32 битами, и w1 присвоено шестнадцатеричное значение F777EE22, то смещение w1 на одну по-зицию вправо с помощью оператора w1 >>= 1;
даст в результате шестнадцатеричное значение 7BBBF711, как показано ниже. w1 1111 0111 0111 0111 1110 1110 0010 0010 0xF777EE22 w1 >> 1 0111 1011 1011 1011 1111 0111 0001 0001 0x7BBBF711
Если w1 объявлена как (signed) short int,
Если выполняется сдвиг значения влево или вправо на число позиций, равное или превышающее количество бит этого значения, то Objective-C не дает определенный результат. Например, на машине, представляющей целое значение 32 битами, сдвиг целого значения влево или вправо на 32 или больше битов не обязательно даст определенный результат. Если указана отрицательная величина смещения, то результат тоже неопределенный. 4.6. Типы: _Bool, .Complex и .Imaginary
Завершая эту главу, упомянем еще три типа: _Bool, для работы с булевыми зна-чениями (0 или 1), .Complex и .Imaginary — для работы с комплексными и мнимы-ми числами соответственно.
Программисты Objective-C обычно используют тип данных B00L вместо .Bool для работы с булевыми значениями. В действительности это не тип данных, а еще одно имя для типа данных char. Его определяют с помощью специального ключевого слова typedef, которое описывается в главе 10. Упражнения
Какие из следующих констант являются недопустимыми? Почему? 123.456 0x10.5 0X0G1 0001 OxFFFF 123L 0ХаЬО5 0L -597.25 123.5е2 .0001 +12 98.6F 98.7U 17777s 0996 -12Е-12 07777 1234uL 1.2Fe-7 15,000 1.234L 197u 100U OXABCDEFLOxabcu +123
Напишите программу, которая преобразует 27° по Фаренгейту (F) в градусы Цельсия (С) с помощью следующей формулы: С = (F - 32) / 1.8
Какой вывод даст следующая программа? #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; char c, d; c = 'd'; d = c; NSLog (@"d = %c", d); [pool drain]; return 0; }
Напишите программу для вычисления полинома. Зх<sup>3</sup> - 5х<sup>2</sup> + 6, для х = 2.55.
Напишите программу для вычисления выражения и вывода результатов (для вывода результатов используйте формат экспоненциального представления). (3.31 х 10<sup>-8</sup> + 2.01 х 107) / (7.16 х 10<sup>-5</sup> + 2.01 х 10<sup>-8</sup>)
Комплексные (Complex) числа содержат две части: вещественную (real) и мни-мую (imaginary). Если а — это вещественная часть, а b — мнимая часть, то для представления такого числа используется форма записи а + b i Напишите программу на Objective-C, которая определяет новый класс с именем Complex. Соблюдая принцип, описанный для класса Fraction, опреде-лите для своего нового класса следующие методы.
– (void) setReal: (double) а; -(void) setlmaginary: (double) b; -(void) print; // вывод как a + bi -(double) real; -(double) imaginary; Напишите программу, чтобы протестировать новый класс и методы.
Вы разрабатываете библиотеку процедур для работы с графическими объек-тами. Начните с определения нового класса с именем Rectangle (Прямоугольник). Разработайте методы задания ширины и высоты прямоугольна, считывания их значений, а также расчета площади (area) и периметра (perimeter) прямоугольника. Предполагается, что объекты-прямоугольники описывают прямоугольники на целочисленной сетке, например, на экране компьютера. В данном случае ширина и высота прямоугольника являются целыми значениями. Ниже приводится секция @interface для класса Rectangle: @interface Rectangle: NSObject { int width; int height; } -(void) setWidth: (int) w; -(void) setHeight: (int) h; -(int) width; -(int) height; -(int) area; -(int) perimeter; @end
Напишите секцию implementation и программу для тестирования вашего но-вого класса и методов.Модифицируйте методы add:, subtract:, multiply: и divide: для программы 4.6, чтобы считывать результирующее значение сумматора (accumulator). Выполните тестирование этих новых методов.
Закончив упражнение 8, добавьте следующие методы к классу Calculator и выполните их тестирование.
– (double) changeSign; // изменение знака сумматора -(double) reciprocal; // 1/(значение сумматора) -(double) xSquared; // квадрат сумматора
Добавьте методы работы с памятью для класса Calculator в программе 4.6. Реализуйте следующие объявления методов и выполните их тестирование.-(double) memoryClear; // очистка памяти -(double) memoryStore; // запись в память значения сумматора -(double) memoryRecall; // чтение в сумматор значения памяти -(double) memoryAdd; // добавление значения сумматора к памяти -(double) memorySubtrac // вычитание значения сумматора из памяти Каждый из этих методов должен возвращать значение сумматора.
Глава 5. Циклы в программах
Язык Objective-C позволяет повторять последовательности кода различными способами. Темой этой главы являются циклы. Они могут формироваться с помощью следующих операторов.
Оператор for
Оператор while
Оператор do
Начнем с простого примера: подсчет суммы. Составим треугольник из 15 шаров (рис. 5.1).
Рис. 5.1. Пример треугольной компоновки
Первый ряд состоит из одного шара, второй ряд — из двух, и т.д. Количество шаров в треугольнике, состоящем из п рядов, равно сумме чисел от 1 до п. Эта сумма называется треугольным числом.
Если начать с 1, то четвертое треугольное число будет равно сумме последо-вательных чисел от 1 до 4 (1 + 2 + 3 + 4), то есть 10.Напишем программу, которая вычисляет и выводит на экран значение восьмого треугольного числа. Это число легко сосчитать в уме, но можно написать программу на Objective-C, чтобы выполнить эту задачу (программа 5.1). #import <Foundation/Foundation.h> // Программа вычисления восьмого треугольного числа (triangularNumber) int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int triangularNumber; triangularNumber =1 + 2 + 3 + 4 + 5 + 6 + 7 + 8; NSLog (@"The eighth triangular number is %\", triangularNumber); [pool drain]; return 0; }
Вывод программы 5.1 The eighth triangular number is 36 (восьмое треугольное число = 36)
Способ, применяемый в программе 5.1, вполне подходит для относительно небольших треугольных чисел, но что делать, если нам нужно вычислить, на-пример, значение 200-го треугольного числа? Не складывать же в явном виде все целые числа от 1 до 200? К счастью, имеется более простой способ — воз-можность выполнения операций в цикле. Для реализации циклов в языке Objective-C имеется три оператора. 5.1. Оператор for
В программе 5.2 вычисляется 200-е треугольное число. На ее примере мы рассмотрим, как работает оператор for. // Программа вычисления 200-го треугольного числа (triangularNumber) // Пример использования оператора for #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int n, triangularNumber; triangularNumber = 0; for ( n = 1; n <= 200; n = n + 1 ) triangularNumber += n; NSLog (@"The 200th triangular number is %i", triangularNumber); [pool drain]; return 0; }