Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Треугольное число (triangularNumber) можно вычислить для любого целого числа по формуле triangularNumber = п (п + 1) / 2 Например, 10-е треугольное число (55) можно вычислить путем подстановки в эту формулу значения 10 вместо п. Напишите программу, которая создает таблицу треугольных чисел с помощью этой формулы. Эта программа должна вычислять каждое пятое треугольное число для значений п от 5 до 50 (то есть 5, 10, 15,..., 50).

Факториал целого числа п (записывается как п!) — это произведение последовательных чисел от 1 до п. Например, 5 факториал рассчитывается следующим образом: 51 = 5x4x3x2x1 = 120 Напишите программу расчета и вывода первых десяти факториалов.

Если

перед описателем ширины поля поставлен знак «минус», это поле выводится с выравниванием по левому краю. Замените следующим оператором NSLog соответствующий оператор программы 5.2, выполните программу и сравните вывод обеих программ: NSLog (@"%-2i %i", n, triangularNumber);

Программа 5.5 позволяет пользователю ввести только пять чисел. Модифицируйте эту программу, чтобы пользователь мог ввести количество треугольных чисел для расчета.

Перепишите программы 5.2-5.5, заменив все случаи использования оператора for на эквивалентные операторы while. Выполните каждую из этих программ, чтобы проверить идентичность результатов обеих версий.

Что произойдет, если ввести отрицательное число в программу 5.8? Попробуйте выполнить это и посмотрите, что получится.

Напишите программу, которая вычисляет сумму цифр целого числа. Например, сумма цифр числа 2155 равна 2 + 1 + 5 + 5, то есть 13. Программа должна допускать любое число, введенное пользователем.

Глава 6. Принятие решений

В любом языке программирования имеется возможность принятия решений. В языке программирования Objective-C имеются несколько конструкций для принятия решений.

Оператор if

Оператор switch

Условный оператор 6.1. Оператор if

В общем виде оператор if имеет следующий формат. if ( выражение) программный оператор

Представим, что нам нужно преобразовать утверждение «Если нет дождя, я пойду купаться» в операторы языка Objective-C. Используя показанный выше формат, это можно «записать» следующим образом. if ( нет дождя ) я пойду купаться

Оператор if используется, чтобы выполнить программный оператор в зависимости от указанных условий (или операторы, если они заключены в фигурные скобки). Аналогичным образом, в программном операторе if ( count > MAXIMUMSONGS ) [playlist maxExceeded];

сообщение maxExceeded отправляется playlist (список воспроизведения), только если значение переменной count больше значения MAXIMUM SONGS, иначе этот оператор игнорируется.

Рассмотрим пример. Предположим, что вам нужно написать программу, которая принимает целое значение, введенное с клавиатуры, и затем выводит абсолютное значение этого целого числа. Проще всего вычислить абсолютное значение числа — взять его с противоположным знаком, если оно меньше нуля. Фраза «если оно меньше нуля» означает, что программа должна принять решение. Для этого можно использовать оператор if, как показано в программе 6.1. // Вычисление абсолютного значения целого числа #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int number; NSLog (@"Type in your number: "); scanf("%i", &number); if ( number < 0 ) number = -number; NSLog (@"The absolute value is %i", number); [pool drain]; return 0; }

Вывод программы 6.1 Type in your number: (Введите свое число) -100 The absolute value is 100 (Абсолютное значение равно 100)

Вывод программы 6.1 (повторный запуск) Type in your number: 2000 The absolute value is 2000

Эта программа запускалась два раза, чтобы проверить правильность ее работы. Мы проверили оба возможных результата

принятия решений.

После вывода сообщения для пользователя и сохранения введенного целого значения в переменной number программа проверяет, не является ли значение number отрицательным. Если да, то выполняется следующий программный оператор, который изменяет знак number на противоположный. Если значение number не меньше нуля, этот оператор автоматически пропускается. (В этом случае не нужно изменять знак на противоположный.) Затем выполняется вывод значения number и завершается выполнение программы.

Рассмотрим еще одну программу с оператором if. Мы добавим в класс Fraction еще метод convertToNum. Этот метод будет представлять значение дроби в виде вещественного числа — выполнять деление числителя (numerator) на знаменатель (denominator). Результат будет возвращаться как значение двойной точности (double). Так, для дроби 1/2 нужно возвращать значение 0.5.

Для такого метода можно использовать, например, следующее объявление -(double) convertToNum;

Его определение можно записать в следующем виде: -(double) convertToNum { return numerator / denominator; }

Хорошо, но недостаточно. При таком определении этот метод имеет две серьезные проблемы. Первая относится к работе с арифметическими преобразованиями. Напомним, что numerator и denominator — это целые переменные экземпляра. А что происходит при делении целых значений? Оно выполняется как целое деление! Если нужно преобразовать дробь 1/2, то представленный код даст значение нуль! Это легко исправить с помощью оператора приведения типа, преобразующего один или оба операнда в значение с плавающей точкой до операции деления: (double) numerator / denominator

Поскольку этот оператор имеет относительно высокий приоритет, значение numerator преобразуется в тип double до выполнения деления. Вам не обязательно преобразовывать denominator, достаточно сделать это для одного из операндов.

Вторая проблема заключается в том, что нужно проверять деление на нуль (вы должны всегда выполнять эту проверку). Ниже показана модифицированная версия метода convertToNum. -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 0.0; }

Мы решили возвращать значение 0.0, если знаменатель дроби равен нулю. Можно использовать и другие варианты (например, вывод сообщения об ошибке, создание исключительного состояния и т.д.).

Введем этот метод в программе 6.2. #import <Foundation/Foundation.h> @interface Fraction: NSObject { int numerator; int denominator; } -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; -(int) numerator; -(int) denominator; -(double) convertToNum; @end @implementation Fraction -(void) print { NSLog (@" %i/%i", numerator, denominator); } -(void) setNumerator: (int) n { numerator = n; } -(void) setDenominator: (int) d { denominator = d; } -(int) numerator { return numerator; } -(int) denominator { return denominator; } -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 0.0; } @end int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Fraction *aFraction = [[Fraction alloc] init]; Fraction *bFraction = [[Fraction alloc] init]; [aFraction setNumerator: 1]; // 1-я дробь 1/4 [aFraction setDenominator: 4]; [aFraction print]; NSLog (@" ="); NSLog (@"%g", [aFraction convertToNum]); [bFraction print]; // значение не было присвоено NSLog (@" ="); NSLog (@"%g", [bFraction convertToNum]); [aFraction release]; [bFraction release]; [pool drain]; return 0; }

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

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Охотник на демонов

Шелег Дмитрий Витальевич
2. Живой лёд
Фантастика:
боевая фантастика
5.83
рейтинг книги
Охотник на демонов

Варвара Асенкова

Алянский Юрий Лазаревич
Корифеи русской и зарубежной сцены
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Варвара Асенкова

Хозяин Стужи 8

Петров Максим Николаевич
8. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 8

Азеф

Гуль Роман Борисович
Проза:
историческая проза
6.00
рейтинг книги
Азеф

Возмутитель спокойствия

Владимиров Денис
1. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Возмутитель спокойствия

Абсурдистан

Штейнгарт Гари
Проза:
современная проза
5.00
рейтинг книги
Абсурдистан

Хозяин Стужи 5

Петров Максим Николаевич
5. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
6.60
рейтинг книги
Хозяин Стужи 5

Идеальный мир для Лекаря 24

Сапфир Олег
24. Лекарь
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Идеальный мир для Лекаря 24

Двойник Короля 4

Скабер Артемий
4. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 4

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Я - истребитель

Поселягин Владимир Геннадьевич
1. Я - истребитель
Фантастика:
альтернативная история
8.19
рейтинг книги
Я - истребитель

Глотка

Страуб Питер
Детективы:
триллеры
6.25
рейтинг книги
Глотка

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус