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

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

Жанры

Программирование на 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; }

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

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVII

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

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

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

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Базис

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

Авалон. Потенциал Силы. Книга 3

Сказ Алексей
3. Иггдрасиль
Фантастика:
рпг
аниме
уся
5.00
рейтинг книги
Авалон. Потенциал Силы. Книга 3

Афганский рубеж 3

Дорин Михаил
3. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 3